Some time ago this question has been asked before and someone showed
some utility class code. I used the code and created a class like this:
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import org.apache.struts.action.ActionForward;
/**
* Simple utility class to add parameters to an ActionForward
* from within an action. This action is useful when you from
* within an action need to pass parameters to the jsp page or another
action
* you are forwarding to.
*/
public class ActionForwardParameters {
/**
* Encupsulates parameters for ActionForward.
*/
private Map params = new HashMap();
/**
* add all the parameters and values from the hashtable to the
actionforward
* @param parametersValues a hastable with key value pairs
* @return ActionForwardParameters object
*/
public ActionForwardParameters add(Hashtable parametersValues) {
for(Iterator i =
parametersValues.keySet().iterator();i.hasNext();){
String key = (String) i.next();
params.put(key,(String) parametersValues.get(key));
}
return this;
}
/**
* Add parameters to provided ActionForward
* @param forward ActionForward to add parameters to
* @return ActionForward with added parameters to URL
*/
public ActionForward forward(ActionForward forward) {
StringBuffer path = new StringBuffer(forward.getPath());
Iterator iter = params.entrySet().iterator();
if (iter.hasNext()) {
//add first parameter, if avaliable
Map.Entry entry = (Map.Entry) iter.next();
path.append("?" + entry.getKey() + "=" + entry.getValue());
//add other parameters
while (iter.hasNext()) {
entry = (Map.Entry) iter.next();
path.append("&" + entry.getKey() + "=" +
entry.getValue());
}
}
return new ActionForward(path.toString());
}
}
Please note that I didn't come up with the idea of this class, I simply
created the class after reading the information that a fellow programmer
Provided.!
-Oprindelig meddelelse-
Fra: Jay Glanville [mailto:[EMAIL PROTECTED]
Sendt: 16. marts 2004 13:13
Til: 'Struts Users Mailing List'
Emne: RE: What is the best way to pass a parameter to a forward?
It's funny that you say that it will not work, because it does for me,
and without throwing any exceptions.
That being said, your point about modifying an action mappings forwards
is a good one. It is unfortunate that the ActionForward class doesn't
have a copy constructor
--
Jay Glanville
> -Original Message-
> From: news [mailto:[EMAIL PROTECTED] On Behalf Of Martin Cooper
> Sent: Monday, March 15, 2004 8:30 PM
> To: [EMAIL PROTECTED]
> Subject: Re: What is the best way to pass a parameter to a forward?
>
>
> What you are doing will not work - at least, not the way you
> are doing it.
> You are trying to modify the ActionForward instance that is
> owned by Struts,
> and calling setPath() on that instance will result in an
> IllegalStateException.
>
> You need to create your own ActionForward instance, instead
> of trying to
> modify Struts' one. You can do that with something like this:
>
> ActionForward goto = mapping.findForward( "success" );
> String path = ...; // Put together your new path
> ActionForward myGoto = new ActionForward(path,
> goto.getRedirect());
> return myGoto;
>
> --
> Martin Cooper
>
>
> "Glanville, Jay" <[EMAIL PROTECTED]> wrote
> in message
> news:[EMAIL PROTECTED]
> I'm trying to solve a problem, but I'm not sure my solution
> is the best
> way. Basically, I want to set a parameter on a forward within the
> action's execute.
>
> I'm in my action's execute method. I've just successfully performed
> some work, and I now want to forward/redirect to the next page. So,
> I've got some code that looks like this:
>
>public ActionForward execute(ActionMapping.) {
> // do some work
> ActionForward goto = mapping.findForward( "success" );
> return goto;
>}
>
> With an action mapping that looks like this:
>
> path="/EntrySave"
> type="com.package.EntrySaveAction"
> name="EntryForm"
> validate="true"
> input="/Entry.do">
>
>
>
>
> Basically, if I left the EntrySaveAction.execute do what's doing right
> now, then upon successful completion, it would redirect to
> "/Container.do". However, what I want it to do is redirect to
> "/Container.do?id=45", where 45 is the id of the container that I want
> to go to. The value of "45" is dynamic, and is know at the time of
> the EntrySaveAction.execute command.
>
> The way I'm currently doing it is something like this:
>
>public ActionForward execute(ActionMapping.) {
> // do some work
> ActionForward goto = mapping.findForward( "success" )