Servlet Context
Servlet Context概念
ServletContext是Java Web应用运行时所有Servlet共享的Context对象,ServletContext主要拥有如下功能:
- 获取Web.xml中配置的初始化参数
- 设置全局共享属性(
setAttribute) - 获取过滤器(filter)、监听器(listener)的注册信息
- 获取应用资源路径,读取资源
接下来,我们会针对其中两个重要的功能——在web.xml中添加初始化参数以及过滤器——进行阐述以及示例应用。
Servlet Context的简单用法
增加初始化参数以及获取初始化参数
在web.xml中,我们通过配置<context-param>来配置ServletContext的初始化参数,如:
<context-param>
<param-name>sampleContextPram</param-name>
<param-value>Initial</param-value>
</context-param>
而在引用的时候,我们只需要使用如下方法即可。(this指向servlet对象)
this.getServletContext().getInitParameter("sampleContextPram")
Servlet Filter
什么是Servlet Filter
在Servlet对请求进行处理之前,如果我们需要做一些额外且通用的操作,如判断当前访问是否合法,是否包含有处理请求所需要的所有请求头,我们就可以使用Servlet的Filter功能。
在javax.servlet的包下,定义了一个为Filter的接口,这就是我们实现Servlet Filter所需要实现的接口。接口中声明了几个方法。
public void init(FilterConfig filterConfig) throws ServletException;//可以配置filter的初始化参数,并且在init的时候进行获取和处理
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException, ServletException;
//声明且配置完成filter后,每一个请求都会首先通过filter进行处理后再传到Servlet中,而在这一层,我们也可以加入一些拦截方法,拦截一些非法请求。
public void destroy();//用于释放filter持有的资源。
增加Servlet Filter
接下来就会展示如何通过在web.xml中配置增加一个filter。
首先,创建我们自身的filter类
SimpleFilter.java
public class SimpleFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.getOutputStream().write("filtered!".getBytes());
chain.doFilter(request, response);//必须,如果不继续进行链式调用的话,就会直接返回。
}
@Override
public void destroy() {}
}
然后,在web.xml中完成定义
<filter>
<filter-name>simpleFilter</filter-name>
<filter-class>filters.SimpleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>simpleFilter</filter-name>
<url-pattern>/test</url-pattern>
</filter-mapping>
Filter最终也会被注册到ServletContext中,我们可以通过ServletContext.getFilterRegistrations来查看当前Context中注册的所有filter。(因为ServletContext是所有Servlet共享的,因此这些注册信息也会被所有的Servlet共享)
Servlet Listener
Servlet Listener简介
除了能够对请求进行通用的拦截,修改,我们还能够通过监听器来监听特定的事件。
Servlet事件可以分为两类,第一类是发生动态变化,如下表所示。
| Listener | 触发条件 |
|---|---|
ServletContextAttributeListener | ServletContext的属性被修改 |
ServletRequestAttributeListener | Servlet请求属性被修改 |
HttpSessionAttributeListener | Servlet Session属性被修改 |
第二类则是和生命周期相关,如下表所示。
| Listener | 触发条件 |
|---|---|
ServletRequestListener | 创建请求 |
ServletContextListener | ServletContext初始化完成。 |
HttpSessionListener | 创建Session |
增加Servlet Listener
下面,将会简单展示如何添加一个监听ServletContext初始化完成的监听器。
首先,创建类SimpleListener.java
public class SimpleListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("context loaded!");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
然后,在web.xml中增加对应的配置。
<listener>
<listener-class>listeners.SimpleListener</listener-class>
</listener>
小结
这篇文章介绍了Servlet运行时所配置的Context, Filter,以及Listener。首先要明确一点的是,在一个Java Server(一个JVM)中可以拥有多个Servlet,但却只会拥有一个ServletContext,以及一套配置好的Filter和Listener。Servlet在接收确定的请求后才会被创建,但是ServletContext,Filter,Listener却会在启动Java Server的时候就被创建。
ServletContext可以用于存储整个Java应用所需要的初始化参数,以及在Servlet之间共享的变量。
Filter可以用于修改请求头,响应,也可以直接让请求返回,甚至是拦截请求拒绝服务。
Listener则监听在所有Servlet之间发生的事件,比如对一些属性的修改,请求的发生和Session的发生等。
本篇文章涉及到的代码已经上传到了GitHub上,欢迎关注:)
5626

被折叠的 条评论
为什么被折叠?



