如何通过注解映射Servlet动作到JSP路径?路径异常求助
让我来帮你分析这两个问题,本质上都是相对路径与绝对路径的常见坑,咱们一步步拆解解决:
问题1:第二个页面表单提交为何需要/jsp/doactiontwo?能否避免?
原因分析
当你把JSP移到jsp/目录后,第二个页面的访问URL是http://localhost:8080/MyAppContext/jsp/doactiontwo.jsp。你表单里写的action="doactiontwo"是相对路径——浏览器会基于当前页面的URL路径来拼接请求地址:当前页面的路径前缀是/MyAppContext/jsp/,所以相对路径doactiontwo会被解析成/MyAppContext/jsp/doactiontwo,但你的Servlet映射是/doactiontwo(属于应用根路径下的映射),自然匹配不到,返回404。
解决方案:改用绝对路径
不用修改Servlet的URL模式,只需要把表单的action改成基于应用上下文根的绝对路径。JSP里可以通过${pageContext.request.contextPath}获取当前应用的上下文路径(也就是/MyAppContext),修改后的表单代码如下:
<form action="${pageContext.request.contextPath}/doactiontwo" method="post"> <!-- 表单内容 --> <input type="submit" /> </form>
这样不管当前页面在哪个目录下,表单都会提交到http://localhost:8080/MyAppContext/doactiontwo,完美匹配你的Servlet映射。
问题2:为何转发后链接出现双重jsp/?
原因分析
RequestDispatcher.forward()是服务器内部跳转,浏览器的地址栏不会更新——转发完成后,浏览器显示的URL还是之前Servlet的请求地址:http://localhost:8080/MyAppContext/jsp/doactiontwo。而你页面里的链接href="jsp/doactiontwo.jsp"是相对这个URL的,浏览器会自动拼接成/MyAppContext/jsp/jsp/doactiontwo.jsp,自然返回404。
解决方案(二选一即可)
- 给链接也用绝对路径
和表单的处理方式一致,把链接改成基于上下文根的绝对路径:
<a href="${pageContext.request.contextPath}/jsp/doactiontwo.jsp">跳转至页面二</a>
- 设置
<base>标签统一基准路径
在页面的<head>中添加<base>标签,指定所有相对路径的基准URL:
<head> <!-- 把基准路径设为应用上下文根下的jsp目录 --> <base href="${pageContext.request.contextPath}/jsp/"> </head>
之后页面里的所有相对路径都会基于这个基准URL拼接,比如doactiontwo.jsp会自动解析成/MyAppContext/jsp/doactiontwo.jsp,无需再手动加上下文路径。注意:使用<base>标签时,要确保页面内的CSS、JS等静态资源路径也符合基准规则。
核心总结:只要避免依赖当前页面的相对路径,改用基于应用上下文根的绝对路径(或通过<base>统一基准),就能彻底解决这类路径混乱的问题。
内容的提问来源于stack exchange,提问作者NuCradle

