• 第八章:Springmvc中web.xml配置文件


    其实每个xml文件定义的形式多种多样,按照顺序进行配置
    1、指定欢迎页面.
    2、命名与定制URL
    3、定制初始化参数
    4、指定错误处理页面
    5、设置过滤器
    6、设置监听器
    7、设置会话(Session)过期时间
    其中时间以分钟为单位,假如设置60分钟超时:
    8.启动加载级别
    注意配置xml可以选择性使用标签,但是注意先后的顺序。

    <context-param>
    <filter>
    <filter-mapping>
    <servlet>
    <servlet-mapping>
    <listener>
    <welcome-file-list>
    <session-config>
    <error-page>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    web.xml启动顺序

    1.加载顺序:context-param---->listener----> filter --> servlet
    2.servlet在前,servlet-mapping在后,必须这样的顺序

    标签的常用介绍

    1.标签基本是以键值对出现,即有xxx-name就有xxx-value形式
    2.标签的名字Key唯一的,不能重复,比如中name必须唯一
    3.标签中作用是存储数据,目的为被别的程序进行索取

    context-param

    在这个标签内定义的参数值相当于全局public变量variables,可以被共享使用,
    保存的数据是可以被整个应用是使用的

    listener:监听器

    监听器类ContextLoaderListener类的继承类ContextLoader
    中的方法configureAndRefreshWebApplicationContext()方法中
    configLocationParam = sc.getInitParameter(“contextConfigLocation”);
    获取加载容器参数就是获取XML标签中的值,对所有资源的监听。
    1.负责整个容器所有事件状态的监听,比如请求和响应,异常等信息。
    2.相当于实现了Spring容器中IOC思想即控制反转和依赖注入

    filter:过滤器

    请求-->filter过滤器--->servlet--->处理--->servlet处理结束准备响应--->filter过滤器--->响应
    请求和响应对象被servlet处理之前或之后,可以使用过滤器对这两个对象进行操作。
    包含子元素:
    init-param:与context-param 元素具有相同的作用
    filter-name:用来定义过滤器的名称,该名称在整个应用中都必须是惟一的
    filter-class:指定过滤器类的完全限定的名称

    过滤器的映射

    先有过滤器,然后才能配置映射

    servlet:处理请求响应

    用于处理和响应客户端的需求,动态生成web内容。

    welcome-file-list:首页

    包含一个子元素welcome-file,用来定义首页,服务器会依照设定的顺序来找首页

    <welcome-file-list>
        <welcome-file>index1.jsp</welcome-file>
        <welcome-file>index2.jsp</welcome-file>
    </welcome-file-list>
    
    • 1
    • 2
    • 3
    • 4

    标签的顺序

    不同的标签是根据服务器加载的顺序,与自定义的顺序无关。
    相同的标签是按照先来后到的顺序。
    同个标签被mapping映射到某个方法上,是必须先配置此标签,并给此标签一个id即标签name
    举例:
    以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照filter-mapping 配置节出现的顺序来依次调用doFilter() 方法的。

    标签的全局变量和局部变量的比较

    #配置一
    <context-param>
            <param-name>contextConfigLocation</param-name>
            //类文件夹下有好几个文件最后几个字母不同可以用 * 代替
            <param-value>classpath:applicationXXXX-*.xml</param-value>
     </context-param>
    --------------------------------------
    #配置二  以servlet为例
    <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*:/XXX文件夹/applicationXXXXX.xml</param-value>
    	 </init-param>
    	<load-on-startup>1</load-on-startup>
    	<async-supported>true</async-supported>
    </servlet> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    比较init-param and context-param和如何取xml中key的value

    配置一:context-param配置参数值是全局变量variables,可供整个项目的使用,相当于public。
    常用配置数据库的连接信息,数据库的事务管理、日志等信息供全局使用。
    配置二:servlet配置的参数值是局部变量variables,相当于private。
    这里的局部变量是指只有servlet内部的项目才能使用servelt内部配置的参数值,
    上述中的servlet标签或者filter标签都可以配置各自的局部变量,源码中也是这么获取的
    ------获取context-param这个中的参数值
    getServletContext().getInitParameter(“contextConfigLocation”);
    ------获取init-param这个中的参数值
    getInitParameter(“contextConfigLocation”)

    load-on-startup

    load-on-startup 元素标记容器是否应该在启动的时候加载这个servlet,(实例化并调用其init()方法)。
    它的值必须是一个整数,指定当Web应用启动时,装载Servlet的次序
    当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它
    当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet
    当值相同时,容器就会自己选择顺序来加载。

    配置路径模板url-pattern

    在xxx-mapping中指定标签所接收的url符合模板中定义的规则,就会找对应的标签方法处理
    举例:
    1.过滤器中filter-mapping的url模板是/*意思是所有请求都符合过滤器请求模板,那么就会调用过滤器的实现方法,就是过滤器注册类。
    2.servlet中配置url模板*.do表示请求路径中有 .do 请求就会调用servlet的注册配置,按照注册类方法DispatcherServlet后台调用接口。

    配置servlet运行的日志

    1.创建log4j.properties
    2.创建xxx类并继承HttpServlet或者实现ServletContextListener
    3.xxx类取这个log4j.properties文件路径放入到DOMConfigurator或PropertyConfigurator类配置中
    4.将第3步加入到监听中或加入到servlet中
    举例

    #方法一
    <listener>
    <!-- Use fully qualified name of your xxxclass. -->
        <listener-class>your.package.xxx类</listener-class> 
    </listener>
    #方法二
    <servlet>
        <servlet-name>log4j-init</servlet-name>
        <servlet-class>your.package.xxx类</servlet-class>
        <init-param>
    	      <param-name>log4j</param-name>
    	      <param-value>/WEB-INF/log4j.properties</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    web.xml文件基本配置

    基本按照tomcat加载的顺序配置

    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    
        <!--设置配置文件的路径-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
     <!--配置Spring的监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件-->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!--配置解决中文乱码的过滤器-->
        <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>/*      *//所有的请求路径包括静态资源和动态资源
        </filter-mapping>
        <!--配置servlet运行的日志-->
        <servlet>
            <servlet-name>log4j-init</servlet-name>
            <servlet-class>Log4jInit</servlet-class>
            <init-param>
                <param-name>log4j-init-file</param-name>
                <param-value>\WEB-INF\classes\log4j.properties</param-value>
            </init-param>
            <load-on-startup>0</load-on-startup>
        </servlet>
        <!--配置前端控制器-->
        <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>/</url-pattern>
            <url-pattern>*.do</url-pattern>
    		<url-pattern>*.action</url-pattern>
        </servlet-mapping>
        <session-config>
        //60分钟有效期
        <!-- 设置值为-1表示会话永不会超时 -->
    		<session-timeout>60</session-timeout>
    	</session-config>
    		<!-- 通过错误码来配置error-page -->
    	<error-page> 
          	<error-code>404</error-code> 
         	 <location>/jsp/NotFound.jsp</location> 
    	</error-page> 
    	<!-- 通过异常的类型来配置error-page -->
    	<error-page> 
          	 <exception-type>java.lang.NullException</exception-type> 
          	 <location>/jsp/error.jsp</location> 
        </error-page>
        <!-- 当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面error.jsp -->
    </web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
  • 相关阅读:
    【学习辅助】Axure手机时间管理APP原型,告别手机控番茄任务模板
    如何建立高效的质量管理系统?
    已解决‘mongo‘ 不是内部或外部命令,也不是可运行的程序
    贪心算法应用
    1048 Find Coins
    RF优化问题分析和处理
    [Linux]进程间通信--共享内存
    EL-input添加双击或者单击事件
    自学CFD:我在实习岗速成无人机设计和仿真的故事
    【11.23+11.24】Codeforces 刷题
  • 原文地址:https://blog.csdn.net/beiback/article/details/127974621