我正在使用JSTL在JSP中显示我从数据库中搜索的记录。
例如,从数据库返回的这些记录是:
<tr>
<td class="leavehistory">2012-01-31 18:16:36.0</td><td class="leavehistory">Present</td>
</tr>
<tr>
<td class="leavehistory">2012-01-31 18:16:38.0</td><td class="leavehistory">Present</td>
</tr>
这是我的JSP:
<c:forEach items="${attendRecord}" var="attendRecord">
<tr>
<td class="leavehistory">${attendRecord.attendDt}</td><td class="leavehistory">${attendRecord.status}</td>
</tr>
</c:forEach>
这是我的Servlet:
ArrayList<Attendance> arrSub = new ArrayList<Attendance>();
while (rs.next()){
Attendance att = new Attendance();
att.setAttendDt(rs.getString(1));
att.setStatus(rs.getString(2));
att.setClsType(rs.getString(3));
att.setSubID(rs.getString(4));
arrSub.add(att);
}
request.getSession().setAttribute("attendRecord", arrSub);
在我执行其他搜索的地方,结果将是这样的:
<tr>
<td class="leavehistory">2012-01-31 18:16:36.0</td><td class="leavehistory">Present</td>
</tr>
<tr>
<td class="leavehistory">2012-01-31 18:16:38.0</td><td class="leavehistory">Present</td>
</tr>
<tr>
<td class="leavehistory">2012-01-31 18:16:36.0</td><td class="leavehistory">Late</td>
</tr>
<tr>
<td class="leavehistory">2012-01-31 18:16:38.0</td><td class="leavehistory">Late</td>
</tr>
以下是我用来调用servlet的代码:
<script>
function reviewAtt(){
var f = document.review;
f.hdSearch.value = f.cardID.value +";"+document.getElementById("clsType").value+";"+document.getElementById("sub").value;
f.method = "POST";
f.target = "_self";
f.action = "../build/web/WEB-INF/classes/leave/searchAttendServlet";
f.submit();
}
</script>
然后我继续执行另一个搜索操作,最新的搜索结果应该替换旧记录并显示最新结果。但它不会,最新的结果将添加在旧记录的下方。我只想显示最新的搜索结果。 旧的搜索结果将被删除。
有没有解决这个问题的方案?
答案 0 :(得分:2)
此问题不是由JSP / JSTL引起的。它是由代码中某处的错误引起的。但是到目前为止发布的代码看起来很好。我敢打赌,你只是过分简化了使它看起来很好的代码。
至少,这些症状表明您将请求作用域值存储为servlet类的实例变量,这使其成为线程安全的(即它在所有会话中的所有请求之间共享)。像这样:
public class SearchAttendServlet extends HttpServlet {
ArrayList<Attendance> arrSub = new ArrayList<Attendance>();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
}
}
这是不对的。
同样将其存储为会话属性是不对的,但这不一定是您的问题的原因(除非您在向其添加新项目之前从会话中显式检索了相同的列表,但到目前为止发布的代码不是不以任何方式表明这一点。
您应该在线程本地范围内创建列表并将其存储在请求范围中。
public class SearchAttendServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ArrayList<Attendance> arrSub = new ArrayList<Attendance>();
// ...
request.setAttribute("attendRecord", arrSub);
request.getRequestDispatcher("/WEB-INF/yourpage.jsp").forward(request, response);
}
}