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