浅析在java web开发中使用的servlet。

1. main

graph BT
HttpServlet --> GenericServlet
GenericServlet -.-> Serializable
GenericServlet -.-> Servlet
GenericServlet -.-> ServletConfig
graph BT
HttpServletRequestWrapper -->ServletRequestWrapper
HttpServletRequestWrapper -.->HttpServletRequest
ServletRequestWrapper -.-> ServletRequest
HttpServletRequest --> ServletRequest

HttpServletResponseWrapper -->ServletResponseWrapper
HttpServletResponseWrapper -.->HttpServletResponse
ServletResponseWrapper -.-> ServletResponse 
HttpServletResponse --> ServletResponse 

servlet实例化,服务。

  1. Servlet: init,service,destroy
  2. GenericServlet
  3. HttpServlet: doGet,doPost…
  4. ServletConfig: Config
  5. ServletContext: Context
  6. Request: 请求
  7. Response: 响应

2. Wrapper

ServletRequestWrapper,ServletResponseWrapper,HttpServletRequestWrapper,HttpServletResponseWrapper

对于ServletRequest,ServletResponse,HttpServletRequest,HttpServletResponse,servlet提供给开发者wrapper装饰类。开发者可以使用改变属性,扩展功能等,例如验证参数,过滤数据,自定义功能等。

3. ServletContainerInitializer

servlet 3.0提供开发者ServletContainerInitializer,可以通过实现ServletContainerInitializer接口来注册初始化应用,从而取代web.xml

  1. 使用web.xml时,web容器会寻找web.xml进行初始化应用。
  2. 使用实现ServletContainerInitializer时,web容器会寻找ServletContainerInitializer的实现类,并调用onStartup进行初始化应用。

可参考SpringServletContainerInitializer,TomcatStarter

4. Listener

servlet有如下Listener:

  1. ServletContextListenerServletContextAttributeListener

    监听ServletContext,例如Spring中ContextLoaderListener创建WebApplicationContext

  2. ServletRequestListenerServletRequestAttributeListener

    监听ServletRequest,例如Spring中RequestContextListener,进行setLocale等。

  3. AsyncListener

    异步监听

  4. HttpSessionListenerHttpSessionIdListenerHttpSessionAttributeListener

    session的监听,创建,销毁,属性值变化,sessionIdChanged

  5. HttpSessionActivationListener

    session序列化监听

  6. HttpSessionBindingListener

    valueBound(): 数据对象绑定到session监听

    valueUnbound: 解绑监听

  7. WriteListener,ReadListener

名称以Listener结尾的一般为创建销毁监听,AttributeListener为属性变化监听。

5. Filter

Filter,FilterChain,FilterConfig

6. Asyn

servlet3.0支持异步。

void start(Runnable run);