Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing an object from JSP page back to Servlet

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.

like image 209
kuriouscoder Avatar asked Nov 23 '10 07:11

kuriouscoder


People also ask

How does JSP page converts to servlet give an example?

The JSP engine loads the JSP page from disk and converts it into a servlet content. This conversion is very simple in which all template text is converted to println( ) statements and all JSP elements are converted to Java code. This code implements the corresponding dynamic behavior of the page.

Is JSP page is translated into servlet?

When a request is mapped to a JSP page, the web container first checks whether the JSP page's servlet is older than the JSP page. If the servlet is older, the web container translates the JSP page into a servlet class and compiles the class.


2 Answers

Learn how HTTP works:

  • Client (usually, a web browser) 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 and destroys request and response objects.
  • Server sends HTTP response back to client.
  • 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 to String 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, which is not per definition convertible back to the original Java object. Most commonly used String formats of complex objects are JSON and XML. There are a lot of Java libraries available which can convert between complex Java objects and a String in JSON or XML format.

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.

So, in the servlet which prepares the data and forwards to the JSP page:

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

And, in the forwarded JSP page:

<form action="nextservlet" method="post">     <input type="hidden" name="myObjectId" value="${myObjectId}" />     ... </form> 

Finally, in the next servlet which processes the form submit:

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

See also:

  • How do servlets work? Instantiation, sessions, shared variables and multithreading
  • How can I store state for an individual browser tab/window?
like image 73
BalusC Avatar answered Oct 01 '22 12:10

BalusC


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.

like image 32
Pokuri Avatar answered Oct 01 '22 10:10

Pokuri