1. ภาพรวม servlet
1. เทคโนโลยีการพัฒนาทรัพยากรเว็บแบบไดนามิกที่จัดทำโดย Sun Company Essence คือแอปเพล็ต Java ก่อนหน้าซึ่งต้องการให้แอปเพล็ตนี้ต้องใช้อินเทอร์เฟซ Servlet เพื่อให้เซิร์ฟเวอร์สามารถเรียกได้
2. สองขั้นตอนในการพัฒนา servlet
*การทดลอง: เริ่มต้นอย่างรวดเร็วของ servlet
(1) ขั้นตอนที่ 1: เขียนโปรแกรม Java เพื่อใช้งานอินเตอร์เฟส servlet (ที่นี่สืบทอดโดยตรงกับคลาสการใช้งานเริ่มต้น MenericServlet)
แพ็คเกจ cn.itheima; นำเข้า java.io.*; นำเข้า Javax.servlet.*; คลาสสาธารณะ FirstServlet ขยาย Genericservlet {บริการโมฆะสาธารณะ (ServletRequest req, servletResponse res) โยน servletexception, java.io.ioException(2) นอกเหนือจากการใส่. class ที่รวบรวมด้วยแพ็คเกจภายใต้ Web-Inf/คลาสแล้วคุณต้องกำหนดค่า Servlet การลงทะเบียน web.xml ของเว็บแอปพลิเคชัน
<servlet> <servlet-name> FirstServlet </servlet-name> <servlet-lass> cn.itheima.firstservlet </servlet-lass> </servlet> <servlet-mapping> <servlet-name>
3. พัฒนา servlets ด้วย myeclipse
2. คำอธิบายโดยละเอียดของ servlet
1. วัฏจักรชีวิต: เมื่อสิ่งที่เกิดและตายสิ่งที่มันจะทำอย่างหลีกเลี่ยงไม่ได้ในระหว่างการดำรงอยู่ของมัน การรวมเข้าด้วยกันเป็นวงจรการประกาศของสิ่งนั้น
2. วงจรชีวิตของ Servlet: โดยทั่วไปเมื่อ Servlet เข้าถึงเป็นครั้งแรกวัตถุจะถูกสร้างขึ้นในหน่วยความจำและวิธีการ init () จะถูกเรียกทันทีหลังจากการสร้างเพื่อเริ่มต้น สำหรับการร้องขอแต่ละครั้งวิธีการบริการ (REQ, RESP) ใช้เพื่อประมวลผลคำขอ ในเวลานี้ข้อมูลการร้องขอจะถูกห่อหุ้มด้วยวัตถุคำขอและวัตถุตอบสนอง (เดิมที่ว่างเปล่า) แสดงถึงข้อความตอบกลับซึ่งจะส่งผ่านไปยังวิธีการบริการเพื่อใช้งาน เมื่อวิธีการบริการได้รับการประมวลผลเซิร์ฟเวอร์ Return จะจัดส่งข้อความตอบกลับที่จะส่งคืนไปยังเบราว์เซอร์ตามข้อมูลในการตอบกลับ servlet ไม่ได้ถูกทำลายหลังจากการตอบกลับเสร็จสิ้นและอยู่ในหน่วยความจำและรอการร้องขอถัดไป จนกว่าเซิร์ฟเวอร์จะถูกปิดหรือเว็บแอปพลิเคชันจะถูกลบออกจากโฮสต์เสมือนจริงวัตถุ Servlet จะถูกทำลายและวิธีการทำลาย () จะถูกเรียกก่อนที่จะถูกทำลายเพื่อทำอะไรบางอย่างในภายหลัง
3. โครงสร้างการสืบทอดของอินเตอร์เฟส servlet
อินเทอร์เฟซ Servlet: กำหนดวิธีการที่ servlet ควรมีและ servlets ทั้งหมดควรใช้อินเทอร์เฟซนี้โดยตรงหรือโดยอ้อม
-
| ---- Genericservlet: การใช้งานเริ่มต้นของอินเตอร์เฟส servlet, servlet ทั่วไปนี่คือคลาสนามธรรม, วิธีการส่วนใหญ่ถูกนำไปใช้โดยค่าเริ่มต้นเฉพาะวิธีการบริการเป็นวิธีนามธรรมที่ต้องใช้โดยผู้สืบทอด
-
| ----- httpservlet: servlet ที่ได้รับการปรับให้เหมาะสมสำหรับโปรโตคอล HTTP นั้นสืบทอดมาจากคลาส Genericservlet และวิธีการนามธรรมของบริการถูกนำมาใช้ การใช้งานเริ่มต้นจะกำหนดวิธีการร้องขอของคำขอและเรียกใช้วิธี doxxx () ที่แตกต่างกันตามวิธีการร้องขอที่แตกต่างกัน โดยปกติเราสามารถสืบทอด httpservlet โดยตรงได้โดยตรง
4. สิ่งที่ควรทราบเมื่อลงทะเบียน servlets ใน web.xml
4.1 ลงทะเบียน servlet โดยใช้แท็ก <servlet> <servlet-mapping> แท็ก
<servlet> <servlet-name> FirstServlet </servlet-name> <servlet-lass> cn.itheima.firstservlet </servlet-lass>
หมายเหตุ: สิ่งที่คุณต้องการที่นี่คือชื่อคลาสเต็มของ servlet ไม่ใช่เส้นทางไฟล์ที่มีส่วนขยาย. java หรือ. class
</servlet> <servlet-mapping> <servlet-name> firstservlet </servlet-name> <url-pattern>/firstservlet </url-pattern> </servlet-mapping>
4.2 One <servlet> สามารถสอดคล้องกับหลาย ๆ <servlet-mapping>
4.3 คุณสามารถใช้อักขระ *จับคู่เพื่อกำหนดค่า <serlvet-mapping> แต่ระวังว่ามันจะต้องเป็นเส้นทางที่เริ่มต้นด้วย *.do หรือ / / ที่ลงท้ายด้วย / *
~ เนื่องจากการเปิดตัวอักขระการจับคู่เป็นไปได้ว่าเส้นทางเสมือนจะสอดคล้องกับการตรวจสอบ servlet หลายครั้ง ในเวลานี้อันไหนที่คล้ายกับ Servlet ที่กำลังมองหาและระดับ *.do นั้นต่ำที่สุด
4.4 คุณสามารถกำหนดค่า <load-on-startup> sub-label สำหรับ <servlet> โดยระบุว่า servlet ถูกโหลดด้วยการเริ่มต้นเซิร์ฟเวอร์และค่าที่กำหนดค่าจะระบุลำดับของการเริ่มต้น
servlet> <servlet-name> invoker </servlet-name> <servlet-lass> org.apache.catalina.servlets.invokerservlet </servlet-lass> <load-on-startup> 2 </load-on-startup>
4.5 Servlet เริ่มต้น: หากเส้นทางการเข้าถึงภายนอกของ servlet ถูกตั้งค่าเป็น /servlet เป็น servlet เริ่มต้นและ servlets อื่น ๆ จะไม่ดำเนินการตามคำขอ
~ servlet เริ่มต้นได้รับการกำหนดค่าใน conf/web.xml และการเข้าถึงทรัพยากรคงที่และเอาต์พุตของหน้าข้อผิดพลาดได้รับการจัดการโดย servlet เริ่มต้นนี้ หากเราเขียน Servlet เริ่มต้นด้วยตนเองเพื่อเขียนทับ Servlet เริ่มต้นใน web.xml ของพ่อมันจะทำให้ทรัพยากรเว็บคงที่ไม่สามารถเข้าถึงได้ ดังนั้นจึงไม่แนะนำให้กำหนดค่า
4.6 ปัญหาด้านความปลอดภัยของเธรดของเซิร์ฟเล็ต
4.6.1 เนื่องจากโดยปกติ servlet มีเพียงหนึ่งอินสแตนซ์ในหน่วยความจำเพื่อประมวลผลคำขอเมื่อมีการส่งคำขอหลายเธรดหลายเธรดจะทำงานวัตถุ Servlet ซึ่งอาจนำไปสู่ปัญหาความปลอดภัยของเธรด
(1) อาจมีปัญหาด้านความปลอดภัยของเธรดกับตัวแปรสมาชิก Servlvet
*การทดลอง: กำหนดตัวแปรสมาชิก inti = 0; ดำเนินการ i ++ ในวิธี doxxx () และเอาต์พุต i ให้ค่ากับไคลเอนต์ ในเวลานี้ปัญหาความปลอดภัยของด้ายอาจเกิดขึ้นเนื่องจากความล่าช้า
(2) เมื่อ Servet ดำเนินการไฟล์ทรัพยากรหลายเธรดจะทำงานไฟล์เดียวกันและทำให้เกิดปัญหาด้านความปลอดภัยของเธรด
*การทดลอง: คำขอมาพร้อมกับพารามิเตอร์ servlet จะเขียนพารามิเตอร์คำขอไปยังไฟล์จากนั้นอ่านไฟล์และพิมพ์ค่าการอ่านไปยังไคลเอนต์ อาจมีปัญหาด้านความปลอดภัยของด้าย
4.6.2 โซลูชัน
(1) ใช้บล็อกรหัสแบบซิงโครนัสเพื่อแก้ปัญหา ข้อเสียคือบล็อกรหัสแบบซิงโครนัสสามารถประมวลผลคำขอเดียวในเวลาเดียวกันซึ่งไม่มีประสิทธิภาพมากดังนั้นบล็อกรหัสซิงโครนัสจะต้องมีรหัสหลักที่ทำให้เกิดปัญหาด้านความปลอดภัยของเธรด
(2) ใช้อินเทอร์เฟซ SingLetHreadModel สำหรับ servlet นี้ นี่คืออินเตอร์เฟสแท็ก servlet ที่ทำเครื่องหมายไว้จะบันทึกพูล servlet ในหน่วยความจำ หากเธรดมาและไม่มีการประมวลผลวัตถุเซิร์ฟเล็ตในพูลจะมีการสร้างใหม่ หากมี servlets ฟรีในสระให้ใช้โดยตรง สิ่งนี้ไม่ได้แก้ปัญหาความปลอดภัยของด้าย อินเทอร์เฟซนี้ถูกทอดทิ้ง
(3) โซลูชันทั้งสองไม่สมบูรณ์แบบดังนั้นพยายามอย่าปรากฏตัวแปรสมาชิกใน Servlet
3. ServletConfig
1. วัตถุที่แสดงการกำหนดค่าของ servlets ซึ่งสามารถกำหนดค่าได้ใน <servlet> ใน web.xml
<servlet> <servlet-name> demo5servlet </servlet-name> <servlet-lass> cn.itheima.demo5servlet </servlet-class> <init-param> <param-name> data1 </param-name>
จากนั้นใช้ this.getServletConfig () ใน servlet เพื่อรับวัตถุ servletConfig วัตถุนี้มีวิธีการ getInitParameter () และ getInitParameterNames () ซึ่งสามารถสำรวจรายการการกำหนดค่าในการกำหนดค่า
หากคุณไม่ต้องการเขียนเนื้อหาที่ตายแล้วใน servlet คุณสามารถกำหนดค่าได้ที่นี่
4. ServletContext
1. วัตถุที่เป็นตัวแทนของเว็บแอปพลิเคชันปัจจุบัน
2. ใช้เป็นวัตถุโดเมนถ่ายโอนข้อมูลระหว่าง servlets ที่แตกต่างกันและขอบเขตของมันคือเว็บแอปพลิเคชันทั้งหมด
Lifecycle: สร้างวัตถุ ServletContext แทนเว็บแอปพลิเคชันทั้งหมดเมื่อโหลดเว็บแอปพลิเคชันลงในคอนเทนเนอร์ เมื่อเซิร์ฟเวอร์ถูกปิดหรือเว็บแอปพลิเคชันจะถูกลบออกจากคอนเทนเนอร์วัตถุ ServletContext จะถูกทำลาย
~ โดเมน: โดเมนถูกเข้าใจว่าเป็นกล่องซึ่งสามารถวางข้อมูลได้ เนื่องจากโดเมนเรียกว่าโดเมนจึงมีช่วงที่มองเห็นได้ ข้อมูลในโดเมนนี้สามารถดำเนินการภายในช่วงนี้ วัตถุดังกล่าวเรียกว่าวัตถุโดเมน
3. ใน web.xml คุณสามารถกำหนดค่าพารามิเตอร์การเริ่มต้นของเว็บแอปพลิเคชันทั้งหมดและใช้ servletContext เพื่อรับ
<context-Param> <param-Name> param1 </param-name> <param-value> pvalue1 </param-value> </context-param> this.getServletContext (). getInitParameter ("param1") this.getServletContext ()4. การส่งต่อระหว่าง servlets ที่แตกต่างกัน
this.getServletContext (). getRequestDispatcher ("/servlet/demo10servlet"). ไปข้างหน้า (คำขอ, การตอบกลับ);หลังจากการดำเนินการของวิธีการเสร็จสิ้นบริการจะกลับไปที่เซิร์ฟเวอร์และเซิร์ฟเวอร์จะเรียก Servlet เป้าหมายซึ่งคำขอจะถูกสร้างขึ้นใหม่และข้อมูลของคำขอก่อนหน้านี้จะถูกคัดลอกไป
5. อ่านไฟล์ทรัพยากร
5.1 เนื่องจากเส้นทางสัมพัทธ์เป็นไดเรกทอรีที่เริ่มต้นโดยเครื่องเสมือน Java โดยค่าเริ่มต้นเราจะเขียนเส้นทางสัมพัทธ์โดยตรงเมื่อเทียบกับไดเรกทอรี Tomcat/Bin ดังนั้นเราจึงไม่สามารถรับทรัพยากรได้ หากเขียนเป็นเส้นทางที่แน่นอนเส้นทางที่สมบูรณ์จะผิดเมื่อโครงการถูกเผยแพร่ไปยังสภาพแวดล้อมอื่น
5.2 เพื่อแก้ปัญหานี้ ServletContext ให้ this.getServletContext (). getRealPath ("/1.properties") ซึ่งให้เส้นทางเสมือนกับทรัพยากรและจะส่งคืนเส้นทางจริงของทรัพยากรในสภาพแวดล้อมปัจจุบัน this.getServletContext (). getResourceasstream ("/1.properties") ซึ่งส่งคืนเส้นทางเสมือนของทรัพยากรไปยังสตรีมของเส้นทางจริงของทรัพยากร
5.3 เมื่อได้รับไฟล์ทรัพยากรภายใต้บริการที่ไม่ได้รับบริการจะไม่มีวัตถุ ServletContext ที่ใช้และสามารถใช้ตัวโหลดคลาสได้ในเวลานี้เท่านั้น
classloader.getResourceasstream ("../../ 1.properties") วิธีนี้ใช้ตัวโหลดคลาสเพื่อโหลดทรัพยากรลงในหน่วยความจำโดยตรงซึ่งมีปัญหาเกี่ยวกับความล่าช้าในการอัปเดตและหากไฟล์มีขนาดใหญ่เกินไปจะใช้หน่วยความจำมากเกินไป
classloader.getResource ("../ 1. properties"). getPath () ส่งคืนเส้นทางจริงของทรัพยากรโดยตรงโดยไม่มีปัญหาการอัปเดตการหน่วงเวลา
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการพูดคุยสั้น ๆ เกี่ยวกับรากฐานทางเทคนิคของการพัฒนาเซิร์ฟเล็ตและฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
การวิเคราะห์ขั้นพื้นฐานของเทคโนโลยีเซสชัน servlet
เช่นเดียวกับหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!