八、Servlet容器
1、Servlet概述
Servlet(Server Applet),全称Java Servlet。Servlet是基于http协议的,在服务端(如Tomcate)运行的,是按照Servlet规范编写的一个Java类。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。Servlet的生命(周期)是由Servlet容器管理。
Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http.HttpServlet是定义的采用Http通信协议的Servlet的特例。毕竟我们大部分的Web服务都是走的Http协议。HttpServlet针对Http请求的delete、get、post、options、put和trace定义的相应的方法。
一个Web的请求过程如下:
(1)、WEB服务器接收一个用户请求;
(2)、WEB服务器将请求转交给WEB服务器关联的Servlet容器;
(3)、Servlet容器找到对应的Servlet并执行这个Servlet;
(4)、Servlet容器将处理结果返回给WEB服务器;
(5)、WEB服务器把结果送回用户;
2、Servlet生命周期
(1)、加载和实例化阶段
时机取决于web.xml的定义,如果是比较原始的开发方式(通过配置文件定义Servlet),如果有x则在容器启动时,反之则在第一次针对这个Servlet的请求发生时。
(2)、初始化阶段
实例化后会立马进行初始化,也就是执行init方法。
①、Servlet容器加载Servlet类,把Servlet类的.class文件中的数据读至内存中
②、Servlet容器创建一个ServletConfig对象
③、创建一个Servlet对象
④、Servlet容器调用Servlet对象的init()方法进行初始化
(3)、运行阶段
当Servlet容器接收到一个请求时,Servlet容器会针对该请求创建一个ServletRequest和ServletResponse对象,然后调用service()方法,并把这两个参数传递给service()方法。从ServletRequest中获取请求信息,并处理请求,再通过ServletResponse生成这个请求的响应结果,然后销毁对象。无论请求是get或者post,最终这个请求都会由service()方法来处理,而具体的业务逻辑,就可以通过该方法来实现了。
(4)、销毁阶段
当Web应用被终止时,Servlet容器会先调用Servlet对象的destrory()方法,然后销毁Servlet对象。一般我们会在该方法中释放Servlet所占用资源,如:数据库连接、关闭文件输入输出流等。
3、DispatcherServlet
DispatcherServlet的祖先之一便是Servlet接口。在Servlet生命周期部分,请求是通过Servlet的service()来进行处理的,可是在DispatcherServlet中并没有该函数的定义。其实,service()是被定义在其父类FrameworkServlet中的,而FrameworkServlet重写了父类HttpServlet的service(),而HttpServlet的service()主要作用是根据请求(GET/POST...)的不同,将请求交由不同的处理方法(doGet方法/doPost方法/...)来处理。
(1)、SpringMVC/DispatcherServlet执行流程
①、用户发请求—>DispatcherServlet:前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
②、DispatcherServlet—>HandlerMapping:HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器,多个HandlerInterceptor拦截器);
③、DispatcherServlet—>HandlerAdapter:HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器;
④、HandlerAdapter—>处理器功能处理方法的调用:HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据,逻辑视图名),ModelAndView是SpringMVC的底层对象;
⑤、ModelAndView的逻辑视图名—>ViewResolver:ViewResoler将把逻辑视图名解析为具体的View,然后返回视图给前端控制器;
⑥、View—>渲染:View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构;
⑦、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户;
(2)、DispatcherServlet的重要成员
①、HandlerMapping:功能是根据请求的url找到合适的处理器
子类:RequestMappingHandlerMapping:将Contoller的带RequestMapping方法,添加到处理方法映射器和路径方法解决器中。
②、HandlerAdapter:作用是根据请求的url找到处理器的调用方法
子类:RequestMappingHandlerAdapter:主要是解决请求的会话、请求头部处理、数据的绑定等。然后从容器中获取handlerMethod处理业务逻辑,获取数据,渲染视图,并返回。