当前位置: 首页 > 知识库问答 >
问题:

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

孟花蜂
2023-03-14

我有一个简单的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页面的jsp\doactionone.jsp。这个页面包含一个简单的表单:

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

这个页面上的提交实际上调用了正确的servlet(用doactiononeURL模式定义的那个)。我还有一个将用户带到第二个页面的链接(doactiontwo.jsp)。

然而,当我通过这个链接导航到第二个页面时,它有另一个简单的表单(见下文),并执行提交(发布),我在浏览器的调试中看到网址请求是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页的网址上时(

jsp/jsp/doactiontwo.jsp

有趣的是doactionone的源代码。jsp仍然将其显示为jsp/doactiontwo。jsp,但将鼠标悬停在上面会显示http://localhost:8080/MyAppContext/jsp/jsp/doactiontwo,当点击时,它显然会导致404状态。

有人能解释为什么,首先,第二个JSP页面上的提交要求servlet有一个/jsp/doactionTwo的模式来工作,而不是/doactionTwo吗?有没有办法避免在URL模式上追加/jsp

其次,为什么当第二个servlet处理请求并将其分派/转发到第一个页面时,URL现在包含两个jsp/


共有1个答案

汪鸿志
2023-03-14

您需要更改您的设计,以允许控制器(又名Servlet)驱动您的应用程序。在这种情况下,使用第二个Servlet的URL Pattern(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);
}
 类似资料:
  • 问题内容: 我有一张桌子DEAL和一张桌子DEAL_TYPE。我想映射以下代码: 问题在于数据已经存在于数据库中。而且我很难将类映射到数据库。 数据库看起来像这样: 我知道我可以在交易类型之间使用简单的@OneToMany关系,但是我更喜欢使用枚举。这可能吗? 我几乎可以通过使用EnumType.ORDINAL类型来使其工作。但不幸的是,我的交易类型表中的ID不是连续的,并且不是从1开始。 有什么

  • 我有一个JSP登录页面,可以调用login action类。我使用的是Struts注释,而不是到映射,一切正常。我随机尝试了一些新东西,所以我从action类和struts中删除了所有注释。xml还没有映射到我的

  • 我有这些网址 如何设置web.xml以将此模式映射到servlet? 其中xx是一个两个字母的字符串。我把什么放在xx的地方,这样上面的所有链接都将转到MyClass?

  • 我有一些这样的豆子: 3)移动将在bins中搜索注释移动到,并将setter添加到: 但是在这个解决方案中,我不喜欢方法。

  • 问题内容: 我所有的数据库表都应有一个endTime字段,默认情况下应为END_OF_TIME或类似的内容。我对2038的限制不满意,所以我希望endTime在mysql中为DATETIME类型。 我的Java代码是: 我可以通过手动创建带有DATETIME类型的endTime字段的表来解决,而不是将实体endTime映射到该列,但是我希望Hibernate自动生成表- 我该怎么做? 问题答案:

  • 我试图用strut 2应用程序配置spring插件,而strut 2应用程序已经用常规插件运行了,所以我使用了注释。我使用ExtJs提交表单,在我引入spring插件之前,它最初工作得很好,现在ajax请求无法定位操作,并且在firebug中没有显示任何响应。 绒球.xml struts.xml web.xml applicationContext.xml 操作类 Ajax请求火虫报告,XML选项