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 โต้ตอบกับเซิร์ฟเล็ตอย่างไร ในความเป็นจริง กระบวนการนี้เป็นมาตรฐานและเรียกว่าวงจรชีวิตของเซิร์ฟเล็ต ในนั้น เซิร์ฟเล็ตเป็นวัตถุที่โหลดได้ และเว็บเซิร์ฟเวอร์เป็นคอนเทนเนอร์เซิร์ฟเล็ต

หากยังไม่ได้โหลดเซิร์ฟเล็ตดังนั้น:

  1. โหลดคลาสเซิร์ฟเล็ตโดยคอนเทนเนอร์
  2. คอนเทนเนอร์สร้างอินสแตนซ์ของคลาส (วัตถุ) ของเซิร์ฟเล็ต
  3. คอนเทนเนอร์เรียกใช้เมธอด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(), ... ตามต้องการ