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{
}
}