CodeGym /مدونة جافا /Random-AR /الجزء 5. Servlets وJava Servlet API. كتابة تطبيق ويب بسيط...
John Squirrels
مستوى
San Francisco

الجزء 5. Servlets وJava Servlet API. كتابة تطبيق ويب بسيط

نشرت في المجموعة
هذه المادة جزء من سلسلة "مقدمة لتطوير المشاريع". المقالات السابقة: الجزء 5. Servlets وJava Servlet API.  كتابة تطبيق ويب بسيط - 1هل تعرف بالفعل كيفية كتابة تطبيقات Java التي تعرض النص على وحدة التحكم، ولكنك لا تزال لا تعرف حقًا كيفية إنشاء تطبيق الويب الأول الخاص بك؟ عظيم، خذ راحتك في هذه المقالة سوف نتعرف على servlets ونكتب تطبيقًا يمكنك التفاخر به أمام أصدقائك دون إرسال ملف JAR إليهم ودون إجبارهم على تنزيل Java. دعونا نكتب تطبيق ويب بسيط . إذا لم تكن على دراية بالأساليب المستخدمة في تطوير الويب، فإنني أوصيك بأن تبدأ بقراءة المقالة الأولى في سلسلة " مقدمة لتطوير المشاريع ".

ما هو السيرفلت؟

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

ما تحتاجه لإنشاء تطبيق ويب

للحصول على أكبر قدر من الراحة عند العمل مع Java servlets، تحتاج إلى IntelliJ IDEA Ultimate Edition. إنه منتج مدفوع، ولكن يمكنك تفعيل نسخة تجريبية مدتها 30 يومًا أو استخدام إصدار الوصول المبكر، والذي يكون دائمًا مجانيًا. قم أيضًا بتثبيت Apache Tomcat — خادم تطبيقنا. Tomcat عبارة عن حاوية servlet: فهي تعالج الطلبات الواردة وتمررها إلى تطبيقنا. تحميل Tomcat من هنا .

لنقم بإنشاء أول تطبيق ويب خاص بنا

إذا كان كل شيء جاهزًا، قم بإنشاء مشروع Maven. إذا لم تكن على دراية بـ Maven، فقم بإلقاء نظرة على المقالة السابقة . هيا نبدأ!
  1. في pom.xml، أضف تبعية javax.servlet-api وحدد حزمة WAR:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>

    فئة servlet بسيطة:

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
  2. لتشغيل التطبيق، تحتاج إلى إنشاء تكوين Tomcat:

    الجزء 5. Servlets وJava Servlet API.  كتابة تطبيق ويب بسيط - 2الجزء 5. Servlets وJava Servlet API.  كتابة تطبيق ويب بسيط - 3

  3. بعد ذلك، نشير إلى إصدار Tomcat الذي سنستخدمه، وعنوان URL والمنفذ للاتصال بالخادم. يجب أن يكون لديك شيء من هذا القبيل:

    الجزء 5. Servlets وJava Servlet API.  كتابة تطبيق ويب بسيط - 4
  4. نحتاج الآن فقط إلى تحديد القطعة الأثرية (المشروع المجمع في أرشيف JAR) الذي سيتم نشره في الحاوية. يمكنك النقر فوق الزر "إصلاح" وتحديد "الحرب المنفجرة ": وهذا يعني أنه بعد إعادة بناء المشروع، سيتم وضع القطعة الأثرية تلقائيًا في حاوية servlet. الجزء 5. Servlets وJava Servlet API.  كتابة تطبيق ويب بسيط - 5

  5. القيمة الافتراضية لسياق التطبيق هي servlets_war_exploded . وهذا يعني أننا نصل إلى التطبيق على: http://localhost:8080/servlets_war_exploded .

    لماذا نريد أي نص إضافي؟ دعونا حذف ما هو غير ضروري. الآن عنوان تطبيق الويب الخاص بنا هو: http://localhost:8080 .

    الجزء 5. Servlets وJava Servlet API.  كتابة تطبيق ويب بسيط - 6
  6. انقر فوق موافق. نرى أنه يمكننا الآن تشغيل التطبيق:

    الجزء 5. Servlets وJava Servlet API.  كتابة تطبيق ويب بسيط - 7

    الآن عند فتح التطبيق في متصفحك، يجب أن تحصل على خطأ 404. وهذا أمر منطقي، لأن العنوان http://localhost:8080/ يحتاج إلى servlet يتم تعيينه إلى "/"، ولكن servlet الوحيد لدينا يتم تعيينه إلى "/hello" .

  7. يمكننا الوصول إليه على http://localhost:8080/hello . بمجرد القيام بذلك، نحصل على الإجابة المتوقعة - السلسلة "مرحبًا"!

إذا كان كل شيء يعمل، فلنحلل الكود. لإنشاء HTTP-servlet من فئة عادية ، يجب أن يرث فئة HttpServlet. فوق إعلان الفصل، نشير إلى @WebServlet()الشرح. هذا هو المكان الذي نقوم فيه بربط (أو تعيين) servlet بمسار محدد ("/hello"). ظهر هذا التعليق التوضيحي فقط في Java Servlet API 3.0، لذلك يوجد على الإنترنت الكثير من الأمثلة حيث يتم تعيين servlet من خلال ملف XML. هذا لم يعد ضروريا. للتعامل مع طلبات GET ، نتجاوز doGet()الطريقة. انتبه إلى معلمات الطريقة: HttpServletRequestو HttpServletResponse. يزودنا الكائن HttpServletRequestبجميع المعلومات اللازمة حول الطلب. في HttpServletResponse، نكتب ردنا ونضع العناوين اللازمة.

العمل مع المعلمات والجلسة

دعونا نقوم بتحسين servlet الخاص بنا حتى يتمكن من معالجة معلمات الطلب والعمل مع الجلسة:
import javax.servlet.ServletException;
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 ServletException, 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" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
الآن يعمل servlet مع الجلسة، مما يزيد من قيمة visitCounterكل مرة تتم فيها زيارة الصفحة. إذا visitCounterلم يتم إنشاء السمة بعد (عند الزيارة الأولى للصفحة)، فإن الطريقة getAttribute()ترجع فارغة، لذلك نحتاج إلى التحقق من أنها خالية. الأمر نفسه ينطبق على معلمات الطلب. إذا لم يمرر المستخدم معلمة اسم المستخدم، فستكون قيمتها فارغة. في هذه الحالة، نحيي المستخدم كزائر مجهول. لتمرير معلمة في طلب GET، يتم استخدام سلسلة استعلام، على سبيل المثال، يمكننا استخدام عنوان URL التالي: http:// localhost:8080/hello? اسم المستخدم=بول. يمكنك قراءة المزيد حول طلبات HTTP في المقالة السابقة في السلسلة. لا يحتوي تطبيقنا حاليًا على الكثير من المنطق، ولكن من المزعج بعض الشيء أن نحصل على خطأ 404 في المسار الجذر. لإصلاح ذلك، سنقوم بإنشاء servlet آخر وتعيينه إلى صفحة البداية: @WebServlet("/"). الغرض من هذا servlet هو إعادة توجيه الطلبات إلى المسار "/hello". هناك طريقتان للقيام بذلك: استخدام "إعادة التوجيه" أو "إعادة التوجيه". ربما يكون من المفيد أن نفهم الفرق بينهما. يقوم الأمام بتفويض معالجة الطلب إلى servlet آخر على الخادم. العميل غير متورط. للقيام بذلك، قم بإضافة التعليمة البرمجية التالية إلى أسلوب doGet() الخاص بـ servlet الجديد:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
في هذا الكود، نصل إلى سياق servlet، ونحصل على مرسل الطلب لـ servlet ذي الصلة، ونطلب منه معالجة طلب محدد باستخدام الوسائط المحددة (req، resp). تقوم عملية إعادة التوجيه بإرجاع العنوان الذي يجب على العميل استخدامه لمعالجة طلبه إلى العميل. تنتقل معظم المتصفحات تلقائيًا إلى عنوان URL الذي تم إرجاعه. لتنفيذ إعادة التوجيه، تحتاج إلى إضافة هذا الرمز:
resp.sendRedirect(req.getContextPath() + "/hello");
نحن نسمي redirect()الطريقة على HttpServletResponseالمعلمة ونمرر لها العنوان الذي يحتاج العميل إلى استخدامه. إليك تفاصيل مهمة: يجب أيضًا إضافة معلمات HTTP في نهاية مسار إعادة التوجيه الكامل، وهو أمر غير مناسب للغاية. في حالتنا يفضل الاستخدام forward، لكن في بعض الأحيان redirectيكون الاستخدام أفضل. إذا فهمت الفرق في كيفية عملهما، فلن تقوم بالاختيار الخاطئ. يبدو رمز servlet الجديد كما يلي:
import javax.servlet.ServletException;
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 ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

ملخص

تم الانتهاء من تطبيق الويب الأول الخاص بك. في المقالة التالية، ستتعلم كيفية نشره دون استخدام IntelliJ IDEA. لقد كتبنا تطبيقًا يعالج طلبات GET فقط. يتم التعامل مع أساليب HTTP المتبقية بطريقة مماثلة — عن طريق تجاوز الأساليب المقابلة للفئة الأصلية. يمكنك استخدام servlets البسيطة مثل هذه لإنشاء تطبيقات ويب متطورة ومتعددة الاستخدامات. وبطبيعة الحال، فإن استخدام أطر عمل كبيرة مثل Spring يجعل هذا الأمر أسهل بكثير. ولكن إذا كنت تريد حقًا التعمق في جميع إمكانيات servlets، فيمكنك قراءة المواصفات الرسمية . الجزء 6. حاويات Servlet الجزء 7. تقديم نمط MVC (Model-View-Controller)
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION