สวัสดีทุกคน! ในบทความนี้ คุณจะคุ้นเคยกับแนวคิดการพัฒนาเว็บขั้นพื้นฐานของเซิร์ฟเล็ต และสามารถเขียนแอปพลิเคชันง่ายๆ โดยใช้สิ่งเหล่านี้ได้ เพื่อหลีกเลี่ยงขั้นตอนที่ไม่จำเป็น เราจะไม่เริ่มต้นใหม่ทั้งหมด และจะดำเนินการกับแอปพลิเคชันของเราต่อไปจากบทความก่อนหน้าของฉันเกี่ยวกับ Hibernate อย่างไรก็ตาม เนื่องจากเราเพิ่งเริ่มต้นใช้งานเซิร์ฟเล็ต ฉันจึงลบทุกอย่างที่เกี่ยวข้องกับคลาส Auto ออกจากแอปพลิเคชัน และเหลือเพียงคลาส User และการดำเนินการเท่านั้น โครงสร้างโปรเจ็กต์จะมีลักษณะดังนี้: ดังนั้น เซิร์ฟเล็ต! วิกิพีเดียกล่าวว่า: "เซิร์ฟเล็ตเป็นอินเทอร์เฟซจาวาที่มีการนำไปใช้ขยายฟังก์ชันการทำงานของเซิร์ฟเวอร์ เซิร์ฟเล็ตโต้ตอบกับไคลเอนต์ผ่านหลักการตอบสนองต่อคำขอ" และก็เป็นเช่นนั้นจริงๆ ที่นี่เราจะพบกับแนวคิดของ "สถาปัตยกรรมแอปพลิเคชันไคลเอนต์-เซิร์ฟเวอร์" ก่อน สาระสำคัญของมันค่อนข้างเรียบง่ายและลงตัวเป็นภาพเดียว (นำมาจาก ที่นี่ )
ไคลเอนต์ติดต่อกับเซิร์ฟเวอร์โดยการส่งคำขอ HTTP เซิร์ฟเวอร์จะสร้างข้อมูลที่จำเป็น (เช่น ได้รับจากฐานข้อมูล) และส่งคืนไปยังไคลเอนต์ ตัวอย่างที่ง่ายที่สุด: บนเครือข่ายโซเชียลบางแห่งคุณคลิกที่ปุ่ม "เพื่อน" แล้วจึงส่งคำขอไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะตรวจสอบรายชื่อเพื่อนของคุณในฐานข้อมูลและส่งคืนให้คุณ (ลูกค้า) รายการคำขอ HTTP มีขนาดค่อนข้างใหญ่ แต่ถ้าคุณไม่เคยพบมาก่อน ดังนั้นเพื่อความเข้าใจที่ดีขึ้น ควรอ่านเกี่ยวกับพวกเขา เช่น ที่นี่ . งานของเราคือ: สร้างแอปพลิเคชัน CRUD โดยใช้เซิร์ฟเล็ต แอปพลิเคชันจะต้องสามารถสร้าง แก้ไข และลบผู้ใช้ออกจากฐานข้อมูลโดยใช้เซิร์ฟเล็ตที่ประมวลผลคำขอ HTTP แอปพลิเคชันของเราจากบทความเกี่ยวกับ Hibernate รู้วิธีการทำเช่นนี้แล้ว แต่มันถูกควบคุมโดยตรงจากโค้ด Java หรือแม่นยำยิ่งขึ้นจากวิธี 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 หนึ่งคลาส ซึ่งเราจะพูดถึงในภายหลัง
- หากไม่มีเซิร์ฟเล็ตในคอนเทนเนอร์
- คลาสเซิร์ฟเล็ตถูกโหลดโดยคอนเทนเนอร์
- คอนเทนเนอร์สร้างอินสแตนซ์ของคลาสเซิร์ฟเล็ต
- คอนเทนเนอร์เรียกเมธอด init() เมธอดนี้จะเตรียมข้อมูลเบื้องต้นให้กับเซิร์ฟเล็ตและถูกเรียกก่อนก่อนที่เซิร์ฟเล็ตจะสามารถรองรับการร้องขอได้ เมธอด init() ถูกเรียกเพียงครั้งเดียวตลอดวงจรการใช้งาน
- ให้บริการตามคำขอของลูกค้า คำขอแต่ละรายการได้รับการประมวลผลในเธรดแยกของตัวเอง คอนเทนเนอร์เรียกใช้เมธอด service() สำหรับแต่ละคำขอ วิธีนี้จะกำหนดประเภทของคำขอที่เข้ามาและกระจายไปยังวิธีที่สอดคล้องกับประเภทนี้เพื่อประมวลผลคำขอ ผู้พัฒนาเซิร์ฟเล็ตต้องจัดเตรียมการใช้งานสำหรับวิธีการเหล่านี้ หากได้รับการร้องขอโดยที่ไม่ได้ใช้เมธอด เมธอดของคลาสพาเรนต์จะถูกเรียกและมักจะจบลงด้วยข้อผิดพลาดที่ส่งคืนไปยังผู้ร้องขอ
- ในกรณีที่คอนเทนเนอร์จำเป็นต้องลบเซิร์ฟเล็ต จะเรียกใช้เมธอด destroy() ซึ่งจะลบเซิร์ฟเล็ตออกจากบริการ เช่นเดียวกับเมธอด init() เมธอดนี้จะถูกเรียกหนึ่งครั้งในระหว่างรอบเซิร์ฟเล็ตทั้งหมด
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 แยกพารามิเตอร์ id ชื่อและอายุจากนั้นค้นหาผู้ใช้ด้วย id ที่ระบุ กำหนดชื่อและอายุที่มาพร้อมกับเขาใน ร้องขอและกลับสู่หน้า /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-mapping> เป็นแท็กที่สำคัญมาก มันกำหนด URL ที่จะประมวลผลโดยเซิร์ฟเล็ต ในกรณีของเรา นี่คือ URL ทั้งหมด ดังนั้นเราจึงระบุเพียง "/" แต่ ตัวอย่างเช่น หากเรามีแอปพลิเคชันที่มีผู้ใช้และเครื่องของพวกเขา เราก็สามารถสร้างเซิร์ฟเล็ตที่สอง - SimpleAutoServlet จากนั้นการแมปสำหรับเซิร์ฟเล็ตผู้ใช้จะเป็น “/users” (นั่นคือ คำขอที่เกี่ยวข้องกับการประมวลผลผู้ใช้) และสำหรับเซิร์ฟเล็ตอัตโนมัติ มันจะเป็น “/autos” และสุดท้าย <ตัวกรอง> มันกำหนดภายในวัตถุของคลาส org.springframework.web.filter.HiddenHttpMethodFilter บทความนี้ไม่เกี่ยวกับ Spring ดังนั้นฉันจะไม่พูดถึงรายละเอียด ฉันขอบอกว่ามันแนบมากับแอปพลิเคชันของเราเป็นคุณสมบัติเพิ่มเติมเท่านั้น ประเด็นก็คือเราจะใช้เพจ JSP เพื่อสร้างฝั่งไคลเอ็นต์ ข้อมูลของเราจะแสดงบนหน้าเป็นตารางพร้อมรายชื่อผู้ใช้ ภายในหน้า JSP จะมีการใช้แท็ก HTML <form/> และมีเพียงคำขอ HTTP GET และ POST เท่านั้นที่สามารถใช้เพื่อส่งข้อมูลจาก <form/> นั่นคือสำหรับการดำเนินการทั้งสามอย่าง - อัปเดต การลบ และการสร้างผู้ใช้ - เราจะต้องใช้เฉพาะคำขอ POST เท่านั้น เราไม่สามารถใช้คำขอ PUT และ DELETE ได้ และตามหลักการแล้ว นี่เป็นเรื่องปกติและง่ายต่อการนำไปใช้ แต่คลาส HiddenHttpMethodFilter ช่วยให้เราสามารถใช้งานได้ สิ่งนี้จะทำให้ผู้อ่านเห็นความแตกต่างระหว่างการดำเนินการในแอปพลิเคชันชัดเจนยิ่งขึ้น สุดท้าย เรามาดูฝั่งไคลเอ็นต์กันดีกว่า มันถูกแสดงด้วยเพจ JSP ห้าเพจ ดัชนี.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>
ลบUser.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 (หน้าเซิร์ฟเวอร์ Java) มีข้อความสองประเภท: ข้อมูลต้นฉบับคงที่ ซึ่งสามารถอยู่ในรูปแบบข้อความรูปแบบใดรูปแบบหนึ่ง (HTML, SVG, WML หรือ XML) และองค์ประกอบ JSP ซึ่งสร้างเนื้อหาแบบไดนามิก เพื่อทำความเข้าใจว่า JSP คืออะไร ฉันจะอนุญาตให้ตัวเองคัดลอกและวางบทความที่ดีมากโดยผู้เขียนคนหนึ่ง ( จากที่นี่ ) "โดยพื้นฐานแล้ว JSP จะถูกแปลงเป็นเซิร์ฟเล็ตในครั้งแรกที่มีการเข้าถึงและทำงานเป็นเซิร์ฟเล็ต สิ่งนี้สำคัญมากที่จะเข้าใจJSP ไม่ใช่เพจเหมือนเพจ HTML - เป็นสิ่งสำคัญสำหรับโปรแกรมเมอร์มือใหม่ที่จะเข้าใจอย่างชัดเจนว่าสิ่งนี้ เป็นเซิร์ฟเล็ตอื่น - คุณเพียงแค่ไม่จำเป็นต้องเขียนโปรแกรมเอาต์พุต คุณสามารถวาด และแทนที่ข้อมูลในตำแหน่งที่ถูกต้อง แต่เนื่องจากหน้า JSP อย่างน้อยก็มีลักษณะคล้ายกับ HTML มันจึงจะง่ายกว่าสำหรับนักออกแบบอย่างเห็นได้ชัด และฉันขอบอกผู้เริ่มต้นอีกครั้งอย่างจริงจัง - JSP คือ SERVLETมันถูกจัดเตรียมด้วยข้อมูลทั้งหมดบนเซิร์ฟเวอร์ นี่คือที่ที่ข้อมูลทั้งหมดถูกแทรก และผู้ใช้จะได้รับหน้า HTML สำเร็จรูปในเบราว์เซอร์ซึ่งไม่ได้ มีสัญญาณของ Java" คุณสามารถเห็นได้ด้วยตัวเองว่าเพจ JSP นั้นเป็นเซิร์ฟเล็ตจริงๆ เนื่องจากแต่ละเพจมีเมธอดที่ต้องดำเนินการ ตัวอย่างเช่น หน้าเริ่มต้น index.jsp ระบุว่าเมื่อคุณคลิกที่ปุ่ม "เริ่มทำงานกับฐานข้อมูล" method="get" จะถูกดำเนินการ ในหน้า addUser.jsp ซึ่งมีหน้าที่สร้างผู้ใช้ใหม่ เมื่อคุณคลิกที่ปุ่มบันทึก method="post" จะถูกดำเนินการ JSP ที่เหลือประกอบด้วยมาร์กอัป HTML แบบคงที่ทั่วไปดังนั้นเราจะไม่เจาะลึกรายละเอียดเหล่านี้ - นี่คือหัวข้อของบทความแยกต่างหากซึ่งมีอยู่มากมายบนอินเทอร์เน็ต ดังนั้นเราจึงสร้างแอปพลิเคชันของเรา สิ่งที่เหลืออยู่คือการทดสอบการใช้งานจริง! ในการดำเนินการนี้ เราจำเป็นต้องมีคอนเทนเนอร์เซิร์ฟเล็ต Apache Tomcat ที่กล่าวถึงข้างต้น คุณสามารถดาวน์โหลด cat ได้จากเว็บไซต์อย่างเป็นทางการ (ฉันใช้เวอร์ชัน 8) ต่อไป เราต้องสร้างการกำหนดค่าใน IDEA เพื่อรันแอปพลิเคชันของเราผ่าน Tomcat ในการดำเนินการนี้ ให้เปิดแท็บ "แก้ไขการกำหนดค่า" สร้างการกำหนดค่าใหม่ และเลือก Tomcat Server Local ในแท็บ Application Server ระบุเส้นทางไปยังโฟลเดอร์ที่ Tomcat ตั้งอยู่ จากนั้นไปที่แท็บ Deployment ที่นี่เรากำหนดค่าการปรับใช้แอปพลิเคชันของเราบนเซิร์ฟเวอร์ภายในเครื่อง คลิก "+" เลือก "สิ่งประดิษฐ์" -> ชื่อโครงการของคุณ: war (เราจะรวบรวมแอปพลิเคชันเป็นไฟล์ war) โดยพื้นฐานแล้วมันเป็น! ในหน้า "เซิร์ฟเวอร์" คุณจะเห็นว่าแอปพลิเคชันเดียวกันจะทำงานที่ "http://localhost:8080/" บันทึกการกำหนดค่านี้และตั้งชื่อบางอย่าง (ชื่อการกำหนดค่าของฉันคือ “Tommy”) ถัดไป บนแท็บ Maven ใน IDEA (ทางด้านขวา) เราจะใช้ปลั๊กอิน war เพื่อสร้างโปรเจ็กต์ของเราให้เป็นไฟล์ war (ปลั๊กอิน -> war -> war:war) ความสำเร็จ! หน้าเริ่มต้นได้เปิดตัวแล้ว ตอนนี้คลิกที่ปุ่ม "เริ่มทำงานกับฐานข้อมูล" หน้า JSP ของเรา index.jsp จะสร้างคำขอ GET ที่เซิร์ฟเวอร์จะประมวลผล เซิร์ฟเวอร์จะสร้างการตอบกลับและส่งคืนให้เราในรูปแบบของรายการผู้ใช้ที่มีอยู่ทั้งหมด (หากแน่นอนว่าพวกเขาอยู่ในฐานข้อมูล) และนี่คือ! ลองลบผู้ใช้รายหนึ่งออก: มันก็ใช้ได้เช่นกัน! ดังนั้นเราจึงเขียนแอปพลิเคชันแรกของเราโดยใช้เซิร์ฟเล็ต อย่างที่คุณเห็นทุกอย่างกลายเป็นเรื่องง่าย :) ในการบ้านคุณสามารถคืนฟังก์ชันการทำงานกับรถยนต์จากบทความก่อนหน้าไปยังแอปพลิเคชันได้ เหล่านั้น. สร้างเซิร์ฟเล็ตและหน้า jsp แยกต่างหากสำหรับรถยนต์ และสอนแอปพลิเคชันของเราให้แสดงรายการรถยนต์ของผู้ใช้ เพิ่มรถยนต์ใหม่ให้กับเขา รวมถึงแก้ไขและลบรถยนต์เหล่านั้น PS Servlets และ JSP เป็นเทคโนโลยีที่ค่อนข้างโบราณ และบนอินเทอร์เน็ต คุณมักจะพบความคิดเห็นในจิตวิญญาณของ "ใครต้องการขยะนี้" คำตอบนั้นค่อนข้างง่าย - จำเป็นสำหรับผู้ที่จะทำงานในโครงการจริงเป็นหลักซึ่งค่อนข้างเป็นไปได้ที่จะมีการเขียนโค้ดจำนวนมากโดยใช้สิ่งเหล่านี้ และการนำ "ของเก่า" ไปสู่สิ่งใหม่โดยไม่ต้องเข้าใจว่ามันทำงานอย่างไร แต่ก็ยังน่ายินดี :) สำหรับการศึกษาหัวข้อของ JSP และเซิร์ฟเล็ตอย่างละเอียดยิ่งขึ้น คุณสามารถใช้หนังสือ " Head First Servlets และ JSP" (ใน ภาษาอังกฤษเท่านั้น). เขียนโดยผู้เขียนคนเดียวกันกับซุปเปอร์บุคชื่อดัง "Head First Java" ซึ่งสำหรับหลาย ๆ คนสามารถรับประกันคุณภาพได้ :) ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับผู้อ่าน! หากต้องการดูบทความใหม่ๆ อย่าลืมสนับสนุนผู้เขียนในการแข่งขันด้วยการกด "Like" เขา หรือดีกว่า - "ฉันชอบมันมาก" :) ขอบคุณสำหรับความสนใจและขอให้โชคดีในการเรียน!
GO TO FULL VERSION