(Я посмотрел только MakeTransactionServlet и UMakeTransactions.jsp, для других файлов должно быть похоже).
У Вас недостаточно чётко разделены модель (БД), вид (JSP) и контроллер (сервлет).
Сейчас происходит так:
- сервлет получает запрос,
- проверяет права доступа,
- если всё ок — выполняет транзакцию согласно параметрам запроса,
- делает sendRedirect на JSP
- браузер вместо HTML с результатами получает ответ от сервлета: «HTTP 302, иди смотри JSP»
- браузер спрашивает у сервера JSP
- JSP получает запрос
- проверяет права доступа (это обязанность сервлета!)
- осуществляет запрос к БД (кажется, здесь, я c Hibernate знаком поверхностно) — это тоже обязанность сервлета,
- генерит HTML с результатом для браузера.
Прежде всего, пункты 4-6 лишние: сервлет должен передать запрос напрямую в JSP, а не прося браузер сделать второй запрос к JSP (подробнее об этом ниже).
Во-вторых, если у Вас есть сервлет, то работать с БД должен только он; прямого доступа к БД из JSP быть не должно (так как это противоречит концепции MVC). Доступ к JSP должен быть только у сервлета, нужно запретить к ней прямой доступ извне (это можно сделать, переместив JSP куда-нибудь под WEB-INF). Тогда и проверки прав доступа будет достаточно одной — в сервлете; и не будет нужен второй запрос от браузера. Передачу данных из сервлета в JSP можно делать через request.setAttribute().
Теоретические основы описаны
здесь в разделе «Integrating Servlets and JSP Pages», вот краткая суть:
The servlet acts as a controller responsible for processing requests and creating any beans needed by the JSP page. The controller is also responsible for deciding to which JSP page to forward the request. The JSP page retrieves objects created by the servlet and extracts dynamic content for insertion within a template.
Вообще, конечно, хорошо бы изучить статью целиком.
В результате процесс будет выглядеть так:
- сервлет получает запрос,
- проверяет права,
- если права ОК — выполняет транзакцию,
- получает обновлённые данные из БД,
- складывает эти данные в отдельный объект (или несколько объектов, см. «beans» в цитате выше),
- присоединяет этот объект к запросу:
request.setAttribute("resultsForJsp", bean)
- и передаёт запрос в JSP:
getServletContext().getRequestDispatcher("/WEB-INF/jsp/myView.jsp").forward(request, response)
В отличие от sendRedirect, forward просто передаёт запрос на обработку другому сервлету/JSP (сохраняя установленные ранее атрибуты запроса); sendRedirect же возвращает указание браузеру запросить другой адрес (атрибуты запроса теряются, выживает только сессия).
Путь /WEB-INF/...
доступен только «для своих» изнутри сервлет-контейнера, браузер туда никак не попадёт — поэтому проверка поступающих данных (в том числе прав доступа) не нужна: её уже сделал сервлет.
- JSP получает запрос с уже готовыми к показу данными,
- генерит HTML для браузера.
А ещё, старайтесь не использовать в JSP скриптлеты (<% java-код %>) — это считается моветоном, поскольку:
1) засоряет HTML Java-кодом, и
2) часто указывает на перенос части функций контроллера (сервлета) в вид (JSP).
Вместо скриптлетов лучше использовать
JSTL.
Например,
строки 45-52 из UMakeTransactions.jsp могли бы выглядеть так:
<c:forEach var='item' items='${resultsForJsp.items}'>
<option value="<c:out value='${item.item_id}'/>"><c:out value='${item.item_name}'/>
</c:forEach>