JSP:使用doPost requestDispatcher包括不在转发页面上调用

时间:2010-11-10 13:19:59

标签: jsp servlets forward jspinclude

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

选择项目并单击提交按钮后,将调用servlet来准备所选项目并创建requestDispatcher.forward req并重新分配到我的主页。

主页面布局:
标题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>(DIV是空的)。只有当我刷新页面时(doGet,我才认为),包含将正确加载。

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

**注意:requestDispatchers的语法在doPostdoGet方法中完全相同。

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


修改

使用的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映射与doGetdoPost有什么关系呢?


亲切的问候,

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,看起来正在header.dofooter.do上收听的servlet仅限于GET个请求。您还需要确保在POST个请求上执行它。

关于评论中的新问题:

  

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

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


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