@WEB
web项目执行顺序
现在主流的web开发框架一般都是基于Spring开发的,Spring生态圈量级非常之大,功能非常强大。今天讲述一下普通的web项目加载顺序。 虽然项目大部分都在使用SpringBoot、SpringCloud等微服务的架构来搭建项目,基本不会在进行这些配置了,但是如果项目追究Spring源码,这些基础知识还是需要了解的。
-
web.xml
web项目运行时首先会加载web.xml配置文件,一般该配置文件在 /WebRoot(web)/WEB-INF/web.xml ,web.xml中的内容加载不依赖于内容书写顺序,而是以 context-param 、 listener、 filter、servlet的顺序进行加载。web.xml中有以下几项内容:
(1)context-param
以下为配置spring配置文件目录的配置。该配置是针对整个web项目上下文的。<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
(2)listener
该配置用于向web容器中注册一个事件监听器,监听事件发生事件,如何响应等信息。事件监听程序在建立、修改和删除会话或servlet环境时得到通知。常与context-param联合使用。<listener> // 该类继承ServletContextListener 包含初始化方法contextInitialized(ServletContextEvent event) 和销毁方法contextDestoryed(ServletContextEvent event) <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
(3)filter
filter 在web项目中起到过滤请求的作用,可配置在web.xml中,也可在项目中使用代码 继承Filter类来进行处理一些逻辑。Filter类中有 init(), doFilter(),destory() 方法。可获取到请求ServletRequest 和ServletResponse,然后决定继续处理哪些请求,阻挡哪些请求等。一般用作 防CRSF攻击、防SQL注入、权限过滤等 。
web.xml中filter 需要和 filter-mapping 一起使用,如下为字符过滤器。<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
public interface Filter { default void init(FilterConfig filterConfig) throws ServletException {} void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; default void destroy() {} }
(4)servlet
SpringMVC 中围绕 DispatcherServlet 来设计请求映射、视图处理、视图解析。DispatcherServlet 用于处理请求分发。具体内容见后续SpringMVC执行顺序。<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
(5)欢迎页
web项目默认启动加载的页面。<welcome-file-list> <welcome-file>.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
SpringMVC执行顺序
- 时序图
2.组件
DispatcherServlet
前端控制器DispatcherServlet是SpringMVC整个流程控制中心,由它来调度其它组件相互配合,完成匹配请求URL,解析数据,响应数据,视图解析以及视图渲染等任务。
HandlerMapping
处理器映射器HandlerMapping负责根据用户请求URL找到匹配的Handler处理器。
HandlerAdapter
处理器适配器HandlerAdapter对处理器进行执行
ModelAndView
ModelAndView是Spring封装的model和view组合对象。可用于处理数据和视图。
ViewResolver
视图解析器ViewResolver负责处理结果生成视图,先根据逻辑视图名称找到物理视图地址,再生成视图对象,最后对视图进行渲染,将处理结果通过页面展现给用户。
Controller
业务逻辑处理器,接受请求参数,进行业务处理,返回响应的数据和视图。
3.applicationContext.xml和dispatcher-servlet.xml
applicationContext.xml 是Spring的全局配置文件,用来控制Spring特性,管理Bean的容器。
dispatcher-servlet.xml是SpringMVC中用作控制器,拦截器、转发view等作用。
注意
在两个配置文件中最好不要声明相同的bean。 applicationContext.xml是随ContextLoaderListener而加载的,ContextLoaderListener 配置于 中的。dispatcher-servlet.xml是随DispatcherServlet而加载的,而DispatcherServlet配置于 中,在web.xml中加载顺序为 context-param 、listener 、 filter 、servlet 。所以先加载applicationContext.xml 再加载dispatcher-servlet.xml