2012-09-22 55 views
2

我正在转发到一个jsp,该jsp显示了由jstl sql标记填充的注释的表和表单。从servlet转发到jsp导致表单提交错误

的问题是形式,如果我用response.sendRedirect("comments.jsp");

工作正常,但因为我需要保留页面之间的会话信息,我想用request.getRequestDispatcher("comments.jsp").forward(request, response); 触发后的形式和重定向随后的职位,以servlet的URL。

LoginServlet

public class LoginServlet extends HttpServlet { 
    Connection connection = null; 
    PreparedStatement ptmt = null; 
    ResultSet resultSet = null; 
    User user = null; 
    boolean fail = true; 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     String email = request.getParameter("email"); 
     String password = request.getParameter("password"); 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     if (null != email && null != password) { 
      try { 
       connection = ConnectionFactory.getInstance().getConnection(); 
       user = new User(); 
       String queryString = "SELECT * FROM USERINFO WHERE EMAIL=?"; 
       ptmt = connection.prepareStatement(queryString); 
       ptmt.setString(1, email); 
       resultSet = ptmt.executeQuery(); 
       resultSet.next(); 
       user.setEmail(resultSet.getString("EMAIL")); 
       ...      
       user.setSecret3(resultSet.getString("SECRET3")); 
      } catch (SQLException e) { 
       System.out.println(e.getMessage()); 
      } finally { 
      } 
     } 
     if (null != user.getPassword() && user.getPassword().equals(password)) { 
      request.setAttribute("user",user); 
      request.getRequestDispatcher("comments.jsp").forward(request, response); 
//   response.sendRedirect("comments.jsp"); 

     } 

comments.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>Comments</title> 
    </head> 
    <body> 
     <sql:setDataSource var="dataSource" driver="org.apache.derby.jdbc.ClientDriver" 
          url="jdbc:derby://localhost:1527/mp1" 
          user="app" password="app"/> 

     <sql:setDataSource var="dataSource2" driver="org.apache.derby.jdbc.ClientDriver" 
          url="jdbc:derby://localhost:1527/mp1" 
          user="app" password="app"/> 

     <H2>Comments</H2> 

     <sql:query dataSource="${dataSource}" sql="SELECT * FROM COMMENTS" var="comments" /> 
     <table border=1> 
      <c:forEach var="row" items="${comments.rows}"> 
       <tr> 
        <c:forEach var="col" items="${row}"> 
         <td><c:out value="${col.value}" /></td> 
        </c:forEach> 
       </tr> 
      </c:forEach> 
     </table> 

     <form method="post"> 
      <table> 
       <tr> 
        <td>Enter Email</td> 
        <td><input type="text" name="EMAIL"></td> 
       </tr> 
       <tr> 
        <td>Enter Comment</td> 
        <td><input type="text" name="COMMENT"></td> 
       </tr> 
       <tr> 
        <td></td> 
        <td><input type="submit" value="submit"></td> 
       </tr> 
      </table> 
     </form> 
     <c:if test="${pageContext.request.method=='POST'}"> 
      <c:catch var="exception"> 
       <sql:update dataSource="${dataSource2}" var="updatedTable"> 
        INSERT INTO 
        COMMENTS (EMAIL,COMMENT) 
        VALUES (?, ?) 
        <sql:param value="${param.EMAIL}" /> 
        <sql:param value="${param.COMMENT}" /> 
       </sql:update> 
       <c:if test="${updatedTable>=1}"> 
        <c:redirect url="/comments.jsp"/> 
       </c:if> 
      </c:catch> 
      <c:if test="${exception!=null}"> 
       <c:out value="Unable to add comment." /> 
      </c:if> 
     </c:if> 
    </body> 
</html> 

顺便说一句,这是一个家庭作业是老师要我们学习它是如何做旧的方式。因此,使用安全性和更好的技术并不是真正的问题。

PS。我已经通过分离评论和添加评论到单独的页面来解决这个问题。也许更好的解决方案是使用会话而不是对象传输请求。

+1

这不是答案的一部分,而是一个建议:不要在servlet中定义属性,它们不会是线程安全的。详细了解servlet如何在这里工作:[servlet如何工作?实例化,会话变量和多线程](http://stackoverflow.com/a/3106909/1065197) –

+0

你的servlet中最后一条if语句发生了什么?代码被切断。 – Sean

+0

@肖恩,逻辑,指向不同的页面。因为它不会被执行,所以不会影响结果。 – jeremyjjbrown

回答

1
  1. 重定向和转发都应该保留会话,因为session支持cookie(大多数情况下)。

  2. 您的表单没有action参数,因此其行为取决于浏览器的当前URL(表单获取当前URL而不是定义在动作中),当前URL在重定向和转发时不同。

+0

“重定向和转发应保留会话”,当然,但我把数据放入请求中,而不是通过重定向保留。 – jeremyjjbrown