ما هو السيرفلت
أولاً، دعونا نتعرف على ما هو servlet ولماذا تسمع عنه كثيرًا. Java Servlet API هي واجهة برمجة تطبيقات موحدة مصممة للتنفيذ على الخادم والعمل مع العميل باستخدام نظام الاستجابة للطلب. servlet هي فئة يمكنها تلقي الطلبات من العميل وإرجاع الاستجابات إليها. نعم، إن servlets في Java هي على وجه التحديد العناصر التي تم بناء بنية خادم العميل بها. إذا كنت تتذكر، فقد تحدثنا بالفعل عن ذلك في إحدى المقالات في السلسلة. دعونا لا نتجول في الأدغال: فلنكتب بعض التعليمات البرمجية على الفور.ما تحتاجه لإنشاء تطبيق ويب
للعمل بشكل مريح مع servlets في Java، ستحتاج إلى Intellij IDEA Ultimate Edition. إنه مدفوع، ولكن يمكنك تفعيل فترة تجريبية مدتها 30 يومًا أو استخدام إصدار الوصول المبكر - فهو دائمًا مجاني. قم أيضًا بتثبيت خادم التطبيقات الخاص بنا - Apache Tomcat. Tomcat عبارة عن حاوية servlet: وهي الحاوية التي تعالج الطلبات الواردة من الخارج وتمررها إلى تطبيقنا. يمكنك تنزيل Tomcat من هذا الرابط .إنشاء أول تطبيق ويب
إذا كان كل شيء جاهزًا، فلنقم بإنشاء مشروع Maven. إذا لم تكن على دراية بـ Maven، انتبه إلى المقالة السابقة . لنبدأ!-
في 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(); } }
-
لتشغيل التطبيق، تحتاج إلى إنشاء تكوين Tomcat:
-
بعد ذلك، نشير إلى إصدار Tomcat الذي سنستخدمه، وعنوان URL الذي يمكننا من خلاله الوصول إلى الخادم، والمنفذ. يجب أن تحصل على شيء مثل هذا:
-
كل ما تبقى هو تحديد القطعة الأثرية (المشروع المجمع في أرشيف الجرة)، والتي سيتم نشرها في الحاوية. يمكنك النقر فوق الزر "إصلاح" وتحديد "الحرب المنفجرة ": وهذا يعني أنه بعد إعادة بناء المشروع، سيتم وضع القطعة الأثرية تلقائيًا في حاوية servlet.
-
يتم تعيين سياق التطبيق على servlets_war_exploded افتراضيًا ، مما يعني أنه يجب الوصول إلى التطبيق على: http://localhost:8080/servlets_war_exploded .
لماذا نحتاج إلى نص إضافي؟ دعونا إزالة الأشياء غير الضرورية. الآن عنوان تطبيقنا هو: http://localhost:8080 .
-
انقر فوق موافق. نرى أن لدينا الآن الفرصة لإطلاق التطبيق:
الآن، عند تشغيل التطبيق، يجب أن يفتح المتصفح ويعرض الخطأ 404. هذا أمر منطقي، لأنه في العنوان http://localhost:8080/ يجب أن يكون هناك servlet مع التعيين "/"، وservlet الوحيد لدينا لديه التعيين "/hello" .
-
نتصل به على http://localhost:8080/hello ونحصل على الاستجابة المتوقعة - السلسلة "Hello"!
العمل مع المعلمات والجلسة
فلنعمل على تحسين 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");
}
}
GO TO FULL VERSION