Springmvc项目web.xml中servlet-mapping的路径映射配置注意事项

                    版权声明:本文为博主原创文章,未经博主允许不得转载。                        <a class="copy-right-url" href=" https://blog.csdn.net/huangyaa729/article/details/83213227"> https://blog.csdn.net/huangyaa729/article/details/83213227</a>
                </div>
                                                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
                                    <div id="content_views" class="markdown_views prism-atom-one-dark">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <p>今天准备在IDEA编辑器下创建个通过maven管理的springMVC工程来测试一些功能,按照记忆中的方式以及配合百度完成了工程的创建,但在访问web.xml中配置的首页时,无论如何都无法访问,试了很多方式,但都不是很理想,无意间仔细看了下下的映射规则,再结合自己的尝试,算是解决了心中的疑惑,也总结下自己的心得:<br>

其他的配置暂且略去,主要关注属性的配置;

最初的配置:

  <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

 
 
  • 1
  • 2
  • 3
  • 4

可以正常访问controller层的映射处理函数,但是无法访问web.xml中设置的首页;
尝试的方法:

(1)因为无法找到首页index.jsp,首先怀疑是路径不对,改了各种位置,甚至重建了一遍工程还是不行,最后仔细分析报错,如下:

 org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/spring] in
  DispatcherServlet with name 'dispatcher'

 
 
  • 1
  • 2

无法通过DispatcherServlet 找到合适的映射,因此怀疑把首页的请求也当成映射来处理了,于是改成如下的匹配模式,精确匹配路径:

   <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/test/*</url-pattern>
        </servlet-mapping>

 
 
  • 1
  • 2
  • 3
  • 4

虽然首页能正常显示了,但是controller层的映射却匹配不到了,访问路径为:http://localhost:8080/spring/test/first
controller层的映射匹配模式如下:@RequestMapping("/test/first")

报错仍是找不到映射处理函数,然后尝试了很多次,发现采用精确匹配模式后,在dispatcher查找映射处理函数时,会把路径中"test/“之前的部分去除,只匹配之后的路径部分,改为如下模式即可匹配:
@RequestMapping(”/first")

(2)然后再次改变精确匹配模式,改为如下配置:

            <servlet-mapping>
                <servlet-name>dispatcher</servlet-name>
                <url-pattern>*.do</url-pattern>
            </servlet-mapping>

 
 
  • 1
  • 2
  • 3
  • 4

controller层的映射改为 @RequestMapping("/test/first.do"),这样首页和controller层都可以正常访问了,当然原理与上一个方法一样,改变DispatcherServlet匹配规则,让首页访问不再经过DispatcherServlet匹配,那么就能访问到了;

(3)无意间参考了之前的一个工程配置,发现采用如下映射模式:

           <servlet-mapping>
                <servlet-name>dispatcher</servlet-name>
                <url-pattern>/</url-pattern>
            </servlet-mapping>

 
 
  • 1
  • 2
  • 3
  • 4

发现也解决了首页和congtroller层的访问问题,因此就搜了下"/“和”/*"区别:(具体原因可参照tomcat解析中的Catalina请求处理这一节所述)

 1、<url-pattern>/ </ url-pattern >   不会匹配到*.jsp,由JspServlet(tomcat中默认的web.xml中配置的)拦截处理,即*.jsp不会进入spring的 DispatcherServlet类 。
 2、在配置了< url-pattern > /* </ url-pattern >的情况下自然会拦截所有请求(包括/login,*.jsp,*.js和*.html等)

 
 
  • 1
  • 2

同时,对于首页的匹配逻辑如下所述,完美解释了上述报错的原因:

 如果配置了servlet的url-pattern是/*,那么访问localhost:8080/会匹配到该servlet上,而不会匹配welcome-file-list;
 如果url-pattern是/(该servlet即为默认servlet),访问localhost:8080/时,如果其他匹配模式都没有匹配到,则会匹配welcome-file-list(只针对这个启动时默认访问请求有效)。

 
 
  • 1
  • 2

另外,“/”其实能拦截“.js”,“.css”,".png"等静态资源的访问,因此如果采用“/”的配置时,需要在主配置文件中配置放行静态资源(即DispatcherServlet对应的配置文件),这样才不会出现意想不到的匹配错误404.

<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/> 
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
 <mvc:resources location="/WEB-INF/images/" mapping="/images/**"/>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

如上就是我针对此次创建工程的问题的总结,如有不妥的地方还望指出。

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
                </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值