发表于: 2019-12-21 23:00:13
1 1418
今日完成的事情:
学习 Javaweb中监听器+过滤器+拦截器
当启动一个web项目时
需要启动容器(tomcat等)
首先会读取项目web.xml里的配置,这一步骤未出错且完成后,项目才能正常的启动。
名词介绍:
context-param :
就是一些需要初始化的配置,放入context-param中,从而被监听器, 然后被加载
监听器(listener):
就是对项目起到监听的作用,它能感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化;
过滤器(filter):
就是对请求起到过滤的作用,它在监听器之后,作用在servlet之前,对请求进行过滤
<filter-mapping>:用来声明Web应用中的过滤器映射,过滤器被映射到一个servlet或一个URL模式。这个过滤器的<filter>和<filter-mapping>必须具有相同的<filter-name>,指定该Filter所拦截的URL。过滤是按照部署描述符的<filter-mapping>出现的顺序执行的。
servlet: (可以把它理解为 spring mcv的整体流程)
就是对request和response进行处理的容器,它在filter之后执行,servlet其中的一部分就是controller层,还包括渲染视图层和进入controller之前系统的一些处理部分
<jsp-file>:用来指定应用中JSP文件的完整路径。这个完整路径必须由/开始。
拦截器(interceptor):
就是对请求和返回进行拦截,它作用在servlet的内部
这个目前还没用到过
context-param-->listener-->filter-->servlet-->interceptor
他们之间的关系图

关于我的MVC配配置详解:
1.启动WEB项目的时候,web容器首先会去它的配置文件web.xml读取两个节点:
<listener></listener> 和 <context-param></context-param>。
listener读取context-param里的内容
listener的有两种加载方式
我用的是第2种
2.紧接着,web容器创建一个ServletContext(Application),这个WEB项目所有部分都将共享这个上下文。
3.容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。
4.容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,启动Web应用时,系统调用会方法得到这个context-param的值。
<listener>主要用于监听Web应用事件,其中有两个比较重要的Web应用事件:
Application的启动和停止(starting up or shutting down)
Session的创建和失效(created or destroyed)。
Application启动事件发生在应用第一次被Servlet容器装载和启动的时候;停止事件发生在Web应用停止的时候。
前4点总结要点:
(1)如果context-param没有配置的话, listener会去默认的路径(WEB/INF/applicationContext去寻找)
所以我自己的理解 context-param主要是起到的是配置路径的作用。
(2)applicationContext.xml 里spring+mybatis连接数据库的整合配置 及 加载bean
(3)ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,一般如:DAO层、Service层Bean
(4)DispatcherServlet初始化的上下文加载的Bean是只对Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,该初始化上下文只加载Web相关组件。
关于ContextLoaderListener DispatcherServlet 的关系
6.接着,容器会读取<filter></filter>,根据指定的类路径来实例化过滤器。
<!-- 解决中文乱码的问题-->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 映射关系配置 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter能够在一个request到达Servlet之前预处理request
也可以在离开Servlet时处理response,Filter其实是一个Servlet链。
7.以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。
所以,Servlet的初始化都要比上面提到的那几个要迟。
默认查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml
可以通过配置修改MVC配置文件的位置,需要在配置DispatcherServlet时指定MVC配置文件的位置。
(就是下图的init-param里的内容 用来指定springmvc.xml位置)
这个servlet作用很好理解了,创建一个mvc控制器器, 用来控制mvc总体流程
8.总结,web.xml的加载顺序是:
< interceptor>拦截器 这个拦截器还没用过,不过 它包含在控制器内
明天计划的事情:
完成任务
评论