Ответ 1
Узнайте, как работает HTTP:
- Клиент запускает HTTP-запрос.
- Сервер получает HTTP-запрос.
- Servletcontainer создает новые объекты
HttpServletRequest
иHttpServletResponse
. - Servletcontainer вызывает соответствующий сервлет с этими объектами.
- Сервлет обрабатывает запрос и отправляет запрос и ответ JSP.
- JSP записывает тело ответа.
- Servletcontainer фиксирует HTTP-ответ.
- Сервер отправляет HTTP-ответ обратно на клиентские и мусорные объекты запроса и ответа.
- Клиент получает HTTP-ответ и обрабатывает его (отображает HTML, применяет CSS, выполняет JS).
Когда вы отправляете новый запрос, отправляя форму, он не будет повторно использовать те же объекты запроса и ответа.
Существует два способа преодоления этого безгосударственного характера HTTP. Вам нужно преобразовать этот объект в String
и включить его в скрытое поле ввода формы HTML в JSP, чтобы он был доступен как параметр запроса при отправке.
<input type="hidden" name="myObject" value="${myObjectAsString}" />
Преобразование необходимо, потому что HTTP и HTML не понимают объекты Java. HTML в перспективе Java в основном один большой String
(сделайте правый клик и View Source в webbrowser, чтобы увидеть его). Если вы не конвертируете объект Java в String
, то по умолчанию результат Java object toString()
будет напечатан в HTML.
Или, если объект слишком большой или слишком сложный для преобразования в String
и наоборот, тогда вам нужно сохранить его в памяти сервера или в какой-либо базе данных и вместо этого передать свой уникальный идентификатор в качестве скрытого значения ввода, Обычно для этого используется область сеанса.
Предварительная обработка формы Пример сервлета:
String myObjectId = UUID.randomUUID().toString();
request.getSession().setAttribute(myObjectId, myObject);
request.setAttribute("myObjectId", myObjectId);
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
Пример JSP:
<input type="hidden" name="myObjectId" value="${myObjectId}" />
Постобработка формы Пример сервлета:
String myObjectId = request.getParameter("myObjectId");
Object myObject = request.getSession().getAttribute(myObjectId);
request.getSession().removeAttribute(myObjectId);
// ...