6

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

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

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

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

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

我该怎么做?

4

4 回答 4

9

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

只需发送一个请求参数以及标识您希望在新 GET 请求中显示的信息即可。

// ...
Long id = dataService.save(data);
// ...
response.sendRedirect(request.getContextPath() + "/index?editId=" + id);

然后在映射到 URL 模式的servlet中/index

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Long editId = Long.valueOf(request.getParameter("editId")); // Handle nullcheck yourself.
    Data editData = dataService.find(editId);
    request.setAttribute("editData", editData); // For the edit form.
    List<Data> allData = dataService.list();
    request.setAttribute("allData", allData); // For the table/list of all data.
    request.getRequestDispatcher("/index.jsp").forward(request, response);
}
于 2012-10-10T22:06:39.743 回答
5

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

于 2012-10-04T09:57:08.917 回答
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所有请求参数。如果f5orrefresh被命中,则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)insert在您的数据库中生成。并且getAllNamesFromDb()将返回一个ArrayList<String>对象,该对象将代表您数据库中的条目。(并且您不再需要names我之前在第一个答案中介绍的列表)

于 2012-10-08T08:05:32.047 回答
0

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

于 2012-10-14T05:55:21.863 回答