DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=866>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=866

Clean Way to Add Parameters to Redirecting Forward





------- Additional Comments From [EMAIL PROTECTED]  2004-01-31 00:19 -------

My patch will do the following:

1. Add ActionRedirect methods
   - new constructors which accept a ServletContext (needed to evaluate 
messages).
   - new methods:
     addMessage(HttpServletRequest request, ActionMessage message)
     addMessage(HttpServletRequest request, String key, ActionMessage message)
     addErrorMessage(HttpServletRequest request, ActionMessage message)
     addErrorMessage(HttpServletRequest request, String key, ActionMessage 
message)
      The "key" is for specifying the resource bundle to use.

2. In the ActionRedirect class, the message is evaluated using 
MessageResources. This is done here because the actual message may need 
additional parameters ("new ActionMessage(key, arg0, arg1)") that should not 
(and cannot) be passed as redirect params.

3. The resulting message is added to the redirect params using a unique param 
name. A "unique param name" is easy to set up when you're working on a 
particular application, but for a framework, the user should be able to specify 
this. I've added "msgParamName" and "errorParamName" to ControllerConfig to 
allow the user to specify the request parameter to use for normal msgs and 
error msgs. (I was thinking "redirectMessageParamName" 
and "redirectErrorMessageParamName" were too long.)  

4. In RequestProcessor.process(request,response), after processActionPerform() 
and before processForwardConfig() is called, I inserted a 
processRedirectMessages() call.  In that method, the request is checked for 
params with names specified by "msgParamName" and "errorParamName".  If 
messages are present, ActionMessage objects are created to hold them and they 
are added to the existing ActionMessages that is referred to by 
Globals.MESSAGE_KEY or Globals.ERROR_KEY, depending on whether the message is 
for an error or not.  (If the needed ActionMessages object doesn't exist, it is 
created).

5. For the redirected ActionMessage to work, the user must include an entry in 
the app's message resources:

org.apache.struts.action.redirect.message={0}


The use of ActionRedirect changes slightly:

ActionRedirect redirect = getActionRedirect(mapping.findForward("target"));
redirect.addParameter("param1","value1");
redirect.addParameter("param2","value2");
redirect.addMessage(request, new ActionMessage("msg.key",obj1,obj2));
redirect.addErrorMessage(request, new ActionMessage("error.key",errorParams));
return redirect;

getActionRedirect() is a convenience method in the Action class which creates 
an ActionRedirect instance with the servlet context already provided.

If the user creates an ActionRedirect without a servlet context, then attempts 
to add an ActionMessage, an IllegalStateException is thrown.  (If the user even 
tests the redirect-with-a-msg even once, this would be caught while in dev).

I've updated my struts source base with the latest CVS changes, and used that 
to enter my changes.  I've tested it with a test app, and I'm now preparing 
unit tests that I can submit with the patch.

There are several areas here where people might want to chime in, and so I'm 
posting these details here before I submit anything.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to