I have a home-grown MVC implementation. A ControllerServlet like so:
/controller?cmd=EditUser&userid=55
From this URL, the controller creates a EditUserCommand.class instance and calls an execute() method which returns the result page (ex. user.jsp) to display.
The controller servlet then does a …
getRequestDispatcher(resultPage).forward(request, response);
… and the resulting page is shown.
One of the things the controller does is set messages (error, info, and so on) as request attribtues. For example:
request.setAttribute("infoMessage", "User was edited successfully.");
And that message gets pulled out of the request in the user.jsp page and displayed.
Works fine.
Now here comes my problem.
Sometimes my commands don’t return a page like user.jsp but return a URL like cmd=ShowUser&userid=55 for the result. This is because there might be things I want to check before displaying the final page, like permission to view the user and so on.
When I do this the “infoMessage” I placed in the request never appears because the result is a URL that makes a new call to the servlet, which is a new request. The new request doesn’t maintain the request attributes from the first request; which makes sense, I just didn’t forsee this happening.
How can I make my request variable “stay alive” until it’s actually displayed on the final page that results from the original request?
Any suggestions or advice are appreciated. Just FYI, I can’t re-write the entire app to go to something like Struts, Spring MVC, of JSF. It’s not an option.
Thanks!
Rob
You may be giving a simple example, but your control flow causes the “Resend” Error, perhaps? Basically, after making any change to the data, the controller must immediately do a “Get” via a redirect and the screen should be displayed completely stateless.
Please take a look:
http://en.wikipedia.org/wiki/Post/Redirect/Get
As such, Attributes are not a great help. What you may want to consider is, maintaining a Bean/Object for every login user, and persist this object in a LRU cache (JCache or MemcacheD), and retrieve it on every entry to the application. Once you have that, you can maintain a pseudo-state such as previous results in that object.
In any case, using Attributes to retain state will severely constrain your options. You need to have a more generic flexible routing-independent mechanism.