Servlet Session属性监听器深入探索

本文深入探讨了Servlet中的HttpSessionAttributeListener和HttpSessionBindingListener接口,分析了向session添加、替换和删除属性时的事件触发情况,以及session过期失效时的行为。实验结果显示,当属性已存在时,会触发属性替换事件;删除不存在属性不会触发移除事件;session过期会触发属性移除事件。使用HttpSessionBindingListener可以提高运行效率和代码的灵活性。
摘要由CSDN通过智能技术生成

Servlet关于对象属性监听器,接口有三类:HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener。每种接口有三个方法attributeAdded、attributeReplace、attributeRemove,分别对应监控属性的添加、替换、移除。如果仔细考究的话,会有一些细节方面的问题需要回答。

一、HttpSessionAttributeListener问题

问题1:当向session添加名为test的属性时,如果test属性已存在,会发生什么呢?

猜测:当向session中添加已经存在的属性时,session的方法setAttribute应该会首先检查这个属性是否已经存在,如果存在则会触发属性替换事件,如果不存在则触发属性添加事情。

Servlet测试代码:

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

// 添加到Session的测试用属性类
class UserInfo {
	private String name;
	private Date createdDate;

	public UserInfo(String name) {
		this.name = name;
		createdDate = new Date();
	}

	public String getName() {
		return name;
	}

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

	public Date getCreatedDate() {
		return createdDate;
	}
}

public class SessionListener extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public SessionListener() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 创建Session
		HttpSession session = request.getSession(true);
		// 向Session添加名为test的属性,此时应该触发监听器的attributeAdded事件
		session.setAttribute("test", new UserInfo("billy"));
		// 再一次向Session添加名为test的属性,此时应该触发监听器的attributeReplaced事件
		session.setAttribute("test", new UserInfo("stars"));
		// 将Session中的test属性删除,此时应该会触发attributeRemoved事件
		session.removeAttribute("test");
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
}

监视器测试代码:

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class SessionAttributeListenerImpl implements HttpSessionAttributeListener {

	public SessionAttributeListenerImpl() {
	}

	public void attributeAdded(HttpSessionBindingEvent event) {
		System.out.println("======Add Attribute=====");
		display(event);
	}

	public void attributeRemoved(HttpSessionBindingEvent event) {
		System.out.println("======Remove Attribute=====");
		display(event);
	}

	public void attributeReplaced(HttpSessionBindingEvent event) {
		System.out.println("======Replace Attribute=====");
		display(event);
	}
	
	private void display(HttpSessionBindingEvent event) {
		System.out.println("Source: " + event.getSource().getClass().getName());
		System.out.println("Session ID: " + event.getSession().getId());
		System.out.println("At
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值