1. การตรวจสอบบทนำ
1.1. แนวคิดของผู้ฟัง
ผู้ฟังเป็นวัตถุที่ใช้เป็นพิเศษในการฟังและประมวลผลเหตุการณ์หรือการเปลี่ยนแปลงสถานะที่เกิดขึ้นกับวัตถุอื่น ๆ เมื่อสถานการณ์เกิดขึ้นในวัตถุที่ถูกตรวจสอบการกระทำที่สอดคล้องกันจะดำเนินการทันที ผู้ฟังเป็นโปรแกรม Java ธรรมดาที่ใช้อินเทอร์เฟซเฉพาะ โปรแกรมนี้ใช้โดยเฉพาะเพื่อฟังการโทรวิธีหรือการเปลี่ยนแปลงคุณสมบัติของวัตถุ Java อื่น เมื่อเหตุการณ์ข้างต้นเกิดขึ้นในวัตถุที่ถูกฟังวิธีการบางอย่างของผู้ฟังจะถูกดำเนินการทันที
1.2. กรณีผู้ฟัง-ผู้ฟังฟังหน้าต่างหน้าต่าง
แพ็คเกจ me.gacl.listener.demo; นำเข้า java.awt.frame; นำเข้า java.awt.event.windowevent; นำเข้า java.awt.event.windowListener; Demo1 สาธารณะ 1 { /***กลไกการฟังเหตุการณ์ Java*1 การฟังเหตุการณ์เกี่ยวข้องกับสามองค์ประกอบ: แหล่งเหตุการณ์, วัตถุเหตุการณ์, ฟังเหตุการณ์*2 เมื่อมีการกระทำเกิดขึ้นในแหล่งเหตุการณ์จะเรียกวิธีการฟังเหตุการณ์และส่งผ่านวัตถุเหตุการณ์เมื่อเรียกวิธีการ * นักพัฒนาสามารถรับแหล่งที่มาของเหตุการณ์ผ่านวัตถุเหตุการณ์ในผู้ฟังซึ่งจะดำเนินการกับแหล่งเหตุการณ์ */ โมฆะคงที่สาธารณะหลัก (สตริง [] args) {เฟรม f = เฟรมใหม่ (); F.Setsize (400, 400); f.setVisible (จริง); // ลงทะเบียน Event Listener F.AddWindowListener (ใหม่ WindowListener () {โมฆะสาธารณะ windowActivated (windowEvent e) {} โมฆะสาธารณะ windowclosed (windowEvent e) {}/*** เมื่อรูปแบบหน้าต่างปิดการใช้งานหน้าต่าง e) {// รับวัตถุที่มาของเหตุการณ์ผ่านวัตถุเหตุการณ์ eframe f = (frame) e.getsource (); windowopened (windowevent e) {}}); -1.3. ออกแบบวัตถุที่สามารถฟังโดยวัตถุอื่น ๆ
เมื่อเรากำลังพัฒนาเราเขียนผู้ฟังเพื่อตรวจสอบวัตถุอื่น ๆ ดังนั้นเราควรทำอย่างไรถ้าเราต้องการออกแบบวัตถุเพื่อให้วัตถุนี้สามารถฟังวัตถุอื่นได้ เราสามารถออกแบบวัตถุตามรูปแบบการประมวลผลเหตุการณ์ที่เข้มงวดและวัตถุนี้สามารถฟังโดยวัตถุอื่น ๆ รูปแบบการประมวลผลเหตุการณ์เกี่ยวข้องกับสามองค์ประกอบ: แหล่งเหตุการณ์วัตถุเหตุการณ์และผู้ฟังเหตุการณ์
มาออกแบบวัตถุบุคคลตามรูปแบบการประมวลผลเหตุการณ์ รหัสเฉพาะมีดังนี้:
แพ็คเกจ me.gacl.observer;/*** @classname: บุคคล (แหล่งที่มาของเหตุการณ์)* @description: ออกแบบคลาสบุคคลเป็นแหล่งเหตุการณ์ พฤติกรรมของวัตถุในชั้นเรียนนี้ (เช่นการกินการวิ่ง) สามารถฟังโดยวัตถุอื่น ๆ* @author: Lonely Canglang* @date: 2014-9-9-9 9:26:06 PM **/ บุคคลระดับสาธารณะ {/ *** @field: ผู้ฟัง /** * @method: Eat * @description: พฤติกรรมของคนออกแบบ: กิน * @anthor: ความโดดเดี่ยวและความเย่อหยิ่ง * * /โมฆะสาธารณะ Eat () {ถ้า (ฟัง! = null) { /** * เรียกวิธีการฟังเหตุการณ์ของเหตุการณ์ แหล่งที่มา*/ listener.doeat (เหตุการณ์ใหม่ (นี้)); }} /*** @method: run* @description: พฤติกรรมของคนออกแบบ: เรียกใช้* @anthor: ความโดดเดี่ยวและความเย่อหยิ่ง** /โมฆะสาธารณะเรียกใช้ () {ถ้า (ฟัง! = null) { /*** เรียกเมธอด Dorun ของผู้ฟัง * วัตถุเหตุการณ์ห่อหุ้มแหล่งที่มาของเหตุการณ์และสิ่งนี้ในเหตุการณ์ใหม่ (สิ่งนี้) แสดงถึงแหล่งเหตุการณ์*/ listener.dorun (เหตุการณ์ใหม่ (นี้)); }} / ** * @method: registerListener * @description: วิธีนี้ใช้ในการลงทะเบียนผู้ฟังที่ฟังพฤติกรรมของวัตถุคลาสบุคคล * @anthor: The Oloof Wolf * * @param Listener * / Public Void RegisterListener }}/*** @className: PersonListener (ผู้ฟังเหตุการณ์)* @description: ออกแบบอินเทอร์เฟซผู้ฟังสำหรับคลาสบุคคล (แหล่งที่มาของเหตุการณ์)* @author: Lonely Canglang* @date: 2014-9-9 9:28:06 PM **/อินเทอร์เฟซ * เมื่อคลาสการใช้งานใช้วิธีการ doeat คุณสามารถตรวจสอบการกระทำของวัตถุคลาสบุคคลกิน (กิน) * @anthor: Lonely Canglang * * @param e */ void doeat (เหตุการณ์ e); /** * @method: dorun * @description: วิธีนี้ใช้เพื่อฟังพฤติกรรมของการทำงานของวัตถุบุคคล (เรียกใช้) * เมื่อคลาสการใช้งานใช้วิธี Dorun คุณสามารถฟังการกระทำของวัตถุคลาสบุคคลที่รัน (เรียกใช้)* @anthor: 克克** @param e*/ void dorun (เหตุการณ์ e);}/ *** @classname: เหตุการณ์ (วัตถุเหตุการณ์)* @description } บุคคลสาธารณะ getSource () {แหล่งกลับ; } โมฆะสาธารณะ setSource (แหล่งที่มาของบุคคล) {this.source = แหล่งที่มา; -หลังจากการออกแบบดังกล่าววัตถุของคลาส Peron สามารถฟังโดยวัตถุอื่น ๆ รหัสทดสอบมีดังนี้:
แพ็คเกจ me.gacl.observer; Public Class Persontest { / ** * @Method: Main * @description: Test Person Class * @anthor: The Jolfant Wolf * * @param args * / โมฆะสาธารณะคงที่หลัก (สตริง [] args) {// บุคคล p = บุคคลใหม่ (); // ลงทะเบียนผู้ฟังที่รับฟังพฤติกรรมของวัตถุ P วัตถุ P P.RegisterListener (ใหม่บุคคล () {// ฟัง p พฤติกรรมการกิน p สาธารณะ void doeat (เหตุการณ์ e) {person p = e.getSource (); system.out.println (p + "การกิน");} // ฟัง System.out.println (p + "กิน");}}); // p กิน p.eat (); // p วิ่ง p.run (); -ผลการทำงาน:
me.gacl.observer.person@4a5ab2 กำลังกิน me.gacl.observer.person@4a5ab2 กำลังทำงานอยู่
2. ผู้ฟังใน Javaweb
2.1. แนวคิดพื้นฐาน
ผู้ฟังใน Javaweb เป็นคลาสพิเศษที่กำหนดไว้ในข้อกำหนด Servlet พวกเขาใช้เพื่อฟังเหตุการณ์การสร้างและการทำลายล้างของวัตถุโดเมนเช่น servletContext, httpsession และ servletrequest ในเว็บแอปพลิเคชันรวมถึงการฟังเหตุการณ์ที่คุณสมบัติในวัตถุโดเมนเหล่านี้ได้รับการแก้ไข
2.2. การจำแนกประเภทของผู้ฟัง servlet
มีผู้ฟังหลายประเภทที่กำหนดไว้ในข้อกำหนด Servlet แหล่งเหตุการณ์ที่ใช้สำหรับการฟังคือ ServletContext, httpsession และ servletrequest ข้อกำหนด Servlet แบ่งผู้ฟังหลายประเภทออกเป็นสามประเภทสำหรับการดำเนินการในวัตถุทั้งสามนี้:
•ผู้ฟังเหตุการณ์ที่รับฟังการสร้างและทำลายวัตถุโดเมนเอง
•ผู้ฟังเหตุการณ์ที่รับฟังสำหรับการเพิ่มและลบคุณสมบัติในวัตถุโดเมน
•ผู้ฟังเหตุการณ์ที่รับฟังสถานะของวัตถุในโดเมน HTTPSESSION
2.3. ฟังวัตถุโดเมน ServletContext
อินเทอร์เฟซ servletContextListener ใช้เพื่อฟังเหตุการณ์การสร้างและการทำลายล้างของวัตถุ ServletContext คลาสทั้งหมดที่ใช้อินเตอร์เฟส servletContextListener สามารถฟังการสร้างและทำลายวัตถุ ServletContext
•เมื่อสร้างวัตถุ servletContext วิธีการบริบท (servletContextEvent SCET) จะถูกยิง
•เมื่อวัตถุ ServletContext ถูกทำลายวิธีการบริบท (ServletContextEvent SCET) จะถูกเปิดใช้งาน
•เวลาในการสร้างและทำลายวัตถุโดเมน servletContext:
สร้าง: เซิร์ฟเวอร์เริ่มต้นสร้าง servletContext สำหรับแต่ละเว็บแอปพลิเคชัน
การทำลายล้าง: ปิด servletContext แทนเว็บแอปพลิเคชันแต่ละรายการก่อนที่เซิร์ฟเวอร์จะปิด
ตัวอย่าง: เขียนคลาส MyServletContextListener ใช้อินเทอร์เฟซ servletContextListener ฟังการสร้างและการทำลายวัตถุ ServletContext
1. เขียนผู้ฟังด้วยรหัสต่อไปนี้:
แพ็คเกจ me.gacl.web.listener; นำเข้า Javax.servlet.servletContextEvent; นำเข้า Javax.servlet.servletContextListener;/*** @className: MyServletContextListener* @description วัตถุ ServletContext * @author: The Proud Wolf* @date: 2014-9-9 10:26:16 PM **/ คลาสสาธารณะ MyServletContextListener ใช้ ServletContextListener {@Override โมฆะสาธารณะบริบท (ServletContextEvent Scet) {System.out.println } @Override โมฆะสาธารณะบริบท (ServletContextEvent SCET) {System.out.println ("การทำลายวัตถุ ServletContext"); -2. ลงทะเบียนผู้ฟังในไฟล์ web.xml
เรากล่าวถึงข้างต้นว่าเพื่อฟังแหล่งเหตุการณ์คุณต้องลงทะเบียนผู้ฟังไปยังแหล่งเหตุการณ์เพื่อตรวจสอบการกระทำของแหล่งเหตุการณ์ ใน Javaweb การลงทะเบียนการฟังจะถูกกำหนดค่าในไฟล์ web.xml ดังต่อไปนี้:
<? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://ww.w3.org/200 XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_3 <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> <!-ลงทะเบียนผู้ฟังเพื่อฟังวัตถุ ServletContext-> <Sisterer> <SecutionS> ServletContextListener Listener </คำอธิบาย> <! <Sistener-Class> me.gacl.web.listener.myservletContextListener </listener-class> </listener> </eber-app>
หลังจากสองขั้นตอนนี้เราได้เสร็จสิ้นการเขียนและการลงทะเบียนของผู้ฟัง เมื่อเว็บเซิร์ฟเวอร์เริ่มต้นจะลงทะเบียนผู้ฟังที่กำหนดค่าใน web.xml โดยอัตโนมัติไปยังวัตถุ ServletContext ด้วยวิธีนี้ผู้ฟัง MyServletContextListener ที่พัฒนาขึ้นสามารถฟังได้บนวัตถุ ServletContext
2.4. ฟังการสร้างและทำลายวัตถุโดเมน Httpsession
อินเทอร์เฟซ HTTPSESSIONLISTENER ใช้เพื่อฟังการสร้างและการทำลายวัตถุ HTTPSESSION เมื่อสร้างเซสชันเมธอด SessionCreated (HTTPSESSIONEVENT SE) จะถูกเปิดใช้งานเมื่อทำลายเซสชันและวิธีการเซสชัน (HTTPSESSIONEVENT SE) จะเปิดใช้งาน
ตัวอย่าง: เขียนคลาส myhttpsessionListener ใช้อินเตอร์เฟส httpsessionListener และฟังการสร้างและการทำลายของวัตถุ HTTPSESSION
1. เขียนผู้ฟังด้วยรหัสต่อไปนี้:
แพ็คเกจ me.gacl.web.listener; นำเข้า javax.servlet.http.httpsessionevent; นำเข้า Javax.servlet.http.httpsessionListener;/*** @classname: myhttpsessionListener* @description การกระทำของการสร้างและทำลายวัตถุ HTTPSESSION สามารถฟังได้ * @author: The Lonely Canglang* @date: 2014-9-9 11:04:33 PM **/ คลาสสาธารณะ MyhttpsessionListener ใช้ httpsessionListener {@Override โมฆะสาธารณะเซสชัน SessionCreated (httpsessionEvent SE) }/* เวลาการทำลายของ httpsession จะต้องกำหนดค่าใน web.xml ดังต่อไปนี้:* <เซสชั่นการรับรู้> <Session-Timeout> 1 </Session-Timeout> </ession-config> การกำหนดค่านี้หมายความว่าเซสชันจะถูกทำลายหลังจาก 1 นาที*/@Override -2. ลงทะเบียนผู้ฟังในไฟล์ web.xml
<!-ลงทะเบียนผู้ฟังสำหรับการฟังวัตถุ httpsession-> <sistener> <scription> httpsessionListener Listener </คำอธิบาย> <Sistener-Lass> me.gacl.web.listener.myhttpsessionListener </listener-class> วัตถุ httpsession-> <session-config> <!-กำหนดค่าการทำลายวัตถุ httpsession หลังจาก 1 นาทีของวัตถุ httpsession-> <session-timeout> 1 </session-timeout> </ession-config>
เมื่อเราเข้าถึงหน้า JSP วัตถุ HTTPSESSION จะถูกสร้างขึ้น ในเวลานี้เราสามารถสังเกตกระบวนการสร้างของวัตถุ httpsession ใน httpsessionListener เราสามารถเขียนหน้า JSP เพื่อสังเกตกระบวนการสร้างของวัตถุ HTTPSESSION
ดังนี้: index.jsp
< %@ page language = "java" import = "java.util.*" pageencoding = "utf-8" %> <! doctype html> <html> <head> <title> httpsessionListener ผู้ฟังการสร้าง HTTPSISSION ID ของเซสชันที่สร้างขึ้นคือ: $ {pageContext.session.id} </body> </html>ผลการดำเนินการมีดังนี้:
2.5. ฟังการสร้างและทำลายวัตถุโดเมน servletrequest
เมื่ออินเทอร์เฟซ ServletRequestListener ถูกใช้เพื่อฟังการสร้างและการทำลายของวัตถุ ServletRequest วิธีการร้องขอ (servletrequestevent SRE) ของผู้ฟังจะถูกเรียก เมื่อวัตถุคำขอถูกทำลายจะมีการเรียกร้องให้มีการร้องขอ (servletrequestevent SRE) ของผู้ฟัง
ServletRequest การสร้างวัตถุและช่วงเวลาการทำลายล้าง:
สร้าง: ทุกครั้งที่ผู้ใช้เข้าชมวัตถุคำขอจะถูกสร้างขึ้นวัตถุคำขอจะถูกทำลาย: การเข้าถึงปัจจุบันสิ้นสุดลงวัตถุคำขอจะถูกทำลาย
ตัวอย่าง: เขียนคลาส MyServletRequestListener ใช้งานอินเทอร์เฟซ ServletRequestListener ฟังการสร้างและการทำลายของวัตถุ ServletRequest
1. เขียนผู้ฟังด้วยรหัสต่อไปนี้:
แพ็คเกจ me.gacl.web.listener; นำเข้า Javax.servlet.servletrequestEvent; นำเข้า Javax.servlet.ServletRequestListener;/*** @className: MyServletRequestListener* @description การทำลายวัตถุ ServletRequest * @author: The Proud Wolf* @Date: 2014-9-9 11:50:08 PM **/ คลาสสาธารณะ MyServletRequestListener ใช้ ServletRequestListener {@Override โมฆะสาธารณะร้องขอ } @Override โมฆะสาธารณะขอให้ใช้งาน (servletRequestEvent SRE) {System.out.println (sre.getServletRequest () + "สร้าง !!"); -2. ลงทะเบียนผู้ฟังในไฟล์ web.xml
<!-ลงทะเบียนผู้ฟังเพื่อฟังวัตถุ ServletRequest-> <sistener> <secutions> ServletRequestListListener Listener </คำอธิบาย> <Sistener-Lass> me.gacl.web.listener.myservletRequestListener </listener-class>
ผลการทดสอบมีดังนี้:
จากผลลัพธ์การรันเราจะเห็นว่าผู้ใช้สร้างวัตถุคำขอทุกครั้งที่เขาเข้าถึงและวัตถุคำขอจะถูกทำลายหลังจากการเข้าถึงเสร็จสมบูรณ์
ข้างต้นเป็นคำอธิบายสั้น ๆ ของผู้ฟัง