如何使用注释将Servlet操作映射到JSP路径?

时间:2018-05-15 03:08:03

标签: java jsp tomcat servlets tomcat9

我有一个简单的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/

1 个答案:

答案 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