Spring MVC集成Jetty 8报错:无HTTP请求URI映射问题求助
这个问题我之前在Spring MVC搭配Jetty开发的时候也踩过坑!提示里说DispatcherServlet(名字是appServlet)找不到/testJetty/WEB-INF/views/index.jsp的请求映射,本质是视图解析后的路径和请求处理流程没对上,咱们一步步排查解决:
这个WARN的本质是:当你访问http://localhost:9090/testJetty/index时,Spring的Controller已经处理了请求并返回了视图名,但DispatcherServlet在尝试解析视图并转发请求时,找不到对应的处理规则——要么是视图解析器配置错了,要么是请求映射的范围出了问题。
1. 先检查Spring视图解析器的配置
打开你的Spring Servlet配置文件(比如appServlet-servlet.xml或者spring-mvc.xml),找InternalResourceViewResolver的配置,这是Spring用来解析JSP视图的核心Bean,正确的配置应该是这样的:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀必须以/开头,对应web应用根目录下的WEB-INF/views/ --> <property name="prefix" value="/WEB-INF/views/"/> <!-- 后缀指定视图文件的扩展名 --> <property name="suffix" value=".jsp"/> </bean>
踩坑点:如果你的prefix没加开头的/,比如写成WEB-INF/views/,那解析后的路径会变成/testJetty/WEB-INF/views/WEB-INF/views/index.jsp,肯定找不到文件!
2. 确认Controller的请求映射是否正确
你的Controller类里处理/index请求的方法,返回的视图名要和配置匹配,比如:
@Controller public class IndexController { // 映射到/testJetty/index请求(因为上下文路径是testJetty) @RequestMapping("/index") public String showIndexPage() { // 只需要返回视图名"index",视图解析器会自动拼接成/WEB-INF/views/index.jsp return "index"; } }
踩坑点:别在返回值里加.jsp或者完整路径,比如return "/WEB-INF/views/index.jsp",这样会绕开视图解析器,导致DispatcherServlet直接去处理这个JSP请求,而JSP是由Jetty的JspServlet负责的,自然会报找不到映射。
3. 检查web.xml里的DispatcherServlet映射
打开你的web.xml,确认appServlet的<url-pattern>配置正确,这是很多人容易搞错的地方:
<servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <!-- 用/表示处理所有非JSP、非静态资源的请求 --> <url-pattern>/</url-pattern> </servlet-mapping>
踩坑点:如果用了/*作为url-pattern,DispatcherServlet会处理所有请求,包括JSP,而Jetty本身的JspServlet就没法处理JSP文件了,就会出现找不到映射的错误。
4. 确认Jetty的上下文路径配置
你访问的是http://localhost:9090/testJetty/index,说明你的应用上下文路径是/testJetty,要确保:
- 在RAD的Jetty服务器部署配置里,上下文路径设置的是
/testJetty(别写成空或者其他路径) - 所有的请求映射、视图路径都是相对于这个上下文路径的,不要硬写绝对路径
5. 最后确认JSP文件的实际位置
检查你的index.jsp是不是真的放在WEB-INF/views/目录下,注意路径大小写(Jetty在Linux/macOS上是区分大小写的),比如别把views写成Views,index.jsp写成Index.jsp。
如果上面的配置都没问题,你可以试试直接访问http://localhost:9090/testJetty/WEB-INF/views/index.jsp:
- 如果返回403:说明文件存在,但WEB-INF目录下的文件不能直接访问,这时候问题肯定出在Spring的映射或视图解析配置上
- 如果返回404:说明文件路径不对,先把JSP放到正确的位置
内容的提问来源于stack exchange,提问作者user2863754

