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

来源:互联网 发布:ed视频剪辑软件下载 编辑:程序博客网 时间:2024/09/21 09:01

  • Servlet Context
    • Servlet Context概念
    • Servlet Context的简单用法
      • 增加初始化参数以及获取初始化参数
  • Servlet Filter
    • 什么是Servlet Filter
    • 增加Servlet Filter
  • Servlet Listener
    • Servlet Listener简介
    • 增加Servlet 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 触发条件 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上,欢迎关注:)

0 0
原创粉丝点击