2

我目前正在编写一个需要使用用户名和密码登录的 Web 应用程序。该过程的下一步是选择一个涉及登录用户的项目。

选择项目并单击提交按钮后,将调用一个 servlet 来准备所选项目并创建一个请求requestDispatcher.forward响应我的主页。

主页面布局:
header div:

<div><jsp:include page="header.do" flush="true"/></div>

身体 div:

<div>   code that is present in the mainpage.jsp </div>

页脚 div:

<div><jsp:include page="footer.do" flush="true"/></div>

假设这 3 个 div 构成了主页。

转发页面后,requestDispatcher我可以看到主页的内容。但是<jsp:include>'s 未加载(DIV 为空)。只有当我刷新页面时(doGet我假设),包含才会正确加载。

无论如何让包含加载到 doPost requestDispatch 执行?

**注意: requestDispatchers 的语法在doPostanddoGet方法中是完全一样的。

如果需要更多说明或额外代码。请告诉我。


编辑

使用的 Servlet 容器: Tomcat 6.0

Web.xml:

<!--- Servlet Mapping for Project Selection Servlet-->
<servlet>
    <servlet-name>ProjectSelect</servlet-name>
    <servlet-class>MyProject.Login.ProjectSelect</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ProjectSelect</servlet-name>
    <url-pattern>/ProjectSelect.do</url-pattern>
</servlet-mapping>

但是 servlet 映射与doGetand有什么关系doPost


亲切的问候,

B.

4

1 回答 1

1

如评论中所述,看起来正在侦听的 servletheader.do仅限footer.doGET请求。您需要确保它也将在POST请求上执行。

至于评论中的新问题:

为什么从另一个jsp页面doPost()调用a时会调用该方法?<jsp:include>

因为客户端帐户触发的 HTTP 请求的方法。RequestDispatcher不会触发一个全新的 HTTP 请求左右(只有谁sendRedirect()在这样做)。RequestDispatcher只是重用包含/转发资源的初始请求。请求方法不会更改,并且在这种情况下保留在POST包含/转发的资源中。


也就是说,您可能希望将所有*.doservlet 重新设计/重构为单个中央前端控制器 servlet,该控制器在service()方法中实现了必要的逻辑,以避免重复/样板混乱。或者更好的是,采用 JSF、Struts(2)、Spring-MVC 等 MVC 框架。有关更多详细信息,请查看此答案

于 2010-11-10T15:52:28.420 回答