SV: What is the best way to pass a parameter to a forward? Create a utility class

2004-03-16 Thread Tommy Holm - TELMORE
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:
 
action
   path=/EntrySave
   type=com.package.EntrySaveAction
   name=EntryForm
   validate=true
   input=/Entry.do
   forward name=success redirect=true path=/Container.do/
   forward name=failure redirect=false path=/Entry.do /
/action
 
 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 = 

SV: What is the best way to pass a parameter to a forward? Create a utility class .Client code

2004-03-16 Thread Tommy Holm - TELMORE
Forgot to show the code how to use it!
In your action you should not return 
return mapping.findForward(bla) 
but 
Hashtable a = new Hashtable();//add what ever key/value pairs you need
return new
ActionForwardParameters().add(a).forward(mapping.findForward(success))
;

-Oprindelig meddelelse-
Fra: Tommy Holm - TELMORE 
Sendt: 16. marts 2004 13:48
Til: Struts Users Mailing List
Emne: SV: What is the best way to pass a parameter to a forward? Create
a utility class


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:
 
action
   path=/EntrySave
   type=com.package.EntrySaveAction
   name=EntryForm
   validate=true
   input=/Entry.do
   forward name=success redirect=true path=/Container.do/
   forward name=failure redirect=false path=/Entry.do /
/action
 
 Basically, if I left the EntrySaveAction.execute do what's doing right