JavaEE Servlet技术

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

1. Listener

Servlet规范中定义了很多监听器,基于观察者模式将主要流程的控制/管理和事件的响应处理分离。主要分为两类:

  1. LifeCycleListener. 包括:ServletContextListener,HttpSessionListener;监听目标对象的创建和销毁事件;
  2. EventListener. 包括:ServletContextAttributeListener, ServletRequestAttributeListener ,ServletRequestListener, HttpSessionAttributeListener等等

这里写图片描述

它们基本上涵盖了整个 Servlet 生命周期中你感兴趣的事件。这些 Listener 的实现类可以配置在 web.xml 中的 < listener> 标签中。当然也可以在应用程序中动态添加 Listener,需要注意的是 ServletContextListener 在容器启动之后就不能再添加新的,因为它所监听的事件已经不会再出现
部分接口源码如下:

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);    
}


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

public interface HttpSessionAttributeListener extends EventListener {
    public void attributeAdded(HttpSessionBindingEvent se);
    public void attributeRemoved(HttpSessionBindingEvent se);
    public void attributeReplaced(HttpSessionBindingEvent 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值