- เกี่ยวกับเครือข่าย
- เกี่ยวกับสถาปัตยกรรมซอฟต์แวร์
- เกี่ยวกับโปรโตคอล HTTP/HTTPS ;
- เกี่ยวกับ พื้นฐานของ Maven
เซิร์ฟเล็ตคืออะไร
ก่อนอื่น เรามาดูกันว่าเซิร์ฟเล็ตคืออะไร และเหตุใดคุณจึงได้ยินเกี่ยวกับมันบ่อยครั้ง Java Servlet APIเป็น API มาตรฐานที่ออกแบบมาเพื่อการใช้งานบนเซิร์ฟเวอร์และการทำงานกับไคลเอนต์โดยใช้รูปแบบการตอบกลับคำขอ เซิร์ฟเล็ตเป็นคลาสที่สามารถรับคำขอจากไคลเอนต์และส่งคืนการตอบกลับได้ ใช่ เซิร์ฟเล็ตใน Java เป็นองค์ประกอบที่ใช้สร้างสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ หากคุณจำได้เราได้พูดถึงเรื่องนี้ไปแล้วในบทความหนึ่งในซีรีส์ อย่าไปยุ่งวุ่นวาย: มาเขียนโค้ดกันทันทีสิ่งที่คุณต้องการในการสร้างเว็บแอปพลิเคชัน
หากต้องการทำงานอย่างสะดวกสบายกับเซิร์ฟเล็ตใน Java คุณจะต้องมี Intellij IDEA Ultimate Edition ชำระเงินแล้ว แต่คุณสามารถเปิดใช้งานช่วงทดลองใช้งาน 30 วันหรือใช้เวอร์ชันทดลองใช้ก่อนเปิดตัวได้ ซึ่งฟรีเสมอ ติดตั้งเซิร์ฟเวอร์แอปพลิเคชันของเรา - Apache Tomcat ด้วย Tomcat เป็นคอนเทนเนอร์เซิร์ฟเล็ต: เป็นคอนเทนเนอร์ที่ประมวลผลคำขอที่เข้ามาจากภายนอกและส่งต่อไปยังแอปพลิเคชันของเรา คุณสามารถดาวน์โหลด 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 ที่เราจะใช้ URL ที่เราสามารถเข้าถึงเซิร์ฟเวอร์ และพอร์ต คุณควรได้รับสิ่งนี้:
-
สิ่งที่เหลืออยู่คือการระบุสิ่งประดิษฐ์ (โปรเจ็กต์ที่ประกอบไว้ในไฟล์เก็บถาวร jar) ซึ่งจะถูกปรับใช้ในคอนเทนเนอร์ คุณสามารถคลิก ปุ่ม แก้ไขและเลือกwar exploded : ซึ่งหมายความว่าหลังจากสร้างโปรเจ็กต์ใหม่แล้ว อาร์ติแฟกต์จะถูกวางในคอนเทนเนอร์เซิร์ฟเล็ตโดยอัตโนมัติ
-
บริบทของแอปพลิเคชัน ถูกตั้งค่าเป็น servlets_war_explodedโดยดีฟอลต์ซึ่งหมายความว่าต้องเข้าถึงแอปพลิเคชันที่: http: // localhost:8080/servlets_war_exploded
ทำไมเราจึงต้องมีข้อความเพิ่มเติม? มากำจัดสิ่งที่ไม่จำเป็นออกไป ตอนนี้ที่อยู่แอปพลิเคชันของเราคือ: http://localhost: 8080
-
คลิกตกลง เราเห็นว่าตอนนี้เรามีโอกาสที่จะเปิดตัวแอปพลิเคชันแล้ว:
ตอนนี้ เมื่อคุณเปิดแอปพลิเคชัน เบราว์เซอร์ควรเปิดขึ้นและแสดงข้อผิดพลาด 404 นี่เป็นตรรกะ เนื่องจากที่อยู่http://localhost:8080/ควรมีเซิร์ฟเล็ตที่มีการแมป “/” และเซิร์ฟเล็ตเดียวของเรามีการ แมป “/hello”
-
เราติดต่อได้ที่http://localhost:8080/helloและรับการตอบกลับที่คาดหวัง - สตริง “Hello”!
การทำงานกับพารามิเตอร์และเซสชัน
มาปรับปรุงเซิร์ฟเล็ตของเราเพื่อให้สามารถประมวลผลพารามิเตอร์คำขอและทำงานกับเซสชันได้: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();
}
}
ขณะนี้เซิร์ฟเล็ตกำลังรันเซสชัน โดยเพิ่ม visitCounter ทุกครั้งที่มีการเยี่ยมชมเพจ หากยังไม่ได้สร้างแอตทริบิวต์ visitCounter (ครั้งแรกที่คุณเยี่ยมชมเพจ) เมธอด getAttribute() จะส่งคืนค่าว่าง ดังนั้นคุณต้องตรวจสอบค่าว่าง เช่นเดียวกับพารามิเตอร์คำขอ หากผู้ใช้ไม่ผ่านพารามิเตอร์ชื่อผู้ใช้ ค่าจะเป็นโมฆะ ในกรณีนี้ เราจะทักทายผู้ใช้โดยไม่เปิดเผยตัวตน หากต้องการส่งพารามิเตอร์ในคำขอ GET จะใช้ตัวแปรพา ธ นั่นคือคุณต้องเข้าถึงลิงก์http://localhost:8080/hello?username= Pavel คุณสามารถอ่านเพิ่มเติมเกี่ยวกับคำขอ http ได้ในบทความก่อนหน้าในชุดนี้ ขณะนี้แอปพลิเคชันของเรามีตรรกะเพียงเล็กน้อย แต่ข้อผิดพลาด 404 ในเส้นทางรากนั้นน่ารำคาญเล็กน้อย เพื่อแก้ไข เรามาสร้างเซิร์ฟเล็ตอื่นและแมปมันกับหน้าเริ่มต้น @WebServlet("/") งานของเซิร์ฟเล็ตนี้คือการเปลี่ยนเส้นทางคำขอไปยังเส้นทาง “/hello” มีสองวิธีในการทำเช่นนี้: ใช้การส่งต่อหรือการเปลี่ยนเส้นทาง บางทีมันก็คุ้มค่าที่จะเข้าใจว่าความแตกต่างระหว่างพวกเขาคืออะไร ส่งต่อ - มอบหมายคำขอการประมวลผลไปยังเซิร์ฟเล็ตอื่นบนเซิร์ฟเวอร์ ไคลเอ็นต์ไม่เกี่ยวข้อง เมื่อต้องการทำเช่นนี้ คุณต้องเพิ่มโค้ดต่อไปนี้ลงในเมธอด doGet() ของเซิร์ฟเล็ตใหม่:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
ในโค้ดนี้ เราเข้าถึงบริบทเซิร์ฟเล็ต รับตัวจัดการคำขอของเซิร์ฟเล็ตที่ต้องการ จากนั้นขอให้ประมวลผลคำขอเฉพาะด้วยพารามิเตอร์ที่ระบุ (req, resp) เปลี่ยนเส้นทาง - ส่งคืนที่อยู่ให้กับลูกค้าที่เขาต้องการติดต่อเพื่อดำเนินการตามคำขอของเขา เบราว์เซอร์ส่วนใหญ่จะไปที่ลิงก์ที่ส่งโดยอัตโนมัติ หากต้องการใช้การเปลี่ยนเส้นทาง คุณต้องเพิ่มโค้ดนี้:
resp.sendRedirect(req.getContextPath() + "/hello");
ใน HttpServletResponse เราเรียกเมธอดการเปลี่ยนเส้นทาง () และส่งผ่านไปยังที่อยู่ที่ลูกค้าต้องการติดต่อ รายละเอียดที่สำคัญ: ต้องเพิ่มพารามิเตอร์ 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