سرولت چیست؟
ابتدا بیایید بفهمیم servlets چیست و چرا اغلب در مورد آنها می شنوید. Java Servlet API یک API استاندارد شده است که برای پیاده سازی روی سرور در نظر گرفته شده است. بر اساس یک طرح درخواست-پاسخ با مشتریان تعامل دارد. servlet کلاسی است که می تواند درخواست های مشتری را دریافت کند و پاسخ ها را به مشتری برگرداند . در واقع سرولت ها دقیقاً بلوک های ساختمانی هستند که برای ایجاد معماری سرویس گیرنده-سرور در جاوا استفاده می کنیم. شاید به خاطر داشته باشید که قبلاً در یکی از مقالات این مجموعه در مورد آن معماری صحبت کردیم. ما قرار نیست دور بوش بزنیم: بیایید فوراً کدی بنویسیم.آنچه برای ایجاد یک برنامه وب نیاز دارید
برای راحتی بیشتر هنگام کار با سرورهای جاوا، به 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>
کلاس سرولت ساده:
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) را که در کانتینر مستقر می شود، مشخص کنیم. می توانید روی دکمه Fix کلیک کنید و war exploded را انتخاب کنید : این بدان معناست که پس از بازسازی پروژه، آرتیفکت به طور خودکار در ظرف servlet قرار می گیرد.
-
مقدار پیش فرض برای زمینه برنامه servlets_war_exploded است . این بدان معناست که ما به برنامه در آدرس زیر دسترسی داریم: http://localhost:8080/servlets_war_exploded .
چرا متن اضافی می خواهیم؟ بیایید موارد غیر ضروری را حذف کنیم. اکنون آدرس برنامه وب ما این است: http://localhost:8080 .
-
روی OK کلیک کنید. می بینیم که اکنون می توانیم برنامه را راه اندازی کنیم:
اکنون وقتی برنامه را در مرورگر خود باز می کنید، باید با خطای 404 مواجه شوید. این منطقی است، زیرا آدرس http://localhost:8080/ به یک سرور نیاز دارد که به "/" نگاشت شود، اما تنها سرور ما به "/hello" نگاشت می شود .
-
ما می توانیم در http://localhost:8080/hello به آن دسترسی داشته باشیم . هنگامی که این کار را انجام دادیم، پاسخ مورد انتظار را دریافت می کنیم - رشته "Hello"!
@WebServlet()
حاشیه نویسی را نشان می دهیم. اینجا جایی است که ما سرورلت را به یک مسیر خاص ("/hello") متصل می کنیم (یا نقشه برداری می کنیم). این حاشیهنویسی فقط در Java Servlet API 3.0 ظاهر شد، بنابراین اینترنت نمونههای زیادی دارد که در آن نقشهبرداری سرولت از طریق یک فایل 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()
null را برمی گرداند، بنابراین باید null را بررسی کنیم. در مورد پارامترهای درخواست هم همینطور. اگر کاربر پارامتر نام کاربری را پاس نکند، مقدار آن null خواهد بود. در این صورت به کاربر به عنوان بازدیدکننده ناشناس سلام می کنیم. برای ارسال یک پارامتر در درخواست GET، از یک query string استفاده می شود، به عنوان مثال، می توانیم از URL زیر استفاده کنیم: http:// localhost:8080/hello?
نام کاربری = پل. در مقاله قبلی
این مجموعه می توانید اطلاعات بیشتری در مورد درخواست های HTTP بخوانید . برنامه ما در حال حاضر منطق زیادی ندارد، اما کمی آزاردهنده است که در مسیر ریشه با خطای 404 مواجه می شویم. برای رفع این مشکل، ما یک servlet دیگر ایجاد می کنیم و آن را به صفحه شروع نگاشت می کنیم: @WebServlet("/")
. هدف این سرورلت هدایت درخواست ها به مسیر "/hello" است. دو راه برای انجام این کار وجود دارد: استفاده از "forward" یا "redirect". شاید ارزش درک تفاوت بین آنها را داشته باشد. فوروارد پردازش درخواست را به سرور دیگری در سرور واگذار می کند . مشتری درگیر نیست. برای انجام این کار، کد زیر را به متد ()doGet جدید servlet اضافه کنید:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
در این کد، به متن سرولت دسترسی پیدا می کنیم، توزیع کننده درخواست سرور مربوطه را دریافت می کنیم و از آن می خواهیم که یک درخواست خاص را با آرگومان های مشخص شده (req، resp) پردازش کند. ریدایرکت آدرسی را که کلاینت باید برای پردازش درخواست خود از آن استفاده کند به مشتری برمی گرداند. اکثر مرورگرها به طور خودکار به URL برگشتی هدایت می شوند. برای اجرای تغییر مسیر، باید این کد را اضافه کنید:
resp.sendRedirect(req.getContextPath() + "/hello");
redirect()
متد را روی پارامتر فراخوانی می کنیم HttpServletResponse
و آدرسی را که مشتری باید استفاده کند به آن ارسال می کنیم. در اینجا یک جزئیات مهم وجود دارد: پارامترهای HTTP نیز باید در انتهای مسیر تغییر مسیر کامل اضافه شوند، که خیلی راحت نیست. در شرایط ما، استفاده از آن ارجح است forward
، اما گاهی اوقات استفاده redirect
بهتر است. اگر تفاوت عملکرد آنها را درک کنید، انتخاب اشتباهی نخواهید داشت. کد سرور جدید به صورت زیر است:
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