Java Server 理解与实践 —— Servlet Context,Filter以及Listener

Servlet Context

Servlet Context概念

ServletContext是Java Web应用运行时所有Servlet共享的Context对象,ServletContext主要拥有如下功能:

  1. 获取Web.xml中配置的初始化参数
  2. 设置全局共享属性(setAttribute
  3. 获取过滤器(filter)、监听器(listener)的注册信息
  4. 获取应用资源路径,读取资源

接下来,我们会针对其中两个重要的功能——在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触发条件
ServletContextAttributeListenerServletContext的属性被修改
ServletRequestAttributeListenerServlet请求属性被修改
HttpSessionAttributeListenerServlet Session属性被修改

第二类则是和生命周期相关,如下表所示。

Listener触发条件
ServletRequestListener创建请求
ServletContextListenerServletContext初始化完成。
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上,欢迎关注:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值