来自 电脑知识 2019-11-21 02:00 的文章
当前位置: 威尼斯国际官方网站 > 电脑知识 > 正文

深入学习JavaWeb中监听器

2.1、HttpSessionBindingListener接口

  在web.xml文件中登记监听器

  为了考查绑定到HttpSession对象中的javabean对象随HttpSession对象一起被钝化到硬盘上和从硬盘上海重机厂新活化回到内存中的的经过,大家须求依赖tomcat服务器扶植我们成功HttpSession对象的钝化和活化进度,具体做法如下:

  达成了HttpSessionActivationListener接口的JavaBean对象足以感知本人被活化(反系列化)和钝化(连串化)的风云
  当绑定到HttpSession对象中的javabean对象将在随HttpSession对象被钝化(类别化)在此以前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。那样javabean对象就能够知道本身将要和HttpSession对象一齐被连串化(钝化)到硬盘中.
  当绑定到HttpSession对象中的javabean对象就要随HttpSession对象被活化(反类别化)之后,web服务器调用该javabean对象的void sessionDidActive(HttpSession伊夫nt event)方法。这样javabean对象就足以清楚自个儿快要和 HttpSession对象一齐被反体系化(活化)回到内部存款和储蓄器中

package me.gacl.domain;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

/**
* @ClassName: JavaBeanDemo2
* @Description: 
 实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件
 活化:javabean对象和Session一起被反序列化(活化)到内存中。
 钝化:javabean对象存在Session中,当服务器把session序列化到硬盘上时,如果Session中的javabean对象实现了Serializable接口
 那么服务器会把session中的javabean对象一起序列化到硬盘上,javabean对象和Session一起被序列化到硬盘中的这个操作称之为钝化
 如果Session中的javabean对象没有实现Serializable接口,那么服务器会先把Session中没有实现Serializable接口的javabean对象移除
 然后再把Session序列化(钝化)到硬盘中
 当绑定到 HttpSession对象中的javabean对象将要随 HttpSession对象被钝化之前,
 web服务器调用该javabean对象对象的 void sessionWillPassivate(HttpSessionEvent event)方法
 这样javabean对象就可以知道自己将要和 HttpSession对象一起被序列化(钝化)到硬盘中
 当绑定到HttpSession对象中的javabean对象将要随 HttpSession对象被活化之后,
 web服务器调用该javabean对象的 void sessionDidActive(HttpSessionEvent event)方法
 这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中
* @author: 孤傲苍狼
* @date: 2014-9-11 下午11:22:35
*
*/ 
public class JavaBeanDemo2 implements HttpSessionActivationListener,
  Serializable {


 private static final long serialVersionUID = 7589841135210272124L;
 private String name;

 @Override
 public void sessionWillPassivate(HttpSessionEvent se) {

  System.out.println(name+"和session一起被序列化(钝化)到硬盘了,session的id是:"+se.getSession().getId());
 }

 @Override
 public void sessionDidActivate(HttpSessionEvent se) {
  System.out.println(name+"和session一起从硬盘反序列化(活化)回到内存了,session的id是:"+se.getSession().getId());
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public JavaBeanDemo2(String name) {
  this.name = name;
 }
}

  jsp测验代码如下:

1.2、attributeRemoved 方法

运转结果如下:

  编写RequestAndSessionAttributeListenerTest.jsp测量检验页面

二、感知Session绑定的事件监听器

  域对象中品质的更改的风云监听器正是用来监听 ServletContext, HttpSession, HttpServletRequest 这四个对象中的属性别变化更音讯事件的监听器。   

  JavaWeb开垦才具中的监听器技艺的剧情就这么多了,在日常的行事中,监听器技艺在JavaWeb项目支出中用得是超级多,因而必得调控那门才干。

<%@ page language="java" pageEncoding="UTF-8"%>
<%@page import=" me.gacl.domain.JavaBeanDemo1"%>
<!DOCTYPE HTML>
<html>
 <head>
 <title></title>
 </head>

 <body>
 <% 
  //将javabean对象绑定到Session中
  session.setAttribute("bean",new JavaBeanDemo1("孤傲苍狼"));
  //从Session中删除javabean对象
  session.removeAttribute("bean");
 %>
 </body>
</html>
package me.gacl.web.listener;

import java.text.MessageFormat;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

/**
* @ClassName: MyServletContextAttributeListener
* @Description: ServletContext域对象中属性的变更的事件监听器
* @author: 孤傲苍狼
* @date: 2014-9-11 下午10:53:04
*
*/ 
public class MyServletContextAttributeListener implements
  ServletContextAttributeListener {

 @Override
 public void attributeAdded(ServletContextAttributeEvent scab) {
  String str =MessageFormat.format(
    "ServletContext域对象中添加了属性:{0},属性值是:{1}"
    ,scab.getName()
    ,scab.getValue());
  System.out.println(str);
 }

 @Override
 public void attributeRemoved(ServletContextAttributeEvent scab) {
  String str =MessageFormat.format(
    "ServletContext域对象中删除属性:{0},属性值是:{1}"
    ,scab.getName()
    ,scab.getValue());
  System.out.println(str);
 }

 @Override
 public void attributeReplaced(ServletContextAttributeEvent scab) {
  String str =MessageFormat.format(
    "ServletContext域对象中替换了属性:{0}的值"
    ,scab.getName());
  System.out.println(str);
 }
}

威尼斯国际官方网站 1

威尼斯国际官方网站 2 

1.4、ServletContextAttributeListener监听器轨范:

  从运维结果中得以看到,ServletContextListener监听器成功监听到了ServletContext域对象(application)中的属性值的更改意况。

  当监听器的域对象中的有个别属性被沟通时,web容器调用事件监听器的attributeReplaced方法举行响应
  各种域属性监听器中的完整语法定义为:

当再次访谈那些Jsp页面时,服务器又会活动将曾经钝化(系列化)到硬盘上HttpSession对象重新活化(反体系化)回到内部存款和储蓄器中。运维结果如下:

威尼斯国际官方网站 3

如上便是本文的全部内容,希望对我们的学习抱有助于,也可望我们多都赐教脚本之家。

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
 <head>
 <title>RequestAndSessionAttributeListener监听器测试</title>
 </head>

 <body>
 <%
   //往session域对象中添加属性
   session.setAttribute("aa", "bb");
   //替换session域对象中aa属性的值
   session.setAttribute("aa", "xx");
   //移除session域对象中aa属性
   session.removeAttribute("aa");

   //往request域对象中添加属性
   request.setAttribute("aa", "bb");
   //替换request域对象中aa属性的值
   request.setAttribute("aa", "xx");
   //移除request域对象中aa属性
   request.removeAttribute("aa");
 %>
 </body>
</html>

  在WebRootMETA-INF文件夹下创建三个context.xml文件,如下所示:

威尼斯国际官方网站 4

  在context.xml文件文件中安插了1分钟过后就将HttpSession对象钝化到本地硬盘的一个gacl文件夹中

  context.xml文件的内容如下:

 <listener>
  <description>MyServletContextAttributeListener监听器</description>
  <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class>
 </listener>

  从运维结果中得以看来,HttpSessionAttributeListener监听器和ServletRequestAttributeListener成功监听到了HttpSession域对象和HttpServletRequest域对象的属性值变化景况。

  编写ServletContextAttributeListenerTest.jsp测量检验页面

威尼斯国际官方网站 5

<%@ page language="java" pageEncoding="UTF-8"%>
<%@page import="me.gacl.domain.JavaBeanDemo2"%>
<!DOCTYPE HTML>
<html>
 <head>
 <title></title>
 </head>

 <body>
  一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id}
  <hr/>
 <% 
  session.setAttribute("bean",new JavaBeanDemo2("孤傲苍狼"));
 %>
 </body>
</html>

您大概感兴趣的稿子:

  • Java Swing中JList接收事件监听器ListSelectionListener用法示例
  • 详谈Java中的事件监听机制
  • JAVA客商自定义事件监听实例代码
  • Java增加风浪监听的七种方法代码实例
  • java开垦gui教程之jframe监听窗体大小变化事件和jframe创立窗体
  • 浅析JAVA中过滤器、监听器、拦截器的界别
  • JavaWeb监听器Listener实例解析
  • JavaFX 监听窗口关闭事件实例详细明白
  • java实现table加多右键点击事件监听操作示例

1.5、ServletRequestAttributeListener和HttpSessionAttributeListener监听器典范:

 <listener>
  <description>MyRequestAndSessionAttributeListener监听器</description>
  <listener-class>me.gacl.web.listener.MyRequestAndSessionAttributeListener</listener-class>
 </listener>

  上述的JavaBean德姆o1那个javabean完成了HttpSessionBindingListener接口,那么那么些JavaBean对象足以感知本身被绑定到Session阳春从Session中剔除的那八个操作,测量检验代码如下:

<Context>
  <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
  <Store className="org.apache.catalina.session.FileStore" directory="gacl"/>
  </Manager>
 </Context>
public void attributeReplaced(ServletContextAttributeEvent scae)
public void attributeReplaced (HttpSessionBindingEvent hsbe)
public void attributeReplaced (ServletRequestAttributeEvent srae)
package me.gacl.domain;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
* @ClassName: JavaBeanDemo1
* @Description: 
* 实现了HttpSessionBindingListener接口的 JavaBean对象可以感知自己被绑定到 Session中和从Session中删除的事件
 当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的 void valueBound(HttpSessionBindingEvent event) 方法
 当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法

* @author: 孤傲苍狼
* @date: 2014-9-11 下午11:14:54
*
*/ 
public class JavaBeanDemo1 implements HttpSessionBindingListener {

 private String name;

 @Override
 public void valueBound(HttpSessionBindingEvent event) {
  System.out.println(name+"被加到session中了");
 }

 @Override
 public void valueUnbound(HttpSessionBindingEvent event) {
  System.out.println(name+"被session踢出来了");
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public JavaBeanDemo1(String name) {
  this.name = name;
 }
}
 public void attributeAdded(ServletContextAttributeEvent scae)
 public void attributeReplaced(HttpSessionBindingEvent hsbe)
 public void attributeRmoved(ServletRequestAttributeEvent srae)

威尼斯国际官方网站 6

  运营结果如下:

  在web.xml文件中登记监听器

1.3、attributeReplaced 方法

public void attributeRemoved(ServletContextAttributeEvent scae)
public void attributeRemoved (HttpSessionBindingEvent hsbe)
public void attributeRemoved (ServletRequestAttributeEvent srae)

威尼斯国际官方网站 7

2.2、HttpSessionActivationListener接口

  访问那一个jsp页面,服务器就能够立时创设贰个HttpSession对象,然后将贯彻了HttpSessionActivationListener接口的JavaBean对象绑定到session对象中,那么些jsp页面在等待1分钟过后并未有人再度访问,那么服务器就能够活动将以此HttpSession对象钝化(种类化)到硬盘上,

威尼斯国际官方网站 ,范例:

1.1、attributeAdded 方法

  运转结果如下:

  完结了HttpSessionBindingListener接口的JavaBean对象能够感知自身被绑定到Session仲阳Session中删去的事件
  当指标被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法
  当目的从HttpSession对象中革除绑依期,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法

package me.gacl.web.listener;

import java.text.MessageFormat;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class MyRequestAndSessionAttributeListener implements
  HttpSessionAttributeListener, ServletRequestAttributeListener {

 @Override
 public void attributeAdded(ServletRequestAttributeEvent srae) {
  String str =MessageFormat.format(
    "ServletRequest域对象中添加了属性:{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 attributeReplaced(ServletRequestAttributeEvent srae) {
  String str =MessageFormat.format(
    "ServletRequest域对象中替换了属性:{0}的值"
    ,srae.getName());
  System.out.println(str);
 }

 @Override
 public void attributeAdded(HttpSessionBindingEvent se) {
  String str =MessageFormat.format(
    "HttpSession域对象中添加了属性:{0},属性值是:{1}"
    ,se.getName()
    ,se.getValue());
  System.out.println(str);
 }

 @Override
 public void attributeRemoved(HttpSessionBindingEvent se) {
  String str =MessageFormat.format(
    "HttpSession域对象中删除属性:{0},属性值是:{1}"
    ,se.getName()
    ,se.getValue());
  System.out.println(str);
 }

 @Override
 public void attributeReplaced(HttpSessionBindingEvent se) {
  String str =MessageFormat.format(
    "HttpSession域对象中替换了属性:{0}的值"
    ,se.getName());
  System.out.println(str);
 }
}

生机勃勃、监听域对象中质量的改换的监听器

  保存在Session域中的对象足以有各样状态:绑定(session.setAttribute(“bean”,Object))到Session中;从 Session域中灭亡(session.removeAttribute(“bean”))绑定;随Session对象悠久化到三个存款和储蓄设备中;随Session对象从贰个存款和储蓄设备中平复
  Servlet 标准中定义了八个特殊的监听器接口“HttpSessionBindingListener和HttpSessionActivationListener”来援救JavaBean 对象领会自身在Session域中的那几个意况: ,达成那三个接口的类无需 web.xml 文件中开展注册。

  当删除被监听指标中的几本性质时,web容器调用事件监听器的attributeRemoved方法开展响应
  各类域属性监听器中的完整语法定义为:

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
 <head>
 <title>ServletContextAttributeListener监听器测试</title>
 </head>

 <body>
  <%
   //往application域对象中添加属性
   application.setAttribute("name", "孤傲苍狼");
   //替换application域对象中name属性的值
   application.setAttribute("name", "gacl");
   //移除application域对象中name属性
   application.removeAttribute("name");
   %>
 </body>
</html>

范例:

  这两个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,那四个接口中都定义了四个主意来管理被监听目的中的属性的增加,删除和替换的平地风波,同三个事变在此八个接口中对应的方法名称完全相符,只是选拔的参数类型不相同。

  编写ServletContextAttributeListener监听器监听ServletContext域对象的属性值变化景况,代码如下:

  编写监听器监听HttpSession和HttpServletRequest域对象的属性值变化意况,代码如下:

作者们得以在tomcat服务器的workCatalinalocalhostJavaWeb_Listener_20140908gacl文件夹下找到类别化到地头存款和储蓄的session,如下图所示:

  当向被监听指标中追加壹天质量时,web容器就调用事件监听器的attributeAdded方法举办响应,那个措施接纳一个事变类型的参数,监听器可以透过这些参数来收获正在扩充品质的域对象和被保留到域中的属性对象
  各样域属性监听器中的完整语法定义为:

本文由威尼斯国际官方网站发布于电脑知识,转载请注明出处:深入学习JavaWeb中监听器

关键词: