You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过注解映射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。

解决方案(二选一即可)

  1. 给链接也用绝对路径
    和表单的处理方式一致,把链接改成基于上下文根的绝对路径:
<a href="${pageContext.request.contextPath}/jsp/doactiontwo.jsp">跳转至页面二</a>
  1. 设置<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:50:27