Обновление записи базы данных после отображения пользователю - PullRequest
0 голосов
/ 06 января 2012

У меня есть вопрос о том, как обновить конкретную запись в базе данных, используя JSTL и Java-сервлеты.

Хорошо, чтобы вызвать одну запись, я использую сервлет для запуска запроса, чтобы заполнить страницу jsp с использованием этого типа формата.

        ResultSet results = getRecords.executeQuery();  //run database query
        Result result = ResultSupport.toResult(results);  
        request.setAttribute("result", result);
        RequestDispatcher rd = request.getRequestDispatcher("/showReport.jsp");  //redirect to this page with query info
        rd.forward(request, response);

На странице jsp я использую этот формат для заполнения страницы.
номер строки соответствует индексу значения того, как выполняется запрос.

    <c:forEach var="row" items="${result.rowsByIndex}"> 
<form action = "/runthis/servlet?id=${row[0]}" method = "get" >
    Employee Name<input type="text"  value="<c:out value="${row[2]}"/>" />
    Department<select>
    <option value="<c:out value="${row[4]}"/>"><c:out value="${row[4]}"/></option></select>
<input type="submit" value="Save">
</form>
    </c:forEach>

Так, например, если кто-то изменит имя сотрудника, но оставит поле Департамента в покое, или наоборот, как мне поступить?

Я думаю, что я должен быть в состоянии отправить это действие формы "сервлету обновления", но я бы не стал "обновлять" каждый элемент в записи, если мне это не нужно.

Кроме того, я все еще изучаю веб-разработчик, поэтому, если вы можете придумать лучший способ предварительно заполнить материал с помощью javascript или чего-либо еще, я тоже хочу попробовать это, если это возможно.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 07 января 2012

Я думаю, вам нужно сделать что-то вроде этого:

<c:forEach var="row" items="${result.rowsByIndex}"> 
    <form action="/runthis/servlet" method="post">
        <input type="hidden" name="id" value="<c:out value="${row[1]}"/>" />
        <input type="hidden" name="EmployeeName_orig" value="<c:out value="${row[2]}"/>" />
        Employee Name<input type="text" name="EmployeeName" value="<c:out value="${row[2]}"/>" />
        <input type="hidden" name="Department_orig" value="<c:out value="${row[4]}"/>" />
        Department
        <select id="Department" name="Department">
            <option value="<c:out value="${row[4]}"/>"><c:out value="${row[4]}"/></option>
        </select>
        <input type="submit" value="Save" />
    </form>
</c:forEach>

и затем в вашем сервлете обновлений (здесь он называется / runthis / servlet) вы выполняете какую-то форму сотрудника по обновлению и задаете имя и отдел, в котором строка представляет собой идентификатор. обратите внимание, что я отправляю идентификатор в скрытом поле, но его можно также отправить в URL, как вы упоминали в нашем обсуждении выше!

о вашем замечании по обновлению каждого элемента в записи:

это можно сделать разными способами. Один из способов - сначала загрузить запись из базы данных и сравнить поля, чтобы узнать, какие поля нужно обновить. но для этого потребуется дополнительное чтение из базы данных перед обновлением.

другой способ (тот, который я подготовил в предложенном мной решении) - это иметь скрытые поля, по одному для каждого ввода в вашей форме. это скрытое поле содержит исходное значение для его входного аналога. таким образом, вы можете сравнить исходное значение с новым значением без необходимости чтения из базы данных. с другой стороны, теперь вы передаете двойной объем данных по строке для каждого почтового запроса.

...