1.1 อินเตอร์เฟส Servlet
วันนี้เรากำลังเริ่มหัวข้อใหม่และน่าสนใจ- เซิร์ฟเล็ต เป็นการเพิ่มเซิร์ฟเล็ตให้กับ Java ซึ่งส่งผลให้ Java เป็นมาตรฐานโดยพฤตินัยสำหรับแอปพลิเคชันเซิร์ฟเวอร์ขนาดใหญ่ 80% ของซอฟต์แวร์องค์กรทั้งหมดในโลกเขียนด้วย Java และที่จีนทุกอย่าง 100% แล้วเซิร์ฟเล็ตคืออะไร?
เซิร์ฟเล็ตคือสิ่งที่ทำให้โปรแกรม Java เป็นบริการบนเว็บและอนุญาตให้ประมวลผลคำขอจากลูกค้า แล้วก็เป็นแบบนี้...
ในช่วงทศวรรษที่ 90 ทันทีหลังจากการกำเนิดของเวิลด์ไวด์เว็บ เว็บไคลเอนต์ (เบราว์เซอร์) และเว็บเซิร์ฟเวอร์ก็ปรากฏขึ้น เว็บเซิร์ฟเวอร์มักจะแจกจ่ายไฟล์ที่เก็บไว้บนอินเทอร์เน็ต: หน้า html, สคริปต์, รูปภาพ ฯลฯ
เมื่อถึงจุดหนึ่ง ทุกคนก็สรุปว่าจำเป็นต้องทำให้ทั้งสองฝ่ายฉลาดขึ้น เพิ่ม JavaScript ลงในหน้า HTML และเพิ่มปลั๊กอินลงในเซิร์ฟเวอร์ ซึ่งเป็นสคริปต์พิเศษที่ถูกเรียกเพื่อตอบสนองคำขอบางอย่างและทำให้พฤติกรรมของเซิร์ฟเวอร์มีความยืดหยุ่นและชาญฉลาดยิ่งขึ้น
ดังนั้นเซิร์ฟเล็ตจึงเป็นปลั๊กอิน Javaที่สร้างขึ้นJava web-server
และอนุญาตให้รันโค้ด Java เมื่อมีการร้องขอสำหรับบางเพจ และแล้วโค้ด Java นี้ซึ่งแสดงโดยคลาสที่สืบทอดมาจากคลาส Servlet ได้ทำในสิ่งที่นักพัฒนาตั้งใจไว้
และอย่างที่คุณทราบแล้วว่าเว็บเซิร์ฟเวอร์ Java ที่ได้รับความนิยมสูงสุดคือTomcat ตั้งชื่อเพื่อเป็นเกียรติแก่แมวทอมจากการ์ตูนเรื่อง "Tom and Jerry"
Tomcat โต้ตอบกับเซิร์ฟเล็ตอย่างไร ในความเป็นจริง กระบวนการนี้เป็นมาตรฐานและเรียกว่าวงจรชีวิตของเซิร์ฟเล็ต ในนั้น เซิร์ฟเล็ตเป็นวัตถุที่โหลดได้ และเว็บเซิร์ฟเวอร์เป็นคอนเทนเนอร์เซิร์ฟเล็ต
หากยังไม่ได้โหลดเซิร์ฟเล็ตดังนั้น:
- โหลดคลาสเซิร์ฟเล็ตโดยคอนเทนเนอร์
- คอนเทนเนอร์สร้างอินสแตนซ์ของคลาส (วัตถุ) ของเซิร์ฟเล็ต
- คอนเทนเนอร์เรียกใช้เมธอด
init()
บนวัตถุเซิร์ฟเล็ต วิธีการนี้เรียกว่าเพียงครั้งเดียว
รอบการทำงานมาตรฐาน - ให้บริการตามคำขอของลูกค้า :
- คำขอแต่ละรายการได้รับการประมวลผลในเธรดแยกต่างหาก
- คอนเทนเนอร์เรียกเมธอด
service()
บนเซิร์ฟเล็ตและส่งผ่านออบเจกต์ ServletRequest และ ServletResponse ไปที่นั่น - ในการยุติเซิร์ฟเล็ต จะมีการเรียกใช้เมธอด
destroy()
บนวัตถุเซิร์ฟเล็ต เรียกว่าเพียงครั้งเดียว
อาจมีสาเหตุหลายประการที่ทำให้เซิร์ฟเล็ตหยุดทำงาน:
- โปรแกรมเมอร์รีสตาร์ทเว็บเซิร์ฟเวอร์ จำเป็นต้องปิดเซิร์ฟเล็ตทั้งหมดอย่างสง่างาม
- โปรแกรมเมอร์โหลดเซิร์ฟเล็ตเวอร์ชันใหม่ ต้องยกเลิกการโหลดเวอร์ชันเก่าอย่างถูกต้อง
- และอื่น ๆ
จำสิ่งสำคัญ: เว็บเซิร์ฟเวอร์และเซิร์ฟเล็ตควรทำงานโดยไม่มีข้อผิดพลาดและรีสตาร์ทเป็นเวลาหลายเดือน โดยให้บริการคำขอนับพันต่อนาที ดังนั้นโค้ดสำหรับการโหลดและการทำงาน และการโหลดเซิร์ฟเล็ตควรเขียนด้วยคุณภาพสูงเสมอ
1.2 คลาส HttpServlet
คลาส Servlet มีอยู่เพื่อสร้างมาตรฐานวิธีการทำงานของเซิร์ฟเล็ตและคอนเทนเนอร์ โปรแกรมเมอร์ไม่ได้ทำงานโดยตรงกับคลาสนี้ พวกเขาไม่ค่อยทำงาน คลาสที่ใช้บ่อยที่สุดHttpServlet
นั้นสืบทอดมาจาก Servlet
คลาสนี้มีหลายวิธีที่จะเป็นประโยชน์กับเรา คุณมักจะใช้:
วิธี | คำอธิบาย | |
---|---|---|
1 | init() |
เรียกใช้ครั้งเดียวเมื่อโหลดเซิร์ฟเล็ต |
2 | destroy() |
ถูกเรียกหนึ่งครั้งเมื่อไม่ได้โหลดเซิร์ฟเล็ต |
3 | service(HttpRequest, HttpResponse) |
ร้องขอทุกคำขอใหม่ไปยังเซิร์ฟเล็ต |
4 | doGet(HttpRequest, HttpResponse) |
เรียกใช้ทุกคำขอ GET ใหม่ไปยังเซิร์ฟเล็ต |
5 | doPost(HttpRequest, HttpResponse) |
เรียกใช้ทุกคำขอ POST ใหม่ไปยังเซิร์ฟเล็ต |
6 | doHead(HttpRequest, HttpResponse) |
เรียกทุกคำขอ HEAD ใหม่ไปยังเซิร์ฟเล็ต |
7 | doDelete(HttpRequest, HttpResponse) |
เรียกใช้ทุกคำขอ DELETE ใหม่ไปยังเซิร์ฟเล็ต |
8 | doPut(HttpRequest, HttpResponse) |
เรียกทุกคำขอ PUT ใหม่ไปยังเซิร์ฟเล็ต |
init()
และวิธีการdestroy()
สืบทอดมาจากคลาส Servlet ดังนั้น หากคุณตัดสินใจที่จะแทนที่สิ่งเหล่านี้ในเซิร์ฟเล็ตของคุณ คุณจะต้องเรียกใช้การใช้งานจากคลาสพื้นฐานด้วย คำสั่งใช้สำหรับสิ่งนี้super.method name()
.
ตัวอย่างเซิร์ฟเล็ต:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 บริการ (HttpServletRequest, HttpServletResponse)
หากคุณดูการประมวลผลคำขอของไคลเอ็นต์จากมุมมองของเซิร์ฟเล็ต สิ่งต่างๆ จะเป็นแบบนี้
สำหรับคำขอของไคลเอ็นต์แต่ละรายการ คอนเทนเนอร์ (เว็บเซิร์ฟเวอร์) จะสร้างHttpServletRequest
และ ออบเจกต์ HttpServletResponse
จากนั้นเรียกใช้เมธอดservice(HttpServletRequest request, HttpServletResponse response)
บนเซิร์ฟเล็ตที่เกี่ยวข้อง วัตถุเหล่านี้จะถูกส่งผ่านเพื่อให้เมธอดสามารถรับข้อมูลที่จำเป็นrequest
และใส่ผลลัพธ์ของงานลงresponse
ใน
วิธีการservice()
มีการใช้งานเริ่มต้น หากไม่ได้กำหนดใหม่ ก็จะถูกดำเนินการ นั่นคือสิ่งที่เขาทำ
เมธอดservice()
กำหนดประเภทเมธอด HTTP จากคำขอ (GET, POST, ...) และเรียกเมธอดที่สอดคล้องกับคำขอ
วิธี | คำอธิบาย | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
ร้องขอทุกคำขอใหม่ไปยังเซิร์ฟเล็ต |
2 | doGet(HttpRequest, HttpResponse) |
เรียกใช้ทุกคำขอ GET ใหม่ไปยังเซิร์ฟเล็ต |
3 | doPost(HttpRequest, HttpResponse) |
เรียกใช้ทุกคำขอ POST ใหม่ไปยังเซิร์ฟเล็ต |
4 | doHead(HttpRequest, HttpResponse) |
เรียกทุกคำขอ HEAD ใหม่ไปยังเซิร์ฟเล็ต |
5 | doDelete(HttpRequest, HttpResponse) |
เรียกใช้ทุกคำขอ DELETE ใหม่ไปยังเซิร์ฟเล็ต |
6 | doPut(HttpRequest, HttpResponse) |
เรียกทุกคำขอ PUT ใหม่ไปยังเซิร์ฟเล็ต |
ในชั้นเรียนของคุณ คุณสามารถกำหนดเมธอดหนึ่งใหม่service()
หรือปล่อยไว้ตามลำพัง แต่จากนั้นกำหนดเมธอดใหม่doGet()
, doPost()
, ... ตามต้องการ