Запись поиска JSTL будет добавлена ​​в последнюю запись - PullRequest
1 голос
/ 02 февраля 2012

Я использую 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>

Вот мой сервлет:

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>

Вот мой код, который использовалчтобы вызвать мой сервлет:

<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 Ответ

2 голосов
/ 02 февраля 2012

Эта проблема не вызвана JSP / JSTL. Это вызвано ошибкой где-то в вашем коде. Однако опубликованный код выглядит хорошо. Могу поспорить, что вы просто упростили код, который волшебным образом заставил его выглядеть хорошо.

По крайней мере, симптомы указывают на то, что вы сохраняете значения в области запроса как переменную экземпляра класса сервлета, что делает его потокобезопасным (т. Е. Оно используется всеми запросами во всех сеансах). Примерно так:

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

}

Смотри также:

...