zoukankan      html  css  js  c++  java
  • 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等)

  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/niceyoo/p/8764584.html
Copyright © 2011-2022 走看看