JavaEE Servlet技术

Tomcat是一个Servlet容器,实现了Servlet规范,可以运行我们自己编写的Servlet应用程序处理动态请求,并返回响应,下面介绍Listener、Filter、Servlet、Request、Respones这几个比较常见的对象元素。

1. Listener

Listener(监听器)用来监听一些对象的事件,当事件发生时可以进入到定义监听器中进行处理,主要有ServletContextListener、HttpSessionListener 和 ServletRequestListener三个接口定义如下:

public interface ServletRequestListener extends EventListener {
    void requestDestroyed(ServletRequestEvent var1);
    void requestInitialized(ServletRequestEvent var1);
}

public interface ServletContextListener extends EventListener {
    void contextInitialized(ServletContextEvent var1);
    void contextDestroyed(ServletContextEvent var1);
}

public interface HttpSessionListener extends EventListener {   
    public void sessionCreated(HttpSessionEvent se);    
    public void sessionDestroyed(HttpSessionEvent se);    
}

我们程序中可以实现这些JavaEE Servlet API中提供的监听器接口,然后通过web.xml定义部署发生作用. 如:

 <!-- 配置log4j.xml监听器,注意该 listener需要放在spring的Listener之前 -->
 <listener>
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>

 <!--spring监听-->
 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

 <listener>
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
 </listener>  

Servlet容器需要在开始执行进入应用的第一个请求之前完成Web应用中的监听器类的实例化,而且保持每一个监听器的引用直到为Web应用最后一个请求提供服务。

2. Filter

Filter(过滤器)可以改变HTTP请求的内容、响应、及header信息,过滤器通常不产生响应或像 servlet 那样对请求作出响应,而是修改或调整到资源的请求,修改或调整来自资源的响应。
接口定义如下:

public interface Filter {
    void init(FilterConfig var1) throws ServletException;

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    void destroy();
}

其中init方法是在容器启动时被调用,destroy方法是在容器销毁时被调用, 以上两个方法在整个生命周期中被调用两次,

当容器接收到传入的请求时,它将获取列表中所有符合该请求的过虑器组成过虑器链(FilterChain),然后通过FilterChain嵌套调用各过虑器的Filter.doFilter()方法(过滤器中再次调用FilterChain.doFilter, 这就是责任链模式)

Filter在部署描述符中通过< filter>元素声明,一个过滤器或一组过滤器可以通过在部署描述符中定义< filter-mapping>来为调用配置。

当滤器链调用完所有的Filter.doFilter()方法后,会调用相关Servlet.service()方法,交给Servlet(Spring框架中是DispatherServelet)的处理。
注意,Filter.doFilter()可以阻止过滤器链接下来的调用,返回时过滤器负责填充Reponse对象。

3. Servlet

Servlet 这里指的是实现了javax.servlet.Servlet接口的处理程序,一般开发中都是继承HttpServlet,其继承自实现了Servlet接口的GenericServlet类。

容器在部署Web应用程序时,或Servlet第一次请求处理时实例化调用Servlet.init()方法;容器销毁时调用Servlet的destroy方法. 当FilterChain.doFilter结束时, 接着调用Servlet.service方法, 在service中会根据请求类型分为doGet(),doPost()方法.

4. Request与Response

Request对象封装了客户端请求的所有信息,Response对象封装了从服务器返回到客户端的所有信息。

每个Request/Response对象只在Servlet.service()方法、或Filter.doFilter()方法的作用域内有效;发生异步处理的情况下,对象一直有效,直到调用AsyncContext.complete()方法。

除了异步请求时的AsyncContext.startAsync()和AsyncContext.complete()方法,Request/Response对象的实现都不保证线程安全,多线程访问时需要同步处理。

4. web.xml

描述组成应用程序的servlet和其他组件、以及相关初始化参数等信息。

web.xml中组件加载顺序为:
context-param -> listener -> filter -> servlet(同类则按编写顺序执行)。

参照资料:
https://blog.csdn.net/tjiyu/article/details/54590259

猜你喜欢

转载自blog.csdn.net/yangsnow_rain_wind/article/details/80061642
今日推荐