如何将 Servlet 操作映射到带有注释的 JSP 路径?



我有一个简单的Maven servlet/jsp应用程序,我将其部署到本地Tomcat 9(通过Eclipse(。JSP页面存储在根文件夹(srcmainwebapp*.jsp(下,当Maven安装WAR时,它们位于根文件夹下(MyAppContext*.jspMyAppContextMETA-INFMyAppContextWEB-INF一起(。

servlet 的 URL 模式为每个 servlet 进行了注释,例如/doactionone/doactiontwo等大多数 servlet 执行到各种 JSP 页面的调度,但我确实有一个直接的锚链接。

我想将这些 JSP 页面移动到它们各自的目录中,所以我将它们移动到srcmainwebappjsp*.jsp文件夹中,当 Maven 安装运行时,它们被放置在MyAppContextjsp下。

我在web.xml中唯一的条目是一个欢迎文件,在重新定位 JSP 文件后,它指向加载相应 JSP 页面的jspdoactionone.jsp。此页面包含一个简单的表单:

<form action="doactionone" method="post">
...
<a href="jsp/doactiontwo.jsp">
<input type="submit" />...
</form>

此页面上的提交实际上调用了正确的 servlet(使用 URL 模式定义的 servletdoactionone(。我还有一个链接可以将用户带到第二页(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 (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/

您需要更改设计以允许控制器(也称为 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,因此您需要覆盖DoActionTwoServletdoGet()方法,并将这些请求转发到实际的doactiontwo.jsp

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException  {
RequestDispatcher rd = request.getRequestDispatcher("jsp/doactiontwo.jsp");
rd.forward(request, response);
}

最新更新