1. المستمع الذي يستمع للتغييرات في الخصائص في كائنات المجال
مستمع الحدث لتغيير السمات في كائنات المجال هو المستمع للاستماع إلى أحداث معلومات تغيير السمة في الكائنات الثلاثة: ServletContext و Httpsession و HttPservletRequest.
واجهات المستمع الثلاثة هذه هي servletContextTatriptIlistener و HttpsessionAttributeListener و ServleTRequestAtTributElistener. تحدد جميع الواجهات الثلاثة ثلاث طرق للتعامل مع الأحداث التي تزيد من السمات وحذفها واستبدالها في الكائن المستمع. أسماء الطريقة المقابلة لنفس الحدث في هذه الواجهات الثلاث هي نفسها تمامًا ، لكن المعلمات المقبولة مختلفة.
1.1. طريقة attributeadded
عند إضافة سمة إلى الكائن الذي يتم الاستماع إليه ، تستجيب حاوية الويب عن طريق استدعاء طريقة مستمع الحدث. تتلقى هذه الطريقة معلمة نوع الحدث. يمكن للمستمع الحصول على كائن المجال الذي يضيف سمات وكائنات السمة المحفوظة في المجال. إن تعريف بناء الجملة الكامل لكل مستمع سمة مجال هو كما يلي:
public void attributeadded (servletContextAttAttributeevent scae) public void attributeplaced (httpsessionbindingevent hsbe) public void attributermoved (servletrequestattributeevent srae)
1.2. طريقة attributeremoved
عند حذف سمة في الكائن الذي يجري استمعجه ، تقوم حاوية الويب باستدعاء طريقة AttributeReMoved لمستمع الحدث للرد على تعريف بناء الجملة الكامل في مستمع السمة في كل مجال:
public void void attributeReMoved (servletcontextattributeevent scae) public void attributeReMoved (httpsessionbindingevent hsbe) public void atrighteremoved (servletRequestAtTributeevent SRAE)
1.3. طريقة المنحقة
عندما يتم استبدال سمة معينة في كائن مجال المستمع ، تستدعي حاوية الويب الطريقة المنحقة لمستمع الحدث للرد على تعريف بناء الجملة الكامل في كل مستمع سمة مجال:
public void attributeplaced (servletContextAttRibteevent scae) public void attributeplaced (httpsessionbindingevent hsbe) public void attributeplaced (servletrequestattributeevent srae)
1.4. مثال مستمع ServletContextAttArbultIlistener:
اكتب مستمع ServletContextTerBultElistener لمراقبة التغييرات في قيم السمات لكائنات مجال ServletContext. الرمز كما يلي:
package me.gacl.web.listener ؛ import java.text.messageformat ؛ import javax.servlet.servletcontextAttRibteevent ؛ import javax.servlet.servletcontexttattributEner ؛/*** @cclassname Author: lonely canglang*date: 2014-9-11 10:53:04 pm **/ public class myservletcontextAttRibtListener تنفذ servletcontextAttAttributEn {0} ، قيمة السمة هي: {1} "، scab.getName () ، scab.getValue ()) ؛ system.out.println (str) ؛ } override public void attributeReMoved (servletContextTatribteevent Scab) {String str = messageformat.format ("delete attribute: {0} في كائن مجال servletContext ، قيمة السمة هي: {1}" ، scab.getname () ، scab.getvalue ()) ؛ system.out.println (str) ؛ } Override public void attributePlaced (servletContextTupteevent Scab) {String str = messageformat.format ("تم استبدال قيمة السمة: {0} في كائن مجال ServletContext" ، scab.getName ()) ؛ system.out.println (str) ؛ }}سجل المستمع في ملف web.xml
<StaNeer> <scription> myServletContextTuptIlistener مستمع </description> <المستمع- فئة> me.gacl.web.listener.myservletContextTiroptIlistener </stanker-class> </nistener>
اكتب ServletContextAttributeListenertest.jsp صفحة اختبار
<٪@ page language = "java" pageencoding = "utf-8" ٪> <! doctype html> <html> <head> <title> servletContextAttArbultener test test </title> </head> <body> <٪ // إضافة application. // استبدل قيمة سمة الاسم في Application. // قم بإزالة سمة الاسم في Application Application.RemoVeatTribute ("الاسم") ؛ ٪> </body> </html>نتائج التشغيل كما يلي:
من نتائج التشغيل ، يمكننا أن نرى أن مستمع ServletContextListener استمع بنجاح إلى تغيير قيمة الخاصية في كائن مجال ServletContext (التطبيق).
1.5. ServletRequestatTributElistener و HttpsessionAttributeListener مثال على ذلك:
اكتب مستمعًا لمراقبة التغييرات في قيم السمات من كائنات المجال HTTPSESSINT و httpservletrequest ، والرمز كما يلي:
package me.gacl.web.listener ؛ استيراد java.text.messageformat ؛ استيراد javax.servlet.servletrequestattributevent javax.servlet.http.httpsessionbindingevent ؛ الطبقة العامة myrequestandsessionAttributeListener تنفذ httpsessionAttributeListener ، servletRequestAtAtTributEner السمة: {0} ، قيمة السمة هي: {1} "، srae.getName () ، srae.getValue ()) ؛ system.out.println (str) ؛ } Override public void attributeReMoved (servletRequestAtTributeevent Srae) {String str = messageformat.format ("قم بإزالة السمات في كائن المجال servletrequest: {0} ، قيمة السمة هي: {1}" ، srae.getname () ، srae.getvalue () ؛ system.out.println (str) ؛ } Override public void attributeplaced (servletRequestAtTributevent Srae) {String str = messageformat.format ("تم استبدال قيمة السمات: {0} في كائن المجال servletrequest" ، srae.getName ()) ؛ system.out.println (str) ؛ } Override public void attributeadded (httpsessionbindingevent se) {string str = messageformat.format ("تمت إضافة السمة: {0} إلى" كائن httpsession commain ، system.TeBrintl ؛ تم حذف attributeReMoved (httpsessionbindingevent se) {string str = messageformat.format ("السمة: {0} من" كائن مجال httpsession ، قيمة السمة هي: {1} "، se.getName () ، se.getvalue ()) ؛ system.out.println (str) ؛ } Override public void attributeplaced (httpsessionbindingevent se) {string str = messageformat.format ("تم استبدال قيمة السمة: {0} في كائن مجال httpsession" ، se.getName ()) ؛ system.out.println (str) ؛ }}سجل المستمع في ملف web.xml
<StaNeer> <scription> myrequestandsessionattributeListener مستمع </description> <المستمع- فئة> me.gacl.web.listener.myrequestandsessionattributeListener </stanker-class> </nistener>
اكتب requestandsessionattributeListenertest.jsp صفحة اختبار
<٪@ page language = "java" pageencoding = "utf-8" ٪> <! doctype html> <html> <head> <title> requestAndSessionAttributeListener اختبار مستمع </title> </head> <٪ // إضافة سمة السمة. // استبدل قيمة سمة AA في جلسة كائن مجال الجلسة. // قم بإزالة جلسة السمة AA.RemoVeatTribute ("AA") ؛ // إضافة request request.setattribute ("aa" ، "bb") ؛ // استبدل قيمة سمة AA في طلب كائن مجال الطلب. // قم بإزالة request request.remoVeatTribute ("aa") ؛ ٪> </body> </html>نتائج التشغيل كما يلي:
من نتائج التشغيل ، يمكننا أن نرى أن مستمع HTTPSESSITATETTRIPTILISTERER و SERCLETREQUESTATTRIPTILISTERER قد استمع بنجاح إلى التغييرات في قيم السمة لكائن مجال HTTPSESSERESS وكائن مجال httpservletrequest.
2. إدراك مستمع الحدث المرتبط بالجلسة
يمكن أن يكون للكائنات المخزنة في مجال الجلسة حالات متعددة: الربط (Session.setAttribute ("Bean" ، Object)) في الجلسة ؛ undinding (Session.RemoVeatTribute ("Bean")) من مجال الجلسة ؛ الاستمرار في جهاز تخزين مع كائن الجلسة ؛ التعافي من جهاز تخزين مع كائن الجلسة. يتم تعريف اثنين من الواجهات الخاصة للمستمع "httpsessionBindingListener و HttPsessionActivationListener" في مواصفات servlet لمساعدة كائنات Javabean على فهم حالاتها في مجال الجلسة: ، ، لا تتطلب الفصول التي تنفذ هاتين الواجهتين التسجيل في ملف web.xml.
2.1. httpsessionBindingListener واجهة
يمكن لـ Javabean Object التي تنفذ واجهة HTTPsessionBindingListener أن تشعر أنها مرتبطة بالجلسة وحذف الأحداث في الجلسة. عندما يكون الكائن مرتبطًا بكائن httpsession ، يستدعي خادم الويب طريقة void valueBound (حدث httpsessionbindingevent) للكائن. عندما يكون الكائن غير محدود من كائن HTTPSASTERESS ، يقوم خادم الويب باستدعاء طريقة void valueunbound (حدث httpsessionbindingevent) للكائن.
مثال:
package me.gacl.domain ؛ import javax.servlet.http.httpsessionbindingevent ؛ استيراد javax.servlet.http.httpsessionbindebindinger ؛/*** @classname: javabeandemo1* description: الأحداث المحذوفة من الجلسة عندما يكون الكائن مرتبطًا بكائن httpsession ، يستدعي خادم الويب طريقة void valueBound (httpsessionbindingevent حدث) للكائن عندما يكون الكائن مرتبطًا بكائن httpsession. عندما لا يكون ذلك في الكائن في الكائن ، يقوم خادم الويب باستدعاء Void ViletUnbound (حدث httpsessionBindingevent)* A* Author: Lonely canglang* date: 2014-9-11 11:14:54 PM **/ Class public javabeandemo yberments httpsessionbindistener {private strep. Override public void valueBound (httpsessionbindingevent event) {system.out.println (تمت إضافة اسم+"إلى الجلسة") ؛ } Override public void viletunbound (حدث httpsessionBindingevent) {system.out.println (الاسم+"تم طرده بواسطة الجلسة") ؛ } السلسلة العامة getName () {return name ؛ } public void 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> <head> <title> </head> <sod Javabeandemo1 ("Lonely Canglang")) ؛ // lexoveAttribute ("Bean") ؛ ٪> </body> </html>نتائج التشغيل كما يلي:
2.2. httpsessionActivationListerener واجهة
يمكن أن يشعر كائن Javabean الذي ينفذ واجهة HTTPSASETACTIVATIVELISTERER بأنه يتم تنشيطه (DESERIALIST) وأحداث (تسلسل). قبل أن يتم نقل كائن Javabean المرتبط بكائن HTTPSASTERESS (تسلسل) باستخدام كائن HTTPSASTERSE ، يقوم خادم الويب بتنشيط SESSITALSPASSED (حدث HTTPSENESSEVENT) لكائن Javabean. وبهذه الطريقة ، يمكن أن يعرف كائن Javabean أنه سيتم تسلسله (السلبي) إلى القرص الثابت مع كائن HTTPSASTER.
بعد أن يتم تنشيط كائن Javabean المرتبط بكائن HTTPSASTERESS (Deserialized) باستخدام كائن HTTPSASTERESS ، يستدعي خادم الويب طريقة SessionDidActive (حدث httpsessionevent) لكائن Javabean. وبهذه الطريقة ، يمكن أن يعرف كائن Javabean أنه سيتم إلحاقه (يتم تنشيطه) ويعود إلى الذاكرة باستخدام كائن HTTPSASTER.
مثال:
package me.gacl.domain;import java.io.Serializable;import javax.servlet.http.HttpSessionActivationListener;import javax.servlet.http.HttpSessionEvent;/*** @ClassName: JavaBeanDemo2* @Description: JavaBean object that implements the HttpSessionActivationListener interface can perceive the تنشيط الحدث الذي يتم تنشيطه وسلبيه: يتم إلغاء تخصيص كائن جافابان والجلسة (المنشط) في الذاكرة معًا. التخميل: كائن Javabean موجود في الجلسة. عندما يقوم الخادم بتسلسل الجلسة إلى القرص الثابت ، إذا كان كائن Javabean في الجلسة ينفذ الواجهة القابلة للتسلسل ، فسيقوم الخادم بتسلسل كائن Javabean في الجلسة إلى القرص الثابت معًا. يسمى تشغيل كائن Javabean والجلسة على القرص الثابت معًا التخميل. إذا لم ينفذ كائن Javabean في الجلسة الواجهة القابلة للتسلسل ، فسيقوم الخادم أولاً بإزالة كائن Javabean في الجلسة التي لا تنفذ الواجهة القابلة للتسلسل ثم تخصيص (تجسيد) الجلسة إلى القرص الثابت. عندما يتم تمرير كائن Javabean المرتبط بكائن HTTPSASTERESS باستخدام كائن HTTPSASTERESS ، فإن خادم الويب يستدعي الفراغ من كائن Javabean قبل كائن Javabean المرتبط بكائن httpsession مع كائن httpsession. SessionWillPassivate (حدث HTTPsessionevent) بحيث يمكن للكائن Javabean معرفة أنه سيتم تسلسله (السلبي) مع كائن HTTPSession إلى القرص الصلب. بعد أن يتم تنشيط كائن Javabean المرتبط بكائن HTTPsession باستخدام كائن httpsession ، يستدعي خادم الويب طريقة sessiondidactive (حدث httpsessionevent) لكائن javabean حتى يمكن أن يعرف كائن javabean* @ @ @ @sured1: @ @ @adae11: deferain. PM **/ فئة عامة JavabeanDemo2 تنفذ httpsessionactivationlistener ، قابلة للتسلسل {private Static Final Long SerialVersionuid = 7589841135210272124L ؛ اسم السلسلة الخاصة ؛ Override public void SessionWillPassivate (httpsessionevent se) {system.out.println (name+"يتم تسلسل الجلسة (السلبي) إلى القرص الثابت معًا. معرف الجلسة هو:"+se.getsession (). getid ()) ؛ } Override public void sessionDidActivate (httpsessionevent se) {system.out.println (name+"وجلسة يتم تفريغها (المنشط) من القرص الثابت معًا. معرف الجلسة هو:"+se.getsession (). getId ()) ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } javabeandemo2 (اسم السلسلة) {this.name = name ؛ }}من أجل مراقبة عملية كائن Javabean المرتبط بكائن httpsession الذي يتم نقله إلى القرص الصلب وإعادة تنشيطه من القرص الثابت إلى الذاكرة ، نحتاج إلى استخدام خادم Tomcat لمساعدتنا في إكمال عملية التخميل وتفعيل كائن HTTPSESSUSE. الطرق المحددة هي كما يلي:
قم بإنشاء ملف context.xml في مجلد WebRoot/Meta-Inf على النحو التالي:
محتويات ملف context.xml هي كما يلي:
<Context> <manager className = "org.apache.catalina.session.persistrainationManager" maxidleswap = "1"> <store classname = "org.apache.catalina.session.filestore" directory = "gacl"/> </context>
بعد دقيقة واحدة من التكوين في ملف context.xml ، تشتيت كائن httpsession إلى مجلد GACL على القرص الثابت المحلي
رمز اختبار JSP كما يلي:
<٪@ page language = "java" pageencoding = "utf-8" ٪> <٪@ page import = "me.gacl.domain.javabeandemo2" ٪> <! doctype html> <html> <head> <head> </title> </head> <body> بمجرد الوصول إلى صفحة Jsp ، معرف الجلسة التي تم إنشاؤها هو: $ {pagecontext.session.id} <hr/> <٪ session.setattribute ("Bean" ، New Javabeandemo2 ("Lonely and Fruit")) ؛ ٪> </body> </html>عند الوصول إلى صفحة JSP هذه ، سيقوم الخادم على الفور بإنشاء كائن httpsession ، ثم ربط كائن javabean الذي ينفذ واجهة httpsessionActivationListerener إلى كائن الجلسة. بعد الانتظار لمدة دقيقة واحدة ، لن يصل أحد إلى صفحة JSP هذه مرة أخرى ، وسيقوم الخادم تلقائيًا بتصوير (تسلسل) كائن HTTPSASTERSE إلى القرص الثابت.
يمكننا العثور على الجلسة المسلسل للتخزين المحلي في مجلد عمل Tomcat Server/Catalina/LocalHost/Javaweb_Listener_20140908/GACL ، كما هو موضح في الشكل أدناه:
عند الوصول إلى صفحة JSP هذه مرة أخرى ، سيقوم الخادم تلقائيًا بتنشيط (Deserialize) كائن HTTPSENESS على القرص الثابت وإعادته إلى الذاكرة. نتائج التشغيل كما يلي:
لا يوجد سوى الكثير من المحتوى في تقنية المستمع في تقنية تطوير Javaweb. في العمل اليومي ، يتم استخدام تقنية المستمع بشكل متكرر في تطوير مشروع Javaweb ، لذلك يجب عليك إتقان هذه التكنولوجيا.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.