JavaRush /مدونة جافا /Random-AR /الجزء 5. السيرفلتس، Java servlet API. كتابة تطبيق ويب بسي...

الجزء 5. السيرفلتس، Java servlet API. كتابة تطبيق ويب بسيط

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

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

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

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

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

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

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

    <?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. السيرفلتس، Java servlet API.  كتابة تطبيق ويب بسيط - 2 الجزء 5. السيرفلتس، Java servlet API.  كتابة تطبيق ويب بسيط - 3

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

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

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

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

    الجزء 5. السيرفلتس، Java servlet API.  كتابة تطبيق ويب بسيط - 6

  6. انقر فوق موافق. نرى أن لدينا الآن الفرصة لإطلاق التطبيق:

    الجزء 5. السيرفلتس، Java servlet API.  كتابة تطبيق ويب بسيط - 7

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

  7. نتصل به على http://localhost:8080/hello ونحصل على الاستجابة المتوقعة - السلسلة "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 بعد (في المرة الأولى التي تزور فيها الصفحة)، فسترجع طريقة getAttribute() قيمة فارغة، لذلك تحتاج إلى التحقق من وجود قيمة خالية. الأمر نفسه ينطبق على معلمات الطلب. إذا لم يمرر المستخدم معلمة اسم المستخدم، فستكون قيمتها فارغة. في هذه الحالة، سوف نحيي المستخدم كمجهول. لتمرير معلمة في طلب GET، يتم استخدام متغيرات المسار، أي أنك تحتاج إلى الوصول إلى الرابط http://localhost:8080/hello?username=Pavel . يمكنك قراءة المزيد حول طلبات http في المقالة السابقة في السلسلة. الآن تطبيقنا لديه الحد الأدنى من المنطق، ولكن الخطأ 404 في مسار الجذر مزعج بعض الشيء. لإصلاح ذلك، دعونا ننشئ servlet آخر ونقوم بتعيينه إلى الصفحة الأولية @WebServlet("/"). وظيفة هذا servlet هي إعادة توجيه الطلبات إلى المسار "/hello". هناك طريقتان للقيام بذلك: استخدام إعادة التوجيه أو إعادة التوجيه. ربما يكون من المفيد فهم الفرق بينهما. إلى الأمام - يطلب المفوضون المعالجة إلى servlet آخر على الخادم، ولا يشارك العميل. للقيام بذلك، تحتاج إلى إضافة التعليمة البرمجية التالية إلى طريقة doGet() للخادم الجديد:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
في هذا الكود، نصل إلى سياق servlet، ونحصل منه على مدير الطلب للـ servlet المطلوب ونطلب منه معالجة طلب محدد باستخدام المعلمات المحددة (req، resp). إعادة التوجيه - يعيد إلى العميل العنوان الذي يحتاج إلى الاتصال به لمعالجة طلبه. تنتقل معظم المتصفحات إلى الرابط المرسل تلقائيًا. لتنفيذ عملية إعادة التوجيه، عليك إضافة هذا الكود:
resp.sendRedirect(req.getContextPath() + "/hello");
في HttpServletResponse، نستدعي طريقة إعادة التوجيه () ونمرر لها العنوان الذي يحتاج العميل إلى الاتصال به. تفاصيل مهمة: يجب أيضًا إضافة معلمات http في نهاية مسار إعادة التوجيه الكامل، وهو أمر غير مناسب للغاية. في حالتنا، يفضل استخدام إعادة التوجيه، ولكن يحدث أنه من الأفضل استخدام إعادة التوجيه. إذا فهمت الفرق في عملهم، فلن تخطئ في اختيارك. يبدو رمز 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 بمزيد من التفاصيل، فيمكنك قراءة المواصفات الرسمية . الجزء 6. حاويات Servlet الجزء 7. مقدمة لنمط MVC (Model-View-Controller) الجزء 8. كتابة تطبيق صغير في Spring-Boot
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION