大家好,又见面了,我是全栈君。
学习Spring的时候,在配置web.xml的时候,把url-pattern 配置成/*,启动项目后去访问自己的Controller总是报404.检查了很多发现资源是存在的,配置的地址也没有问题,为什么会出现404错误呢?最后发现是自己配置的 url-pattern 不对! 现整理一下: (1):在使用springmvc时,都会在web.xml中配置一个dispatchservlet,如下:
代码语言:javascript复制<!-- Spring MVC Servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
(2):配置spring的配置文件
代码语言:javascript复制<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="contentType" value="text/html" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
(3):举例说明:
代码语言:javascript复制①:<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
②:<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)
①:地址为 localhost:8088/login , /login 返回login.jsp 访问去Controller下的/login 跳转到相应的视图login.jsp ②:访问的地址为 localhost:8088/login/ ,/login 返回login.jsp 访问去Controller下的/login,跳转到login.jsp ,然后进过dispatchservlet的时候,由于是/* ,有会以localhost:8088/login/login.jsp 去请求Controller ,那么如果Controller没有 /login/login.jsp 的Mapping映射,则会报404 错误!
(4):总结 < url-pattern > / < url-pattern > /* 能匹配所有请求URL,会匹配到*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
当映射规则为 /* 时,最后返回xx.jsp也经过DispatcherServlet,它又会去找相对应的处理器,这也是控制台打印noHandlerFound,也就导致了404错误,页面更别想看到。当改成 / 后,servlet不会匹配到.jsp的URI,当然就能正常返回页面了
(5):参考文章 url-pattern中 / 和 /* 的区别 Difference between / and /* in servlet mapping url pattern
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/121240.html原文链接:https://javaforall.cn