jstl搜索记录将保留在最后一条记录中

时间:2012-02-02 11:12:48

标签: java html jsp servlets jstl

我正在使用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>

然后我继续执行另一个搜索操作,最新的搜索结果应该替换旧记录并显示最新结果。但它不会,最新的结果将添加在旧记录的下方。我只想显示最新的搜索结果。 旧的搜索结果将被删除。

有没有解决这个问题的方案?

1 个答案:

答案 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);
    }

}

另见: