刷新时如何防止重复输入?

时间:2012-10-04 09:44:16

标签: java html jsp servlets post-redirect-get

我有一个index.jsp页面,其中有一个表单,用户可以使用Controller servlet输入一些存储在数据库中的数据。

我想在数据库中输入数据后,在该表单中显示相同的页面(index.jsp)。另外,我想显示用户在数据库中输入的所有条目。

我尝试使用forward()的{​​{1}}方法。它工作正常(意味着我能够再次显示相同的表单,并使用JSTL显示该用户在表单下输入的所有数据)。

但问题是,每当用户按下RequestDispatcher按钮时,所有先前的数据也会输入到数据库中,并且当我显示所有数据时,也会出现重复的条目。

我想过使用POST-REDIRECT-GET模式,但问题是当我重定向时我没有使用JSTL显示这些数据。

我该怎么做?

3 个答案:

答案 0 :(得分:5)

我会在页面中添加一个不可见的ID。如果数据是数据库的新数据(ID =未知),请插入并创建ID并使用ID更新页面。这样你知道它是否是一个ID!=未知,你不必进行插入。如果数据没有改变,你甚至不需要做更新...

答案 1 :(得分:0)

这是最简单的解决方案

<%@page import="java.util.*"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%!
//This List is just for demonstration purposes
List<String> names = new ArrayList<String>();
%>
<%
if(request.getParameter("name")!=null ){
    names.add(request.getParameter("name"));
    session.setAttribute("nameList", names);
    //Here you put your database insert code

    //Whenever the code execution reaches this line , 
    //then it means that you have a new page submission
    //and not a refresh or f5 case

    response.sendRedirect("index.jsp");
}
%>

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <form action="index.jsp" method="post">
            <input type="text" id="name" name="name"/>
        </form>
        <p>
            <table>
                <c:forEach items="${nameList}" var="element">    
                    <tr>
                        <td>Name:  <c:out value="${element}"/> </td>
                    </tr>
                </c:forEach>
            </table>
        </p>
    </body>
</html>

诀窍在于response.sendRedirect("index.jsp");。这使得null所有请求参数。如果点击f5refresh,则永远不会执行if。如果是正常提交​​,则会执行if并致电response.sendRedirect("index.jsp");

总之,您真正需要做的就是:

1)检查if(request.getParameter("name")!=null )

2)如果满足以上条件,则执行数据库插入

3)如果上述情况属实,那么response.sendRedirect("index.jsp");

<强>更新

if(request.getParameter("name")!=null ){
    DbUtility.addNameToDb(request.getParameter("name"));
    ArrayList<String> currentList = DbUtility.getAllNamesFromDb();
    session.setAttribute("nameList", currentList);
    response.sendRedirect("index.jsp");
}

您只需实施这两种方法即可。 addNameToDb(String)将在您的数据库中生成insertgetAllNamesFromDb()将返回一个ArrayList<String>对象,该对象将代表数据库中的条目。 (并且您不再需要我在第一个回答中介绍的names列表)

答案 2 :(得分:0)

我认为PRGP(Post Redirect Get Pattern)是实现这一目标的方法。如果您使用的是Spring Web Flow,它有一个FlashScope,您可以在Post-get-redirection之后放置要保留的数据。使用此方法,您可以保留的不仅仅是编辑ID。