1. เริ่มต้นด้วยคอนเทนเนอร์ servlet: คอนเทนเนอร์ servlet ที่ทุกคนคุ้นเคยมากที่สุดคือ Tomcat Servlet คอนเทนเนอร์จัดการ servlets อย่างไร
มาดูโมเดลคอนเทนเนอร์ของ Tomcat ก่อน:
จากรูปด้านบนเราจะเห็นว่าภาชนะของ Tomcat แบ่งออกเป็นสี่ระดับ คอนเทนเนอร์ที่จัดการ Servlets อย่างแท้จริงคือคอนเทนเนอร์บริบทและบริบทสอดคล้องกับโครงการเว็บ
ในระดับคอนเทนเนอร์ของ Tomcat คอนเทนเนอร์เป็นคอนเทนเนอร์ที่จัดการ wrapper คลาส wrapper โดยตรง (StandardWrapper) ของ servlet ในคอนเทนเนอร์ดังนั้นวิธีการที่คอนเทนเนอร์บริบทจะส่งผลโดยตรงต่อวิธีการทำงานของ servlet
ที่นี่ฉันจะอธิบายคลาสการห่อของ servlet: StandardWrapper มีคำถามที่นี่ทำไม Servlet ควรถูกห่อหุ้มลงใน StandardWrapper แทนที่จะเป็นวัตถุ Servlet โดยตรง เนื่องจาก StandardWrapper เป็นส่วนหนึ่งของคอนเทนเนอร์ Tomcat จึงมีลักษณะของคอนเทนเนอร์และ Servlet เป็นมาตรฐานการพัฒนาเว็บอิสระและไม่ควรเชื่อมโยงกันอย่างมากใน Tomcat
ยกเว้นการห่อ servlet ลงใน StandardWrapper และเพิ่มลงในบริบทเป็น subcontainer คุณสมบัติอื่น ๆ Web.xml ทั้งหมดจะถูกแยกวิเคราะห์ลงในบริบทดังนั้นคอนเทนเนอร์บริบทคือคอนเทนเนอร์ servlet ที่ใช้ servlet จริงๆ เว็บแอปพลิเคชันสอดคล้องกับคอนเทนเนอร์บริบท คุณสมบัติการกำหนดค่าของคอนเทนเนอร์ถูกระบุโดย web.xml ของแอปพลิเคชันดังนั้นเราจึงสามารถเข้าใจได้ว่ามีบทบาทอย่างไร web.xml เล่น
2. คำอธิบายสั้น ๆ ต่อไปนี้อธิบายโครงการการทำงานของ servlet:
เมื่อเว็บเซิร์ฟเวอร์โต้ตอบกับไคลเอนต์กระบวนการทำงานของ servlet คือ:
1. ส่งคำขอไปยังเว็บเซิร์ฟเวอร์บนไคลเอนต์
2. เว็บเซิร์ฟเวอร์ส่งไปยัง servlet หลังจากได้รับคำขอ
3. คอนเทนเนอร์ servlet สร้างวัตถุอินสแตนซ์สำหรับสิ่งนี้และเรียกใช้วิธีการที่เกี่ยวข้องใน Servlet API เพื่อประมวลผลคำขอ HTTP ไคลเอนต์จากนั้นส่งคืนผลการตอบกลับที่ประมวลผลไปยังเว็บเซิร์ฟเวอร์
4. เว็บเซิร์ฟเวอร์ส่งโครงสร้างการตอบกลับที่ได้รับจากวัตถุอินสแตนซ์ servlet กลับไปที่ไคลเอนต์
3. วงจรชีวิตของ Servlet:
ดังที่แสดงในรูปด้านบนวงจรชีวิตของ servlet สามารถแบ่งออกเป็นสี่ขั้นตอนคือคลาสการโหลดและขั้นตอนการสร้างขั้นตอนการเริ่มต้นขั้นตอนการบริการและขั้นตอนการทำลายอินสแตนซ์ ต่อไปนี้เป็นคำอธิบายโดยละเอียดของงานการเขียนโปรแกรมและข้อควรระวังสำหรับแต่ละขั้นตอน
1. สร้างอินสแตนซ์ servlet:
โดยค่าเริ่มต้นอินสแตนซ์ servlet จะถูกสร้างขึ้นเมื่อคำขอแรกมาถึงและจะถูกนำกลับมาใช้ใหม่ในภายหลัง หาก Servlets บางตัวต้องการการดำเนินการที่ซับซ้อนที่ต้องเสร็จสิ้นเมื่อโหลดการเริ่มต้นเช่นการเปิดไฟล์การเริ่มต้นการเชื่อมต่อเครือข่าย ฯลฯ คุณสามารถแจ้งให้เซิร์ฟเวอร์ทราบเพื่อสร้างอินสแตนซ์ของ Servlet เมื่อเริ่มต้น การกำหนดค่าเฉพาะมีดังนี้:
<servlet> <servlet-name> Timeservlet </servlet-name> <servlet-lass> com.allanlxf.servlet.basic.timeservlet </servlet-lass> <load-on-startup> 1 </load-on-startup>
สร้างโครงสร้างคลาสที่เกี่ยวข้องของวัตถุ servlet:
2. การเริ่มต้น
เมื่อสร้างอินสแตนซ์ servlet เว็บเซิร์ฟเวอร์จะเรียกใช้เมธอด init (servletConfig config) โดยอัตโนมัติเพื่อเริ่มต้น Servlet การกำหนดค่าพารามิเตอร์เมธอดมีข้อมูลการกำหนดค่าของ servlet เช่นพารามิเตอร์การเริ่มต้นซึ่งสร้างโดยเซิร์ฟเวอร์
I. วิธีกำหนดค่าพารามิเตอร์การเริ่มต้นของ servlet?
ในแท็กนิยามของ servlet ใน web.xml ตัวอย่างเช่น:
<servlet> <servlet-name> Timeservlet </servlet-name> <servlet-lass> com.allanlxf.servlet.basic.timeservlet </servlet-class> <init-param> <par am-name> ผู้ใช้ </param-name> <param-value> ชื่อผู้ใช้ </param-value> </init-param> <init-Param> <param-Name> บล็อก </param-name> <param-value> http: // - - </param-value> </itrient-Param> </servlet>
ผู้ใช้พารามิเตอร์การเริ่มต้นและบล็อกการเริ่มต้นสองตัวได้รับการกำหนดค่าด้วยค่าของชื่อผู้ใช้และ http: // - - ด้วยวิธีนี้เพื่อแก้ไขชื่อผู้ใช้และที่อยู่บล็อกในอนาคตคุณไม่จำเป็นต้องแก้ไขรหัส servlet เพียงแค่แก้ไขไฟล์การกำหนดค่า
ii. วิธีการอ่านพารามิเตอร์การเริ่มต้นของ servlet?
ServletConfig กำหนดวิธีการต่อไปนี้เพื่ออ่านข้อมูลของพารามิเตอร์การเริ่มต้น:
สตริงสาธารณะ getInitParameter (ชื่อสตริง)
พารามิเตอร์: ชื่อของพารามิเตอร์การเริ่มต้น
ผลตอบแทน: ค่าของพารามิเตอร์การเริ่มต้นหากไม่ได้กำหนดค่าให้ส่งคืนค่า NULL
จำนวนเวลาดำเนินการของวิธี III.Init (servletConfig)
วิธีนี้จะดำเนินการหนึ่งครั้งในช่วงวงจรชีวิตของ servlet
IV.Init (servletConfig) วิธีการและเธรด
วิธีนี้ดำเนินการในสภาพแวดล้อมที่มีเกลียวเดียวดังนั้นนักพัฒนาไม่จำเป็นต้องพิจารณาปัญหาความปลอดภัยของเธรด
วิธี V.Init (ServletConfig) และข้อยกเว้น
ในระหว่างการดำเนินการวิธีนี้สามารถโยน servletexception เพื่อแจ้งเว็บเซิร์ฟเวอร์ว่าอินสแตนซ์ servlet ล้มเหลวในการเริ่มต้น เมื่อมีการโยน servletexception แล้วเว็บเซิร์ฟเวอร์จะไม่ส่งคำขอไคลเอนต์ไปยังอินสแตนซ์ของ Servlet สำหรับการประมวลผล แต่จะรายงานข้อมูลข้อยกเว้นความล้มเหลวในการเริ่มต้นไปยังไคลเอนต์ซึ่งจะถูกทำลายจากหน่วยความจำ หากมีการร้องขอใหม่เว็บเซิร์ฟเวอร์จะสร้างอินสแตนซ์ Servlet ใหม่และดำเนินการเริ่มต้นของอินสแตนซ์ใหม่
3. บริการ
เมื่อสร้างอินสแตนซ์ Servlet สำเร็จและเริ่มต้นแล้วเซิร์ฟเวอร์สามารถใช้อินสแตนซ์ของเซิร์ฟเวอร์เพื่อตอบสนองคำขอของลูกค้าและสร้างการตอบกลับ ในระหว่างขั้นตอนการบริการเว็บเซิร์ฟเวอร์จะเรียกใช้บริการ (ServletRequest Request, ServletResponse Response) วิธีการของอินสแตนซ์ วัตถุคำขอและวัตถุตอบสนองถูกสร้างขึ้นโดยเซิร์ฟเวอร์และส่งผ่านไปยังอินสแตนซ์ servlet วัตถุคำขอห่อหุ้มข้อมูลที่ส่งโดยไคลเอนต์ไปยังเซิร์ฟเวอร์และวัตถุตอบกลับจะสรุปข้อมูลที่ส่งโดยเซิร์ฟเวอร์ไปยังไคลเอนต์
I. ความรับผิดชอบของวิธีการบริการ ()
วิธีการบริการ () เป็นวิธีการหลักของ servlet ตรรกะทางธุรกิจของลูกค้าควรดำเนินการภายในวิธีนี้ กระบวนการพัฒนาของวิธีการบริการทั่วไปคือ:
วิเคราะห์คำขอไคลเอน
II.Service () เมธอดและเธรด
เพื่อปรับปรุงประสิทธิภาพข้อกำหนดของ Servlet กำหนดให้อินสแตนซ์ Servlet จะต้องสามารถให้บริการคำขอไคลเอนต์หลายรายการในเวลาเดียวกัน นั่นคือวิธีการบริการ () ทำงานในสภาพแวดล้อมแบบมัลติเธรดและนักพัฒนาเซิร์ฟเล็ตจะต้องมั่นใจในความปลอดภัยของเธรดของวิธีการ
III.Service () วิธีการและข้อยกเว้น
วิธีการบริการ () สามารถโยน servletexception และ ioexception ในระหว่างการดำเนินการ ในหมู่พวกเขา Servletexception สามารถโยนได้ในระหว่างกระบวนการประมวลผลคำขอไคลเอนต์เช่นทรัพยากรที่ร้องขอไม่พร้อมใช้งานฐานข้อมูลไม่พร้อมใช้งาน ฯลฯ เมื่อมีการโยนข้อยกเว้นแล้วคอนเทนเนอร์จะต้องรีไซเคิลวัตถุคำขอและรายงานข้อมูลข้อยกเว้นของลูกค้า IOException ระบุข้อผิดพลาดในอินพุตและเอาต์พุต โปรแกรมเมอร์ไม่จำเป็นต้องใส่ใจเกี่ยวกับข้อยกเว้นและรายงานโดยตรงไปยังลูกค้าโดยคอนเทนเนอร์
ข้อควรระวังการเขียนโปรแกรม:
1) เมื่อเธรดเธรดเซิร์ฟเวอร์ดำเนินการเมธอด init () ของอินสแตนซ์ servlet เธรดบริการไคลเอนต์ทั้งหมดไม่สามารถเรียกใช้วิธีการบริการ () ของอินสแตนซ์และไม่มีเธรดที่สามารถเรียกใช้วิธีการทำลาย () ของอินสแตนซ์ ดังนั้นวิธีการ init () ของ servlet ทำงานในสภาพแวดล้อมเธรดเดียวและนักพัฒนาไม่จำเป็นต้องพิจารณาปัญหาความปลอดภัยของเธรดใด ๆ
2) เมื่อเซิร์ฟเวอร์ได้รับการร้องขอหลายครั้งจากไคลเอนต์เซิร์ฟเวอร์จะเรียกใช้เมธอดบริการ () ของอินสแตนซ์ servlet ในเธรดบริการไคลเอนต์แยกต่างหากเพื่อให้บริการไคลเอนต์แต่ละตัว ในเวลานี้หลายเธรดจะเรียกใช้วิธีการบริการ () ของอินสแตนซ์เซิร์ฟเล็ตเดียวกันในเวลาเดียวกันดังนั้นจึงต้องพิจารณาปัญหาความปลอดภัยของเธรด
3) โปรดทราบว่าแม้ว่าวิธีการบริการ () จะทำงานในสภาพแวดล้อมแบบมัลติเธรด แต่ก็ไม่จำเป็นที่จะต้องซิงโครไนซ์วิธีการ แต่ขึ้นอยู่กับประเภทของทรัพยากรที่เข้าถึงโดยวิธีนี้ในระหว่างการดำเนินการและวิธีการเข้าถึงทรัพยากร การวิเคราะห์มีดังนี้:
ฉัน. หากวิธีการบริการ () ไม่สามารถเข้าถึงตัวแปรสมาชิก Servlet หรือทรัพยากรทั่วโลกเช่นตัวแปรคงที่ไฟล์การเชื่อมต่อฐานข้อมูล ฯลฯ จะใช้ทรัพยากรของเธรดปัจจุบันเท่านั้นเช่นตัวแปรชั่วคราวคำขอและวัตถุตอบสนองที่ไม่ชี้ไปยังทรัพยากรทั่วโลก วิธีการนี้เองคือเธรดที่ปลอดภัยและไม่จำเป็นต้องมีการควบคุมการซิงโครไนซ์ใด ๆ
ii. หากเมธอดบริการ () เข้าถึงตัวแปรสมาชิก Servlet แต่การดำเนินการบนตัวแปรคือการดำเนินการแบบอ่านอย่างเดียววิธีการนั้นเองนั้นปลอดภัยและไม่จำเป็นต้องมีการควบคุมการซิงโครไนซ์ใด ๆ
iii. หากเมธอดบริการ () เข้าถึงตัวแปรสมาชิก servlet และการทำงานของตัวแปรจะถูกอ่านและเขียนคำสั่งควบคุมการซิงโครไนซ์มักจะจำเป็น
iv. หากเมธอดบริการ () เข้าถึงตัวแปรสแตติกทั่วโลกหากอาจมีเธรดอื่น ๆ ในระบบที่เข้าถึงตัวแปรสแตติกในเวลาเดียวกันหากมีทั้งการอ่านและเขียนการดำเนินการคำสั่งควบคุมการซิงโครไนซ์
v. หากวิธีการบริการ () เข้าถึงทรัพยากรทั่วโลกเช่นไฟล์การเชื่อมต่อฐานข้อมูล ฯลฯ มักจำเป็นต้องเพิ่มคำสั่งควบคุมการซิงโครไนซ์
4. การทำลายล้าง
เมื่อเว็บเซิร์ฟเวอร์คิดว่าไม่จำเป็นต้องใช้อินสแตนซ์ servlet เช่นการโหลดแอปพลิเคชันใหม่หรือการปิดเซิร์ฟเวอร์และ servlet ไม่ได้รับการเข้าถึงเป็นเวลานาน เซิร์ฟเวอร์สามารถทำลาย (เรียกอีกอย่างว่าการถอนการติดตั้ง) อินสแตนซ์จากหน่วยความจำ เว็บเซิร์ฟเวอร์จะต้องตรวจสอบให้แน่ใจว่าวิธีการทำลาย () ของอินสแตนซ์ servlet ถูกเรียกก่อนที่จะถอนการติดตั้งอินสแตนซ์ servlet เพื่อรีไซเคิลทรัพยากรที่ร้องขอโดย servlet หรือดำเนินการประมวลผลที่สำคัญอื่น ๆ
เว็บเซิร์ฟเวอร์ต้องตรวจสอบให้แน่ใจว่าก่อนที่จะเรียกวิธีการทำลาย () เธรดทั้งหมดที่ทำงานในเมธอดบริการ () ของการออกอินสแตนซ์หรือรอเธรดเหล่านี้เป็นระยะเวลาหนึ่ง เมื่อมีการดำเนินการวิธีการทำลาย () เว็บเซิร์ฟเวอร์จะปฏิเสธคำขอใหม่ทั้งหมดสำหรับอินสแตนซ์ servlet วิธีการทำลาย () ออกและอินสแตนซ์ servlet สามารถเก็บขยะได้
4. ผังงานของไคลเอน
1. เว็บไคลเอนต์ออกคำขอ HTTP ไปยังคอนเทนเนอร์ Servlet;
2. คอนเทนเนอร์ Servlet แยกวิเคราะห์คำขอเว็บ HTTP
3. คอนเทนเนอร์ servlet สร้างวัตถุ HTTPREQUEST, ห่อหุ้มข้อมูลคำขอ HTTP ในวัตถุนี้
4. คอนเทนเนอร์ servlet สร้างวัตถุ HTTPRESSPONSE;
5. Servlet Container (หากไม่ได้สร้าง servlet ที่เข้าถึงได้ที่การเริ่มต้นเซิร์ฟเวอร์ให้สร้างอินสแตนซ์ servlet ก่อนและเรียกใช้เมธอด init () เพื่อเริ่มต้นวัตถุ) เรียกใช้บริการ () ของ httpservlet และส่งพารามิเตอร์ของ HTTPRequest และ HTTPRESSPONSE
6. HTTPSERVLET เรียกวิธีการที่เกี่ยวข้องของ HTTPREQUEST เพื่อรับข้อมูลคำขอ HTTP;
7. HTTPSERVLET เรียกวิธีการที่เกี่ยวข้องของ HTTPRESSPONSE เพื่อสร้างข้อมูลการตอบสนอง
8. คอนเทนเนอร์ Servlet ส่งผลตอบกลับ HTTPSERVLET ไปยังเว็บไคลเอ็นต์
บทความข้างต้นขึ้นอยู่กับหลักการดำเนินการและวงจรชีวิตของ Servlet (การวิเคราะห์ที่ครอบคลุม) เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น