关于servlet的含义,搜索就能搜索出好多定义,主要是用来处理交互数据、生成数据、生成动态的web内容等。
关于servlet组件注册方式:1.传统web.xml,2.注解注册,3.编码注册
Servlet注册:1.web.xml部署<servlet>和<servlet-mapping>,2.@WebServlet,3.ServletContext#addServlet
Filter注册:1.web.xml部署<filter>和<filter-mapping>,2.@WebFilter,3.ServletContext#addFilter
Listener注册:1.web.xml部署<listener>,2.@WebListener,3.ServletContext#addListener
其实上面三中注册形式在之前mvc的时候都已经讲过了,接下来会深入讲一下。
web.xml举例
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/webapp_2_5.xsd"
metadata-complete="true" version="2.5">
<context-param>
<description>
Spring 配置文件路径参数,
该参数值将被 org.springframework.web.context.ContextLoaderListener 使用
</description>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/META-INF/spring/spring-context.xml
</param-value>
</context-param>
<listener>
<description>
org.springframework.web.context.ContextLoaderListener 为可选申明Listener
</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
Spring Framework对Servlet的支持
Servlet生命周期:
初始化:Servlet#init(ServletConfig)
服务:Servlet#service(ServletRequest, ServletResponse)
销毁:Servlet#destroy()
一般来说,初始化比如关闭数据库连接,会销毁,同理打开数据库连接,初始化。
Filter生命周期:
初始化:Filter#init(FilterConfig)
过滤:Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
销毁:Filter#destroy()
ServletContext生命周期
初始化:ServletContextListener#contextInitialized
销毁:ServletContextListener#contextDestroyed
一般来说servlet容器可以有多个应用上下文,在路径uri的地方
看DispatcherServlet源码一层一层很容易看出,这是个继承关系。在里面搜索init(ServletConfig config)可以跳到另一个类中。
1.而这个类也是被HttpServlet继承的,所以接下来的init也就是子类HttpServlet初始化。
2.从源码结构可以看出,HttpServlet有个子类是HttpServletBean,看init
这里servletConfig会被设置到servlet中。
3.上面代码中initServletBean,就是关联context
其中 initWebApplicationContext
这里需要注意的是,这里在创建上下文的时候,会去取根上下文, 根上下文会作为parent。所以在mvc中,如果把bean定义在rootcontext中,DispatcherServlet可以读到。如果在DispatcherServlet里面配置的,root是读不到的。
4.onRefresh被子类DispatcherServlet调用
5.
在看一下service
HttpServlet中,会处理ServletRequest和ServletResponse,然后进一步调用
然后回根据请求类型不同做不同的实现。
对于子类调用,只是添加了patch。通过源码可以知道,不管是什么类型的请求,最后都会到processRequest中
去doService,就到了子类DispatcherServlet
经过一系列设置,到了doDispatch
这里面就有我们之前熟悉的对于mapping、adapter的处理,最后render渲染。
对于销毁,这里只是关闭了之前servlet初始化时关联的上下文。
总结一下,在初始化阶段,初始化了需要的组件,包括handlemapping、handleadapter、ViewResolver等。在服务阶段,之前初始化的组件运用到具体场景,迅速定位到模板、adapter执行器。销毁阶段,DispatcherServlet会把之前关联的上下文关闭。