关于spring mvc路径匹配配置遇到的问题(spring mvc报404错误)

1.配置web.xml文件时,controller应当在<servlet-mapping>中的<url-pattern></url-pattern>被匹配,而jsp文件则不应当被匹配。

2.先看下DispatcherServlet类的执行过程:

 

  • 收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器

  • 控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中。

  • DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图。

  • 一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中。

3.由上面步骤可知,DispatcherServlet收到请求后,会去根据<url-pattern></url-pattern>中的匹配模式判断是否拦截:

1)若不拦截则直接进行视图渲染处理(即直接执行对应的jsp文件并返回);

2)若拦截该请求,则会去WEB-INF路径下解析所有的[name]-servlet.xml,根据RequestMapping判断用哪个controller进行处理,处理完成后controller会告诉DispatcherServlet用处理好的模型(model)去渲染哪个视图,DispatcherServlet找到视图(.jsp文件)并渲染完成后,返回给客户端,执行结束;

这里是关键!!注意:如果在“controller告诉DispatcherServlet用处理好的模型去渲染哪个视图”这一步,相应的视图(比如hello.jsp)会被<url-pattern></url-pattern>中的规则拦截,则会导致500错误,如果此时直接在url里访问该jsp,则会导致404错误!!

举个例子:若我们有一个/hello的controller和一个hello.jsp文件,要想成功执行HelloController并用模型渲染hello.jsp,则拦截配置为<url-pattern>/hello</url-pattern>或<url-pattern>/</url-pattern>都可以,但是<url-pattern>/hello.jsp</url-pattern>和<url-pattern>/*</url-pattern>都是会报404错误的;

4.在这里大家看下/*和/的区别:https://blog.csdn.net/THMAIL/article/details/90580506

 

5.说几个典型错误:

1)为什么<url-pattern>*.jsp</url-pattern>会404,而不是直接返回某.jsp文件?

答:因为jsp后缀的文件被DispatcherServlet类拦截,被拦截的访问会被DispatcherServlet类找相应的controller进行处理,但是DispatcherServlet类又没在RequestMapping中找到相应的Controller,于是就返回404;如果想返回某.jsp文件,则正确的配置应为<url-pattern>/</url-pattern>,或者其他任何不会匹配到.jsp文件的url-pattern!!

2)为什么<url-pattern>/</url-pattern>可以直接在url访问controller和.jsp文件(比如hello和hello.jsp),而<url-pattern>/*</url-pattern>不行?

答:应为<url-pattern>/</url-pattern>不会匹配到.jsp文件,因此可以直接执行某jsp文件或拦截某controller并执行;

而<url-pattern>/*</url-pattern>会匹配到,因此就会发生我在3中所说的controler返回的待渲染的jsp文件被当请求给拦截,并去匹配controller;

 

6.总结下个人理解的处理流程图:

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值