• springmvc.xml 中 <url-pattern></url-pattern>节点详解


    1.  先来上段常见的代码

     1     <!-- MVC Servlet -->
     2     <servlet>
     3         <servlet-name>springServlet</servlet-name>
     4         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     5         <init-param>
     6             <param-name>contextConfigLocation</param-name>
     7             <param-value>classpath*:/spring-mvc*.xml</param-value>
     8         </init-param>
     9         <load-on-startup>1</load-on-startup>
    10     </servlet>
    11     <servlet-mapping>
    12         <servlet-name>springServlet</servlet-name>
    13         <url-pattern>/</url-pattern>
    14     </servlet-mapping>
    15     
    16     <filter>
    17         <filter-name>encodingFilter</filter-name>
    18         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    19         <init-param>
    20             <param-name>encoding</param-name>
    21             <param-value>UTF-8</param-value>
    22         </init-param>
    23         <init-param>
    24             <param-name>forceEncoding</param-name>
    25             <param-value>true</param-value>
    26         </init-param>
    27     </filter>
    28     <filter-mapping>
    29         <filter-name>encodingFilter</filter-name>
    30         <url-pattern>/*</url-pattern>
    31     </filter-mapping>

    正所谓mvc配置千篇一律,不过这个<url-pattern>/</url-pattern> 跟 <url-pattern>/*</url-pattern> 概念还是有点模糊。

    2.  两者的解释

    2.1  <url-pattern>/</url-pattern>

    会匹配到/login这样的路径型的url,不会匹配到模式为*.jsp这样的后缀型url,言外之意就是不拦截jsp文件。

    故经过视图解析器后返回jsp视图时不会再进入DispatcherServlet。

    说到为什么JSP页面的请求并不会命中这个Servlet,那是因为servlet容器内建的JSP Servlet将会被调用,而这个容器内建的JSP Servlet已经默认地映射在了*.jsp上。但还是能拦截到静态资源,如*.js,*.css。

    2.2  <url-pattern>/*</url-pattern>

    会匹配所有的url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)。

    故经过视图解析器后返回jsp视图时会再进入DispatcherServlet,导致找不到对应的controller所以报404错。

    No mapping found for HTTP request with URI [/Shiro-Spring/WEB-INF/jsp/login.jsp] in DispatcherServlet with name ‘springmvc’

    3.  /和/*的区别总结

    先说一种问题,假设你方法请求后想返回index.jsp界面:return "index";

    如果配置成< url-pattern > /* </ url-pattern >这样,即使你配置了如下这些同样会报错。

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!-- 前缀 -->
         <property name="prefix" value="/WEB-INF/jsp/" />
         <!-- 后缀 -->
         <property name="suffix" value=".jsp" />
    </bean>

    错误提示:

    org.springframework.web.servlet.DispatcherServlet noHandlerFound
    警告: No mapping found for HTTP request with URI [/myspring/WEB-INF/jsp/index.jsp] in DispatcherServlet with name ‘spring’ 错误,
    也就是找不到 index.jsp

    通过这种错误配置再来看一下两者区别吧:

    < url-pattern > / </ url-pattern > 不会匹配到*.jsp,即:*.jsp不会进入spring的 DispatcherServlet类 。

    < url-pattern > /* </ url-pattern > 会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,重复的去分配到方法里面,最终导致找不到对应的controller所以报404错。

    总之,关于web.xml的url映射的小知识:
    < url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
    < url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)

  • 相关阅读:
    Help Hanzo (素数筛+区间枚举)
    How to create and apply a patch with Git
    Assembly
    GNU C 内联汇编介绍
    Arch Linux sudo: PAM authentication error: Module is unknown [Solved!]
    关于 RTL8723BS 同时开启 STA/AP 模式
    单源最短路径算法——Dijkstra算法
    Altium Designer PCB制作入门实例
    I2C 总线协议
    TarJan 算法求解有向连通图强连通分量
  • 原文地址:https://www.cnblogs.com/niceyoo/p/8764584.html
Copyright © 2020-2023  润新知