Passing an object from JSP page back to Servlet

2019-01-01 04:15发布

In short, I want to know how to pass an object from JSP page back to a Servlet. Specifically, I have a form element whose action tag references a servlet. On form submission, I want to embed an object in HttpServletRequest request object so that it can be dereferenced by servlet.

So far, I have tried setting request.setAttribute(object) in JSP page. But still retrieving it from servlet gives it as null. Any pointers would be appreciated.

3条回答
唯独是你
2楼-- · 2019-01-01 04:38

Learn how HTTP works:

  • Client fires HTTP request.
  • Server retrieves HTTP request.
  • Servletcontainer creates new HttpServletRequest and HttpServletResponse objects.
  • Servletcontainer invokes appropriate servlet with those objects.
  • Servlet processes request and forwards request and response to JSP.
  • JSP writes to the response body.
  • Servletcontainer commits HTTP response.
  • Server sends HTTP response back to client and garbages request and response objects.
  • Client retrieves HTTP response and processes it (display HTML, apply CSS, execute JS).

When you send a new request by submitting the form, it won't reuse the same request and response objects.

There are two ways to overcome this stateless nature of HTTP. You need to convert this object to String and include it in a hidden input field of the HTML form in the JSP so that it'll be available as request parameter upon submission.

<input type="hidden" name="myObject" value="${myObjectAsString}" />

The conversion is necessary because HTTP and HTML doesn't understand Java objects. HTML is in Java's perspective basically one large String (do a rightclick and View Source in webbrowser to see it). If you don't convert a Java object to String, then by default Java object's toString() result will be printed to HTML.

Or, if the object is too large or too complex to be converted to String and vice versa, then you need to store it in the server's memory or in some database and instead pass its unique identifier around as hidden input value. Usually the session scope is been used for this.

Form preprocessing Servlet example:

String myObjectId = UUID.randomUUID().toString();
request.getSession().setAttribute(myObjectId, myObject);
request.setAttribute("myObjectId", myObjectId);
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);

JSP example:

<input type="hidden" name="myObjectId" value="${myObjectId}" />

Form postprocessing Servlet example:

String myObjectId = request.getParameter("myObjectId");
Object myObject = request.getSession().getAttribute(myObjectId);
request.getSession().removeAttribute(myObjectId);
// ...

See also:

查看更多
只靠听说
3楼-- · 2019-01-01 04:39

Best way is to encode Java object in base64 and then pass it as a String from JSP to servlet.

For example -

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()));

Pass this result in HTTP request -

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

Read it on server back to java object -

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();
查看更多
明月照影归
4楼-- · 2019-01-01 04:45

once the JSP is rendered the request object is over. So the object you set on request of JSP is available for that JSP page request alone. Do you have any constraint on using session instead of request. So, session can hold data between fresh requests until the session expires.

查看更多
登录 后发表回答