文章目录
监听器按其功能可以分为三种,分别是生命周期监听器(
ServletContextListener
,ServletRequestListener
,HttpSessionListener
),属性监听器(ServletRequestAttributeListener
,HttpSessionAttributeListener
,ServletContextAttributeListener
),会话属性监听器(HttpSessionBindingListener
,HttpSessionActivationListener
)。下面我们将会详细的介绍这三种监听器。
生命周期监听器 生命周期就是从创建到销毁,因此顾名思义,就是在对象创建的时候会触发,销毁的时候也会触发
前面我们说过
ServletContext
是上下文的,是应用程序共享的,当应用程序启动就会生成的。在应用程序初始化或者结束前,会分别调用contextInitialized()
和contextDestroyed()
方法,通过传入的ServletContextEvent
取得ServletContext
对象。
下面读取设置的初始化参数,并且在监听器中将其绑定为属性实现全文共享
web.xml
的文件,主要是设置初始化属性值,前面已经讲过<!-- 设置ServletContext初始参数 -->
<context-param>
<param-name>username</param-name>
<param-value>陈加兵</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
<!-- 设置ServletContext初始参数 -->
<!-- 设置监听器,ServletContextListener -->
<listener>
<listener-class>com.ServletContextListenerDemo</listener-class>
</listener>
<!-- 设置监听器,ServletContextListener -->
下面是实现监听器的功能
package com;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerDemo implements ServletContextListener {
// ServletContext销毁的时候触发
public void contextDestroyed(ServletContextEvent arg0) {
//当销毁的时候就移除其中绑定的属性
ServletContext context = arg0.getServletContext();
// 获取所有属性的名称
Enumeration enumeration = context.getAttributeNames();
while (enumeration.hasMoreElements()) {
String name = (String) enumeration.nextElement();
// 移除绑定的属性
context.removeAttribute(name);
}
}
// ServletContext生成的时候触发,一般当web程序应用的时候就会初始化ServletContext参数
public void contextInitialized(ServletContextEvent arg0) {
//获取ServletContext对象
ServletContext context = arg0.getServletContext();
// 读取参数
String name = context.getInitParameter("username");
String password = context.getInitParameter("password");
// 绑定属性,用于全文共享
context.setAttribute("username", name);
context.setAttribute("password", password);
}
}
这是在对象
ServletRequest
对象生成或结束时,会触发的监听器。当生成的时候会触发requestInitialized()
,结束时会触发requestDestroyed()
方法。 ServletRequest对象生成一般在浏览器发出请求,或者转发重定向。注意这个触发是在Servlet的doGet()或者doPost()之前。
ServletRequestListener
文件:在ServletRequest
对象生成时绑定属性
package com;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class ServletRequestListenerDemo implements ServletRequestListener {
//在ServletRequest对象结束时触发
public void requestDestroyed(ServletRequestEvent arg0) {
HttpServletRequest request=(HttpServletRequest)arg0.getServletRequest();
}
//在ServletRequest对象生成时触发(比如浏览器请求)
public void requestInitialized(ServletRequestEvent arg0) {
//强制转换成其子类
HttpServletRequest request=(HttpServletRequest) arg0.getServletRequest();
//绑定属性,这里的request和触发其的Servlet中的是一样的,因此可以实现共享
//就好像forward,include一样
request.setAttribute("login", "atuo"); //绑定属性
}
}
Servlet
文件:取得绑定的值
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter pWriter=response.getWriter();
pWriter.println(request.getAttribute("login")); //取得上面监听器绑定的值
}
web.xml
文件
<!-- 设置监听器,ServletRequestListener -->
<listener>
<listener-class>com.ServletRequestListenerDemo</listener-class>
</listener>
<!-- 设置监听器,ServletRequestListener -->
在
HttpSession
对象初始化后或者结束时,会分别调用sessionCreated()
和sessionDestroyed()
方法,你可以通过传入的HttpSessionEvent
来取得HttpSession
,以针对会话对象做出响应的创建或者结束处理操作
Servlet
文件:用来验证登录是否正确,如果正确就创建HttpSession
对象,并且绑定属性用来实现自动登录
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.registry.infomodel.User;
public class ServletDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name=request.getParameter("username");
String password=request.getParameter("password");
if ("chenjiabing".equals(name)&&"123456".equals(password)) {
//用户名和密码正确创建对象
HttpSession session=request.getSession();
session.setAttribute("login", "auto");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void init() throws ServletException {
}
}
HttpSessionListenerDemo
文件:用来记录登录的人数
package com;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.omg.CORBA.Request;
public class ServletHttpSessionListenerDemo implements HttpSessionListener {
private static int count=0;
//HttpSession创建时触发
public void sessionCreated(HttpSessionEvent arg0) {
count++; //人数++
}
//HttpSession销毁时触发
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
count--; //人数--
}
}
顾名思义,属性操作监听器就是当绑定属性或者移除绑定属性的时候会触发,共有三个监听器,分别为:
ServletContextAttributeListener
,ServletRequestAttributeListener
,HttpSessionAtrributeListener
。相同的是它们都有共同需要实现的方法,分别为:attributeAdded
(绑定属性的时候触发),attributeRemoved
(属性移除的时候触发),attributeReplace
(属性被替换的时候触发) 由于这三个监听器实现的方法都是一样的,下面就演示一个即可,其他的都是相同的
这是监听
HttpSession
对象属性的,主要有(添加,移除,替换),当然这个也是要在web.xml
设置的
package com;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
public class HttpSessionAttributeListener implements javax.servlet.http.HttpSessionAttributeListener {
/*HttpSessionBindingEvent方法
* String getName() 返回最近改变的属性的名称
* Object getValue() 返回已添加、移除或替换的属性的值。如果添加(或绑定)了属性,则这是该属性的值。如果移除(或取消绑定)了属性,则这是被移除属性的值。如果替换了属性,则这是属性原来的值。
* getSession() 获取HttpSession对象
*/
//添加新的属性时触发,每绑定一个属性就触发一次
public void attributeAdded(HttpSessionBindingEvent arg0) {
//获取HttpSession对象
HttpSession session=arg0.getSession();
String name=arg0.getName(); //获取添加的属性名称
String attribute=(String) arg0.getValue(); //获取添加的属性的值
}
//移除属性的时候触发 ,每移除一次就会触发一次
public void attributeRemoved(HttpSessionBindingEvent arg0) {
String value=(String) arg0.getValue();
System.out.println("被移除的属性的值为:"+value);
}
//属性值被替换的时候触发,直接重新设置属性值就是替换
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("被替换的属性的值:"+arg0.getValue());
}
}
先前介绍的几个监听器都是要在
web.xml
中使用<listener>
定义的,这个会话属性监听器是不要在web.xml
设置的 这里介绍的监听器分别为:HttpSessionBindingListener
,HttpSessionActivationListener
当实现
HttpSessionBindingListener
接口的类的对象被移除或者绑定到HttpSession
成为属性的时候就会触发 下面是实现HttpSessionBindingListener
接口的类
package com;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
public class HttpSessionBindingListenerDemo implements javax.servlet.http.HttpSessionBindingListener {
public String name;
private int age;
public HttpSessionBindingListenerDemo() {
super();
this.name="陈加兵";
this.age=22;
}
//当这个类的对象绑定成为HttpSession的属性的时候将会触发
public void valueBound(HttpSessionBindingEvent arg0) {
//获取绑定的属性的对象
HttpSessionBindingListenerDemo listenerDemo=(HttpSessionBindingListenerDemo)arg0.getValue();
//获取对象的值
System.out.println(listenerDemo.name);
}
//当这个类的对象被移除的时候就会触发
//getValue() getName()
public void valueUnbound(HttpSessionBindingEvent arg0) {
}
}
Servlet
文件:package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取对象
HttpSession session=request.getSession();
//对象
HttpSessionBindingListenerDemo listener=new HttpSessionBindingListenerDemo();
//绑定对象
session.setAttribute("listener", listener);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void init() throws ServletException {
}
}