CodeGym /مدونة جافا /Random-AR /الجزء 6. حاويات Servlet
John Squirrels
مستوى
San Francisco

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

نشرت في المجموعة
هذه المادة جزء من سلسلة "مقدمة لتطوير المشاريع". المقالات السابقة: الجزء 6. حاويات 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/ في متصفحك. ستظهر لك لوحة تحكم رسومية:

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

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

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

    • Java_HOME - يجب أن يشير هذا إلى الإصدار الحالي من Java 8+.
    • CATALINA_BASE — يجب أن يشير هذا إلى 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 الخاصة بنا في ملف WAR. عادةً ما يتم استخدام Maven للقيام بذلك، ولكن لإنشاء ملف WAR تحتاج إلى ملف web.xml الذي يحتوي على تعيين لجميع servlets. لقد استخدمنا التعليق التوضيحي @WebServlet الجديد لكتابة servlets، لذلك ليس لدينا ملف web.xml. لحسن الحظ، يمكن لـ IDEA القيام بالعمل القذر نيابةً عنا، حيث تقوم بتغليف مشروعنا في ملف WAR. للقيام بذلك، افتح بنية المشروع (Ctrl+Shift+Alt+S) -> القطع الأثرية -> حدد ملف WAR المطلوب -> حدد مربع الاختيار بجوار "تضمين في إنشاء المشروع" -> انقر فوق "موافق". الجزء 6. حاويات Servlet - 4لنقم ببناء المشروع باستخدام مجموعة المفاتيح Ctrl+F9. أصبح الآن ملف WAR الخاص بنا موجودًا في الدليل الهدف. الجزء 6. حاويات Servlet - 5يمكن إعادة تسمية الملف إلى شيء أكثر بساطة، على سبيل المثال، servlet.war، ونقله إلى مكان أكثر ملاءمة، على سبيل المثال، C:\\my\\. بمجرد أن يصبح ملف WAR جاهزًا للاستخدام، سنضعه في حاوية . هناك طريقتان للقيام بذلك.
  1. باستخدام الواجهة الرسومية

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

    إذا تابعت معي حتى هذه اللحظة، فإن اسم المستخدم هو "مستخدم"، وكلمة المرور هي "كلمة المرور" .

    بعد تسجيل الدخول بنجاح، سترى Tomcat Web Application Manager. يحتوي قسم "التطبيقات" بالفعل على 5 تطبيقات — وهي أدوات مساعدة Tomcat، والتي تسهل التعامل مع Tomcat. ويمكن حذفها في المستقبل.

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

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

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

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

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

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

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

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

    كل ما هو مطلوب منا هو نقل ملف servlet.war الخاص بنا هنا.

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

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

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

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

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

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

توليد شهادة

بغض النظر عن الإصدار، يتضمن JDK عددًا كبيرًا من الأدوات المساعدة. واحد منهم هو أداة المفاتيح . هذه أداة لإنشاء مفاتيح التشفير والعمل معها. لاستخدامه، في سطر الأوامر، انتقل إلى الدليل C:\\Program Files\\Java\\jdk1.8.0_181\\bin وقم بتشغيل الأمر keytool -genkey -alias tomcat -keyalg RSA .
  • keytool - اسم الأداة المساعدة التي نقوم بتشغيلها مع خيارات سطر الأوامر
  • -genkey - يشير إلى أننا نريد إنشاء مفتاح جديد
  • -alias Tomcat - قم بإنشاء اسم مستعار رئيسي
  • -keyalg RSA — حدد RSA كخوارزمية إنشاء المفاتيح
بعد تنفيذ الأمر، تبدأ الأداة المساعدة في حوار معنا: الجزء 6. حاويات 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 باستخدام المتغيرات والحلقات والمصفوفات وبنيات اللغة الأخرى. هل كنت قادرا على تخيل ذلك؟ والخبر السار هو أن شيئا مماثلا موجود. الخبر السيئ هو أنها لا تحقق هذا الخيال بالكامل. إذا لم تكن قد خمنت، فنحن نتحدث عن صفحات JavaServer (JSP). باختصار، هذه هي التقنية التي تتيح لك إدراج أجزاء من تعليمات Java البرمجية في صفحة HTML. صحيح أن كود 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 هنا . في نهاية المطاف، هذه المقالة ليست عن JSP — نحن هنا للحديث عن حاويات servlet! فلماذا ذكرنا JSP؟ الأمر بسيط: حاوية servlet هي ما يحول تعليمات Java البرمجية من JSP إلى HTML. عندما يقوم servlet بإرجاع محتوى JSP كاستجابة، تأخذ الحاوية ملاحظة وتحوله أولاً إلى صفحة HTML سهلة الاستخدام للمتصفح قبل إرسال هذا المحتوى إلى العميل. اليوم، هناك العديد من نظائرها لتكنولوجيا JSP - Thymeleaf، FreeMarket، Moustache، وغيرها. كلهم يعملون بطريقة مماثلة. أي منهم تختار لعملك هو مسألة ذوق. ينطبق هذا أيضًا على اختيار حاوية servlet. في هذه الأمثلة، استخدمنا Tomcat، الحاوية الأكثر شيوعًا، لكن بعض المشاريع تستخدم حاويات أخرى. من المفيد مراجعة أشهرها بإيجاز والنظر في مدى اختلافها عن Tomcat.

بدائل تومكات

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

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

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

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

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

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

  4. WebLogic هو برنامج مرخص يجب شراؤه قبل الاستخدام. إنه ينتمي إلى أوراكل.

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

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

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

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