Передача объекта со страницы JSP обратно в сервлет - PullRequest
22 голосов
/ 23 ноября 2010

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

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

Ответы [ 3 ]

41 голосов
/ 23 ноября 2010

Узнайте, как работает 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 (сделайте правый клик и Просмотреть исходный код в веб-браузере, чтобы увидеть его).Если вы не преобразуете объект Java в String, то по умолчанию результат toString() объекта Java будет распечатан в 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 голосов
/ 24 января 2017

Лучший способ - закодировать объект 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();
2 голосов
/ 23 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...