Подтвердить что ты не робот

Передача объекта с страницы JSP обратно в Servlet

Короче говоря, я хочу знать, как передать object с страницы JSP обратно на сервлет. В частности, у меня есть элемент формы, чей тег действия ссылается на сервлет. При отправке формы я хочу вставить запрос object in HttpServletRequest object, чтобы он мог быть разыменован сервлетом.

До сих пор я пробовал установку request.setAttribute(object) на странице JSP. Но все же получение его из сервлета дает ему значение null. Любые указатели будут оценены.

4b9b3361

Ответ 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);
// ...

См. также:

Ответ 2

как только JSP отображается, объект запроса завершен. Таким образом, объект, который вы задали по запросу JSP, доступен только для одного запроса страницы JSP. У вас есть ограничение на использование сеанса вместо запроса. Таким образом, сеанс может хранить данные между новыми запросами до истечения срока действия сеанса.

Ответ 3

Лучший способ - закодировать объект Java в base64, а затем передать его как строку из JSP в сервлет.

Например -

final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(javaObject);
oos.flush();
final String result = new String(Base64.getEncoder().encode(baos.toByteArray()));

Передайте этот результат в HTTP-запросе -

   <input type = "hidden" name="<%= "MY_JAVA_OBJECT" %>" value="<%= result  %>" />

Прочтите его на сервере обратно в объект java -

final String base64String = request.getparameter("MY_JAVA_OBJECT");
final byte[] objToBytes = Base64.getDecoder().decode(base64String);
ByteArrayInputStream bais = new ByteArrayInputStream(objToBytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return (ObjectClass) ois.readObject();