我有一个index.jsp
页面,其中有一个表单,用户可以使用Controller servlet输入一些存储在数据库中的数据。
我想在数据库中输入数据后,在该表单中显示相同的页面(index.jsp
)。另外,我想显示用户在数据库中输入的所有条目。
我尝试使用forward()
的{{1}}方法。它工作正常(意味着我能够再次显示相同的表单,并使用JSTL显示该用户在表单下输入的所有数据)。
但问题是,每当用户按下RequestDispatcher
按钮时,所有先前的数据也会输入到数据库中,并且当我显示所有数据时,也会出现重复的条目。
我想过使用POST-REDIRECT-GET模式,但问题是当我重定向时我没有使用JSTL显示这些数据。
我该怎么做?
答案 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
所有请求参数。如果点击f5
或refresh
,则永远不会执行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
列表)
答案 2 :(得分:0)
我认为PRGP(Post Redirect Get Pattern)是实现这一目标的方法。如果您使用的是Spring Web Flow,它有一个FlashScope,您可以在Post-get-redirection之后放置要保留的数据。使用此方法,您可以保留的不仅仅是编辑ID。