发表于: 2019-12-21 23:00:13

1 1417


今日完成的事情:


学习 Javaweb中监听器+过滤器+拦截器


当启动一个web项目时

需要启动容器(tomcat等)

首先会读取项目web.xml里的配置,这一步骤未出错且完成后,项目才能正常的启动。



名词介绍:


context-param :  

就是一些需要初始化的配置,放入context-param中,从而被监听器,  然后被加载


监听器(listener):

就是对项目起到监听的作用,它能感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化;


过滤器(filter):

就是对请求起到过滤的作用,它在监听器之后,作用在servlet之前,对请求进行过滤


<filter-name>:用来定义过滤器的名称,该名称在整个程序中都必须唯一。
<filter-class>:指定过滤器类的完全限定的名称,即Filter的实现类。
<init-param>:为Filter配置参数,与<context-param>具有相同的元素描述符<param-name>和<param-value>。

<filter-mapping>:用来声明Web应用中的过滤器映射,过滤器被映射到一个servlet或一个URL模式。这个过滤器的<filter>和<filter-mapping>必须具有相同的<filter-name>,指定该Filter所拦截的URL。过滤是按照部署描述符的<filter-mapping>出现的顺序执行的。


servlet: (可以把它理解为 spring mcv的整体流程)

就是对request和response进行处理的容器,它在filter之后执行,servlet其中的一部分就是controller层,还包括渲染视图层和进入controller之前系统的一些处理部分   


<servlet>必须含有<servlet-name>和<servlet-class>,或者<servlet-name>和<jsp-file>。 
<servlet-name>:用来定义servlet的名称,该名称在整个应用中必须是惟一的。
<servlet-class>:用来指定servlet的完全限定的名称。

<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>,而<context-param>可有可无-->
<!-- 默认参数是/WEB/INF/applicationContext.xml 因此要用context-param添加路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 第一种方式-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- J2EE工程中web服务器启动的时候最先调用web.xml,上面这段配置的意思是加载spring的监听器-->
<!-- 其中ContextLoaderListener的作用就是启动Web容器时,自动装配applicationContext.xml的配置信息,执行它所实现的方法。-->


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时处理responseFilter其实是一个Servlet链。



7.以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。

所以,Servlet的初始化都要比上面提到的那几个要迟。


默认查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml

可以通过配置修改MVC配置文件的位置,需要在配置DispatcherServlet时指定MVC配置文件的位置。

(就是下图的init-param里的内容   用来指定springmvc.xml位置) 


这个servlet作用很好理解了,创建一个mvc控制器器,  用来控制mvc总体流程


<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>
<!-- 第一次发请求时就创建servlet类 然后servlet初始化参数加载springmvc.xml -->
<!-- 配置 servlet 的对象的创建时间点:应用加载时创建。 取值只能是非 0 正整数,表示启动顺序 -->
<!-- Web应用启动时立即创建Servlet实例,即load-on-start Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>


8.总结,web.xml的加载顺序是:


<context-param>->上下文参数            设置路径为applicationContext.xml文件
<listener>-> 监听器                             传入上下文参数,加载applicationContext文件
<filter>->(过滤器)                                 过滤一些不需要的请求
<servlet> 控制器                                           (spring mvc流程)                   

 < interceptor>拦截器                           这个拦截器还没用过,不过  它包含在控制器内  



明天计划的事情:

完成任务



返回列表 返回列表
评论

    分享到