เซิร์ฟเล็ต เซิร์ฟเล็ต. เรากำลังเขียนเซิร์ฟเล็ตเพื่อตรวจสอบผู้ใช้โซเชียลเน็ตเวิร์กที่คุณป้อน
Java Servlet เป็นโปรแกรมฝั่งเซิร์ฟเวอร์ที่เขียนด้วยภาษาโปรแกรมชื่อเดียวกัน ซึ่งรับสัญญาณจากไคลเอนต์และส่งการตอบสนองกลับไป เป็นองค์ประกอบสำคัญที่สร้าง Java EE ทั่วไป นอกเหนือจาก JSP, EJB, XML และเทคโนโลยีอื่นๆ ที่เกี่ยวข้อง แอปพลิเคชันสามารถรวมเป็นไฟล์ WAR (Web AR chive) เพื่อปรับใช้บนเว็บเซิร์ฟเวอร์ เซิร์ฟเวอร์ที่สามารถรันเซิร์ฟเล็ต Java ได้เรียกว่าคอนเทนเนอร์ โปรแกรมที่ทำงานบนเซิร์ฟเวอร์ดังกล่าวสามารถสร้างเว็บเพจแบบไดนามิกได้
Java Servlet: พื้นฐาน
คอนเทนเนอร์ที่ได้รับความนิยมและใช้กันอย่างแพร่หลายที่สุดคือ Tomcat และ JBoss ในทางเทคนิคแล้ว เซิร์ฟเล็ตเป็นคลาส Java ปกติที่มีส่วนขยายสำหรับ Common Client-Server Protocol หรือ HTTP ในทางปฏิบัติ มันถูกใช้เพื่อประมวลผลคำขอผ่านการแทนที่ HttpServlet GET และ POST ตามลำดับ คอนเทนเนอร์ Java Servlet จัดเตรียม Http.ServletRequest และ Http.ServletResponse ซึ่งเป็นอ็อบเจ็กต์ที่ตอบสนองต่อคำขอ และมักจะใช้ร่วมกับ JSP เพื่อสร้างเนื้อหาแบบไดนามิก
สถานการณ์จำลองทั่วไป:
Java Servlet Filters เป็นส่วนประกอบปลั๊กอิน Java ที่ใช้ในการสกัดกั้นและประมวลผลคำขอก่อนที่จะถูกส่งไปยังเซิร์ฟเล็ตและตอบสนองหลังจากโค้ดเสร็จสมบูรณ์ และก่อนที่คอนเทนเนอร์จะส่งการตอบกลับไปยังไคลเอนต์
งานทั่วไปที่ดำเนินการกับตัวกรอง:
มีการเชื่อมต่อตัวกรองและกำหนดค่าในไฟล์ตัวอธิบายการปรับใช้ (web.xml) เซิร์ฟเล็ตและตัวกรองไม่รู้จักกัน ดังนั้นคุณจึงสามารถเพิ่มหรือลบตัวกรองได้ง่ายๆ โดยแก้ไข web.xml เป็นไปได้ที่จะมีหลายตัวกรองสำหรับทรัพยากรเดียว หรือสร้างกลุ่มตัวกรองสำหรับ web.xml หรือรันตัวกรอง Java Servlet โดยใช้อินเทอร์เฟซ javax.servlet.Filter
คำขอแบบขนานไปยังเซิร์ฟเวอร์ได้รับการประมวลผลโดยเธรด ซึ่งมีคุณสมบัติที่สำคัญของเว็บ - มัลติเธรดและการทำงานแบบขนาน
ฟังก์ชั่นหลัก:
ความจำเป็นในการใช้หน้าเว็บแบบไดนามิก
มีสาเหตุหลายประการที่ทำให้ธุรกิจต้องการสร้างเว็บเพจแบบไดนามิกได้ทันที เช่น เมื่อข้อมูลบนเว็บไซต์เปลี่ยนแปลงบ่อยครั้ง โดยทั่วไปแล้ว เว็บไซต์ข่าวสารและพยากรณ์อากาศจะใช้ CGI ในการทำให้เนื้อหามีความสดใหม่โดยไม่ต้องอาศัยความสนใจจากนักพัฒนาอย่างต่อเนื่อง หน้าเว็บอีคอมเมิร์ซที่แสดงราคาปัจจุบันและระดับสินค้าคงคลังใช้ CGI เพื่อดึงเนื้อหานี้ตามความต้องการ โดยดึงมาจากโครงสร้างพื้นฐานภายในของบริษัท
ผู้ใช้จำนวนมากมีประสบการณ์ในการใช้เทคโนโลยี Java เพื่อสร้างบริการเว็บที่ใช้ CGI แต่ Java Servlets นั้นมีประสิทธิภาพมากกว่า ทรงพลังกว่า ใช้งานง่ายกว่า และราคาถูกกว่าทางเลือก CGI แบบดั้งเดิม
ข้อดีของ Java Servlets:
เซิร์ฟเล็ตเป็นโปรแกรมจาวาที่ทำงานบนฝั่งเซิร์ฟเวอร์ของเว็บแอปพลิเคชัน เช่นเดียวกับแอปเพล็ตที่ขยายแบบไดนามิก ฟังก์ชั่นเซิร์ฟเล็ตของเว็บเบราว์เซอร์ขยายการทำงานของเว็บเซิร์ฟเวอร์แบบไดนามิก
งาน เซิร์ฟเล็ต"และสามารถอธิบายได้ดังต่อไปนี้: เมื่อคำขอมาถึงจากไคลเอนต์ เว็บเซิร์ฟเวอร์โดยใช้ไฟล์การกำหนดค่าพิเศษ สามารถกำหนดได้ว่าเซิร์ฟเล็ตใดที่จำเป็นต้องดำเนินการ หลังจากนี้ เว็บเซิร์ฟเวอร์จะเปิดตัว JVM ซึ่งจะดำเนินการ servlet Servlet ประมวลผลคำขอและถ่ายโอนเนื้อหาไปยังเว็บ - ไปยังเซิร์ฟเวอร์ (อาจอยู่ในรูปแบบของหน้า HTML) เว็บเซิร์ฟเวอร์ส่งการตอบกลับไปยังไคลเอนต์ (หน้า HTML ที่สร้างโดยเซิร์ฟเล็ต)
เว็บเซิร์ฟเวอร์นั้นเป็นคอนเทนเนอร์ชนิดหนึ่งที่โหลด เซิร์ฟเล็ต"s ดำเนินการพวกเขา และเมื่อได้รับผลลัพธ์จากพวกเขาแล้ว ก็ส่งไปยังลูกค้า
Servlet ในสถาปัตยกรรมแอปพลิเคชันเว็บ
ด้วยพลังและความยืดหยุ่นของมัน เซิร์ฟเล็ต"สามารถมีบทบาทสำคัญในสถาปัตยกรรมระบบ พวกเขาสามารถทำงานแอปพลิเคชันสำหรับมิดเดิลแวร์ ทำหน้าที่เป็นพร็อกซีสำหรับไคลเอนต์ และแม้แต่ปรับปรุงการทำงานของมิดเดิลแวร์โดยเพิ่มการรองรับโปรโตคอลใหม่และคุณสมบัติอื่น ๆ มิดเดิลแวร์ ทำหน้าที่เป็นเซิร์ฟเวอร์แอปพลิเคชันในระบบที่เรียกว่าระบบไคลเอ็นต์-เซิร์ฟเวอร์สามระดับ และตั้งอยู่ระหว่างไคลเอ็นต์แบบไลท์เวท เช่น เว็บเบราว์เซอร์ และแหล่งข้อมูล
Servlet เป็นพร็อกซีเซิร์ฟเวอร์
เพื่อรองรับแอปเพล็ต เซิร์ฟเล็ตสามารถทำหน้าที่เป็นพร็อกซีได้ สิ่งนี้อาจมีความสำคัญเนื่องจากการรักษาความปลอดภัย Java อนุญาตให้แอปเพล็ตเชื่อมต่อกับเซิร์ฟเวอร์ที่ดาวน์โหลดมาเท่านั้น หากแอปเพล็ตจำเป็นต้องเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลที่อยู่ในเครื่องอื่น เซิร์ฟเล็ตสามารถสร้างการเชื่อมต่อนี้สำหรับแอปเพล็ตได้
ชั่วคราวและถาวร เซิร์ฟเล็ต"ส
Servlets สามารถเริ่มต้นและหยุดได้สำหรับคำขอของลูกค้าแต่ละราย นอกจากนี้ยังสามารถเปิดใช้งานได้เมื่อเว็บเซิร์ฟเวอร์เริ่มทำงานและมีอยู่จนกว่าจะหยุดทำงาน ชั่วคราว เซิร์ฟเล็ต"ถูกโหลดตามความต้องการและเสนอวิธีที่ดีในการประหยัดทรัพยากรเซิร์ฟเวอร์สำหรับฟังก์ชันที่ไม่ค่อยได้ใช้ เซิร์ฟเล็ตแบบถาวรจะถูกโหลดเมื่อเว็บเซิร์ฟเวอร์เริ่มทำงานและคงอยู่จนกว่าจะหยุดทำงาน เซิร์ฟเล็ตจะถูกติดตั้งเป็นส่วนขยายถาวรไปยังเซิร์ฟเวอร์หากค่าใช้จ่ายในการรัน ซึ่งมีค่าสูงมาก (เช่น การสร้างการเชื่อมต่อฐานข้อมูล) หากมีฟังก์ชันการทำงานฝั่งเซิร์ฟเวอร์อย่างต่อเนื่อง (เช่น บริการ RMI) หรือในกรณีที่จำเป็นต้องตอบสนองต่อคำขอของลูกค้าโดยเร็วที่สุด ไม่มีรหัสเฉพาะเจาะจง กำหนด. เซิร์ฟเล็ต"และถาวรหรือชั่วคราว นี่เป็นหน้าที่ในการตั้งค่าเว็บเซิร์ฟเวอร์
วงจรชีวิตของเซิร์ฟเล็ต javax.servlet.Servlet
Servlets ทำงานบนแพลตฟอร์มเว็บเซิร์ฟเวอร์โดยเป็นส่วนหนึ่งของกระบวนการเดียวกันกับเว็บเซิร์ฟเวอร์ เว็บเซิร์ฟเวอร์มีหน้าที่รับผิดชอบในการเริ่มต้น เรียกใช้ และทำลายแต่ละอินสแตนซ์เซิร์ฟเล็ต เว็บเซิร์ฟเวอร์โต้ตอบกับเซิร์ฟเล็ตผ่านอินเทอร์เฟซที่เรียบง่าย: javax.servlet.Servlet.
อินเทอร์เฟซ javax.servlet.Servlet มีสามวิธีหลัก:
- เริ่มต้น()
- บริการ()
- ทำลาย()
และตัวช่วยสองวิธี:
- getServletConfig()
- getServletInfo()
ความคล้ายคลึงกันระหว่างอินเทอร์เฟซ เซิร์ฟเล็ต"และ Java applet นั้นชัดเจน นั่นเป็นวิธีการออกแบบอย่างแน่นอน! Java servlets นั้นสำหรับเว็บเซิร์ฟเวอร์ว่าแอพเพล็ตคืออะไรสำหรับเว็บเบราว์เซอร์ แอพเพล็ตทำงานในเว็บเบราว์เซอร์โดยดำเนินการตามคำขอผ่านอินเทอร์เฟซพิเศษ servlet ทำ สิ่งเดียวกันเมื่อทำงานบนเว็บเซิร์ฟเวอร์
การเริ่มต้นเซิร์ฟเล็ต, init() วิธีการ
เมื่อเซิร์ฟเล็ตถูกโหลดครั้งแรก เมธอด init() จะถูกเรียก ซึ่งช่วยให้เซิร์ฟเล็ตสามารถดำเนินการตั้งค่าใดๆ ได้ เช่น การเปิดไฟล์หรือสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ หากเซิร์ฟเล็ตถูกติดตั้งอย่างถาวรบนเซิร์ฟเวอร์ จะถูกโหลดเมื่อเซิร์ฟเวอร์เริ่มทำงาน มิฉะนั้น เซิร์ฟเวอร์จะเปิดใช้งานเซิร์ฟเล็ตเมื่อได้รับคำขอแรกจากไคลเอนต์เพื่อให้บริการที่เซิร์ฟเล็ตนั้นมอบให้
รับรองได้เลยว่าวิธีการ เริ่มต้น()จะสิ้นสุดก่อนการเรียกเซิร์ฟเล็ตอื่น ๆ - เช่นการเรียกเมธอด บริการ()- โปรดทราบว่า เริ่มต้น()จะถูกเรียกเพียงครั้งเดียว มันจะไม่ถูกเรียกจนกว่าเซิร์ฟเล็ตจะยกเลิกการโหลดแล้วโหลดโดยเซิร์ฟเวอร์อีกครั้ง
วิธี เริ่มต้น()รับหนึ่งอาร์กิวเมนต์ - การอ้างอิงถึงวัตถุ ServletConfigซึ่งมีอาร์กิวเมนต์เพื่อเริ่มต้นเซิร์ฟเล็ต วัตถุนี้มีวิธีการ getServletContext ()ส่งคืนวัตถุ ServletContextซึ่งมีข้อมูลเกี่ยวกับสภาพแวดล้อมของเซิร์ฟเล็ต
Servlet core วิธีการบริการ ()
วิธี บริการ()คือหัวใจของเซิร์ฟเล็ต แต่ละคำขอจากไคลเอนต์ส่งผลให้มีการเรียกเมธอดเดียว บริการ()- วิธีการนี้อ่านคำขอและสร้างข้อความตอบกลับโดยใช้สองอาร์กิวเมนต์ ServletRequest และ ServletResponse:
มีสองวิธีในการส่งข้อมูลจากไคลเอนต์ไปยังเซิร์ฟเล็ต ประการแรกคือการส่งผ่านค่าในพารามิเตอร์คำขอ สามารถแทรกค่าพารามิเตอร์ลงใน URL ได้ วิธีที่สองในการส่งข้อมูลจากไคลเอนต์ไปยังเซิร์ฟเล็ตคือผ่าน InputStream (หรือ Reader)
วิธีการทำงานอย่างไร บริการ()โดยพื้นฐานแล้วเป็นเรื่องง่าย - สร้างการตอบกลับสำหรับทุกคำขอของลูกค้าที่ส่งมาจากเซิร์ฟเวอร์ อย่างไรก็ตาม โปรดทราบว่าอาจมีคำขอหลายรายการที่ได้รับการประมวลผลพร้อมกัน หากวิธีการ บริการ()ต้องใช้ทรัพยากรภายนอก เช่น ไฟล์ ฐานข้อมูล ดังนั้น จึงจำเป็นเพื่อให้แน่ใจว่าการเข้าถึงทรัพยากรนั้นปลอดภัยต่อเธรด
ยกเลิกการโหลดเซิร์ฟเล็ต, ทำลาย () วิธีการ
วิธี ทำลาย()เรียกให้ปล่อยทรัพยากรทั้งหมด (เช่น เปิดไฟล์และการเชื่อมต่อฐานข้อมูล) ก่อนที่จะยกเลิกการโหลดเซิร์ฟเล็ต วิธีนี้สามารถเว้นว่างไว้ได้หากไม่จำเป็นต้องดำเนินการตกแต่งขั้นสุดท้าย ก่อนที่จะเรียกวิธีการ ทำลาย()เซิร์ฟเวอร์จะรอให้การดำเนินการบำรุงรักษาทั้งหมดเสร็จสิ้นหรือสิ้นสุดระยะเวลาหนึ่ง ซึ่งหมายความว่าวิธีการ ทำลาย()สามารถเรียกได้ในระหว่างการดำเนินการของวิธีการระยะยาวบางอย่าง บริการ().
สิ่งสำคัญคือต้องทำให้วิธีการเป็นทางการ ทำลาย()ในลักษณะที่จะหลีกเลี่ยงการปิดทรัพยากรที่จำเป็นจนกว่าจะมีการโทรทั้งหมด บริการ()จะไม่เสร็จสิ้น
การกำหนดค่าเซิร์ฟเล็ต, เมธอด getServletConfig()
วิธี getServletConfig()ส่งคืนการอ้างอิงไปยังวัตถุที่ใช้อินเทอร์เฟซ ServletConfig- ออบเจ็กต์นี้ให้การเข้าถึงข้อมูลเกี่ยวกับการกำหนดค่าเซิร์ฟเล็ต เช่น เข้าถึงพารามิเตอร์การเริ่มต้นเซิร์ฟเล็ตและวัตถุบริบทเซิร์ฟเล็ต ServletContextซึ่งให้การเข้าถึงเซิร์ฟเล็ตและสภาพแวดล้อม
ข้อมูลเซิร์ฟเล็ต, เมธอด getServletInfo()
วิธี getServletInfo()กำหนดโดยโปรแกรมเมอร์ที่สร้างเซิร์ฟเล็ตเพื่อส่งคืนสตริงที่มีข้อมูลเกี่ยวกับเซิร์ฟเล็ต เช่น ผู้สร้างและเวอร์ชันของเซิร์ฟเล็ต
อินเทอร์เฟซ ServletRequest
ServletRequest ให้ข้อมูลไคลเอ็นต์เกี่ยวกับพารามิเตอร์คำขอ HTTP ไปยังเซิร์ฟเล็ต เช่น ให้ข้อมูลรวมถึงชื่อและค่าพารามิเตอร์ คุณลักษณะ และสตรีมอินพุต ข้อมูลนี้จะถูกส่งผ่านไปยังวิธีการ บริการ().
ต่อไป ตัวอย่างเซิร์ฟเล็ตแสดงวิธีรับข้อมูลจากพารามิเตอร์ ขอวิธี บริการ():
เครื่องอ่าน BufferedReader; สตริงพารามิเตอร์1; สตริง param2; บริการโมฆะสาธารณะ (คำขอ ServletRequest, การตอบสนอง ServletResponse) ( reader = request.getReader(); param1 = request.getParameter("First"); param2 = request.getParameter("Second"); )
ข้อมูลเพิ่มเติมเกี่ยวกับการร้องขอมีอยู่ในเซิร์ฟเล็ตผ่านวิธีการ ซึ่งหลักๆ จะแสดงอยู่ในตารางต่อไปนี้:
รับแอตทริบิวต์() | ส่งกลับค่าของแอตทริบิวต์ที่ระบุของคำขอนี้ |
getContentLength () | ขนาดคำขอหากทราบ |
getContentType() | ส่งกลับประเภท MIME ของเนื้อหาคำขอ |
getInputStream () | ส่งคืน InputStream สำหรับการอ่านข้อมูลไบนารีจากเนื้อหาคำขอ |
รับชื่อพารามิเตอร์() | ส่งกลับอาร์เรย์ของสตริงที่มีชื่อของพารามิเตอร์ทั้งหมด |
รับค่าพารามิเตอร์ () | ส่งกลับอาร์เรย์ของค่าสำหรับพารามิเตอร์ที่ระบุ |
รับโปรโตคอล() | ส่งกลับโปรโตคอลและเวอร์ชันสำหรับการร้องขอเป็นสตริงของแบบฟอร์ม |
รับReader() | ส่งกลับ BufferedReader เพื่อดึงข้อความจากเนื้อหาคำขอ |
รับ RealPath() | ส่งคืนเส้นทางจริงสำหรับเส้นทางเสมือนที่ระบุ |
getRemoteAddr() | ที่อยู่ IP ของไคลเอ็นต์ที่ส่งคำขอนี้ |
getRemoteHost() | ชื่อโฮสต์ เครื่องไคลเอนต์ที่ส่งคำขอนี้ |
รับโครงการ() | ส่งคืนรูปแบบที่ใช้ใน URL ของคำขอนี้ (เช่น https, http, ftp เป็นต้น) |
รับชื่อเซิร์ฟเวอร์() | ชื่อโฮสต์ของเซิร์ฟเวอร์ที่ยอมรับคำขอนี้ |
getServerPort() | ส่งกลับหมายเลขพอร์ตที่ใช้ในการรับคำขอนี้ |
อินเทอร์เฟซ ServletResponse
อินเทอร์เฟซ ServletResponseเป็นเครื่องมือในการส่งข้อมูลไปยังไคลเอนต์ วิธีการทั้งหมดของเครื่องมือนี้ใช้เพื่อแก้ไขปัญหานี้โดยเฉพาะ:
สาธารณะ java.lang.String getCharacterEncoding() โมฆะสาธารณะ setLocale(java.util.Locale loc) สาธารณะ java.util.Locale getLocale()
วิธีแรกส่งคืนประเภทการเข้ารหัส MIME (เช่น UTF8) ซึ่งข้อมูลที่จะแสดง สองวิธีที่สองยังใช้ได้กับชุดอักขระด้วย ระบุภาษาที่ใช้ในเอกสาร (เช่น รัสเซีย)
สาธารณะ ServletOutputStream getOutputStream() พ่น java.io.IOException
เมธอด getOutputStream ส่งคืนสตรีมเอาต์พุตสำหรับเซิร์ฟเล็ต ตัวอย่างเช่น สตรีมนี้ใช้เพื่อส่งออกไฟล์ไบนารี ข้อมูลข้อความสามารถส่งออกได้โดยใช้ java.io.Writer:
java.io.PrintWriter getWriter() สาธารณะพ่น java.io.IOException
เมธอด getWriter() จะแปลงสตริงเป็นชุดอักขระที่ระบุในเมธอด getCharacterEncoding() และ getLocale() โดยอัตโนมัติ
โมฆะสาธารณะ setContentLength (int len)
วิธีการ setContentLength ตั้งค่าของฟิลด์ส่วนหัว HTTP "Content-Length"
โมฆะสาธารณะ setContentType (ประเภทสตริง)
เมธอด setContentType ใช้เพื่อส่งประเภทเนื้อหา MIME ของเอกสาร ฟิลด์ส่วนหัว HTTP "ประเภทเนื้อหา"
สตรีมข้อมูลเอาต์พุตถูกบัฟเฟอร์ ซึ่งหมายความว่าชิ้นส่วนของข้อมูลจะถูกส่งไปยังไคลเอนต์หลังจากที่บัฟเฟอร์เต็มเท่านั้น
โมฆะสาธารณะ setBufferSize (ขนาด int) int สาธารณะ getBufferSize () โมฆะสาธารณะ flushBuffer () พ่น java.io.IOException โมฆะสาธารณะ resetBuffer ()
วิธีการ 4 วิธีข้างต้นช่วยให้คุณสามารถกำหนดขนาดของบัฟเฟอร์การส่ง รับขนาดของมัน เริ่มต้นการส่งเนื้อหาของบัฟเฟอร์ไปยังไคลเอนต์ตามลำดับโดยไม่ต้องรอให้เต็ม และยังล้างบัฟเฟอร์ข้อมูลนี้ด้วย
บูลีนสาธารณะ isCommission()
เมื่อใช้เมธอด isCommission คุณจะได้รับแฟล็กที่ระบุว่าการส่งข้อมูลไปยังไคลเอ็นต์ได้เริ่มต้นแล้วหรือไม่ ค่าสถานะจะเป็นค่าบวกหากส่วนหัวการตอบกลับ HTTP ถูกส่งไปแล้ว
โมฆะสาธารณะรีเซ็ต()
หากยังไม่ได้ส่งส่วนหัว HTTP วิธีการรีเซ็ตจะ "รีเซ็ต" ส่วนหัว HTTP เป็นค่าเริ่มต้น
แผนภูมิ JFreeChart ในเซิร์ฟเล็ต
ไลบรารีกราฟิก JFreeChart สามารถใช้ในเซิร์ฟเล็ตเพื่อสร้างแผนภูมิและแสดงบนหน้าเว็บไซต์เป็นรูปภาพ รายละเอียดของคำอธิบายและตัวอย่างการใช้ JFreeChart ในเซิร์ฟเล็ตจะถูกนำเสนอ
Servlet พร้อมไลบรารีกราฟิก Chart.js
JNI ในเซิร์ฟเล็ต
ในบางกรณี อาจจำเป็นต้องใช้ JNI ในเว็บแอปพลิเคชัน มีการนำเสนอตัวอย่างของการใช้ JNI ในเซิร์ฟเล็ต
ข้อความ JMS ในเซิร์ฟเล็ต
Servlet สามารถใช้ในการสื่อสาร เจเอ็มเอสข้อความระหว่างแอปพลิเคชัน ตัวอย่างของการใช้เซิร์ฟเล็ตเพื่อส่งและอ่านข้อความ JMS ในคอนเทนเนอร์ JBoss จะถูกนำเสนอ
Servlets คือโปรแกรม Java ที่ทำงานบนฝั่งเซิร์ฟเวอร์ของเว็บแอปพลิเคชัน เช่นเดียวกับที่แอปเพล็ตขยายฟังก์ชันการทำงานของเว็บเบราว์เซอร์แบบไดนามิก เซิร์ฟเล็ตจะขยายฟังก์ชันการทำงานของเว็บเซิร์ฟเวอร์แบบไดนามิก แม้ว่าเซิร์ฟเล็ตจะสามารถตอบสนองคำขอใดๆ ได้ แต่โดยทั่วไปแล้วจะใช้เพื่อขยายเว็บเซิร์ฟเวอร์ สำหรับแอปพลิเคชันดังกล่าว เทคโนโลยี Java Servlet จะกำหนดคลาสเซิร์ฟเล็ตเฉพาะ HTTP แพ็คเกจ javax.servlet และ javax.servlet.http จัดเตรียมอินเทอร์เฟซและคลาสสำหรับการสร้างเซิร์ฟเล็ต
- โครงสร้างของโครงการเว็บคืออะไร?
- คอนเทนเนอร์เซิร์ฟเล็ตคืออะไร? วงจรชีวิตของเซิร์ฟเล็ต
คอนเทนเนอร์เซิร์ฟเล็ตเป็นโปรแกรมที่จัดการวงจรชีวิตของเซิร์ฟเล็ต
วงจรชีวิตของเซิร์ฟเล็ต: มันถูกจัดการโดยคอนเทนเนอร์เซิร์ฟเล็ต ในครั้งแรกที่มีการเข้าถึงเซิร์ฟเล็ต เซิร์ฟเล็ตจะถูกโหลดเข้าสู่หน่วยความจำ และเรียกใช้เมธอด init() ตลอดการดำเนินการของแอปพลิเคชัน การเรียกใช้เมธอด service() จะเกิดขึ้นเพื่อประมวลผลคำขอของไคลเอ็นต์ เมื่อแอปพลิเคชันสิ้นสุดลง เมธอด destroy() จะถูกเรียกใช้ และเซิร์ฟเล็ตจะถูกยกเลิกการโหลดจากหน่วยความจำ
- งานและฟังก์ชันการทำงานของคอนเทนเนอร์เซิร์ฟเล็ตคืออะไร?
คอนเทนเนอร์เซิร์ฟเล็ตสามารถทำหน้าที่เป็นเว็บเซิร์ฟเวอร์แบบสแตนด์อโลนเต็มรูปแบบ ทำหน้าที่เป็นผู้ให้บริการเพจสำหรับเว็บเซิร์ฟเวอร์อื่น เช่น Apache หรือรวมเข้ากับแอปพลิเคชันเซิร์ฟเวอร์ Java EE ให้การแลกเปลี่ยนข้อมูลระหว่างเซิร์ฟเล็ตและไคลเอนต์ รับหน้าที่ต่างๆ เช่น การสร้าง สภาพแวดล้อมซอฟต์แวร์สำหรับเซิร์ฟเล็ตที่ทำงาน การระบุและการอนุญาตไคลเอนต์ การจัดการเซสชั่นสำหรับแต่ละเซิร์ฟเล็ต
- sendRedirect() และ forward() แตกต่างกันอย่างไร?
ในการเรียก JSP โดยใช้พาธสัมพัทธ์ จะใช้เมธอด sendRedirect() ในการเข้าถึง JSP โดยใช้พาธสัมบูรณ์ ความแตกต่างระหว่างเมธอดเหล่านี้ก็คือ เมื่อใช้เมธอด forward() ออบเจ็กต์คำขอที่มีอยู่แล้วจะถูกส่งผ่าน และเมื่อมีการเรียกใช้เมธอด sendRedirect() คำขอใหม่จะถูกสร้างขึ้น ในกรณีหลังนี้ ข้อมูลควรถูกส่งไปยังวัตถุอื่น นอกจากนี้ เมธอด forward() ยังทำงานได้เร็วกว่าอีกด้วย
- คุณรู้อะไรเกี่ยวกับตัวกรองเซิร์ฟเล็ต
การใช้อินเทอร์เฟซตัวกรองทำให้คุณสามารถสร้างออบเจ็กต์ที่ดักฟังคำขอและสามารถเปลี่ยนส่วนหัวและเนื้อหาของคำขอไคลเอ็นต์ได้ ตัวกรองไม่ได้สร้างคำขอหรือการตอบกลับ แต่เพียงแก้ไขเท่านั้น ตัวกรองดำเนินการ ก่อนการรักษาร้องขอก่อนที่จะถึงเซิร์ฟเล็ต ตามด้วย (หากจำเป็น) โดยประมวลผลการตอบสนองที่มาจากเซิร์ฟเล็ต ตัวกรองสามารถโต้ตอบกับ ประเภทต่างๆโดยเฉพาะอย่างยิ่ง ทั้งเซิร์ฟเล็ตและเพจ JSP ตัวกรองเซิร์ฟเล็ตสามารถ:
- สกัดกั้นการเริ่มต้นเซิร์ฟเล็ตก่อนที่จะเริ่มต้นเซิร์ฟเล็ต
- กำหนดเนื้อหาของคำร้องขอก่อนที่จะเริ่มต้นเซิร์ฟเล็ต
- แก้ไขส่วนหัวของคำขอและข้อมูลซึ่งบรรจุคำขอที่เข้ามา
- แก้ไขส่วนหัวการตอบกลับและข้อมูลซึ่งบรรจุการตอบกลับที่ได้รับ
- สกัดกั้นการเริ่มต้นเซิร์ฟเล็ตหลังจากเข้าถึงเซิร์ฟเล็ต
ตัวกรองเซิร์ฟเล็ตสามารถกำหนดค่าให้ทำงานบนเซิร์ฟเล็ตเดียวหรือกลุ่มของเซิร์ฟเล็ตได้ พื้นฐานสำหรับการสร้างตัวกรองคืออินเทอร์เฟซ javax.servlet.Filter ซึ่งใช้สามวิธี:
- เป็นโมฆะ init (การกำหนดค่า FilterConfig) พ่น ServletException;
- โมฆะทำลาย();
- เป็นโมฆะ doFilter (คำขอ ServletRequest, การตอบสนอง ServletResponse, ห่วงโซ่ FilterChain) พ่น IOException, ServletException;
มีการเรียกเมธอด init() ก่อนที่ตัวกรองจะเริ่มทำงานและตั้งค่าออบเจ็กต์การกำหนดค่าของตัวกรอง วิธีการ doFilter จะทำงานจริงของตัวกรอง ดังนั้น เซิร์ฟเวอร์จะเรียก init() หนึ่งครั้งเพื่อเริ่มตัวกรอง จากนั้นจึงเรียก doFilter() หลายครั้งตามที่ร้องขอไปยังตัวกรองนี้โดยตรง หลังจากที่ตัวกรองทำงานเสร็จสิ้นแล้ว จะเรียกเมธอด destroy()
- เหตุใดเราจึงต้องมีผู้ฟังในเซิร์ฟเล็ต?
Listener บริบทและเซสชันคือคลาสที่สามารถติดตามเมื่อบริบทหรือเซสชันถูกเตรียมใช้งาน หรือติดตามว่าเมื่อใดควรถูกทำลาย และเมื่อใดที่คุณลักษณะถูกเพิ่มหรือลบออกจากบริบทหรือเซสชัน Servlet 2.4 ขยายโมเดลตัวฟังคำขอโดยอนุญาตให้คุณติดตามวิธีการสร้างและทำลายคำขอ และวิธีเพิ่มและลบคุณลักษณะออกจากเซิร์ฟเล็ต Servlet 2.4 เพิ่มคลาสต่อไปนี้:
- ServletRequestListener
- ServletRequestEvent
- ServletRequestAttributeListener
- ServletRequestAttributeEvent
- วิธีจัดการกับข้อยกเว้นที่เกิดจากเซิร์ฟเล็ตอื่นในแอปพลิเคชัน
เนื่องจากเบราว์เซอร์เข้าใจเฉพาะ HTML เท่านั้น เมื่อแอปพลิเคชันส่งข้อยกเว้น คอนเทนเนอร์เซิร์ฟเล็ตจะจัดการข้อยกเว้นและสร้างขึ้นมา การตอบสนอง HTML- ซึ่งคล้ายกับสิ่งที่เกิดขึ้นกับรหัสข้อผิดพลาดเช่น 404, 403 เป็นต้น Servlet API ให้การสนับสนุนเซิร์ฟเล็ตดั้งเดิมเพื่อจัดการกับข้อยกเว้นและข้อผิดพลาด ซึ่งเราสามารถระบุในตัวอธิบายการปรับใช้ งานหลักของเซิร์ฟเล็ตดังกล่าวคือการจัดการข้อผิดพลาดหรือข้อยกเว้น และส่งการตอบสนอง HTML ที่ชัดเจนไปยังผู้ใช้ ตัวอย่างเช่น คุณสามารถระบุลิงก์ไปยัง หน้าแรกตลอดจนคำอธิบายรายละเอียดบางอย่างเกี่ยวกับข้อผิดพลาด
- ตัวอธิบายการปรับใช้คืออะไร?
ตัวอธิบายการปรับใช้คือไฟล์การกำหนดค่าของสิ่งประดิษฐ์ที่จะนำไปใช้กับคอนเทนเนอร์เซิร์ฟเล็ต ในข้อกำหนด แพลตฟอร์มจาวาตัวอธิบายการปรับใช้ Enterprise Edition อธิบายถึงวิธีการปรับใช้ส่วนประกอบ โมดูล หรือแอปพลิเคชัน (เช่น เว็บหรือแอปพลิเคชันระดับองค์กร)
ไฟล์การกำหนดค่านี้ระบุตัวเลือกการปรับใช้สำหรับโมดูลหรือแอปพลิเคชันที่มีการตั้งค่าเฉพาะ ตัวเลือกความปลอดภัย และอธิบายข้อกำหนดการกำหนดค่าเฉพาะ ไวยากรณ์สำหรับไฟล์ตัวอธิบายการปรับใช้ใช้ XML
- จะใช้การเปิดตัวเซิร์ฟเล็ตด้วยการเปิดตัวแอปพลิเคชันได้อย่างไร
โดยปกติคอนเทนเนอร์เซิร์ฟเล็ตจะโหลดเซิร์ฟเล็ตตามคำขอแรกของไคลเอ็นต์ แต่บางครั้งจำเป็นต้องโหลดเซิร์ฟเล็ตทันทีที่จุดเริ่มต้นของแอปพลิเคชัน (เช่น หากเซิร์ฟเล็ตมีขนาดใหญ่และจะใช้เวลานานในการโหลด) เมื่อต้องการทำเช่นนี้ คุณต้องใช้องค์ประกอบ load-on-startup ในตัวอธิบาย (หรือหมายเหตุประกอบ loadOnStartup) ซึ่งจะระบุว่าควรโหลดเซิร์ฟเล็ตเมื่อเริ่มต้นหรือไม่
ค่าจะต้องเป็น int หากค่าเป็นลบ เซิร์ฟเล็ตจะถูกโหลดเมื่อไคลเอนต์ร้องขอ และหากเป็น 0 และมากกว่านั้น เซิร์ฟเล็ตจะถูกโหลดเมื่อเริ่มต้นแอปพลิเคชัน ยิ่งตัวเลขต่ำ เซิร์ฟเล็ตก็จะยิ่งอยู่ในคิวการดาวน์โหลดเร็วขึ้นเท่านั้น
- วัตถุ ServletConfig คืออะไร
อินเทอร์เฟซ javax.servlet.ServletConfig ใช้เพื่อส่งข้อมูลการกำหนดค่าไปยังเซิร์ฟเล็ต แต่ละเซิร์ฟเล็ตมีอ็อบเจ็กต์ ServletConfig ของตัวเอง ซึ่งคอนเทนเนอร์เซิร์ฟเล็ตมีหน้าที่ในการสร้างอินสแตนซ์ หากต้องการตั้งค่าพารามิเตอร์การกำหนดค่า ให้ใช้พารามิเตอร์ init ใน web.xml (หรือคำอธิบายประกอบ WebInitParam) เมธอด getServletConfig() ใช้เพื่อรับอ็อบเจ็กต์ ServletConfig ของเซิร์ฟเล็ตที่กำหนด
- วัตถุ ServletContext คืออะไร
อินเทอร์เฟซ javax.servlet.ServletContext กำหนดชุดวิธีการที่เซิร์ฟเล็ตใช้เพื่อสื่อสารกับคอนเทนเนอร์เซิร์ฟเล็ต ตัวอย่างเช่น การรับประเภท MIME ของไฟล์ การส่งคำขอ หรือการเขียนลงในไฟล์บันทึก ออบเจ็กต์ ServletContext มีลักษณะเฉพาะและพร้อมใช้งานสำหรับเซิร์ฟเล็ตทั้งหมดในแอปพลิเคชันเว็บ เราสามารถใช้วัตถุ ServletContext เมื่อเราต้องการให้การเข้าถึงเซิร์ฟเล็ตอย่างน้อยหนึ่งรายการกับพารามิเตอร์เริ่มต้นของเว็บแอปพลิเคชัน องค์ประกอบนี้ใช้สำหรับสิ่งนี้
คอนเทนเนอร์เซิร์ฟเล็ตยังสามารถจัดเตรียมวัตถุบริบทที่ไม่ซ้ำกับกลุ่มของเซิร์ฟเล็ต แต่ละกลุ่มจะเชื่อมโยงกับชุด URL เส้นทางโฮสต์ของตนเอง
ServletContext ได้รับการขยายในข้อกำหนด Servlet 3 และจัดให้มี การเพิ่มซอฟต์แวร์ผู้ฟังและตัวกรองในแอปพลิเคชัน อินเทอร์เฟซนี้ยังมีวิธีการที่มีประโยชน์มากมาย เช่น getMimeType(), getResourceAsStream() เป็นต้น
- ความแตกต่างระหว่าง ServletContext และ ServletConfig คืออะไร?
ด้านล่างนี้คือข้อแตกต่างบางประการ:
- ServletConfig เป็นออบเจ็กต์ที่ไม่ซ้ำกันสำหรับแต่ละเซิร์ฟเล็ต ในขณะที่ ServletContext จะไม่ซ้ำกันสำหรับแอปพลิเคชันทั้งหมด
- ServletConfig ใช้เพื่อจัดเตรียมพารามิเตอร์การเริ่มต้นให้กับเซิร์ฟเล็ต และ ServletContext ใช้เพื่อจัดเตรียมพารามิเตอร์การเริ่มต้นแอปพลิเคชันให้กับเซิร์ฟเล็ตทั้งหมด
- เราไม่สามารถตั้งค่าแอตทริบิวต์ในวัตถุ ServletConfig ในขณะที่เราสามารถตั้งค่าคุณลักษณะในวัตถุ ServletContext ที่จะพร้อมใช้งานสำหรับเซิร์ฟเล็ตอื่น
- อินเทอร์เฟซ ServletResponse
อินเทอร์เฟซ ServletResponse เป็นเครื่องมือสำหรับการส่งข้อมูลไปยังไคลเอนต์ วิธีการทั้งหมดในเครื่องมือนี้ตอบสนองจุดประสงค์นี้ทุกประการ
- อินเทอร์เฟซ ServletRequest
อินเทอร์เฟซ ServletRequest เป็นเครื่องมือสำหรับรับพารามิเตอร์คำขอ HTTP อินเทอร์เฟซนี้มีวิธีการบางอย่างเหมือนกันในชื่อและวัตถุประสงค์ของ ServletContext
- Request Dispatcher คืออะไร?
อินเทอร์เฟซ RequestDispatcher ใช้เพื่อส่งคำขอไปยังทรัพยากรอื่น (ซึ่งอาจเป็น HTML, JSP หรือเซิร์ฟเล็ตอื่นในแอปพลิเคชันเดียวกัน) เราสามารถใช้สิ่งนี้เพื่อเพิ่มเนื้อหาจากแหล่งข้อมูลอื่นในการตอบกลับ อินเทอร์เฟซนี้ใช้สำหรับการสื่อสารภายในระหว่างเซิร์ฟเล็ตในบริบทเดียวกัน อินเทอร์เฟซใช้สองวิธี:
- ถือเป็นโมฆะไปข้างหน้า(ServletRequest var1, ServletResponse var2) - ส่งต่อคำขอจากเซิร์ฟเล็ตไปยังทรัพยากรอื่น (ไฟล์เซิร์ฟเล็ต, JSP หรือ HTML) บนเซิร์ฟเวอร์
- เป็นโมฆะรวม(ServletRequest var1, ServletResponse var2) - รวมเนื้อหาของทรัพยากร (servlet, JSP หรือ หน้า HTML) เพื่อตอบสนอง
อินเทอร์เฟซสามารถเข้าถึงได้โดยใช้เมธอด ServletContext getRequestDispatcher(String s) เส้นทางต้องขึ้นต้นด้วย / ซึ่งจะถูกตีความโดยสัมพันธ์กับเส้นทางรูทบริบทปัจจุบัน
- คุณจะสร้างการหยุดชะงักในเซิร์ฟเล็ตได้อย่างไร?
การหยุดชะงักสามารถรับได้โดยการใช้การเรียกเมธอดแบบวนซ้ำ ตัวอย่างเช่น โดยการเรียกเมธอด doPost() ในเมธอด doGet() และการเรียก doGet() ในเมธอด doPost()
- จะรับที่อยู่ของเซิร์ฟเล็ตบนเซิร์ฟเวอร์ได้อย่างไร?
หากต้องการรับเส้นทางเซิร์ฟเล็ตจริงบนเซิร์ฟเวอร์ คุณสามารถใช้โครงสร้างนี้: getServletContext().getRealPath(request.getServletPath())
- จะรับข้อมูลเซิร์ฟเวอร์จากเซิร์ฟเล็ตได้อย่างไร?
ข้อมูลเซิร์ฟเวอร์สามารถรับได้โดยใช้วัตถุ ServletContext โดยใช้เมธอด getServerInfo() เหล่านั้น. getServletContext().getServerInfo()
- จะรับที่อยู่ IP ของลูกค้าบนเซิร์ฟเวอร์ได้อย่างไร
ใช้ request.getRemoteAddr() เพื่อรับ IP ของไคลเอ็นต์ในเซิร์ฟเล็ต
- คุณรู้อะไรเกี่ยวกับคลาสของ servlet wrapper?
Servlet HTTP API มีคลาส wrapper สองคลาส - HttpServletRequestWrapper และ HttpServletResponseWrapper ช่วยให้นักพัฒนานำการใช้งานคำขอและประเภทการตอบกลับของเซิร์ฟเล็ตมาใช้เอง เราสามารถขยายคลาสเหล่านี้และแทนที่เฉพาะวิธีการที่จำเป็นเพื่อใช้การตอบสนองและประเภทออบเจ็กต์คำขอของเราเอง คลาสเหล่านี้ไม่ได้ใช้ในการเขียนโปรแกรมเซิร์ฟเล็ตมาตรฐาน
หนึ่งในสิ่งที่ดีที่สุดเกี่ยวกับ Java ก็คือลักษณะการใช้งานที่หลากหลาย แน่นอนว่าการสร้างเดสก์ท็อปแบบดั้งเดิมและแม้กระทั่ง แอปพลิเคชันมือถือ- นี่เป็นสิ่งที่ดีมาก แต่ถ้าคุณต้องการหลีกหนีจากเส้นทางที่ไม่คุ้นเคยและเข้าสู่พื้นที่การพัฒนาล่ะ? แอปพลิเคชันเว็บในชวา? ข่าวดีสำหรับคุณก็คือภาษานี้มาพร้อมกับ Servlet API ที่มีคุณสมบัติครบถ้วน ซึ่งช่วยให้คุณสามารถสร้างแอปพลิเคชันเว็บที่เชื่อถือได้โดยไม่ต้องยุ่งยากมากนัก
การสร้างแอปพลิเคชัน Java ด้วย Servlets
ดังนั้นเราจึงได้สร้างไว้แล้ว ไฟล์การกำหนดค่าการใช้งาน อย่างไรก็ตาม ในสถานะปัจจุบัน มันไม่ได้ทำอะไรเลยอย่างแท้จริง เราต้องการให้ลูกค้าสามารถลงทะเบียนโดยใช้แบบฟอร์ม HTML ได้ ดังนั้นสิ่งต่อไปที่เราต้องทำคือสร้างไฟล์ JSP ที่จะแสดงแบบฟอร์มด้านบนและรายละเอียดลูกค้าเมื่อการลงทะเบียนเสร็จสมบูรณ์ นี่คือสิ่งที่เราจะทำตอนนี้
เรากำลังดำเนินการเกี่ยวกับรูปลักษณ์ภายนอก
ลักษณะที่ปรากฏของแอปพลิเคชันจะถูกกำหนดโดยไฟล์ JSP สองไฟล์ - ในบริบท MVC ไฟล์เหล่านี้เรียกว่ามุมมอง คนแรกจะต้องรับผิดชอบในการแสดงแบบฟอร์มลงทะเบียนและ ข้อผิดพลาดที่เป็นไปได้เรียกว่าหลังจากตรวจสอบข้อมูลที่ป้อนแล้ว ส่วนที่สองจะเป็นหน้าต้อนรับปกติที่จะแสดงรายละเอียดที่ลูกค้าป้อนหลังจากกระบวนการลงทะเบียนเสร็จสมบูรณ์
นี่คือไฟล์ JSP ไฟล์แรก:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
การลงทะเบียน
$(การละเมิด)
ไฟล์ประกอบด้วย HTML ง่าย ๆด้วยการเพิ่มเติมสองสามอย่าง นี่คือความงามของ JSP รวมกับ JSTL และ JEL สังเกตว่าการตรวจสอบข้อผิดพลาดในการตรวจสอบความถูกต้องนั้นง่ายดายเพียงใดโดยใช้แท็กมาตรฐาน เช่น<с:if>และ
แอ็ตทริบิวต์การดำเนินการของแบบฟอร์มการลงทะเบียนชี้ไปที่ URL ต่อไปนี้: $(pageContext.request.contextPath)/processcustomer ซึ่งหมายความว่าทุกครั้งที่ลูกค้าพยายามลงทะเบียน ข้อมูลจะถูกส่งไปยังลูกค้าที่ประมวลผล โดยไม่คำนึงถึง URL ที่เข้าถึงแบบฟอร์ม สิ่งนี้สามารถทำได้ผ่านการทำงานของอ็อบเจ็กต์ที่มีอยู่ในไฟล์ JSP เช่น request .
เร็วๆ นี้เราจะดูว่าเซิร์ฟเล็ตเชื่อมโยงกับ URL ของลูกค้ากระบวนการอย่างไร และโต้ตอบกับอินพุตอย่างไร ในตอนนี้ เรามาดูไฟล์ JSP ที่รับผิดชอบหน้าต้อนรับกัน:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
ขอบคุณสำหรับการลงทะเบียน!
ข้อมูลที่คุณป้อน:
ชื่อ:$(ชื่อ)
นามสกุล:$(นามสกุล)
อีเมล:$(อีเมล)
ตอนนี้เราเข้าใจการแสดงผลเพจแล้ว ขั้นตอนต่อไปคือการสร้างเซิร์ฟเล็ตที่รับผิดชอบในการรวบรวมข้อมูลไคลเอ็นต์จากคำขอ POST และตรวจสอบความถูกต้องของข้อมูลด้วยวิธีง่ายๆ
การเขียนตัวควบคุม
การเขียนเซิร์ฟเล็ตที่สามารถดึงข้อมูลจากแบบฟอร์มลงทะเบียนไม่ใช่เรื่องง่ายอีกต่อไป สิ่งที่เราต้องทำคือเขียนคลาสย่อยของคลาส HttpServlet และใช้เมธอด doGet() หรือ doPost() (หรือทั้งสองอย่าง หากจำเป็น) ในกรณีนี้ เซิร์ฟเล็ตจะโต้ตอบกับข้อมูลที่มาจากคำขอ POST
นี่คือสิ่งที่ดูเหมือน:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") คลาสสาธารณะ CustomerController ขยาย HttpServlet ( @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) พ่น ServletException, IOException ( RequestCustomer customer = RequestCustomer.fromRequestParameters(request); customer .setAsRequestAttributes(request); การละเมิดรายการ = customer.validate(); if (!violations.isEmpty()) ( request.setAttribute("violations", allowances); ) String url = กำหนดUrl(violations); , การตอบสนอง); ) สตริงส่วนตัวกำหนดUrl(การละเมิดรายการ) ( if (!violations.isEmpty()) ( return "/"; ) else ( return "/WEB-INF/views/customerinfo.jsp"; ) ) คลาสคงที่ส่วนตัว RequestCustomer ( ชื่อสตริงสุดท้ายส่วนตัว; นามสกุลสตริงสุดท้ายส่วนตัว; อีเมลสตริงสุดท้ายส่วนตัว; RequestCustomer ส่วนตัว (ชื่อสตริง, นามสกุลสตริง, อีเมลสตริง) ( this.firstName = firstName; this.lastName = นามสกุล;<>this.email = อีเมล;
) Public static RequestCustomer fromRequestParameters(คำขอ HttpServletRequest) ( return new RequestCustomer(request.getParameter("firstname"), request.getParameter("lastname"), request.getParameter("email")); ) โมฆะสาธารณะ setAsRequestAttributes(คำขอ HttpServletRequest) ( request.setAttribute("firstname", firstName); request.setAttribute("lastname", LastName); request.setAttribute("email", email); ) ตรวจสอบรายการสาธารณะ () ( การละเมิดรายการ = new ArrayList
ที่นี่เราได้ตั้งชื่อเซิร์ฟเล็ต CustomerController เนื่องจากถือเป็นแนวปฏิบัติที่ดีในการใช้ชื่อคลาสเซิร์ฟเล็ตเป็นค่าของแอตทริบิวต์ name ของคำอธิบายประกอบ @WebServlet มิฉะนั้น บางคอนเทนเนอร์จะไม่สามารถจับคู่ได้ ส่งผลให้เกิดข้อผิดพลาด 404
คลาส CustomerController เองก็ทำสิ่งง่ายๆ บางอย่าง ขั้นแรกจะรวบรวมอินพุตแบบฟอร์มโดยใช้อินเทอร์เฟซ HttpServletRequest ซึ่งมีค่าที่สอดคล้องกับช่องชื่อ นามสกุล และอีเมลของแบบฟอร์ม จากนั้นจะตั้งค่าเหล่านี้เป็นแอตทริบิวต์แบบสอบถามเพื่อให้สามารถแสดงซ้ำได้ในแบบฟอร์มหรือบนหน้าผลลัพธ์ สุดท้าย ผู้ตรวจสอบความถูกต้องจะตรวจสอบความถูกต้องของข้อมูลที่ป้อน
เครื่องมือตรวจสอบความถูกต้องเป็นคลาสง่ายๆ ที่ตรวจสอบคุณสมบัติบางอย่าง เช่น สตริงว่างเปล่าหรืออีเมลดูเหมือนอีเมลหรือไม่ คุณสามารถดูการใช้งานได้ใน GitLab ของผู้เขียน
ผลการตรวจสอบจะส่งผลต่อขั้นตอนต่อไปของเหตุการณ์: หากข้อมูลไม่ถูกต้อง ไคลเอ็นต์จะถูกเปลี่ยนเส้นทางผ่านออบเจ็กต์ RequestDispatcher ไปยังหน้าการลงทะเบียน ซึ่งจะแสดงข้อผิดพลาดที่เกี่ยวข้อง หากทุกอย่างเป็นไปตามลำดับ หน้าต้อนรับจะปรากฏขึ้น
ดังนั้นเราจึงได้สร้างเว็บแอปพลิเคชันทั้งหมดใน Java ที่อนุญาตให้คุณลงทะเบียนไคลเอนต์โดยใช้รูปแบบ HTML เซิร์ฟเล็ตพื้นฐาน และไฟล์ JSP สองสามไฟล์ ถึงเวลาเปิดตัวแล้ว
เปิดแอปพลิเคชัน
ในการเปิดแอปพลิเคชันคุณต้องทำตามขั้นตอนต่อไปนี้:
IntelliJ IDEA) เมื่อคุณปรับใช้โปรเจ็กต์และรัน เบราว์เซอร์เริ่มต้นควรเปิดขึ้นพร้อมกับหน้าต่างการลงทะเบียน
บทสรุป
ดังนั้น คุณได้รับทักษะทั้งหมดที่จำเป็นในการสร้างเว็บแอปพลิเคชันของคุณเองใน Java โดยไม่ต้องใช้เฟรมเวิร์กที่ซับซ้อน สิ่งที่คุณต้องมีคือ Servlet API เทคโนโลยีเช่น JSP สำหรับการเรนเดอร์ และเครื่องมือ Java ดั้งเดิม เยี่ยมมากใช่มั้ย?
เป็นที่น่าสังเกตว่าการใช้งานคลาส CustomerController เน้นจุดแข็งและจุดอ่อนของเซิร์ฟเล็ต ในด้านหนึ่ง แสดงให้เห็นโดยย่อว่าการประมวลผลพารามิเตอร์คำขอและส่งการตอบกลับไปยังไคลเอนต์ในรูปแบบที่แตกต่างกันนั้นง่ายเพียงใด แต่ฟังก์ชันการทำงานนี้มาพร้อมกับราคา: การใช้งานทั้งอินเทอร์เฟซ HttpServletResponse และ HttpServletResponse เป็นตัวระบุตำแหน่งบริการปกติ นี่ไม่ได้เป็นการบอกว่านี่เป็นสิ่งที่ไม่ดี เนื่องจากตัวระบุตำแหน่งมีเพียงข้อมูลเท่านั้น อย่างไรก็ตาม คุณต้องจำไว้ว่าการใช้งานเหล่านี้จะเชื่อมโยงกับเซิร์ฟเล็ตเสมอ
เซิร์ฟเล็ตตัวอย่างประกอบด้วยเซิร์ฟเล็ต HelloWorld.java และตัวให้คำอธิบายแอปพลิเคชัน web.xml เซิร์ฟเล็ตอนุญาตให้คุณสร้างเพจตอบกลับโดยใช้ตัวอักษรซีริลลิก โครงสร้างของเซิร์ฟเล็ตตัวอย่างใน Eclipse IDE จะแสดงในภาพหน้าจอต่อไปนี้
รายการตัวอย่างเซิร์ฟเล็ต HelloWorld.java
โค้ดด้านล่างนี้ใช้เซิร์ฟเล็ตแบบธรรมดา HelloWorld.javaซึ่งส่งคืนหน้า HTML แบบคงที่ไปยังเบราว์เซอร์ ในตัวอย่าง เซิร์ฟเล็ตสืบทอดคุณสมบัติของ HttpServlet ที่ใช้อินเทอร์เฟซ เซิร์ฟเล็ต.
นำเข้า java.io.IOException; นำเข้า java.io.OutputStream; นำเข้า javax.servlet.ServletConfig; นำเข้า javax.servlet.http.HttpServlet; นำเข้า javax.servlet.ServletException; นำเข้า javax.servlet.http.HttpServletRequest; นำเข้า javax.servlet.http.HttpServletResponse; HelloWorld คลาสสาธารณะขยาย HttpServlet (การกำหนดค่า ServletConfig ส่วนตัว @Override public void init (ServletConfig config) พ่น ServletException ( this.config = config; ) @Override public void destroy() () @Override public ServletConfig getServletConfig() ( return config; ) @Override public String getServletInfo() ( return "A Simple Servlet"; ) บริการโมฆะสาธารณะ (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse) พ่น ServletException, IOException ( response.setContentType("text/html"); String text = " " + "
" + " " + "สวัสดี %s %s!
" + ""; text = String.format(ข้อความ, config.getInitParameter("ชื่อ"), config.getInitParameter("mname")); OutputStream outStream = response.getOutputStream(); outStream.write(text.getBytes(" UTF-8")); outStream.flush(); outStream.close(); ) )เมื่อเข้าถึงเซิร์ฟเล็ต วิธีการจะถูกเรียก บริการซึ่งสร้างหน้าตอบกลับและส่งผ่านไปยังเบราว์เซอร์ผ่าน HttpServletResponse บรรทัดแรกของการตอบกลับของเซิร์ฟเวอร์มีส่วนหัว ประเภทเนื้อหาระบุการเข้ารหัส UTF-8 นอกจากนี้ เทมเพลตการตอบกลับยังเต็มไปด้วยชื่อและนามสกุลที่ได้รับจากตัวอธิบายแอปพลิเคชัน web.xml นั่นคือ พารามิเตอร์คอนฟิกูเรชันเซิร์ฟเล็ตจะถูกอ่าน
เพื่อให้สามารถคืนหน้าด้วยอักษรซีริลลิกได้จึงใช้ เอาท์พุตสตรีม- คุณสามารถส่งข้อมูลใดๆ ไปยังเอาท์พุตสตรีมได้ (ในตัวอย่างของเราคือโค้ด HTML แบบธรรมดา)
รายการตัวอธิบายแอปพลิเคชัน web.xml
ในตัวอธิบายแอปพลิเคชัน เว็บ.xmlพารามิเตอร์เซิร์ฟเล็ตถูกกำหนด (ชื่อเซิร์ฟเล็ตชื่อและคลาสเซิร์ฟเล็ตคลาส) และพารามิเตอร์การกำหนดค่าเริ่มต้น (ชื่อชื่อ, ชื่อผู้อุปถัมภ์) เซิร์ฟเล็ตอ่านพารามิเตอร์เหล่านี้โดยใช้ ServletConfig.
เพื่อรันเซิร์ฟเล็ตตัวอย่างจาก IDE Eclipse จำเป็นต้องเริ่มต้นแอปพลิเคชันเซิร์ฟเวอร์และป้อนบรรทัดต่อไปนี้ในแถบที่อยู่ของเบราว์เซอร์:
http://localhost:8080/ServletHello/hello
เบราว์เซอร์จะแสดงคำทักทายให้เราทราบโดยระบุตัวละครหลักของผลงานของ Ilf และ Petrov
หากต้องการคอมไพล์เซิร์ฟเล็ตแยกกัน คุณสามารถใช้ ไฟล์แบตช์ข้อความสำหรับ Windows อาจมีลักษณะเช่นนี้
SET TOMCAT_LIB="C:\Program Files\Apache Software Foundation\Tomcat\common\lib" SET JAVA_SDK=C:\Java\Sun\SDK\jdk\bin\ %JAVA_SDK%javac -classpath %TOMCAT_LIB%\servlet-api. โถ *.java
หลังจากคอมไพล์เซิร์ฟเล็ตแล้ว สวัสดีเวิลด์.คลาสจะต้องวางไว้ในไดเร็กทอรี WEB-INF/คลาส/แอปพลิเคชันเว็บบนเซิร์ฟเวอร์ Tomcat และลงทะเบียนในตัวอธิบายการจัดส่ง เว็บ.xml.
ดาวน์โหลดตัวอย่าง
ซอร์สโค้ดสำหรับเซิร์ฟเล็ตตัวอย่างที่กล่าวถึงในข้อความของเพจมีอยู่ (191 KB)
สามารถดูตัวอย่างของเซิร์ฟเล็ตที่ใช้ไลบรารีกราฟิก Chart.js เพื่อสร้างเพจที่มีแผนภูมิแบบไดนามิกได้