我目前正在编写一个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的语法在doPost
和doGet
方法中完全相同。
如果需要更多说明或额外代码。请告诉我。
修改
使用的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映射与doGet
和doPost
有什么关系呢?
亲切的问候,
乙
答案 0 :(得分:1)
正如评论中所提到的,看起来正在header.do
和footer.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。