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

标签 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\ )。

servlets 的 URL 模式是为每个 servlet 注释的,例如/doactionone , /doactiontwo等。大多数 servlet 执行到各种 JSP 页面的调度,但我在一个页面上有一个直接的 anchor 链接。

我想将这些 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 ) 之后分派(dispatch)/转发请求:

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 处理请求并将其分派(dispatch)/转发到第一页时,URL 现在包含两个 jsp/的?

最佳答案

您需要更改您的设计以允许 Controller (也称为 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>

现在,由于调用 anchor 链接时的默认方法是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);
}

关于java - 如何使用注释将 Servlet 操作映射到 JSP 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50341757/

相关文章:

tomcat - 从 WEB-INF/lib/*.jar!/META-INF/resources 间歇加载

Java nio2 目录没有关闭。导致 "too many open files"错误

带有 Manager WebApp 的 Tomcat Digest

java - 避免重复、SQLITE、android

java - 分配新对象是否会自动销毁先前分配给同一数据成员的对象?

javascript - Struts 1 操作未在 jsp 中的 javascript 函数内调用

java - 使用JSP从本地文件系统读取文件

java - 20 字节的蓝牙 LE 数据 JSON

Java 字符串字符编码 - 法语 - 荷兰语语言环境

java - 同一表单中的多个提交按钮调用不同的 Servlet