JavaRush /مدونة جافا /Random-AR /الجزء السادس: حاويات Servlet

الجزء السادس: حاويات Servlet

نشرت في المجموعة
هذه المادة جزء من سلسلة "مقدمة لتطوير المشاريع". المقالات السابقة: الجزء السادس: حاويات Servlet - 1في المقالة الأخيرة، تعرفنا على servlets وتعلمنا كيفية إنشاء تطبيقات الويب بمساعدتهم. لقد حان الوقت لإلقاء نظرة فاحصة على ما لم تكن هذه العطلة ممكنة بدونها - حاويات servlet.

محتوى:

ما هي حاوية servlet

هذا برنامج يعمل على الخادم ويمكنه التفاعل مع السيرفلتس التي أنشأناها. بمعنى آخر، إذا أردنا تشغيل تطبيق الويب الخاص بنا على خادم، فإننا نقوم أولاً بنشر حاوية servlet ثم نضع servlet فيها. طريقة العمل بسيطة: عندما يتصل العميل بالخادم، تقوم الحاوية بمعالجة طلبه، وتحدد أي servlet يجب أن يعالجه وتمريره. الجزء 6. حاويات Servlet - 2

كيفية استخدام حاويات servlet

بالإضافة إلى طلبات التوجيه، تؤدي حاوية servlet وظائف أخرى:
  1. يقوم بإنشاء صفحات HTML بشكل ديناميكي من ملفات JSP.
  2. تشفير/فك تشفير رسائل HTTPS.
  3. يوفر وصولاً مقيدًا لإدارة servlet.
بشكل عام، يبدو جيدا، كل ما تبقى هو معرفة كيفية تطبيق كل شيء. حسنًا، لتتعلم كيفية استخدام شيء ما، ما عليك سوى... محاولة استخدامه :) لذلك سنتدرب اليوم! حاوية servlet الأكثر شيوعًا هي Apache Tomcat . إنه مفتوح المصدر ومجاني للاستخدام. قم بتنزيل Tomcat لنظام التشغيل الخاص بك من هذا الرابط ، ودعنا نرى كيفية العمل مع الحاويات أثناء العمل.

تثبيت وتشغيل Tomcat

  1. لتثبيت Tomcat، ما عليك سوى فك ضغط الأرشيف الذي تم تنزيله في الدليل المطلوب.

  2. يرجى ملاحظة أن Tomcat يتطلب إصدار Java 8 أو أعلى لتشغيله. تأكد من أن متغير البيئة JAVA_HOME يشير إلى إصدار jdk الحالي.

  3. بعد ذلك، تحتاج إلى تكوين وصول المستخدم إلى Tomcat . يتم ذلك في ملف Tomcat-users.xml الموجود في مجلد conf.

    يأتي Tomcat مزودًا مسبقًا بأربعة أدوار:

    • manager-gui - الوصول إلى الواجهة الرسومية وصفحة الحالة؛
    • manager-script - الوصول إلى واجهة النص وصفحة الحالة؛
    • manager-jmx - الوصول إلى JMX وصفحة الحالة؛
    • حالة المدير - الوصول فقط إلى صفحة الحالة.

    داخل العلامة <tomcat-users>، سنكتب هذه الأدوار بوضوح ونخصصها لمستخدمنا:

    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user username="user" password="password"
        roles="manager-gui, manager-script, manager-jmx, manager-status"/>

    الآن كل شيء جاهز للإطلاق!

  4. في مجلد bin، قم بتشغيل ملفstartup.bat (startup.sh على Linux).

  5. بعد بضع ثوان، افتح الرابط http://localhost:8080/ في متصفحك . سيظهر مدير الرسوميات هناك:

    الجزء السادس: حاويات Servlet - 3

    إذا رأيت مثل هذه القائمة، فهذا يعني أن Tomcat قيد التشغيل.

  6. إذا لم ينجح الأمر، فتحقق يدويًا من متغيرات البيئة JAVA_HOME وCATALINA_HOME:

    • Java_HOME - يجب أن يشير إلى الإصدار الحالي من Java 8+؛
    • CATALINA_HOME - يجب أن يشير إلى Tomcat أو أن يكون غائبًا (يجب ألا يشير إلى إصدار آخر من Tomcat).

نشر تطبيق على Tomcat

لقد تمكنا من إطلاق Tomcat، لذا فقد حان الوقت لنشر نوع من المشروع فيه. دعونا نستخدم servlets من المقالة السابقة . الخدمة الرئيسية:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "
"
); } else { printWriter.write("Hello, " + username + "
"
); } printWriter.write("Page was visited " + visitCounter + " times."); printWriter.close(); } }
خدمة الفهرس:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}
قبل النشر، يجب أن يتم تجميع servlets الخاصة بنا في أرشيف الحرب. عادةً ما يتم استخدام Maven لهذا الغرض، ولكن لإنشاء أرشيف حرب تحتاج إلى ملف web.xml الذي يتم فيه تعيين جميع servlets. لقد كتبنا servlets باستخدام التعليق التوضيحي @WebServlet الجديد، لذلك ليس لدينا web.xml. ولحسن الحظ، يمكن لـ IDEA القيام بالعمل القذر نيابةً عنا، وتغليف مشروعنا بشكل فردي في أرشيف الحرب. للقيام بذلك، تحتاج إلى فتح بنية المشروع (Ctrl + Shift + Alt + S) -> القطع الأثرية -> حدد البناء المطلوب -> حدد المربع بجوار "تضمين في بناء المشروع" -> انقر فوق "موافق". الجزء 6: حاويات Servlet - 4أنشئ مشروعًا باستخدام المجموعة Ctrl + F9. أصبح الآن أرشيف الحرب الخاص بنا موجودًا في الدليل الهدف. الجزء 6: حاويات Servlet - 5ويمكن إعادة تسمية الملف بشيء أبسط - على سبيل المثال، servlet.war - ونقله إلى مكان أكثر ملاءمة - في C:\my\. عندما يصبح المشروب جاهزًا للاستخدام، ضعيه في وعاء . ويمكن أن يتم ذلك بطريقتين.
  1. عبر واجهة المستخدم الرسومية

    للقيام بذلك، اتبع الرابط http://localhost:8080/manager/html . يجب أن يطالبك Tomcat بتسجيل الدخول وكلمة المرور.

    إذا كررت كل الخطوات بعدي، فإن تسجيل الدخول هو مستخدم، وكلمة المرور هي كلمة المرور .

    بعد التفويض الناجح سترى Tomcat Web Application Manager. يحتوي قسم التطبيقات بالفعل على 5 تطبيقات - وهي تطبيقات الأداة المساعدة Tomcat الضرورية لتبسيط العمل معها. ويمكن إزالتها في المستقبل.

    الجزء 6: حاويات Servlet - 6

    يوجد أدناه قسم النشر. باستخدامه، يمكنك تحديد أرشيف الحرب للنشر. دعنا ندخل المسار والسياق يدويًا:

    الجزء 6. حاويات Servlet - 7

    انقر فوق "نشر"، نرى أن تطبيقنا قد ظهر في قسم التطبيقات:

    الجزء 6: حاويات Servlet - 8 باستخدام Tomcat GUI يمكننا إيقافه وإعادة تشغيله وتحديد مدة الجلسة وحذفها. عند النشر، حددنا السياق /demo، مما يعني أنه يجب الوصول إلى تطبيقنا عبر الرابط http://localhost:8080/demo . تحقق، كل شيء يجب أن يعمل.

  2. من خلال نظام الملفات

    لنشر تطبيق بهذه الطريقة، تحتاج إلى فتح الدليل الذي تم فك ضغط Tomcat فيه والانتقال إلى تطبيقات الويب. فيما يلي التطبيقات المساعدة التي نعرفها:

    الجزء 6: حاويات Servlet - 9

    كل ما علينا فعله هو نقل servlet.war الخاص بنا إلى هنا.

    ننتظر بضع ثوان، ونرى أن مجلد servlet جديد قد ظهر، مما يعني أنه تم نشر تطبيقنا. دعنا ننتقل إلى واجهة مدير التطبيقات المألوفة - http://localhost:8080/manager/ . نرى هنا أن تطبيقنا قد تم نشره في سياق /servlet:

    الجزء 6: حاويات Servlet - 10

    عند النشر بهذه الطريقة، يتم تعيين السياق تلقائيًا لاسم أرشيف الحرب المنشور. لتغيير السياق، يمكنك إعادة تسمية المجلد الذي تم إنشاؤه حديثًا باستخدام التطبيق، ولكن قبل ذلك تحتاج إلى حذف الملف: وإلا فسيقوم Tomcat بإعادة نشر التطبيق باسم الأرشيف.

    كما ترون، فإن نشر التطبيقات على Tomcat أسهل بكثير مما قد يبدو. لكن وظائفها الأخرى سهلة الاستخدام. دعونا تحقق.

استخدام بروتوكول HTTPS بدلاً من HTTP

إذا كنت تتذكر، فقد ناقشنا الفرق بين HTTP و HTTPS في مقال منفصل . HTTPS هو نفس بروتوكول HTTP، ولكنه يستخدم تشفير البيانات التي يتم نقلها. من جانب العميل، يتم التعامل مع التشفير بواسطة المتصفح، ويجب علينا توفير التشفير من جانب الخادم. وبما أن طلبات HTTP يتم قبولها وتوجيهها بواسطة Tomcat، فسيكون من المنطقي تفويض التشفير إليها. للقيام بذلك تحتاج:
  1. إنشاء شهادة موقعة ذاتيا؛
  2. قم بإجراء إعدادات خادم إضافية.
دعونا نتدرب على هذا.

توليد شهادة

يأتي JDK مع عدد كبير من الأدوات المساعدة، بغض النظر عن الإصدار، أحدها هو keytool . هذه أداة لإنشاء مفاتيح التشفير والعمل معهم. لاستخدامه، باستخدام سطر الأوامر، انتقل إلى الدليل C:\Program Files\Java\jdk1.8.0_181\bin وقم بتشغيل الأمر keytool -genkey -alias tomcat -keyalg RSA .
  • keytool - قم بتشغيل الأداة المساعدة باستخدام المعلمات؛
  • -genkey - يشير إلى أننا نريد إنشاء مفتاح جديد؛
  • -alias tomcat - إنشاء اسم مستعار رئيسي؛
  • -keyalg RSA - حدد RSA كخوارزمية إنشاء المفاتيح.
بعد تنفيذ الأمر، ستبدأ الأداة المساعدة في حوار معنا: الجزء السادس: حاويات Servlet - 11أدخل المعلومات الضرورية. لقد قمنا الآن بإنشاء مخزن مفاتيح في دليلنا الرئيسي (بالنسبة لنظام التشغيل Windows، فهو C:\Users\{username}\.keystore) ومفتاح Tomcat فيه. لقد أنشأنا شهادة بسيطة تقبلها معظم المتصفحات. هذه الشهادة غير مناسبة للتطبيقات التجارية: يمكن استخدامها فقط لأغراض الاختبار. على خادم الإنتاج، يجب عليك استخدام شهادة من مرجع مصدق (على سبيل المثال، https://letsencrypt.org/ ).

إعداد الخادم

الآن بعد أن أصبحت الشهادة جاهزة، تحتاج إلى ضبط إعدادات الخادم، أي موصل SSL. يتم ذلك في ملف server.xml الموجود في Apache-tomcat-9.0.30/conf/ . نجد كتل مثل:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
 </Connector>
وبجانبهم نضع التكوين الخاص بنا:
<Connector
       protocol="org.apache.coyote.http11.Http11NioProtocol"
       port="8443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="C:\Users\user\.keystore" keystorePass="mypass"
       clientAuth="false" sslProtocol="TLS"/>
نقوم بتعيين القيم ذات الصلة بالنسبة لنا لمعلمات keystoreFile وkeystorePass، وحفظ Tomcat وإعادة تشغيله باستخدام ملفات Shutdown.bat وstartup.bat. الآن أصبح الخادم جاهزًا لمعالجة طلبات https، قليلًا عند العنوان الذي تم تغييره - https://localhost:8443/demo/hello . عند الضغط على الرابط سيظهر لك تحذير بأن الشهادة مشكوك فيها، وهذا ليس بالأمر المستغرب. كما هو موضح سابقًا، للحصول على شهادة عادية، يجب عليك استخدام خدمات إحدى خدمات التصديق. لكن حتى الآن حققنا هدفنا: التطبيق يعمل باستخدام بروتوكول HTTPS، وهذا هو الشيء الرئيسي!

توليد ديناميكي لصفحات HTML

الآن دعونا نواصل مراجعتنا للميزات الأخرى لحاويات servlet - الإنشاء الديناميكي لصفحات HTML. تخيل عالمًا مثاليًا، حيث يمكنك، بدلاً من كود HTML الثابت والممل، كتابة كود JAVA باستخدام المتغيرات والحلقات والمصفوفات وبنيات اللغة الأخرى. هل تخيلت؟ والخبر السار هو أن شيئًا مشابهًا موجود، والخبر السيئ هو أنه غير موجود بالكامل. إذا لم تكن قد خمنت، فنحن نتحدث عن تقنية JSP (صفحات خادم Java). باختصار، هذه تقنية تسمح لك بإدراج أجزاء من كود JAVA في صفحة HTML. صحيح أن هذا الرمز لا يزال يتحول إلى HTML قبل إرساله إلى العميل، ولكن سيتم إنشاؤه ديناميكيًا مع مراعاة العوامل المختلفة. على سبيل المثال، يمكنك استخدام الإنشاءات الشرطية وتقديم محتوى مختلف اعتمادًا على بعض الشروط. مثال لصفحة JSP:
<%@ page language="java"" %>
<html>
<head>
<title>JSP</title>
</head>

<body>
<%
String firstName="name";
String secondName="surname";

    if(firstName.equals("name")){
      out.print("Hello :"+firstName+"<br>");
    }

    if(firstName.equals("name") && secondName.equals("surname"))
    {
      out.print("Hello, my dear friend! <br>");
    }
    else
    {
      out.print("I don’t know you. Go away! <br>");
    }
%>
</body>
</html>
يمكنك قراءة المزيد عن JSP هنا . في الواقع... نحن لسنا هنا من أجل هذا، ولكن من أجل حاويات servlet! ما علاقة JSP به؟ الأمر بسيط: يتم تحويل كود JAVA من JSP إلى كود HTML بواسطة حاوية servlet. عندما يكون servlet على وشك إرجاع محتوى JSP كاستجابة، تنتبه الحاوية وتحوله أولاً إلى صفحة HTML يمكن قراءتها في المتصفح قبل إرسال هذا المحتوى إلى العميل. يوجد اليوم العديد من نظائرها لتقنية JSP - Thymeleaf وFreeMarket وMoustache وغيرها. كلهم يعملون على مبدأ مماثل. أي واحد للاختيار للعمل هو مسألة ذوق. ينطبق هذا أيضًا على اختيار حاوية servlet. في الأمثلة، استخدمنا Tomcat - الحاوية الأكثر شيوعًا، لكن بعض المشاريع تستخدم أخرى. من المفيد أن تتعرف لفترة وجيزة على أكثرها شهرة وأن تنظر إلى اختلافاتها عن Tomcat.

بدائل تومكات

  1. GlassFish عبارة عن حاوية مفتوحة المصدر تدعمها Oracle.

    على عكس Tomcat، فهو خادم ويب متكامل يمكنه، بالإضافة إلى servlets، تشغيل مكونات أخرى من إطار عمل JavaEE. وفي الوقت نفسه، يستخدم الكثير من ذاكرة الوصول العشوائي. أكثر مرونة عند ضبط الخادم، مما يزيد من صعوبة استخدامه. يجدر استخدامه عند تطوير التطبيقات باستخدام إطار عمل JavaEE.

  2. WildFly - Jboss سابقًا . مفتوحة المصدر أيضا. تم تطويره بواسطة ريد هات. تم تغيير الاسم لتجنب الخلط بينه وبين منتج آخر للشركة - JBoss Enterprise Application Platform.

    WildFly، مثل GlassFish، هو خادم ويب متكامل. بالمناسبة، تحت الغطاء، يستخدم WildFly Tomcat كحاوية servlet. على عكس GlassFish، فإن WildFly أكثر خفة الوزن وأسهل في الإعداد.

  3. جيتي - مثل سابقاتها، مفتوح المصدر. تم تطويره بواسطة إكليبس.

    مثل Tomcat، فهي عبارة عن حاوية servlet بسيطة، بدون دعم لجميع مكونات إطار عمل JavaEE. وفي الوقت نفسه، فهو خفيف الوزن ويمكن تشغيله على الهاتف المحمول. يبدأ ويتوقف بسرعة ويتوسع بشكل جيد. على عكس Tomcat، فهو يحتوي على مجتمع أصغر وقاعدة معرفية أصغر.

  4. WebLogic هو برنامج مرخص يتطلب الشراء قبل الاستخدام. مملوكة لشركة أوراكل.

    بالمقارنة مع Tomcat، فإن وظائفه أوسع قليلاً. يمكن أن تعمل مع بروتوكول ftp. لكنها ليست مرنة جدًا عند تطوير التطبيقات واختبارها.

  5. WebSphere (خادم تطبيق WebSphere على وجه الدقة) هو برنامج مدفوع. تم تطويره بواسطة آي بي إم. على غرار WildFly وGlassFish، فهو خادم تطبيقات متكامل. ولكنه يتميز بواجهة إعداد أكثر سهولة، بالإضافة إلى موثوقية تشغيلية عالية.

    الجانب السلبي هو أنه يستخدم الكثير من الموارد، ويستغرق وقتًا طويلاً للبدء والتوقف، وهو أمر غير مناسب جدًا عند تطوير المشاريع الصغيرة.

تعتمد حاوية servlet أو خادم التطبيق الذي سيتم اختياره على المشروع المحدد. هناك مشاريع حيث يمكن حتى لشخص خارجي واضح أن يثبت نفسه بأعلى جودة، ولكن في البداية من الأفضل أن نفهم شيئًا واحدًا تمامًا. ربما يكون المرشح المثالي لهذا هو Tomcat. لقد اتخذنا بالفعل الخطوات الأولى في دراستها، ثم الأمر متروك لك! في المقالات الأخيرة من سلسلة "مقدمة لتطوير المشاريع"، سوف نتعرف على نمط MVC. الجزء 7. مقدمة لنمط MVC (وحدة التحكم في عرض النموذج) الجزء 8. كتابة تطبيق صغير في Spring-Boot
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION