Servlet的filter和listener,重点了解ServletContext

本文介绍了Servlet 2.3中的Filter功能,包括其作用及实现方式,并深入探讨了Listener的作用和实现原理,特别是Spring框架中ContextLoaderListener的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 filter是servlet2.3新增加的功能,功能是在请求到达servlet之前和返回之前可以修改request和response。

还可以通过继承HttpServletRequestWrapper去重写request和response的一些方法

二 listener的作用查了一些资料没有看到想要的答案,然后决定自己去看看源码,以web.xml中spring配置的listener为例子

1 org.springframework.web.context.ContextLoaderListener

2 ContextLoaderListener的源码:

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
	public ContextLoaderListener() {
	}

	public ContextLoaderListener(WebApplicationContext context) {
		super(context);
	}

	public void contextInitialized(ServletContextEvent event) {
		this.initWebApplicationContext(event.getServletContext());
	}

	public void contextDestroyed(ServletContextEvent event) {
		this.closeWebApplicationContext(event.getServletContext());
		ContextCleanupListener.cleanupAttributes(event.getServletContext());
	}
}
public interface ServletContextListener extends EventListener {
	void contextInitialized(ServletContextEvent arg0);

	void contextDestroyed(ServletContextEvent arg0);
}

分析:

1 ServletContextListener是javax.context包里面的,看这两个方法就是conext初始化和销毁的时候

2 这个context就是ServletContext,ServletContext是Servlet的接口,一个web应用只有一个ServletContext,所有应用共用一个ServletContext

3 applicationContext实现了Servlet接口,applicationContext类中包含了StandardContext对象

4 StandardContext对象:一个web应用对应一个Context容器,也就是一个StandardContext类(其中ContextConfig类负责解析配置文件xml,这个类会被加到StandardContext类中),StandardContext的子容器是Wrapper对象,而Wrapper包装的就是Servlet了。StandardContext(Context容器)---Wrapper(servlet包装类)---servlet。

5 所以从servlet中获取的ServletContext,其实是获得了ApplicationConext,也就获得了context容器StandardContext,可以这么说:一个ServletContext就代表着一个web应用,一个Context容器。

6 ServletContext如何获取,如果你用的是struts,this.getServlet().getServletContext(),原因是struts的action中有servlet,而所有servlet就可以获得ServletContext。

7 ServleContext有什么用:设置全局参数,比如全局的根路径(我暂时用到的地方就是这里了),下面是最简单的例子

public class MyListener implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent event) {
		// TODO Auto-generated method stub
		event.getServletContext().setAttribute("ctx", event.getServletContext().getContextPath());
	}

	@Override
	public void contextDestroyed(ServletContextEvent event) {
		// TODO Auto-generated method stub
		
	}

}

在jsp中直接用<c:out value="${ctx }"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值