سلام به همه! در این مقاله با مفهوم اولیه توسعه وب سرورلت ها آشنا می شوید و می توانید با استفاده از آنها یک برنامه کاربردی ساده بنویسید. برای جلوگیری از اقدامات غیر ضروری، ما از ابتدا شروع نمی کنیم و به کار بر روی برنامه خود از مقاله قبلی خود در مورد Hibernate ادامه می دهیم . با این حال، از آنجایی که ما به تازگی شروع به کار با servlets کردهایم، همه چیز مربوط به کلاس Auto را از برنامه حذف کردم و فقط کلاس User و اقدامات آن را باقی گذاشتم. ساختار پروژه به این صورت خواهد بود: بنابراین، servlets! ویکیپدیا میگوید: "سرولت یک رابط جاوا است که پیادهسازی آن عملکرد سرور را گسترش میدهد. یک سرولت از طریق یک اصل درخواست-پاسخ با مشتریان تعامل دارد." و در واقع همینطور است. در اینجا ابتدا با مفهوم “معماری اپلیکیشن مشتری-سرور” مواجه می شویم. ماهیت آن بسیار ساده است و در یک تصویر ( از اینجا گرفته شده ) قرار می گیرد.
مشتری با ارسال یک درخواست HTTP با سرور تماس می گیرد. سرور داده های لازم را تولید می کند (مثلاً آن را از پایگاه داده دریافت می کند) و آن را به مشتری برمی گرداند. ساده ترین مثال: در یک شبکه اجتماعی خاص، روی دکمه "دوستان" کلیک می کنید و بنابراین درخواستی را به سرور ارسال می کنید. سرور لیست دوستان شما را در پایگاه داده بررسی می کند و آن را به شما (کلاینت) برمی گرداند. لیست درخواست های HTTP بسیار بزرگ است، اما اگر تا به حال با آنها برخورد نکرده اید، برای درک بهتر بهتر است در مورد آنها، به عنوان مثال، در اینجا بخوانید . وظیفه ما این است که: ایجاد یک برنامه CRUD با استفاده از servlets. برنامه باید بتواند با استفاده از یک سرورلت که درخواست های HTTP را پردازش می کند، کاربران را از پایگاه داده ایجاد، اصلاح و حذف کند. برنامه ما از مقاله Hibernate قبلاً می دانست که چگونه این کار را انجام دهد، اما مستقیماً از کد جاوا و به طور دقیق تر از روش main() کنترل می شد. در اینجا درخواست ها توسط مشتری، یعنی شما ارسال می شود :) اولین کاری که باید انجام دهیم این است که وابستگی های جدید را به فایل pom.xml خود اضافه کنیم.
<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>com.itis4</groupId>
<artifactId>UsersDaoProject</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
</plugin>
</plugins>
</build>
<dependencies>
<!-- PostgreSQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1212.jre7</version>
</dependency>
<!-- Hibernate 5.2.6 Final -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.6.Final</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
</dependencies>
</project>
ما 3 وابستگی اضافه کرده ایم:
- خود کتابخانه javax.servlet-api.
- کتابخانه تگ JSTL. برای ایجاد سمت مشتری، یعنی صفحات JSP، مورد نیاز است.
- Spring-WebMVC. ما به یک کلاس Spring نیاز داریم که کمی بعد در مورد آن صحبت خواهیم کرد.
- اگر سرولت در ظرف نباشد.
- کلاس servlet توسط کانتینر بارگذاری می شود.
- ظرف نمونه ای از کلاس servlet را ایجاد می کند.
- ظرف متد init() را فراخوانی می کند. این متد سرولت را مقدار دهی اولیه می کند و قبل از اینکه سرورلت بتواند درخواست سرویس دهی کند، ابتدا فراخوانی می شود. متد init() تنها یک بار در طول چرخه عمر خود فراخوانی می شود.
- ارائه درخواست مشتری هر درخواست در رشته جداگانه خود پردازش می شود. ظرف برای هر درخواست متد service() را فراخوانی می کند. این روش نوع درخواست ورودی را تعیین می کند و آن را برای پردازش درخواست در روش مربوط به این نوع توزیع می کند. توسعه دهنده servlet باید پیاده سازی هایی را برای این روش ها فراهم کند. اگر درخواستی دریافت شود که متدی برای آن پیادهسازی نشده باشد، متد کلاس والد فراخوانی میشود و معمولاً با یک خطا به درخواستکننده بازگردانده میشود.
- در صورتی که کانتینر نیاز به حذف یک servlet داشته باشد، متد ()struct را فراخوانی می کند که سرورلت را از سرویس حذف می کند. مانند متد ()init، این متد نیز یک بار در کل چرخه servlet فراخوانی می شود.
package servlets;
import models.User;
import services.UserService;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class UserSimpleServlet extends HttpServlet {
private UserService service = new UserService();
public void init(ServletConfig servletConfig) {
try {
super.init(servletConfig);
} catch (ServletException e) {
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> users = service.findAllUsers();
req.setAttribute("users", users);
RequestDispatcher dispatcher = req.getRequestDispatcher("/showUsers.jsp");
dispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = req.getParameter("name");
int age = Integer.parseInt(req.getParameter("age"));
User user = new User(name, age);
service.saveUser(user);
resp.sendRedirect("/users");
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = Integer.parseInt(req.getParameter("id"));
User user = service.findUser(id);
user.setName(req.getParameter("name"));
user.setAge(Integer.parseInt(req.getParameter("age")));
service.updateUser(user);
resp.sendRedirect("/users");
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
int id = Integer.parseInt(req.getParameter("id"));
service.deleteUser(service.findUser(id));
resp.sendRedirect("/users");
}
}
همانطور که می بینید، شامل متد init () است که در بالا توضیح داده شد و 4 متد را پیاده سازی می کند که با چهار درخواست HTTP همزمان هستند - doGet()، doPost()، doPut() و doDelete(). هر یک از آنها به ترتیب به ما اجازه می دهد تا کاربران را دریافت، ایجاد، ویرایش و حذف کنیم. متدها به عنوان اشیاء ورودی کلاسهای javax.servlet.http.HttpServletRequest و javax.servlet.http.HttpServletResponse هستند - یعنی درخواست ارسال شده به سرور و پاسخی که مشتری دریافت میکند. در داخل متدها، متدهای لازم از کلاس UserService اجرا می شود، یک پاسخ برای کلاینت ایجاد می شود و سپس به آدرس /users هدایت می شود. به عنوان مثال، در متد doGet() لیستی از تمام کاربران دریافت می کنیم. در مرحله بعد، یک شی از کلاس RequestDispatcher ایجاد می کنیم که به ما امکان می دهد اشیاء را در یک درخواست Http قرار دهیم و همچنین آن را به یک منبع خاص هدایت کنیم (مثلاً یک صفحه JSP مشتری). در متد doPut() (به روز رسانی داده های کاربر)، درخواست HTTP را پردازش می کنیم، شناسه، نام و پارامترهای سن را از آن استخراج می کنیم، کاربر را با شناسه مشخص شده پیدا می کنیم، نام و سنی را که با او همراه شده است به او اختصاص می دهیم. درخواست کنید و به صفحه /users بازگردید. با این حال، برای اینکه همه این روش ها به درستی کار کنند، باید سرورلت را پیکربندی کنیم. برای این کار از فایل web.xml در پوشه WEB-INF استفاده می کنیم.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>UserSimpleServlet</servlet-name>
<servlet-class>servlets.UserSimpleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserSimpleServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<servlet-name>UserSimpleServlet</servlet-name>
</filter-mapping>
</web-app>
همه تگ های این فایل در اصل شهودی هستند، اما اجازه دهید آنها را به صورت متوالی مرور کنیم. <welcome-file-list> - صفحه شروع JSP مشخص شده است که ابتدا با راه اندازی برنامه باز می شود. در مورد ما، این صفحه index.jsp است. <servlet> - ثبت نام کلاس UserSimpleServlet ما به عنوان servlet. <servlet-mapping> یک تگ بسیار مهم است. URL هایی را تعریف می کند که توسط servlet پردازش می شوند. در مورد ما، اینها همه URL هستند، بنابراین ما به سادگی "/" را نشان می دهیم. اما، به عنوان مثال، اگر ما یک برنامه کاربردی با کاربران و ماشین های آنها داشتیم، می توانیم سرور دوم را ایجاد کنیم - SimpleAutoServlet. سپس نگاشت سرویس سرور کاربر «/users» (یعنی درخواستهای مربوط به پردازش کاربران) و برای سرولت خودکار «/autos» خواهد بود. و در نهایت، <filter>. در داخل یک شی از کلاس org.springframework.web.filter.HiddenHttpMethodFilter را تعریف می کند. مقاله مربوط به بهار نیست، بنابراین من در مورد آن با جزئیات صحبت نمی کنم. بگذارید فقط بگویم که فقط به عنوان یک ویژگی اضافی به برنامه ما پیوست شده است. نکته این است که ما از صفحات JSP برای ایجاد سمت مشتری استفاده خواهیم کرد. داده های ما در صفحه به صورت جدولی با لیستی از کاربران نمایش داده می شود. در داخل صفحات JSP، از تگ های HTML <form/> استفاده خواهد شد. و فقط درخواست های HTTP GET و POST می توانند برای ارسال داده ها از <form/> استفاده شوند. یعنی برای هر سه عملیات - به روز رسانی، حذف و ایجاد کاربر - باید فقط از درخواست های POST استفاده کنیم. استفاده از درخواستهای PUT و DELETE برای ما در دسترس نخواهد بود. و در اصل، این کاملاً عادی است و پیاده سازی آن آسان است، اما کلاس HiddenHttpMethodFilter به ما امکان استفاده از آنها را می دهد. این باعث می شود که تفاوت بین عملیات در برنامه برای خواننده واضح تر شود. در نهایت، اجازه دهید به سمت مشتری حرکت کنیم. توسط پنج صفحه JSP نشان داده شده است. index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Здравствуйте!</title>
</head>
<body>
Если вы хотите начать работу с базой данных пользователей - <br>
нажмите кнопку ниже:
<form action = "users" method="get">
<input type="submit" value="Начать работу с базой данных">
</form>
</body>
</html>
addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Добавить нового пользователя</title>
</head>
<body>
<form action = "/users" method="post">
<input required type="text" name="name" placeholder="Name">
<input required type="text" name="age" placeholder="Возраст">
<input type="submit" value="Сохранить">
</form>
</body>
</html>
deleteUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Удалить пользователя</title>
</head>
<body>
Вы действительно хотите удалить пользователя ${param.id}?
&lform action="/users/${param.id}" method="post">
<input type="hidden" name="id" value="${param.id}">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="Удалить">
</form>
</body>
</html>
showUsers.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Список пользователей</title>
</head>
<body>
<table border="2">
<tr>
<td>ID</td>
<td>Name</td>
<td>Возраст</td>
<td>Действия</td>
</tr>
<c:forEach items="${users}" var = "user">
<tr>
<td>${user.getId()}</td>
<td>${user.getName()}</td>
<td>${user.getAge()}</td>
<td>
<form action = "updateUser.jsp" method="post">
<input type="hidden" name="id" value="${user.getId()}">
<input type="hidden" name="name" value="${user.getName()}">
<input type="hidden" name="age" value="${user.getAge()}">
<input type="submit" value="Изменить" style="float:left">
</form>
<form action="deleteUser.jsp" method="post">
<input type="hidden" name="id" value="${user.getId()}">
<input type="submit" value="Удалить" style="float:left">
</form></td>
</tr>
</c:forEach>
</table>
<form action = "addUser.jsp">
<input type="submit" value="Добавить нового пользователя">
</form>
</body>
</html>
updateUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Изменить данные пользователя</title>
</head>
<body>
Редактировать пользователя
<form action="/users/${param.id}" method="post">
<input type="hidden" name = "id" value="${param.id}">
<input type="text" name="name" value="${param.name}" placeholder=${param.name}>
<input type="text" name="age" value="${param.age}" placeholder=${param.age}>
<input type="hidden" name="_method" value="put">
<input type="submit" value="Обновить">
</form>
</body>
</html>
یک صفحه JSP (صفحه سرور جاوا) شامل دو نوع متن است: داده های منبع ثابت، که می تواند در یکی از قالب های متنی (HTML، SVG، WML یا XML) باشد و عناصر JSP که محتوای پویا را می سازند. برای اینکه بفهمم JSP چیست، به خودم اجازه میدهم قطعهای از یک مقاله بسیار خوب توسط یک نویسنده را کپی و پیست کنم ( از اینجا ). "در اصل، JSP اولین باری که به آن دسترسی پیدا می شود به یک سرورلت تبدیل می شود و به عنوان یک سرورلت کار می کند. درک این موضوع بسیار مهم است. JSP صفحه ای مانند صفحه HTML نیست - برای یک برنامه نویس مبتدی مهم است که به وضوح درک کند که این سرورلت دیگری است - شما فقط نیازی به برنامه نویسی خروجی آن ندارید. می توانید آن را به سادگی ترسیم کنید و داده ها را در مکان های مناسب جایگزین کنید. اما از آنجایی که صفحه JSP حداقل تا حدودی شبیه HTML است، واضح است که برای طراح آسان تر خواهد بود. و من یک بار دیگر به شدت به مبتدیان می گویم - JSP یک SERVLET است . با تمام داده های روی سرور آماده می شود. اینجاست که تمام داده ها درج می شود. و کاربر یک صفحه HTML آماده در مرورگر دریافت می کند که این کار را نمی کند. هر گونه نشانه ای از JAVA وجود دارد." شما خودتان می توانید ببینید که صفحه JSP در واقع یک servlet است، زیرا هر صفحه حاوی متدی است که باید اجرا شود. به عنوان مثال، صفحه شروع index.jsp بیان می کند که وقتی روی دکمه "شروع کار با پایگاه داده" کلیک می کنید، روش "get" اجرا می شود. در صفحه addUser.jsp که وظیفه ایجاد یک کاربر جدید را بر عهده دارد، با کلیک بر روی دکمه ذخیره، متد="پست" اجرا می شود. بقیه JSP از نشانه گذاری HTML ایستا معمولی تشکیل شده است، بنابراین ما در مورد آنها با جزئیات صحبت نمی کنیم - این موضوع یک مقاله جداگانه است که تعداد زیادی از آنها در اینترنت وجود دارد. بنابراین، ما برنامه خود را ایجاد کرده ایم، تنها چیزی که باقی می ماند این است که آن را در عمل آزمایش کنیم! برای انجام این کار به کانتینر سرولت آپاچی تامکت که در بالا ذکر شد نیاز داریم. شما می توانید گربه را از وب سایت رسمی دانلود کنید (من از نسخه 8 استفاده می کنم). در مرحله بعد، باید یک پیکربندی در IDEA ایجاد کنیم تا برنامه خود را از طریق Tomcat اجرا کنیم. برای انجام این کار، تب "Edit Configurations" را باز کنید، یک پیکربندی جدید ایجاد کنید و Tomcat Server Local را انتخاب کنید. در تب Application Server مسیر پوشه ای که Tomcat در آن قرار دارد را مشخص کنید سپس به تب Deployment بروید. در اینجا ما استقرار برنامه خود را در یک سرور محلی پیکربندی می کنیم. روی "+" کلیک کنید، "Artifact" را انتخاب کنید -> نام پروژه شما: war (ما برنامه را در یک فایل جنگی جمع می کنیم). اساساً همین است! در صفحه "سرور" می توانید ببینید که همان برنامه در "http://localhost:8080/" اجرا می شود. این پیکربندی را ذخیره کنید و نامی برای آن بگذارید (نام پیکربندی من "Tommy" است). در مرحله بعد، در تب Maven در IDEA (در سمت راست) از افزونه war برای ساختن پروژه خود در یک فایل جنگی استفاده می کنیم (Plugins -> war -> war:war). موفقیت! صفحه شروع راه اندازی شد. اکنون روی دکمه "شروع کار با پایگاه داده" کلیک کنید. صفحه JSP index.jsp ما یک درخواست GET ایجاد می کند که توسط سرور پردازش می شود. سرور یک پاسخ تولید می کند و آن را در قالب لیستی از همه کاربران موجود (البته اگر در پایگاه داده باشند) به ما برمی گرداند. و اینجا هستند! بیایید سعی کنیم یکی از کاربران را حذف کنیم: این نیز کار می کند! بنابراین ما اولین برنامه خود را با استفاده از servlets نوشتیم. همانطور که می بینید، معلوم شد که همه چیز چندان دشوار نیست :) به عنوان تکلیف، می توانید به عنوان مثال، عملکرد کار با ماشین ها را از مقاله قبلی به برنامه بازگردانید. آن ها یک servlet و صفحات jsp جداگانه برای ماشین ها ایجاد کنید و به برنامه ما آموزش دهید تا لیستی از ماشین های کاربر را نمایش دهد، ماشین های جدید را به او اضافه کند و همچنین آنها را ویرایش و حذف کند. PS Servlets و JSP فن آوری های کاملاً قدیمی هستند و در اینترنت اغلب می توانید نظراتی با روحیه "چه کسی به این آشغال ها نیاز دارد" پیدا کنید. پاسخ بسیار ساده است - در درجه اول برای کسانی که روی پروژه های واقعی کار می کنند مورد نیاز است، که در آن ممکن است کدهای زیادی با استفاده از آنها نوشته شود. و اره کردن "چیزهای قدیمی" به چیزهای جدید، بدون درک نحوه عملکرد آن، هنوز هم لذت بخش است :) برای مطالعه دقیق تر موضوع JSP و servlets، می توانید از کتاب "Head First Servlets and JSP" استفاده کنید (در فقط انگلیسی). توسط همان نویسندگان کتاب فوق العاده معروف "Head First Java" نوشته شده است که برای بسیاری می تواند تضمین کننده کیفیت باشد :) امیدوارم این مقاله برای خوانندگان مفید بوده باشد! اگر مایل به دیدن مقالات جدید هستید، حمایت از نویسنده در مسابقه توسط "لایک" او را فراموش نکنید. یا بهتر از آن - "من آن را خیلی دوست دارم" :) از توجه شما متشکرم و در مطالعات خود موفق باشید!
GO TO FULL VERSION