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