【发布时间】: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:请阅读作业标签维基