我有一个简单的Maven servlet / jsp应用程序,我将其部署到本地Tomcat 9(通过Eclipse)。 JSP页面存储在根文件夹(src\main\webapp\*.jsp
)下,当Maven安装WAR时,它们位于根文件夹(MyAppContext\*.jsp
旁边MyAppContext\META-INF\
和MyAppContext\WEB-INF\
)下。
为每个servlet注释servlet的URL模式,例如: /doactionone
,/doactiontwo
等。大多数servlet执行调度到各种JSP页面,但我确实有一个直接锚链接。
我想将这些JSP页面移动到各自的目录中,因此我将它们移动到src\main\webapp\jsp\*.jsp
文件夹,当运行Maven安装时,它们被置于MyAppContext\jsp\
下。
我在web.xml
中唯一的一个条目是一个欢迎文件,在重新定位JSP文件之后,它指向加载相应JSP页面的jsp\doactionone.jsp
。此页面包含一个简单的表单:
<form action="doactionone" method="post">
...
<a href="jsp/doactiontwo.jsp">
<input type="submit" />...
</form>
此页面上的提交实际上调用了正确的servlet(使用doactionone
URL模式定义的servlet)。我还有一个链接,将用户带到第二页(doactiontwo.jsp
)。
但是,当我通过此链接导航到第二页时,有另一个简单的表单(见下文),并执行提交(发布),我在浏览器的调试中看到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后调度/转发请求({{1} })with:
doactionone
当它被加载时,当鼠标悬停在最初指向第二个JSP页面(RequestDispatcher rd = request.getRequestDispatcher("doactionone.jsp");
rd.forward(request, response);
)的第一页上的URL时,现在实际上指向:
<a href="jsp/doactiontwo.jsp">
有趣的是,doactionone.jsp的源代码仍显示为jsp/jsp/doactiontwo.jsp
,但将鼠标悬停在jsp/doactiontwo.jsp
上会显示http://localhost:8080/MyAppContext/jsp/jsp/doactiontwo
,点击后,显然会显示404状态。
有人可以解释为什么,首先,第二个JSP页面上的提交要求servlet的模式为/jsp/doactiontwo
而不是/doactiontwo
?有没有办法避免将/jsp
附加到网址格式?
第二,为什么当第二个servlet处理请求并将其发送/转发到第一页时,为什么URL现在包含两个jsp/
?
答案 0 :(得分:1)
您需要更改设计以允许控制器a.k.a.Servlet来驱动您的应用程序。在这种特殊情况下,使用第二个Servlet的URL模式(doactiontwo
)代替您链接:
@WebServlet(urlPatterns = { "doactiontwo" }
public class DoActionTwoServlet extends HttpServlet { /* ... */ }
<form action="doactionone" method="post">
...
<a href="doactiontwo"> <!-- This should match your second servlet's URL pattern -->
<input type="submit" />...
</form>
现在,由于调用锚链接时的默认方法是GET
,您需要覆盖DoActionTwoServlet
的{{1}}方法,并将这些请求转发给实际的doGet()
}:
doactiontwo.jsp