1. ผู้ฟังที่รับฟังการเปลี่ยนแปลงคุณสมบัติในวัตถุโดเมน
ผู้ฟังเหตุการณ์สำหรับการเปลี่ยนแอตทริบิวต์ในวัตถุโดเมนคือผู้ฟังสำหรับการฟังเหตุการณ์การเปลี่ยนแปลงแอตทริบิวต์เหตุการณ์ในสามวัตถุ: servletContext, httpsession และ httpservletrequest
อินเทอร์เฟซผู้ฟังทั้งสามนี้คือ ServletContextattributelistener, httpsessionattributelistener และ servletrequestattributelistener อินเทอร์เฟซทั้งสามกำหนดสามวิธีในการจัดการเหตุการณ์ที่เพิ่มขึ้นลบและแทนที่แอตทริบิวต์ในวัตถุที่ฟัง ชื่อวิธีการที่สอดคล้องกันของเหตุการณ์เดียวกันในอินเทอร์เฟซทั้งสามนี้จะเหมือนกัน แต่พารามิเตอร์ที่ยอมรับนั้นแตกต่างกัน
1.1. วิธีการที่ได้รับการตกแต่ง
เมื่อเพิ่มแอตทริบิวต์ให้กับวัตถุที่ถูกฟังเว็บคอนเทนเนอร์จะตอบกลับโดยเรียกใช้วิธีการที่ได้รับการผสมของผู้ฟังเหตุการณ์ วิธีนี้ได้รับพารามิเตอร์ประเภทเหตุการณ์ ผู้ฟังสามารถรับวัตถุโดเมนที่เพิ่มแอตทริบิวต์และวัตถุแอตทริบิวต์ที่บันทึกไว้ในโดเมน คำจำกัดความทางไวยากรณ์ที่สมบูรณ์ของแต่ละผู้ฟังแอตทริบิวต์โดเมนมีดังนี้:
โมฆะสาธารณะ AttributeDded (ServletContextattributeEvent Scae) โมฆะสาธารณะ attributePlaced (httpsessionbindingevent hsbe) โมฆะสาธารณะ attributermoved (servletrequestattributeEvent SRAE)
1.2. วิธีการ AttributeRemoved
เมื่อลบแอตทริบิวต์ในวัตถุที่ถูกฟังเว็บคอนเทนเนอร์จะเรียกใช้วิธีการ AttributeRemoved ของผู้ฟังเหตุการณ์เพื่อตอบสนองต่อนิยามไวยากรณ์ที่สมบูรณ์ในฟังแอตทริบิวต์ในแต่ละโดเมน:
โมฆะสาธารณะ AttributerEmoved (ServletContextattributeEvent Scae) โมฆะสาธารณะ attributerEmoved (httpsessionbindingevent hsbe) โมฆะสาธารณะ attributeremoved (servletrequestattributeEvent Srae)
1.3. วิธีการวางจำหน่าย
เมื่อมีการเปลี่ยนแอตทริบิวต์บางอย่างในวัตถุโดเมนของผู้ฟังเว็บคอนเทนเนอร์จะเรียกใช้วิธีการ AttributeRePlaced ของผู้ฟังเหตุการณ์เพื่อตอบสนองต่อคำจำกัดความของไวยากรณ์ที่สมบูรณ์ในแต่ละผู้ฟังแอตทริบิวต์โดเมน:
โมฆะสาธารณะ AttributeLaplaced (ServletContextattributeEvent Scae) โมฆะสาธารณะ attributePlaced (httpsessionbindingevent hsbe) โมฆะสาธารณะ attributePlaced (servletrequestattributeEvent Srae)
1.4. ServletContextattributelistener Listener ตัวอย่าง:
เขียนผู้ฟัง servletContextattributelistener เพื่อตรวจสอบการเปลี่ยนแปลงในค่าแอตทริบิวต์ของวัตถุโดเมน ServletContext รหัสมีดังนี้:
แพ็คเกจ me.gacl.web.listener; นำเข้า java.text.messageFormat; นำเข้า Javax.servlet.servletContextattributeEvent; นำเข้า Javax.servlet.servletContextattributeListener;/*** @className @author: Lonely Canglang*@date: 2014-9-11 10:53:04 PM **/ คลาสสาธารณะ MyServletContextattributeListener ใช้ ServletContextattributeListener {@Override void attributeDded ค่าคือ: {1} ", scab.getName (), scab.getValue ()); System.out.println (str); } @Override โมฆะสาธารณะ attributeRemoved (servletContextattributeEvent scab) {string str = messageFormat.format ("ลบแอตทริบิวต์: {0} ในวัตถุโดเมน servletContext ค่าแอตทริบิวต์คือ: {1}", scab.getName (), scab.getValue (); System.out.println (str); } @Override โมฆะสาธารณะ attributeRePlaced (servletContextattributeEvent Scab) {string str = messageFormat.format ("ค่าของแอตทริบิวต์: {0} ถูกแทนที่ในวัตถุโดเมน servletContext", scab.getName ()); System.out.println (str); -ลงทะเบียนผู้ฟังในไฟล์ web.xml
<Sistener> <Scription> MyServletContextattributelistener Listener </คำอธิบาย> <Sistener-Lass> me.gacl.web.listener.myservletContextattributelistener </listener-class> </listener>
เขียนหน้าทดสอบ servletContextributiListenerTest.jsp
<%@ page language = "java" pageencoding = "utf-8"%> <! doctype html> <html> <head> <title> ServletContextattributelistener Test Test </title> </head> <body> // แทนที่ค่าของแอตทริบิวต์ชื่อในแอปพลิเคชันวัตถุโดเมนแอปพลิเคชันแอปพลิเคชัน SetAttribute ("ชื่อ", "GACL"); // ลบแอตทริบิวต์ชื่อในแอปพลิเคชันวัตถุโดเมนแอปพลิเคชัน RemoveAttribute ("ชื่อ"); %> </body> </html>ผลการดำเนินการมีดังนี้:
จากผลลัพธ์ที่รันเราจะเห็นว่าผู้ฟัง ServletContextListener ได้ฟังการเปลี่ยนแปลงค่าคุณสมบัติในวัตถุโดเมน ServletContext (แอปพลิเคชัน)
1.5. servletrequestattributelistener และ httpsessionattributelistener ตัวอย่างฟัง:
เขียนผู้ฟังเพื่อตรวจสอบการเปลี่ยนแปลงในค่าแอตทริบิวต์ของวัตถุโดเมน httpsession และ httpservletrequest รหัสมีดังนี้:
แพ็คเกจ me.gacl.web.listener; นำเข้า java.text.messageformat; นำเข้า Javax.servlet.servletrequestattributeEvent; นำเข้า Javax.servlet.servletrequestattributelistener javax.servlet.http.httpsessionbindingevent; คลาสสาธารณะ myrequestandsessionattributeListener ใช้ httpsessionattributeListener, servletrequestattributeListener {@override public voidedededed แอตทริบิวต์: {0}, ค่าแอตทริบิวต์คือ: {1} ", srae.getName (), srae.getValue ()); System.out.println (str); } @Override โมฆะสาธารณะ void attributerEmoved (servletRequestattributeEvent srae) {string str = messageFormat.format ("ลบแอตทริบิวต์ในวัตถุโดเมน servletRequest: {0} ค่าแอตทริบิวต์คือ: {1}", srae.getName (), srae.get System.out.println (str); } @Override โมฆะสาธารณะ attributeRePlaced (servletRequestattributeEvent srae) {string str = messageFormat.format ("ค่าของแอตทริบิวต์: {0} ถูกแทนที่ในวัตถุโดเมน servletrequest", srae.getName (); System.out.println (str); } @Override โมฆะสาธารณะ atributeDded (httpsessionBindingEvent SE) {string str = messageFormat.format ("แอตทริบิวต์: {0} ถูกเพิ่มเข้าไปใน" httpsession domain object, ค่าแอตทริบิวต์คือ: {1} ", se.getName (), se.getValue (); AttributeRemoved (httpsessionBindingEvent SE) {string str = messageFormat.format ("แอตทริบิวต์: {0} ถูกลบออกจาก" วัตถุโดเมน httpsession ค่าแอตทริบิวต์คือ: {1} ", se.getName (), se.getValue ()); System.out.println (str); } @Override โมฆะสาธารณะ attributeRePlaced (httpsessionBindingEvent SE) {string str = messageFormat.format ("ค่าของแอตทริบิวต์: {0} ถูกแทนที่ในวัตถุโดเมน httpsession", se.getName ()); System.out.println (str); -ลงทะเบียนผู้ฟังในไฟล์ web.xml
<Sistener> <Scription> MyRequestandSessionAttributelistener Listener </คำอธิบาย> <Sistener-Lass> me.gacl.web.listener.myrequestandsessionattributeListener </listener-class> </listener>
เขียน requestandsessionattributeListenerTest.jsp หน้าทดสอบ
<%@ page language = "java" pageencoding = "utf-8"%> <! doctype html> <html> <head> <title> requestandsessionattributelistener ผู้ฟังการทดสอบ </title> </head> <body> <%// เพิ่มแอตทริบิวต์เซสชัน // แทนที่ค่าของแอตทริบิวต์ AA ในเซสชันวัตถุโดเมนเซสชัน SetAtattribute ("AA", "XX"); // ลบเซสชันแอตทริบิวต์ AA Removeattribute ("AA"); // เพิ่ม questtribute.setAttribute ("AA", "BB"); // แทนที่ค่าของแอตทริบิวต์ AA ในคำขอวัตถุโดเมนคำขอ SetAttribute ("AA", "XX"); // ลบคำขอแอตทริบิวต์ AA Removeattribute ("AA"); %> </body> </html>ผลการดำเนินการมีดังนี้:
จากผลลัพธ์การรันเราจะเห็นได้ว่าผู้ฟัง HttpsessionAttributeListener และ ServletRequestattributelistener ได้ฟังการเปลี่ยนแปลงในค่าแอตทริบิวต์ของวัตถุโดเมน HTTPSESSION และวัตถุโดเมน HTTPSERVLETREQUEST
2. การรับรู้ถึงผู้ฟังเหตุการณ์ที่ผูกพันกับเซสชัน
วัตถุที่เก็บไว้ในโดเมนเซสชันสามารถมีหลายสถานะ: การผูก (session.setAttribute ("ถั่ว", วัตถุ)) ในเซสชัน; Unbeding (Session.RemoveAttribute ("Bean")) จากโดเมนเซสชัน; ยังคงอยู่กับอุปกรณ์จัดเก็บข้อมูลด้วยวัตถุเซสชัน การกู้คืนจากอุปกรณ์จัดเก็บข้อมูลด้วยวัตถุเซสชัน อินเทอร์เฟซผู้ฟังพิเศษสองรายการ "HttpsessionBindingListener และ HttpsessionActivationListener" ถูกกำหนดไว้ในข้อกำหนดของ Servlet เพื่อช่วยให้วัตถุ Javabean เข้าใจสถานะของพวกเขาในโดเมนเซสชัน: คลาสที่ใช้อินเทอร์เฟซทั้งสองนี้ไม่จำเป็นต้องลงทะเบียนในไฟล์ web.xml
2.1. อินเตอร์เฟส httpsessionbindingListener
วัตถุ Javabean ที่ใช้อินเตอร์เฟส HttpsessionBindingListener สามารถรู้สึกได้ว่ามันถูกผูกไว้กับเซสชันและเหตุการณ์ที่ถูกลบในเซสชัน เมื่อวัตถุถูกผูกไว้กับวัตถุ HTTPSESSION เว็บเซิร์ฟเวอร์จะเรียกวิธีการเป็นโมฆะ valueBound (httpsessionBindingEvent Event) ของวัตถุ เมื่อวัตถุนั้นไม่ได้ผูกมัดจากวัตถุ HTTPSESSION เว็บเซิร์ฟเวอร์จะเรียกวิธีการเป็นโมฆะ ValueUnBound (HTTPSESSIONBINDINGEDEVENT EVENT) ของวัตถุ
ตัวอย่าง:
แพ็คเกจ me.gacl.domain; นำเข้า javax.servlet.http.httpsessionbindingevent นำเข้า Javax.servlet.http.httpsessionbindingListener;/*** @classname: Javabeandemo1* @description: เซสชันและเหตุการณ์ที่ถูกลบออกจากเซสชันเมื่อวัตถุถูกผูกไว้กับวัตถุ HTTPSESSION เว็บเซิร์ฟเวอร์เรียกใช้โมฆะ valueBound (httpsessionBindingEvent Event) ของวัตถุเมื่อวัตถุถูกผูกไว้กับวัตถุ HTTPSESSION เมื่อไม่ จำกัด ในวัตถุเว็บเซิร์ฟเวอร์เรียกว่าโมฆะ ValueUnbound (httpsessionBindingEvent Event)* @author: Lonely Canglang* @date: 2014-9-11 11:14:54 PM **/ คลาสสาธารณะ @Override โมฆะสาธารณะ ValueBound (เหตุการณ์ httpsessionBindingEvent) {system.out.println (ชื่อ+"ถูกเพิ่มลงในเซสชัน"); } @Override โมฆะสาธารณะ ValueUnBound (เหตุการณ์ httpsessionBindingEvent) {system.out.println (ชื่อ+"เตะออกโดยเซสชัน"); } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } สาธารณะ javabeandemo1 (ชื่อสตริง) {this.name = name; -Javabeandemo1 Javabean ข้างต้นใช้อินเทอร์เฟซ HttpsessionBindingListener ดังนั้นวัตถุ Javabean นี้สามารถรู้สึกได้ว่ามันถูกผูกไว้กับเซสชันและลบออกจากเซสชัน รหัสทดสอบมีดังนี้:
<%@ page language = "java" pageencoding = "utf-8"%> <%@ page import = "me.gacl.domain.javabeandemo1"%> <! doctype html> <html> <head> Javabeandemo1 ("Lonely Canglang")); // removeattribute ("ถั่ว"); %> </body> </html>ผลการดำเนินการมีดังนี้:
2.2. HttpsessionActivationListener Interface
วัตถุ Javabean ที่ใช้อินเตอร์เฟส HttpsessionActivationListener สามารถรับรู้ได้ว่าจะเปิดใช้งาน (deserialized) และเหตุการณ์ passivated (serialized) ก่อนที่วัตถุ javabean ที่ถูกผูกไว้กับวัตถุ HTTPSESSION จะถูก passivated (serialized) ด้วยวัตถุ HTTPSESSION เว็บเซิร์ฟเวอร์เรียกว่าโมฆะเซสชัน WillPassivate (เหตุการณ์ HTTPSESSIONEVENT) ของวัตถุ Javabean ด้วยวิธีนี้วัตถุ Javabean สามารถรู้ได้ว่ามันจะถูกทำให้เป็นอนุกรม (passive) ไปยังฮาร์ดดิสก์ด้วยวัตถุ HTTPSESSION
หลังจากวัตถุ Javabean ที่ถูกผูกไว้กับวัตถุ HTTPSESSION จะต้องเปิดใช้งาน (deserialized) ด้วยวัตถุ HTTPSESSION เว็บเซิร์ฟเวอร์เรียกว่าวิธีการ Void SessionDididActive (เหตุการณ์ HTTPSESSIONEVENT) ของวัตถุ Javabean ด้วยวิธีนี้วัตถุ Javabean สามารถรู้ได้ว่ามันจะถูก deserialized (เปิดใช้งาน) และกลับสู่หน่วยความจำด้วยวัตถุ HTTPSESSION
ตัวอย่าง:
แพ็คเกจ me.gacl.domain; นำเข้า java.io.serializable; นำเข้า Javax.servlet.http.httpsessionActivationListener; นำเข้า Javax.servlet.http.httpsessionEvent;/*** @lassname รับรู้ถึงการเปิดใช้งานของเหตุการณ์ที่เปิดใช้งานและแฝง: วัตถุ Javabean และเซสชันจะถูก deserialized (เปิดใช้งาน) ลงในหน่วยความจำด้วยกัน Passivation: วัตถุ Javabean มีอยู่ในเซสชั่น เมื่อเซิร์ฟเวอร์ทำให้เซสชันเป็นฮาร์ดดิสก์เป็นอนุกรมหากวัตถุ Javabean ในเซสชันใช้อินเตอร์เฟส serializable เซิร์ฟเวอร์จะทำให้วัตถุ Javabean เป็นอนุกรมในเซสชันไปยังฮาร์ดดิสก์ด้วยกัน การทำงานของวัตถุ Javabean และเซสชันไปยังฮาร์ดดิสก์ด้วยกันเรียกว่า passivation หากวัตถุ Javabean ในเซสชันไม่ได้ใช้อินเตอร์เฟส serializable เซิร์ฟเวอร์จะลบวัตถุ Javabean ในเซสชันที่ไม่ได้ใช้อินเตอร์เฟส serializable ก่อนแล้วจึงทำให้เซสชัน serialize (passivate) ไปยังฮาร์ดดิสก์ เมื่อวัตถุ javabean ที่ถูกผูกไว้กับวัตถุ HTTPSESSION จะถูกผ่านด้วยวัตถุ HTTPSESSION เว็บเซิร์ฟเวอร์จะเรียกช่องว่างของวัตถุวัตถุ Javabean ก่อนที่วัตถุ Javabean จะถูกผูกไว้กับวัตถุ HTTPSESSION จะถูก passivated ด้วยวัตถุ HTTPSESSION เมธอด SessionWillPassivate (เหตุการณ์ HTTPSESSIONEVENT) เพื่อให้วัตถุ Javabean สามารถรู้ได้ว่ามันจะถูกทำให้เป็นอนุกรม (passive) กับวัตถุ HTTPSESSION ไปยังฮาร์ดดิสก์ หลังจากวัตถุ Javabean ที่ถูกผูกไว้กับวัตถุ HTTPSESSION จะถูกเปิดใช้งานกับวัตถุ HTTPSESSION เว็บเซิร์ฟเวอร์เรียกว่าโมฆะเซสชัน DIDIDACTION (เหตุการณ์ HTTPSESSIONEVENT) ของวัตถุ JABABEAN เพื่อให้วัตถุ JavaBean: 23:22 PM **/ คลาสสาธารณะ Javabeandemo2 ใช้ httpsessionActivationListener, serializable {ส่วนตัวคงที่สุดท้าย long serialversionuid = 7589841135210272124L; ชื่อสตริงส่วนตัว; @Override โมฆะสาธารณะเซสชั่น WillPassivate (httpsessionEvent SE) {System.out.println (ชื่อ+"และเซสชันจะเป็นอนุกรม (passive) ไปยังฮาร์ดดิสก์ด้วยกัน ID ของเซสชันคือ:"+se.getSession () getId ()); } @Override โมฆะสาธารณะ sessionDidActivate (httpsessionEvent SE) {system.out.println (ชื่อ+"และเซสชันจะถูก deserialized (เปิดใช้งาน) จากฮาร์ดดิสก์ด้วยกัน ID ของเซสชันคือ:"+se.getSession () } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } สาธารณะ javabeandemo2 (ชื่อสตริง) {this.name = name; -เพื่อที่จะสังเกตกระบวนการของวัตถุ Javabean ที่ผูกไว้กับวัตถุ HTTPSESSION ที่ถูกส่งผ่านฮาร์ดดิสก์และเปิดใช้งานจากฮาร์ดดิสก์ไปยังหน่วยความจำเราจำเป็นต้องใช้เซิร์ฟเวอร์ Tomcat เพื่อช่วยให้เราเสร็จสิ้นการใช้งานและกระบวนการเปิดใช้งานของวัตถุ HTTPSESSION วิธีการเฉพาะมีดังนี้:
สร้างไฟล์ context.xml ในโฟลเดอร์ WebRoot/Meta-INF ดังนี้:
เนื้อหาของไฟล์ context.xml มีดังนี้:
<dexting> <manager className = "org.apache.catalina.session.persistentManager" maxidleswap = "1"> <store classname = "org.apache.catalina.session.filestore" directory = "gacl"/>
หลังจาก 1 นาทีของการกำหนดค่าในไฟล์ contex
รหัสทดสอบ JSP มีดังนี้:
<%@ page language = "java" pageencoding = "utf-8"%> <%@ page import = "me.gacl.domain.javabeandemo2"%> <! doctype html> <html> <head> <title> ID ของเซสชันที่สร้างขึ้นคือ: $ {pageContext.session.id} <hr/> <% session.setAttribute ("Bean", JavabeanDemo2 ใหม่ ("Lonely and Putely")); %> </body> </html>เมื่อเข้าถึงหน้า JSP นี้เซิร์ฟเวอร์จะสร้างวัตถุ HTTPSESSION ทันทีจากนั้นผูกวัตถุ Javabean ที่ใช้อินเทอร์เฟซ HTTPSESSIPINTLISTIVANTListener กับวัตถุเซสชัน หลังจากรอ 1 นาทีจะไม่มีใครเข้าถึงหน้า JSP นี้อีกครั้งและเซิร์ฟเวอร์จะผ่านวัตถุ httpsession ไปยังฮาร์ดดิสก์โดยอัตโนมัติ
เราสามารถค้นหาเซสชัน serialized ไปยังที่เก็บข้อมูลท้องถิ่นในงานของ Tomcat Server/Catalina/LocalHost/Javaweb_Listener_20140908/GACL ดังที่แสดงในรูปด้านล่าง:
เมื่อเข้าถึงหน้า JSP นี้อีกครั้งเซิร์ฟเวอร์จะเปิดใช้งาน (deserialize) วัตถุ HTTPSESSION โดยอัตโนมัติบนฮาร์ดดิสก์และส่งกลับไปยังหน่วยความจำ ผลการดำเนินการมีดังนี้:
มีเนื้อหามากมายในเทคโนโลยีผู้ฟังในเทคโนโลยีการพัฒนา Javaweb ในการทำงานประจำวันเทคโนโลยีผู้ฟังใช้บ่อยขึ้นในการพัฒนาโครงการ Javaweb ดังนั้นคุณต้องเชี่ยวชาญเทคโนโลยีนี้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น