【问题标题】:forward from servlet to jsp causes form submission errors从 servlet 转发到 jsp 导致表单提交错误
【发布时间】:2012-09-14 22:19:16
【问题描述】:

我正在转发到一个 jsp,它显示了一个表格和一个由 jstl sql 标记填充的 cmets 表单。

问题是,如果我使用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");  

        }

cmets.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。我通过分离 cmets 并将注释添加到单独的页面中解决了这个问题。也许更好的解决方案是使用会话而不是对象传输请求。

【问题讨论】:

  • 这不是答案的一部分,而是一个建议:不要在 servlet 中定义属性,它们不是线程安全的。在此处阅读有关 servlet 如何工作的更多信息:How do servlets work? Instantiation, session variables and multithreading
  • servlet 中最后一个 if 语句之后发生了什么?代码中断。
  • @Sean,指向不同页面的逻辑。没有什么可以影响结果,因为它不会被执行。
  • 嗯?对于一个根本没有详细说明具体问题/问题的问题,有 4 票赞成?唯一的问题描述在标题中,并说“导致表单提交错误”。你在说什么样的错误?究竟发生了什么(不是)?为什么问题中没有详细说明 anywhere ?这个问题绝对不清楚。顺便说一句,在概念或术语上也存在一些误解:“会话信息”比重定向具有更长的生命周期,也许您实际上是说“请求信息”?无论如何,这似乎与具体问题无关。
  • @Oleg Mikheev:请阅读作业标签维基

标签: java jsp session servlets


【解决方案1】:
  1. 重定向和转发都应该保留会话,因为 cookie 支持会话(在大多数情况下)。

  2. 1234563 .

【讨论】:

  • “重定向和转发都应该保留会话”,当然,但我将数据放入请求中,重定向不保留。
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2016-05-04
相关资源
最近更新 更多