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