> Here's something I'm using to accomplish this: > http://www.systemmobile.com/wp/?p=114 > It's pretty simple, but can be refit to be fairly complex. >
I've done something similar too, just another approach using other extension points in Struts. I extend the ActionForward adding some properties to hold the arguments. <forward name="Entity" path="/BusinessEntityDetail.do" redirect="true" className="com.rustts.action.RusttsForwardAction"> <set-property property="arg1" value="masterFileId"/> <set-property property="arg2" value="nameTyp"/> <set-property property="arg3" value="srchTyp"/> <set-property property="arg4" value="entityId"/> <set-property property="arg5" value="entityId2"/> </forward> I extended the ActionMapping adding a transient HttpServletRequest and ActionForm. These values where staged by a base Action class. ActionForward forward = null; if (mapping instanceof IRusttsActionMapping) { ((IRusttsActionMapping) mapping).setState(form, request); } The extended ActionMapping had an overridden findForward that passed the request and form bean to the ActionForward. public ActionForward findForward(String name) { ActionForward forward = super.findForward(name); if ((forward != null) && (forward instanceof IRusttsForwardAction) && (request != null) && (form != null)) { forward = ((IRusttsForwardAction) forward).stageForward(form, request); } return forward; } The stageForward method of the action forward would add the parameters to the path. /** * This is a factory method to handle the prorogation * of key arguments to the target of the action forward. * if the action is a redirect, a query string of encoded * arguments will be added to the path. Otherwise the data * (Map) will be staged on the request. */ public ActionForward stageForward( ActionForm form, HttpServletRequest request) { ActionForward targetForward = null; try { Map sourceArgs = BeanUtils.describe(form); String[] targetNames = getArgs(); Map targetArgs = (Map) new TreeMap(); for (int i = 0; i < targetNames.length; ++i) { if (sourceArgs.containsKey(targetNames[i])) { Object arg = sourceArgs.get(targetNames[i]); if (arg != null) targetArgs.put(targetNames[i], arg); arg = null; } } if (redirect) { if (!targetArgs.isEmpty()) { StringBuffer buff = new StringBuffer(path); //look for an existing query string delimiter boolean firstArg = true; if (buff.toString().indexOf('?') > -1) { firstArg = false; } else buff.append("?"); Iterator vi = targetArgs.keySet().iterator(); while (vi.hasNext()) { String name = (String) vi.next(); Object arg = targetArgs.get(name); if (arg != null) { String value = URLEncoder.encode(arg.toString()); buff.append((firstArg) ? "" : "&").append( name).append( "=").append( value); firstArg = false; value = null; } arg = null; name = null; } //build an new ActionForward with the new query targetForward = new ActionForward(buff.toString(), true); buff = null; vi = null; } else targetForward = this; } else { //stage the data pickle in request scope for the next page request.setAttribute( com.rustts.Globals.RUSTTS_FORWARD_KEY, targetArgs); targetForward = this; } targetNames = null; sourceArgs = null; targetArgs = null; } catch (Exception e) { targetForward = this; } return targetForward; } It looks like a lot of code but after implemented provided a declarative way to handle passing parameters transparent of forward verses redirect. Gary > > On 6/14/05, Frank W. Zammetti <[EMAIL PROTECTED]> wrote: > > Sorry, my bad... it's not setURL, it's setPath. It's actually a method > > of ForwardConfig, which ActionForward extends. Look in the third table > > down in the link you sent, the section labeled "Methods inherited from > > class org.apache.struts.config.ForwardConfig". > > > > That's what I get for going from memory ;) > > > > Frank > > > > Zarar Siddiqi wrote: > > > Where do you see the af.setURL(String) method in the ActionForward class? > > > http://struts.apache.org/api/org/apache/struts/action/ActionForward.html > > > > > > I had a similar problem where dynamic values needed to be passed in via > > > an ActionForward but I wasn't able to find something as simple as you > > > suggest. I had to store the values in session scope (because the > > > ActionForward had redirect=true) and then clean up the session in my > > > receiving code. > > > > > > So you store the values that you are passing in session scope for a > > > quick millisecond while you forward and then clean up once you're in the > > > called method. > > > > > > Zarar > > > > > > > > > ----- Original Message ----- From: "Frank W. Zammetti" > > > <[EMAIL PROTECTED]> > > > To: "Struts Users Mailing List" <user@struts.apache.org> > > > Cc: "Struts Users Mailing List" <user@struts.apache.org> > > > Sent: Tuesday, June 14, 2005 9:27 AM > > > Subject: Re: Sending dynamic parameters to a forward > > > > > > > > >> You can, IIRC, append a query string to the URL returned by your > > >> forward... off the top of my head, it would look something like > > >> this... in > > >> Action 1: > > >> > > >> String param1Val = "someValue1"; > > >> String param2Val = "someValue2"; > > >> String queryString = "?param1=" + param1Val + "¶m2 = " + param2Val; > > >> ActionForward af = new > > >> ActionForward(mapping.findForward("ForwardToAction2")); > > >> af.setURL(af.getURL() + queryString); > > >> return af; > > >> > > >> You'll probably want to encode the parameter values, I'd suggest Commons > > >> Codec for that. > > >> > > >> -- > > >> Frank W. Zammetti > > >> Founder and Chief Software Architect > > >> Omnytex Technologies > > >> http://www.omnytex.com > > >> > > >> On Tue, June 14, 2005 7:52 am, tarek.nabil said: > > >> > > >>> Hi Everyone, > > >>> > > >>> I have an action (Action1) which when completed successfully, forwards > > >>> to another action (Action2). I need to be able to send dyanamic > > >>> parameters to Action2. I thought about putting the parameters as request > > >>> attributes, but the problem here is that Action2 can be called directly > > >>> using a link from some pages and this case, the parameters will be send > > >>> as request parameters rather than attributes. > > >>> > > >>> I can write code to look in the request attributes and if not found, it > > >>> can check the request parameters, but I was hoping there's another way > > >>> to do it. I thought about setting the redirect attribute to true on this > > >>> forward but I still wouldn't know how to append parameters with dynamic > > >>> values to the forward while forwarding to it from Action1. > > >>> > > >>> Any ideas? > > >>> > > >>> --------------------------------------------------------------------- > > >>> To unsubscribe, e-mail: [EMAIL PROTECTED] > > >>> For additional commands, e-mail: [EMAIL PROTECTED] > > >>> > > >>> > > >> > > >> > > >> --------------------------------------------------------------------- > > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > > >> For additional commands, e-mail: [EMAIL PROTECTED] > > >> > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > -- > > Frank W. Zammetti > > Founder and Chief Software Architect > > Omnytex Technologies > > http://www.omnytex.com > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]