我有一个简单的 Maven servlet/jsp 应用程序,我将它部署到本地 Tomcat 9(通过 Eclipse)。JSP 页面存储在根文件夹 ( src\main\webapp\*.jsp
) 下,当 Maven 安装 WAR 时,它们位于根文件夹 (MyAppContext\*.jsp
旁边MyAppContext\META-INF\
和MyAppContext\WEB-INF\
)。
servlet 的 URL 模式针对每个 servlet 进行了注释,例如/doactionone
、/doactiontwo
等。大多数 servlet 执行对各种 JSP 页面的分派,但我确实有一个直接锚链接。
我想将这些 JSP 页面移动到它们各自的目录中,所以我将它们移动到src\main\webapp\jsp\*.jsp
文件夹中,当 Maven 安装运行时,它们被放置在MyAppContext\jsp\
.
我拥有的唯一条目web.xml
是一个欢迎文件,在重新定位 JSP 文件之后,它指向jsp\doactionone.jsp
加载相应 JSP 页面的文件。此页面包含一个简单的表单:
<form action="doactionone" method="post">
...
<a href="jsp/doactiontwo.jsp">
<input type="submit" />...
</form>
此页面上的提交实际上调用了正确的 servlet(使用doactionone
URL 模式定义的那个)。我还有一个链接可以将用户带到第二页 ( doactiontwo.jsp
)。
然而,当我通过这个链接导航到第二个页面时,它有另一个简单的表单(见下文),并执行提交(post),我在浏览器的调试中看到 URL 请求是http://localhost:8080/MyAppContext/jsp/doactiontwo
,由于显而易见的原因,它会返回一个404 状态(并且对此 servlet 的doPost()
(或doGet()
)方法也没有命中)。
<form action="doactiontwo" method="post">
...
<input type="submit" />...
</form>
如果我尝试将第二个 servlet 的 URL 模式修改为/jsp/doactiontwo
,我可以点击 servlet,但是doactiontwo
在处理到第一个 servlet ( doactionone
) 后实际调度/转发请求时:
RequestDispatcher rd = request.getRequestDispatcher("doactionone.jsp");
rd.forward(request, response);
当它被加载时,当将鼠标悬停在最初指向第二个 JSP 页面 ( <a href="jsp/doactiontwo.jsp">
) 的第一页上的 URL 上时,现在实际上指向:
jsp/jsp/doactiontwo.jsp
有趣的是,doactionone.jsp 的源代码仍然显示为jsp/doactiontwo.jsp
,但将鼠标悬停在它上面显示http://localhost:8080/MyAppContext/jsp/jsp/doactiontwo
,并且单击时,它显然会导致 404 状态。
有人可以解释为什么,首先,第二个 JSP 页面上的提交需要 servlet 具有/jsp/doactiontwo
工作模式而不是/doactiontwo
? 有没有办法避免附加/jsp
到 URL 模式?
其次,为什么当第二个 servlet 处理请求并将其分派/转发到第一页时,URL 现在包含两个jsp/
'?