JavaWeb之监听器

2 监听器

2.1 监听request对象被创建和销毁

package cn.itcast.web.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class MyRequestListener implements ServletRequestListener {

	
	public void requestInitialized(ServletRequestEvent sre)  { 
		System.out.println("监听新的request对象被创建了...");
	}
	
    public void requestDestroyed(ServletRequestEvent sre)  { 
    	System.out.println("监听request对象被销毁了...");
    }
	
}

web.xml 注册

  <listener>
    <listener-class>cn.itcast.web.listener.MyRequestListener</listener-class>
  </listener>

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		request.setAttribute("city", "东莞");
	%>
</body>
</html>

2.2 监听session对象的创建和销毁

package cn.itcast.web.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent se)  { 
    	// Event 事件: 通过事件对象可以获取被监听对象的引用
    	HttpSession session = se.getSession();
    	System.out.println(session.getId() + "对应的session被创建了**** **** ");
    }

    public void sessionDestroyed(HttpSessionEvent se)  { 
    	HttpSession session = se.getSession();
    	System.out.println(session.getId() + "对应的session被销毁了**** **** **** **** ");
    }
	
}

web.xml

  <listener>
    <listener-class>cn.itcast.web.listener.MySessionListener</listener-class>
  </listener>

jsp页面

<%
		// 测试session的创建和销毁
		session.setAttribute("username", "柳岩");
		session.invalidate(); // 通知服务器销毁session容器
%>

2.3 监听ServletContext对象(项目对象)的创建和销毁

package cn.itcast.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListner implements ServletContextListener {

	public void contextInitialized(ServletContextEvent sce)  { 
		System.out.println("--------------------------- 监听到项目被创建了....");
	}
	
    public void contextDestroyed(ServletContextEvent sce)  { 
    	System.out.println("******************************************** 监听到项目被销毁了....");
    }

}

web.xml

  <listener>
    <listener-class>cn.itcast.web.listener.MyServletContextListner</listener-class>
  </listener>

2.4 监听request容器属性的变更

package cn.itcast.web.listener;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

public class MyRequestAttrChangeListener implements ServletRequestAttributeListener {

	public void attributeAdded(ServletRequestAttributeEvent srae) {
		// 属性 = 属性名 + 属性值
		// 1 获取属性名
		String name = srae.getName();
		// 2 获取属性值:
		// 2.1 获取事件源对象, 指request对象
		ServletRequest request = srae.getServletRequest();
		Object value = request.getAttribute(name);

		System.out.println("*****request 增加属性: " + name + " = " + value);
	}

	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		// 1 获取属性名
		String name = srae.getName();
		// 2 获取属性值:
		// 2.1 获取事件源对象, 指request对象
		ServletRequest request = srae.getServletRequest();
		Object newValue = request.getAttribute(name);
		// 2.2 获取原来的值
		Object oldValue = srae.getValue();

		System.out.println("***** ***** *****request 修改属性 属性名: " + name);
		System.out.println("***** ***** *****request 修改属性 新的属性值: " + newValue);
		System.out.println("***** ***** *****request 修改属性 旧的属性值: " + oldValue);
	}

	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		// 1 获取属性名
		String name = srae.getName();
		
		System.out.println("***** ***** ***** ***** ***** *****request 删除属性 : " + name);
	}

}

web.xml

  <listener>
    <listener-class>cn.itcast.web.listener.MyRequestAttrChangeListener</listener-class>
  </listener>

jsp

<%
		// 测试request属性的变更
		// 增加属性
		request.setAttribute("city", "广州");
		// 修改属性
		request.setAttribute("city", "深圳");
		// 删除属性
		request.removeAttribute("city");
%>

2.5 绑定和解绑

使对象感知自己被放到session中,称为 绑定;

使对象感知自己从session移除,称为 解绑;

package cn.itcast.web.listener;

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

public class User1 implements HttpSessionBindingListener {
	private int id;
	private String name;
	private int age;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User1 [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	@Override
	public void valueBound(HttpSessionBindingEvent event) {
		System.out.println(this + "感知自己被放到 session中------------------");
	}

	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		System.out.println(this + "感知自己从 session中移除 ---------------------------------------------");
	}

}

<%@page import="cn.itcast.web.listener.User1"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	User1 loginUser = new User1();
	loginUser.setId(1);
	loginUser.setName("张三");
	loginUser.setAge(18);
	
	// 使对象感知自己被放到session中,称为 绑定;
	session.setAttribute("loginUser", loginUser);

	// 使对象感知自己从session移除,称为 解绑;
	// session.removeAttribute("loginUser");
	session.invalidate();
%>
</body>
</html>

2.6 钝化和活化

钝化: 使对象随session 放到硬盘上;(正常关闭服务器, session会钝化到硬盘上)

活化: 使对象随session 活化到内存中.

package cn.itcast.web.listener;

import java.io.Serializable;

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

public class User2 implements HttpSessionActivationListener, Serializable {
	private String nickname;
	private String city;

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	@Override
	public String toString() {
		return "User2 [nickname=" + nickname + ", city=" + city + "]";
	}

	@Override
	public void sessionDidActivate(HttpSessionEvent se) {
		System.out.println(this + "随session活化到内存中 .........");
	}
	
	@Override
	public void sessionWillPassivate(HttpSessionEvent se) {
		System.out.println(this + "随session钝化到硬盘上...................... .........");
	}


}

user2_1.jsp

<%@page import="cn.itcast.web.listener.User2"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>建立user2对象和session的关系: 将user2对象放到session中</h1>
	<%
		User2 user2 = new User2();
		user2.setNickname("小花");
		user2.setCity("中关村");
		
		session.setAttribute("user2", user2);
	%>
</body>
</html>

user2_2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>从session中取出user2对象的信息</h1>
		用户暱称: ${sessionScope.user2.nickname } <br/>
		用户城市: ${sessionScope.user2.city } <br/>
</body>
</html>

拦截器类简介

package org.springframework.web.servlet.handler;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  
public abstract class HandlerInterceptorAdapter implements HandlerInterceptor{  
    // 在业务处理器处理请求之前被调用  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{  
        return true;  
    }  
    // 在业务处理器处理请求完成之后,生成视图之前执行  
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)  
      throws Exception{  
    }  
    // 在DispatcherServlet完全处理完请求之后被调用,可用于清理资源  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
      throws Exception{  
    }  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章