前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet总结五(监听器)

Servlet总结五(监听器)

作者头像
爱撒谎的男孩
发布2019-12-31 14:31:25
4710
发布2019-12-31 14:31:25
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

  1. 1. Servlet总结五(监听器)
    1. 1.1. 分类
    2. 1.2. 生命周期监听器
      1. 1.2.1. ServletContextListener
        1. 1.2.1.1. 实例
      2. 1.2.2. ServletRequestListener
        1. 1.2.2.1. 实例
      3. 1.2.3. HttpSessionListener
        1. 1.2.3.1. 实例
    3. 1.3. 属性操作监听器
      1. 1.3.1. HttpSessionAttributeListener
    4. 1.4. 会话属性监听器
      1. 1.4.1. HttpSessionBindingListener

Servlet总结五(监听器)

分类

监听器按其功能可以分为三种,分别是生命周期监听器(ServletContextListener,ServletRequestListener,HttpSessionListener),属性监听器(ServletRequestAttributeListener,HttpSessionAttributeListener,ServletContextAttributeListener),会话属性监听器(HttpSessionBindingListener,HttpSessionActivationListener)。下面我们将会详细的介绍这三种监听器。

生命周期监听器 生命周期就是从创建到销毁,因此顾名思义,就是在对象创建的时候会触发,销毁的时候也会触发

ServletContextListener

前面我们说过ServletContext是上下文的,是应用程序共享的,当应用程序启动就会生成的。在应用程序初始化或者结束前,会分别调用contextInitialized()contextDestroyed()方法,通过传入的ServletContextEvent取得ServletContext对象。

实例

下面读取设置的初始化参数,并且在监听器中将其绑定为属性实现全文共享

  • web.xml的文件,主要是设置初始化属性值,前面已经讲过
代码语言:javascript
复制
<!-- 设置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 -->

下面是实现监听器的功能

代码语言:javascript
复制
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);

	}

}

ServletRequestListener

这是在对象ServletRequest对象生成或结束时,会触发的监听器。当生成的时候会触发requestInitialized(),结束时会触发requestDestroyed()方法。 ServletRequest对象生成一般在浏览器发出请求,或者转发重定向。注意这个触发是在Servlet的doGet()或者doPost()之前。

实例

ServletRequestListener文件:在ServletRequest对象生成时绑定属性

代码语言:javascript
复制
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文件:取得绑定的值

代码语言:javascript
复制
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter pWriter=response.getWriter();
		pWriter.println(request.getAttribute("login"));   //取得上面监听器绑定的值
		
	}

web.xml文件

代码语言:javascript
复制
<!-- 设置监听器,ServletRequestListener -->
	<listener>
		<listener-class>com.ServletRequestListenerDemo</listener-class>
	</listener>
	<!-- 设置监听器,ServletRequestListener -->

HttpSessionListener

HttpSession对象初始化后或者结束时,会分别调用sessionCreated()sessionDestroyed()方法,你可以通过传入的HttpSessionEvent来取得HttpSession,以针对会话对象做出响应的创建或者结束处理操作

实例

Servlet文件:用来验证登录是否正确,如果正确就创建HttpSession对象,并且绑定属性用来实现自动登录

代码语言:javascript
复制
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文件:用来记录登录的人数

代码语言:javascript
复制
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(属性被替换的时候触发) 由于这三个监听器实现的方法都是一样的,下面就演示一个即可,其他的都是相同的

HttpSessionAttributeListener

这是监听HttpSession对象属性的,主要有(添加,移除,替换),当然这个也是要在web.xml设置的

代码语言:javascript
复制
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

当实现HttpSessionBindingListener接口的类的对象被移除或者绑定到HttpSession成为属性的时候就会触发 下面是实现HttpSessionBindingListener接口的类

代码语言:javascript
复制
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文件:
代码语言:javascript
复制
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 {
		
	}

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Servlet总结五(监听器)
    • 分类
      • ServletContextListener
      • ServletRequestListener
      • HttpSessionListener
    • 属性操作监听器
      • HttpSessionAttributeListener
    • 会话属性监听器
      • HttpSessionBindingListener
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档