سلام، همه! شما با servlet ها به عنوان یک مفهوم اساسی توسعه وب آشنا می شوید و می توانید یک برنامه کاربردی ساده بنویسید که از آنها استفاده می کند.
برای جلوگیری از اقدامات غیر ضروری، ما از ابتدا شروع نمی کنیم. ما به کار بر روی برنامه خود از مقاله قبلی خود در مورد Hibernate
ادامه خواهیم داد . اما از آنجایی که ما تازه شروع به آشنایی با servlet ها کرده ایم، همه چیز مربوط به کلاس Auto را از برنامه حذف کردم و فقط کلاس User و اقدامات مربوط به آن را باقی گذاشتم. ساختار پروژه به این صورت خواهد بود:
بنابراین، servlets! ویکیپدیا میگوید: "سرولت جاوا یک جزء نرمافزار جاوا است که قابلیتهای یک سرور را گسترش میدهد. اگرچه سرولتها میتوانند به انواع مختلفی از درخواستها پاسخ دهند، اما معمولاً کانتینرهای وب را برای میزبانی برنامههای کاربردی وب بر روی سرورهای وب پیادهسازی میکنند و بنابراین به عنوان یک سرور واجد شرایط هستند. side servlet web API." این دقیقا درست است. در اینجا برای اولین بار با مفهوم «معماری برنامه کاربردی سرویس گیرنده-سرور» مواجه می شویم. در هسته خود بسیار ساده است. مشتری با ارسال یک درخواست HTTP به سرور دسترسی پیدا می کند. سرور داده های لازم را تولید می کند (به عنوان مثال، آن را از پایگاه داده واکشی می کند) و آن را به مشتری برمی گرداند. ساده ترین مثال زمانی است که روی دکمه "دوستان" در یک شبکه اجتماعی خاص کلیک می کنید و در نتیجه درخواستی را به سرور ارسال می کنید. سرور لیست دوستان شما را در پایگاه داده به روز می کند و آن را به شما (کلاینت) برمی گرداند. فهرست درخواستهای HTTP بسیار بزرگ است، بنابراین اگر قبلاً با آنها برخورد نکردهاید، بهتر است در مورد آنها در جای دیگری، به عنوان مثال، اینجا
بخوانید . هدف ما این است که: ایجاد یک برنامه CRUD با استفاده از servlets. برنامه باید قادر به ایجاد، خواندن، به روز رسانی و حذف کاربران از پایگاه داده با استفاده از یک سرورلت باشد که درخواست های HTTP را پردازش می کند. برنامه ما از مقاله Hibernate قبلاً می توانست این کار را انجام دهد، اما مستقیماً از کد جاوا و به طور دقیق تر از روش main() کنترل می شد. این بار این مشتری است که درخواست ها را ارسال می کند، یعنی شما :) اولین کاری که باید انجام دهیم این است که وابستگی های جدید را به فایل pom.xml خود اضافه کنیم.
یک پیکربندی جدید ایجاد کنید
و "Tomcat Server Local" را انتخاب کنید. در تب "Application Server" مسیر پوشه Tomcat را مشخص کنید
، سپس به تب "Deployment" بروید.
در اینجا، ما استقرار برنامه خود را در سرور محلی پیکربندی می کنیم. "+" را فشار دهید، "Artifact" -> YourProjectName:war را انتخاب کنید (ما برنامه را در یک فایل جنگی خواهیم ساخت).
و این در مورد آن را خلاصه می کند! در صفحه "سرور" می بینید که برنامه ما در http://localhost:8080/ اجرا می شود. پیکربندی را ذخیره کنید و نامی برای آن بگذارید (من پیکربندی خود را "Tommy" می نامم). بعد، در تب Maven در IDEA (در سمت راست)، از افزونه war برای ساختن پروژه خود در یک فایل جنگی (Plugins -> war -> war: war) استفاده می کنیم.
پس از اتمام ساخت، برنامه را اجرا کرده و منتظر بمانید. موفقیت! صفحه شروع راه اندازی شد. اکنون روی دکمه "شروع کار با پایگاه داده" کلیک می کنیم. index.jsp ما یک درخواست GET ایجاد می کند که توسط سرور پردازش می شود. سرور یک پاسخ تولید می کند و آن را در قالب لیستی از تمام کاربران موجود به ما برمی گرداند (البته با فرض وجود کاربران در پایگاه داده). و آنجا هستند! که شما آن را دارید! شما اولین برنامه خود را با استفاده از سرورهای جاوا نوشتید.
این خیلی بد نبود، نه؟ :) برای انجام تکالیف، می توانید عملکرد ماشین را از مقاله قبلی
بازیابی کنید . به عبارت دیگر، یک سرور مجزا و صفحات JSP برای اتومبیل ها ایجاد کنید و به برنامه آموزش دهید که چگونه اتومبیل های کاربر را لیست کند، اتومبیل های جدید را به کاربر اضافه کند و آنها را ویرایش و حذف کند. PS Servlets و JavaServer Pages فن آوری های نسبتاً قدیمی هستند. در اینترنت، اغلب می توانید نظراتی مانند "چه کسی به این آشغال قدیمی نیاز دارد؟" پاسخ بسیار ساده است: عمدتاً افرادی که روی پروژه های واقعی کار می کنند، جایی که ممکن است با کدهای زیادی مواجه شوند که از این فناوری ها استفاده می کند. و حتی بدون درک نحوه کارکرد آن، باز هم تبدیل کردن «آشغالهای قدیمی» به چیزهای جدید سرگرمکننده است :) برای مطالعه دقیقتر JSP و servlets، میتوانید به کتاب «Head First Servlets and JSP»
مراجعه کنید . این کتاب توسط همان نویسندگان کتاب فوق العاده معروف "Head First Java" نوشته شده است که بسیاری آن را به عنوان ضمانت کیفیت در نظر می گیرند :) امیدوارم این مقاله مفید بوده باشد! با تشکر از توجه شما، و موفق باشید در یادگیری!


<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 باید پیاده سازی هایی را برای این روش ها فراهم کند. اگر درخواستی برای یک handler وارد شود که پیادهسازی نشده باشد، متد کلاس والد فراخوانی میشود و معمولاً یک خطا را به درخواستکننده برمیگرداند.
- اگر کانتینر نیاز به حذف سرورلت داشته باشد، متد ()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 همزمان هستند: doPost()، doGet()، doPut() و doDelete(). آنها به ما اجازه میدهند کاربران را بسازیم، بخوانیم، بهروزرسانی کنیم و حذف کنیم. متدها نمونه هایی از کلاس های javax.servlet.http.HttpServletRequest و javax.servlet.http.HttpServletResponse را به عنوان ورودی می پذیرند، یعنی درخواست های ارسال شده به سرور و پاسخ های دریافت شده توسط مشتری. در داخل، متدها متدهای مربوط به کلاس UserService را فراخوانی میکنند و یک پاسخ برای کلاینت تولید و به آدرس /users هدایت میشود. به عنوان مثال، در متد doGet() لیستی از تمام کاربران دریافت می کنیم. در مرحله بعد، یک شی RequestDispatcher ایجاد می کنیم که به ما امکان می دهد اشیاء را در یک درخواست HTTP قرار دهیم و آن را به یک منبع خاص هدایت کنیم (مثلاً به صفحه JSP مشتری). در متد doPut() (که دادههای کاربر را بهروزرسانی میکند)، یک درخواست HTTP را پردازش میکنیم، شناسه، نام و پارامترهای سن را استخراج میکنیم، کاربر را با شناسه مشخص شده پیدا میکنیم، نام و سن آن را در درخواست به آن اختصاص میدهیم و برمیگردانیم. به صفحه /users. اما برای اینکه همه این روش ها به درستی کار کنند، باید servlet را پیکربندی کنیم. برای این کار از فایل 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) ایجاد کنیم. سپس نقشه servlet کاربر "/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>Hello!</title>
</head>
<body>
If you want to start working with the user database,<br>
click the button below:
<form action = "users" method="get">
<input type="submit" value="Start working with database">
</form>
</body>
</html>
addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Add new user</title>
</head>
<body>
<form action = "/users" method="post">
<input required type="text" name="name" placeholder="Name">
<input required type="text" name="age" placeholder="Age">
<input type="submit" value="Save">
</form>
</body>
</html>
deleteUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Delete user</title>
</head>
<body>
Are you sure you want to delete the user ${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="Delete">
</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>User list</title>
</head>
<body>
<table border="2">
<tr>
<td>ID</td>
<td>Name</td>
<td>Age</td>
<td>Actions</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="Modify" style="float:left">
</form>
<form action="deleteUser.jsp" method="post">
<input type="hidden" name="id" value="${user.getId()}">
<input type="submit" value="Delete" style="float:left">
</form></td>
</tr>
</c:forEach>
</table>
<form action = "addUser.jsp">
<input type="submit" value="Add new user">
</form>
</body>
</html>
updateUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Modify user data</title>
</head>
<body>
Edit user
<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="Update">
</form>
</body>
</html>
یک صفحه JSP (صفحه جاوا سرور) شامل دو نوع متن است: داده های منبع ثابت که می توانند به صورت متن قالب بندی شوند (HTML، SVG، WML یا XML)، و عناصر JSP که برای ساخت محتوای پویا استفاده می شوند. برای اینکه بفهمید صفحه JSP چیست، بخشی از یک مقاله بسیار خوب را کپی کردم. اساساً، اولین باری که یک JSP درخواست میشود، به یک سرورلت تبدیل میشود و بهعنوان یک سرورلت عمل میکند. درک این موضوع بسیار مهم است. یک صفحه JSP مانند یک صفحه HTML نیست - یک برنامهنویس مبتدی باید به وضوح بفهمد که این یک سرورلت دیگر است. - فقط باید بنویسید که چگونه نمایش داده می شود برنامه ریزی کنید. می توان آن را به سادگی ترسیم کرد. و در صورت لزوم داده ها را اضافه کرد. اما از آنجا که یک صفحه JSP یادآور HTML است، طراح به وضوح آن را آسان تر خواهد کرد. و یک بار دیگر. به شدت برای مبتدیان تاکید کنید، یک صفحه JSP یک SERVLET است . این صفحه شامل اضافه کردن تمام داده ها در سرور تولید می شود. اینجا جایی است که همه داده ها درج می شوند. و در مرورگر، کاربر صفحه HTML تمام شده را دریافت می کند که دارای آن است. نه نشانه های جاوا." شما می توانید مطمئن باشید که یک صفحه JSP واقعا یک servlet است، زیرا هر صفحه یک متد دارد که باید اجرا شود. به عنوان مثال، index.jsp نشان می دهد که وقتی روی دکمه "شروع کار با پایگاه داده" کلیک می کنید، متد get اجرا می شود (روش = "get"). صفحه addUser.jsp که وظیفه ایجاد کاربران جدید را بر عهده دارد، با کلیک بر روی دکمه ذخیره، روش ارسال (روش = "پست") را اجرا می کند. بقیه صفحه JSP از نشانه گذاری HTML ایستا معمولی تشکیل شده است، بنابراین ما در مورد آن صحبت نمی کنیم. این موضوع برای مقاله دیگری است و موارد زیادی در مورد این موضوع در اینترنت وجود دارد. بنابراین، ما برنامه خود را ایجاد کرده ایم! اکنون باید آن را در عمل آزمایش کنیم! برای انجام این کار، به کانتینر سرولت آپاچی تامکت که در بالا ذکر شد نیاز داریم. شما می توانید ظرف را از وب سایت رسمی
دانلود کنید (من از نسخه 8 استفاده می کنم). در مرحله بعد، باید یک پیکربندی در IDEA ایجاد کنیم تا برنامه خود را از طریق Tomcat اجرا کنیم. برای انجام این کار، تب "Edit Configurations" را باز کنید، 






GO TO FULL VERSION