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{  
    }  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章