You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by "Deadman, Hal" <ha...@tallan.com> on 2001/05/11 21:38:42 UTC

RE: RE-2: cvs commit: jakarta-struts/src/share/org/apache/struts/acti on Action.java ActionForm.java

I thought of that too but I don't know how to add parameters to the request.
Maybe you could use request.setAttribute and store the multi-part request
String parameters as attributes in the requet object. Then code that looks
for parameters could be changed to a method that looks for parameters or
attributes. I don't know if that would help matters much.

I use something similar in my application so that I can have an action that
is accessed from a link or from another action. In one case the paramters
are passed on the url and in the other case parameters are passed as request
attributes. The receiving action calls a method that checks for one and then
the other, using the first one it finds.

    protected String findStringParameter(HttpServletRequest request, String
key)
    {
        String value = request.getParameter(key);
        if (value == null)
        {
            value = (String) request.getAttribute(key);
        }
        return value;
    }

> -----Original Message-----
> From: SCHACHTER,MICHAEL (HP-NewJersey,ex2) [mailto:mschachter@hp.com]
> Sent: Friday, May 11, 2001 2:19 PM
> To: 'struts-dev@jakarta.apache.org'
> Subject: RE-2: cvs commit:
> jakarta-struts/src/share/org/apache/struts/acti on Action.java
> ActionForm.java
>
>
> On second thought, I'm going to toy around with putting the request
> parameters
> directly into the request from MultipartRequestHandler
> instead of using
> MultipartRequestHandler itself to store attributes.  If I can
> get it to work
> this will solve all
> the problems without adding any new methods to anything, or changing
> anything.
>
> -----Original Message-----
> From: SCHACHTER,MICHAEL (HP-NewJersey,ex2)
> Sent: Friday, May 11, 2001 2:08 PM
> To: 'struts-dev@jakarta.apache.org'
> Subject: RE: cvs commit:
> jakarta-struts/src/share/org/apache/struts/action Action.java
> ActionForm.java
>
>
> Is this an acceptable resolution to this problem for
> everybody?  If so, I'll
> go ahead and fix the token problem in the Action class, be
> creating new
> isTokenValid() method that takes an HttpServletRequest and a
> MultipartRequestHandler
> as arguments, when using it for multipart forms.  The other
> token methods
> don't
> need to be changed, as they only deal with retrieiving
> session information.
>
> -----Original Message-----
> From: SCHACHTER,MICHAEL (HP-NewJersey,ex2) [mailto:mschachter@hp.com]
> Sent: Friday, May 11, 2001 1:29 PM
> To: 'struts-dev@jakarta.apache.org'
> Subject: RE: cvs commit:
> jakarta-struts/src/share/org/apache/struts/action Action.java
> ActionForm.java
>
>
> Hal,
>
> It was my understanding that since isCancelled is a protected
> method in the
> Action class,
> that it was the Action developer's job to call the method.
>
> -----Original Message-----
> From: Deadman, Hal [mailto:hal.deadman@tallan.com]
> Sent: Friday, May 11, 2001 1:24 PM
> To: struts-dev@jakarta.apache.org
> Subject: RE: cvs commit:
> jakarta-struts/src/share/org/apache/struts/action Action.java
> ActionForm.java
>
>
> Doesn't the Struts framework need to call this new method
> somewhere? The
> application code can't call the isCancelled method because
> the Action class
> code will never be called. If Struts ActionServlet calls the
> form validate
> when a user clicked cancel, the validation will likely fail
> and the user
> will be presented with the input form again. Clicking cancel
> needs to bypass
> the call to the form validate method. If that is done then the new
> isCancelled method may be used in the perform method.
>
> Hal
>
> > -----Original Message-----
> > From: mschachter@apache.org [mailto:mschachter@apache.org]
> > Sent: Friday, May 11, 2001 1:11 PM
> > To: jakarta-struts-cvs@apache.org
> > Subject: cvs commit:
> jakarta-struts/src/share/org/apache/struts/action
> > Action.java ActionForm.java
> >
> >
> > mschachter    01/05/11 10:11:06
> >
> >   Modified:    doc      todo-1.1.xml
> >                src/share/org/apache/struts/action Action.java
> >                         ActionForm.java
> >   Log:
> >    - Add an isCancelled() method to the Action class that takes a
> >      MultipartRequestHandler as an argument.  This should address
> >      issues with the html:cancel tag, as long as the new isCancelled
> >      method is called on for multipart forms.
> >    - Add myself to the EJB Design Pattern TODO
> >
> >   Revision  Changes    Path
> >   1.3       +3 -0      jakarta-struts/doc/todo-1.1.xml
> >
> >   Index: todo-1.1.xml
> >
> ===================================================================
> >   RCS file: /home/cvs/jakarta-struts/doc/todo-1.1.xml,v
> >   retrieving revision 1.2
> >   retrieving revision 1.3
> >   diff -u -r1.2 -r1.3
> >   --- todo-1.1.xml	2001/04/12 16:00:42	1.2
> >   +++ todo-1.1.xml	2001/05/11 17:10:47	1.3
> >   @@ -159,6 +159,9 @@
> >          <assigned>
> >            <a href="mailto:nic.hobbs@uk.pwcglobal.com">Nic Hobbs</a>
> >          </assigned>
> >   +      <assigned>
> >   +        <a href="mailto:mschachter@hp.com">Mike Schachter</a>
> >   +      </assigned>
> >        </task>
> >
> >        <task name="HTML No-Cache Support">
> >
> >
> >
> >   1.20      +27 -4
> > jakarta-struts/src/share/org/apache/struts/action/Action.java
> >
> >   Index: Action.java
> >
> ===================================================================
> >   RCS file:
> > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > tion.java,v
> >   retrieving revision 1.19
> >   retrieving revision 1.20
> >   diff -u -r1.19 -r1.20
> >   --- Action.java	2001/02/23 21:13:09	1.19
> >   +++ Action.java	2001/05/11 17:10:55	1.20
> >   @@ -1,7 +1,7 @@
> >    /*
> >   - * $Header:
> > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > tion.java,v 1.19 2001/02/23 21:13:09 craigmcc Exp $
> >   - * $Revision: 1.19 $
> >   - * $Date: 2001/02/23 21:13:09 $
> >   + * $Header:
> > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > tion.java,v 1.20 2001/05/11 17:10:55 mschachter Exp $
> >   + * $Revision: 1.20 $
> >   + * $Date: 2001/05/11 17:10:55 $
> >     *
> >     *
> > ====================================================================
> >     *
> >   @@ -67,6 +67,7 @@
> >    import java.security.MessageDigest;
> >    import java.security.NoSuchAlgorithmException;
> >    import java.util.Locale;
> >   +import java.util.Hashtable;
> >    import javax.servlet.ServletException;
> >    import javax.servlet.ServletRequest;
> >    import javax.servlet.ServletResponse;
> >   @@ -75,6 +76,7 @@
> >    import javax.servlet.http.HttpSession;
> >    import org.apache.struts.taglib.html.Constants;
> >    import org.apache.struts.util.MessageResources;
> >   +import org.apache.struts.upload.MultipartRequestHandler;
> >
> >
> >    /**
> >   @@ -106,7 +108,7 @@
> >     * by this Action.
> >     *
> >     * @author Craig R. McClanahan
> >   - * @version $Revision: 1.19 $ $Date: 2001/02/23 21:13:09 $
> >   + * @version $Revision: 1.20 $ $Date: 2001/05/11 17:10:55 $
> >     */
> >
> >    public class Action {
> >   @@ -466,6 +468,27 @@
> >    	return
> > ((request.getParameter(Constants.CANCEL_PROPERTY) != null) ||
> >
> > (request.getParameter(Constants.CANCEL_PROPERTY_X) != null));
> >
> >   +    }
> >   +
> >   +    /**
> >   +     * Returns <code>true</code> if the current multipart
> > form's cancel button was
> >   +     * pressed.  This method will check if the cancel
> > button generated by
> >   +     * <strong>CancelTag</strong> was pressed by the user in the
> >   +     * current request.  If true, validation performed by an
> >   +     * <strong>ActionForm</strong> validate() method
> will have been
> >   +     * skipped by the controller servlet.  A
> > MultipartRequestHandler instance
> >   +     * can be obtained from a multipart form by calling
> >   +     * {@link ActionForm#getMultipartRequestHandler()
> > ActionForm.getMultipartRequestHandler()}.
> >   +     *
> >   +     * @param request The servlet request we are processing
> >   +     * @see org.apache.struts.taglib.CancelTag
> >   +     * @see org.apache.struts.action.ValidatingActionForm
> >   +     */
> >   +    protected boolean isCancelled(MultipartRequestHandler
> > request) {
> >   +
> >   +        Hashtable elements = request.getTextElements();
> >   +        return ((elements.get(Constants.CANCEL_PROPERTY)
> > != null) ||
> >   +                (elements.get(Constants.CANCEL_PROPERTY_X)
> > != null));
> >        }
> >
> >
> >
> >
> >
> >   1.7       +7 -5
> > jakarta-struts/src/share/org/apache/struts/action/ActionForm.java
> >
> >   Index: ActionForm.java
> >
> ===================================================================
> >   RCS file:
> > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > tionForm.java,v
> >   retrieving revision 1.6
> >   retrieving revision 1.7
> >   diff -u -r1.6 -r1.7
> >   --- ActionForm.java	2001/02/21 00:35:43	1.6
> >   +++ ActionForm.java	2001/05/11 17:10:58	1.7
> >   @@ -1,7 +1,7 @@
> >    /*
> >   - * $Header:
> > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > tionForm.java,v 1.6 2001/02/21 00:35:43 craigmcc Exp $
> >   - * $Revision: 1.6 $
> >   - * $Date: 2001/02/21 00:35:43 $
> >   + * $Header:
> > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > tionForm.java,v 1.7 2001/05/11 17:10:58 mschachter Exp $
> >   + * $Revision: 1.7 $
> >   + * $Date: 2001/05/11 17:10:58 $
> >     *
> >     *
> > ====================================================================
> >     *
> >   @@ -94,7 +94,7 @@
> >     * </p>
> >     *
> >     * @author Craig R. McClanahan
> >   - * @version $Revision: 1.6 $ $Date: 2001/02/21 00:35:43 $
> >   + * @version $Revision: 1.7 $ $Date: 2001/05/11 17:10:58 $
> >     */
> >
> >    public abstract class ActionForm implements Serializable {
> >   @@ -134,7 +134,9 @@
> >         * The reasoning behind this is to give form bean developers
> >         * control over the lifecycle of their multipart requests
> >         * through the use of the finish() and/or rollback() methods
> >   -     * of MultipartRequestHandler
> >   +     * of MultipartRequestHandler.  This method will return
> >   +     * <code>null</code> if this form's enctype is not
> >   +     * "multipart/request-data".
> >         * @see org.apache.struts.upload.MultipartRequestHandler
> >         */
> >        public MultipartRequestHandler getMultipartRequestHandler() {
> >
> >
> >
> >
>

Parameters and chaining (was: Re: RE-2: cvs commit: jakarta-struts/src/share/org/apache/struts/acti on Action.java ActionForm.java)

Posted by Martin Cooper <ma...@tumbleweed.com>.
Actually, one of the reasons I elected to use a separate form bean was
actually to avoid one of the issues (for me, anyway) that a parameter stack
would raise.

When a request is chained using a forward, the set of parameters presented
to the second action is the union of those supplied in the first and second
requests. What bothers me most about that is the dependency introduced
between the two actions and their parameters.

For example, if the second action behaves differently depending on the
presence or absence of a particular parameter, then it would be very
important to know if that same parameter name was ever used by the first
action. Even if the parameter was not specified for the forward itself, if
it was present in the request for the first action, it will be present in
the request for the second action.

Hence I decided to avoid even looking at the request parameters when an
action is chained to. True, my second action has to know to look for a
separate bean, but at least I know what I'm passing and receiving.

It would be nice if there was some Struts mechanism so that I could tell
Struts "please pass this form bean directly to the target action instead of
resetting one and populating it from request parameters". Then my target
action wouldn't need to be aware that it was the target of the chain, or
that the form bean was hand-crafted.

One way would be for Struts to do part of what I'm doing behind the scenes.
That is, I could call a Struts method like setForwardFormBean() to set up
the bean, and Struts could store it in the request under a well-known
attribute name. Then, before resetting and populating a form bean as usual,
Struts would look for a form bean under that same attribute name and, if it
was present, pass that to perform() instead creating/resetting and
populating as usual.

Thoughts, anyone?

--
Martin Cooper


----- Original Message -----
From: "William Shulman" <wi...@metaconsortium.com>
To: <st...@jakarta.apache.org>
Sent: Friday, May 11, 2001 2:47 PM
Subject: RE: RE-2: cvs commit:
jakarta-struts/src/share/org/apache/struts/acti on Action.java
ActionForm.java


>
> Sounds like another good solution might be to implement a parameter
> stack in the request object. The parameter stack is a stack of
> Dictionary objects. When parameters are introduced, they are placed
> in the Dictionary on the top of the stack. Similarly for lookup. Stack
> frames (i.e. the Dictionaries) are pushed and popped appropriately as
> you chain.
>
> Just a thought. There may be some details to work out, but the
> solution would be very general and useful in many places.
>
> -will
>
> Martin Cooper writes:
>  > As far as I am aware, you cannot add parameters to the request.
>  >
>  > I think storing values as request attributes and then looking there for
>  > parameter values would be very dangerous. You could potentially break
>  > existing code that uses request attributes to store data for chaining
actions.
>  >
>  > Incidentally, Hal, I faced a similar problem in chaining actions. What
I
>  > did was to instantiate a separate form bean and store the chaining
>  > parameters in that, then use one well-known (between our Actions, I
mean)
>  > request attribute to store that bean. The chained-to action checks for
that
>  > bean first, otherwise it uses the one Struts passed to the perform()
method.
>  >
>  > --
>  > Martin Cooper
>  >
>  >
>  > At 12:38 PM 5/11/01, Deadman, Hal wrote:
>  > >I thought of that too but I don't know how to add parameters to the
request.
>  > >Maybe you could use request.setAttribute and store the multi-part
request
>  > >String parameters as attributes in the requet object. Then code that
looks
>  > >for parameters could be changed to a method that looks for parameters
or
>  > >attributes. I don't know if that would help matters much.
>  > >
>  > >I use something similar in my application so that I can have an action
that
>  > >is accessed from a link or from another action. In one case the
paramters
>  > >are passed on the url and in the other case parameters are passed as
request
>  > >attributes. The receiving action calls a method that checks for one
and then
>  > >the other, using the first one it finds.
>  > >
>  > >     protected String findStringParameter(HttpServletRequest request,
String
>  > >key)
>  > >     {
>  > >         String value = request.getParameter(key);
>  > >         if (value == null)
>  > >         {
>  > >             value = (String) request.getAttribute(key);
>  > >         }
>  > >         return value;
>  > >     }
>  > >
>  > > > -----Original Message-----
>  > > > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2)
[mailto:mschachter@hp.com]
>  > > > Sent: Friday, May 11, 2001 2:19 PM
>  > > > To: 'struts-dev@jakarta.apache.org'
>  > > > Subject: RE-2: cvs commit:
>  > > > jakarta-struts/src/share/org/apache/struts/acti on Action.java
>  > > > ActionForm.java
>  > > >
>  > > >
>  > > > On second thought, I'm going to toy around with putting the request
>  > > > parameters
>  > > > directly into the request from MultipartRequestHandler
>  > > > instead of using
>  > > > MultipartRequestHandler itself to store attributes.  If I can
>  > > > get it to work
>  > > > this will solve all
>  > > > the problems without adding any new methods to anything, or
changing
>  > > > anything.
>  > > >
>  > > > -----Original Message-----
>  > > > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2)
>  > > > Sent: Friday, May 11, 2001 2:08 PM
>  > > > To: 'struts-dev@jakarta.apache.org'
>  > > > Subject: RE: cvs commit:
>  > > > jakarta-struts/src/share/org/apache/struts/action Action.java
>  > > > ActionForm.java
>  > > >
>  > > >
>  > > > Is this an acceptable resolution to this problem for
>  > > > everybody?  If so, I'll
>  > > > go ahead and fix the token problem in the Action class, be
>  > > > creating new
>  > > > isTokenValid() method that takes an HttpServletRequest and a
>  > > > MultipartRequestHandler
>  > > > as arguments, when using it for multipart forms.  The other
>  > > > token methods
>  > > > don't
>  > > > need to be changed, as they only deal with retrieiving
>  > > > session information.
>  > > >
>  > > > -----Original Message-----
>  > > > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2)
[mailto:mschachter@hp.com]
>  > > > Sent: Friday, May 11, 2001 1:29 PM
>  > > > To: 'struts-dev@jakarta.apache.org'
>  > > > Subject: RE: cvs commit:
>  > > > jakarta-struts/src/share/org/apache/struts/action Action.java
>  > > > ActionForm.java
>  > > >
>  > > >
>  > > > Hal,
>  > > >
>  > > > It was my understanding that since isCancelled is a protected
>  > > > method in the
>  > > > Action class,
>  > > > that it was the Action developer's job to call the method.
>  > > >
>  > > > -----Original Message-----
>  > > > From: Deadman, Hal [mailto:hal.deadman@tallan.com]
>  > > > Sent: Friday, May 11, 2001 1:24 PM
>  > > > To: struts-dev@jakarta.apache.org
>  > > > Subject: RE: cvs commit:
>  > > > jakarta-struts/src/share/org/apache/struts/action Action.java
>  > > > ActionForm.java
>  > > >
>  > > >
>  > > > Doesn't the Struts framework need to call this new method
>  > > > somewhere? The
>  > > > application code can't call the isCancelled method because
>  > > > the Action class
>  > > > code will never be called. If Struts ActionServlet calls the
>  > > > form validate
>  > > > when a user clicked cancel, the validation will likely fail
>  > > > and the user
>  > > > will be presented with the input form again. Clicking cancel
>  > > > needs to bypass
>  > > > the call to the form validate method. If that is done then the new
>  > > > isCancelled method may be used in the perform method.
>  > > >
>  > > > Hal
>  > > >
>  > > > > -----Original Message-----
>  > > > > From: mschachter@apache.org [mailto:mschachter@apache.org]
>  > > > > Sent: Friday, May 11, 2001 1:11 PM
>  > > > > To: jakarta-struts-cvs@apache.org
>  > > > > Subject: cvs commit:
>  > > > jakarta-struts/src/share/org/apache/struts/action
>  > > > > Action.java ActionForm.java
>  > > > >
>  > > > >
>  > > > > mschachter    01/05/11 10:11:06
>  > > > >
>  > > > >   Modified:    doc      todo-1.1.xml
>  > > > >                src/share/org/apache/struts/action Action.java
>  > > > >                         ActionForm.java
>  > > > >   Log:
>  > > > >    - Add an isCancelled() method to the Action class that takes a
>  > > > >      MultipartRequestHandler as an argument.  This should address
>  > > > >      issues with the html:cancel tag, as long as the new
isCancelled
>  > > > >      method is called on for multipart forms.
>  > > > >    - Add myself to the EJB Design Pattern TODO
>  > > > >
>  > > > >   Revision  Changes    Path
>  > > > >   1.3       +3 -0      jakarta-struts/doc/todo-1.1.xml
>  > > > >
>  > > > >   Index: todo-1.1.xml
>  > > > >
>  > > > ===================================================================
>  > > > >   RCS file: /home/cvs/jakarta-struts/doc/todo-1.1.xml,v
>  > > > >   retrieving revision 1.2
>  > > > >   retrieving revision 1.3
>  > > > >   diff -u -r1.2 -r1.3
>  > > > >   --- todo-1.1.xml  2001/04/12 16:00:42     1.2
>  > > > >   +++ todo-1.1.xml  2001/05/11 17:10:47     1.3
>  > > > >   @@ -159,6 +159,9 @@
>  > > > >          <assigned>
>  > > > >            <a href="mailto:nic.hobbs@uk.pwcglobal.com">Nic
Hobbs</a>
>  > > > >          </assigned>
>  > > > >   +      <assigned>
>  > > > >   +        <a href="mailto:mschachter@hp.com">Mike Schachter</a>
>  > > > >   +      </assigned>
>  > > > >        </task>
>  > > > >
>  > > > >        <task name="HTML No-Cache Support">
>  > > > >
>  > > > >
>  > > > >
>  > > > >   1.20      +27 -4
>  > > > > jakarta-struts/src/share/org/apache/struts/action/Action.java
>  > > > >
>  > > > >   Index: Action.java
>  > > > >
>  > > > ===================================================================
>  > > > >   RCS file:
>  > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
>  > > > > tion.java,v
>  > > > >   retrieving revision 1.19
>  > > > >   retrieving revision 1.20
>  > > > >   diff -u -r1.19 -r1.20
>  > > > >   --- Action.java   2001/02/23 21:13:09     1.19
>  > > > >   +++ Action.java   2001/05/11 17:10:55     1.20
>  > > > >   @@ -1,7 +1,7 @@
>  > > > >    /*
>  > > > >   - * $Header:
>  > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
>  > > > > tion.java,v 1.19 2001/02/23 21:13:09 craigmcc Exp $
>  > > > >   - * $Revision: 1.19 $
>  > > > >   - * $Date: 2001/02/23 21:13:09 $
>  > > > >   + * $Header:
>  > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
>  > > > > tion.java,v 1.20 2001/05/11 17:10:55 mschachter Exp $
>  > > > >   + * $Revision: 1.20 $
>  > > > >   + * $Date: 2001/05/11 17:10:55 $
>  > > > >     *
>  > > > >     *
>  > > > >
====================================================================
>  > > > >     *
>  > > > >   @@ -67,6 +67,7 @@
>  > > > >    import java.security.MessageDigest;
>  > > > >    import java.security.NoSuchAlgorithmException;
>  > > > >    import java.util.Locale;
>  > > > >   +import java.util.Hashtable;
>  > > > >    import javax.servlet.ServletException;
>  > > > >    import javax.servlet.ServletRequest;
>  > > > >    import javax.servlet.ServletResponse;
>  > > > >   @@ -75,6 +76,7 @@
>  > > > >    import javax.servlet.http.HttpSession;
>  > > > >    import org.apache.struts.taglib.html.Constants;
>  > > > >    import org.apache.struts.util.MessageResources;
>  > > > >   +import org.apache.struts.upload.MultipartRequestHandler;
>  > > > >
>  > > > >
>  > > > >    /**
>  > > > >   @@ -106,7 +108,7 @@
>  > > > >     * by this Action.
>  > > > >     *
>  > > > >     * @author Craig R. McClanahan
>  > > > >   - * @version $Revision: 1.19 $ $Date: 2001/02/23 21:13:09 $
>  > > > >   + * @version $Revision: 1.20 $ $Date: 2001/05/11 17:10:55 $
>  > > > >     */
>  > > > >
>  > > > >    public class Action {
>  > > > >   @@ -466,6 +468,27 @@
>  > > > >     return
>  > > > > ((request.getParameter(Constants.CANCEL_PROPERTY) != null) ||
>  > > > >
>  > > > > (request.getParameter(Constants.CANCEL_PROPERTY_X) != null));
>  > > > >
>  > > > >   +    }
>  > > > >   +
>  > > > >   +    /**
>  > > > >   +     * Returns <code>true</code> if the current multipart
>  > > > > form's cancel button was
>  > > > >   +     * pressed.  This method will check if the cancel
>  > > > > button generated by
>  > > > >   +     * <strong>CancelTag</strong> was pressed by the user in
the
>  > > > >   +     * current request.  If true, validation performed by an
>  > > > >   +     * <strong>ActionForm</strong> validate() method
>  > > > will have been
>  > > > >   +     * skipped by the controller servlet.  A
>  > > > > MultipartRequestHandler instance
>  > > > >   +     * can be obtained from a multipart form by calling
>  > > > >   +     * {@link ActionForm#getMultipartRequestHandler()
>  > > > > ActionForm.getMultipartRequestHandler()}.
>  > > > >   +     *
>  > > > >   +     * @param request The servlet request we are processing
>  > > > >   +     * @see org.apache.struts.taglib.CancelTag
>  > > > >   +     * @see org.apache.struts.action.ValidatingActionForm
>  > > > >   +     */
>  > > > >   +    protected boolean isCancelled(MultipartRequestHandler
>  > > > > request) {
>  > > > >   +
>  > > > >   +        Hashtable elements = request.getTextElements();
>  > > > >   +        return ((elements.get(Constants.CANCEL_PROPERTY)
>  > > > > != null) ||
>  > > > >   +                (elements.get(Constants.CANCEL_PROPERTY_X)
>  > > > > != null));
>  > > > >        }
>  > > > >
>  > > > >
>  > > > >
>  > > > >
>  > > > >
>  > > > >   1.7       +7 -5
>  > > > > jakarta-struts/src/share/org/apache/struts/action/ActionForm.java
>  > > > >
>  > > > >   Index: ActionForm.java
>  > > > >
>  > > > ===================================================================
>  > > > >   RCS file:
>  > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
>  > > > > tionForm.java,v
>  > > > >   retrieving revision 1.6
>  > > > >   retrieving revision 1.7
>  > > > >   diff -u -r1.6 -r1.7
>  > > > >   --- ActionForm.java       2001/02/21 00:35:43     1.6
>  > > > >   +++ ActionForm.java       2001/05/11 17:10:58     1.7
>  > > > >   @@ -1,7 +1,7 @@
>  > > > >    /*
>  > > > >   - * $Header:
>  > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
>  > > > > tionForm.java,v 1.6 2001/02/21 00:35:43 craigmcc Exp $
>  > > > >   - * $Revision: 1.6 $
>  > > > >   - * $Date: 2001/02/21 00:35:43 $
>  > > > >   + * $Header:
>  > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
>  > > > > tionForm.java,v 1.7 2001/05/11 17:10:58 mschachter Exp $
>  > > > >   + * $Revision: 1.7 $
>  > > > >   + * $Date: 2001/05/11 17:10:58 $
>  > > > >     *
>  > > > >     *
>  > > > >
====================================================================
>  > > > >     *
>  > > > >   @@ -94,7 +94,7 @@
>  > > > >     * </p>
>  > > > >     *
>  > > > >     * @author Craig R. McClanahan
>  > > > >   - * @version $Revision: 1.6 $ $Date: 2001/02/21 00:35:43 $
>  > > > >   + * @version $Revision: 1.7 $ $Date: 2001/05/11 17:10:58 $
>  > > > >     */
>  > > > >
>  > > > >    public abstract class ActionForm implements Serializable {
>  > > > >   @@ -134,7 +134,9 @@
>  > > > >         * The reasoning behind this is to give form bean
developers
>  > > > >         * control over the lifecycle of their multipart requests
>  > > > >         * through the use of the finish() and/or rollback()
methods
>  > > > >   -     * of MultipartRequestHandler
>  > > > >   +     * of MultipartRequestHandler.  This method will return
>  > > > >   +     * <code>null</code> if this form's enctype is not
>  > > > >   +     * "multipart/request-data".
>  > > > >         * @see org.apache.struts.upload.MultipartRequestHandler
>  > > > >         */
>  > > > >        public MultipartRequestHandler
getMultipartRequestHandler() {
>  > > > >
>  > > > >
>  > > > >
>  > > > >
>  > > >
>  >
>  >



RE: RE-2: cvs commit: jakarta-struts/src/share/org/apache/struts/acti on Action.java ActionForm.java

Posted by William Shulman <wi...@metaconsortium.com>.
Sounds like another good solution might be to implement a parameter
stack in the request object. The parameter stack is a stack of 
Dictionary objects. When parameters are introduced, they are placed 
in the Dictionary on the top of the stack. Similarly for lookup. Stack
frames (i.e. the Dictionaries) are pushed and popped appropriately as 
you chain.

Just a thought. There may be some details to work out, but the
solution would be very general and useful in many places.

-will

Martin Cooper writes:
 > As far as I am aware, you cannot add parameters to the request.
 > 
 > I think storing values as request attributes and then looking there for 
 > parameter values would be very dangerous. You could potentially break 
 > existing code that uses request attributes to store data for chaining actions.
 > 
 > Incidentally, Hal, I faced a similar problem in chaining actions. What I 
 > did was to instantiate a separate form bean and store the chaining 
 > parameters in that, then use one well-known (between our Actions, I mean) 
 > request attribute to store that bean. The chained-to action checks for that 
 > bean first, otherwise it uses the one Struts passed to the perform() method.
 > 
 > --
 > Martin Cooper
 > 
 > 
 > At 12:38 PM 5/11/01, Deadman, Hal wrote:
 > >I thought of that too but I don't know how to add parameters to the request.
 > >Maybe you could use request.setAttribute and store the multi-part request
 > >String parameters as attributes in the requet object. Then code that looks
 > >for parameters could be changed to a method that looks for parameters or
 > >attributes. I don't know if that would help matters much.
 > >
 > >I use something similar in my application so that I can have an action that
 > >is accessed from a link or from another action. In one case the paramters
 > >are passed on the url and in the other case parameters are passed as request
 > >attributes. The receiving action calls a method that checks for one and then
 > >the other, using the first one it finds.
 > >
 > >     protected String findStringParameter(HttpServletRequest request, String
 > >key)
 > >     {
 > >         String value = request.getParameter(key);
 > >         if (value == null)
 > >         {
 > >             value = (String) request.getAttribute(key);
 > >         }
 > >         return value;
 > >     }
 > >
 > > > -----Original Message-----
 > > > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2) [mailto:mschachter@hp.com]
 > > > Sent: Friday, May 11, 2001 2:19 PM
 > > > To: 'struts-dev@jakarta.apache.org'
 > > > Subject: RE-2: cvs commit:
 > > > jakarta-struts/src/share/org/apache/struts/acti on Action.java
 > > > ActionForm.java
 > > >
 > > >
 > > > On second thought, I'm going to toy around with putting the request
 > > > parameters
 > > > directly into the request from MultipartRequestHandler
 > > > instead of using
 > > > MultipartRequestHandler itself to store attributes.  If I can
 > > > get it to work
 > > > this will solve all
 > > > the problems without adding any new methods to anything, or changing
 > > > anything.
 > > >
 > > > -----Original Message-----
 > > > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2)
 > > > Sent: Friday, May 11, 2001 2:08 PM
 > > > To: 'struts-dev@jakarta.apache.org'
 > > > Subject: RE: cvs commit:
 > > > jakarta-struts/src/share/org/apache/struts/action Action.java
 > > > ActionForm.java
 > > >
 > > >
 > > > Is this an acceptable resolution to this problem for
 > > > everybody?  If so, I'll
 > > > go ahead and fix the token problem in the Action class, be
 > > > creating new
 > > > isTokenValid() method that takes an HttpServletRequest and a
 > > > MultipartRequestHandler
 > > > as arguments, when using it for multipart forms.  The other
 > > > token methods
 > > > don't
 > > > need to be changed, as they only deal with retrieiving
 > > > session information.
 > > >
 > > > -----Original Message-----
 > > > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2) [mailto:mschachter@hp.com]
 > > > Sent: Friday, May 11, 2001 1:29 PM
 > > > To: 'struts-dev@jakarta.apache.org'
 > > > Subject: RE: cvs commit:
 > > > jakarta-struts/src/share/org/apache/struts/action Action.java
 > > > ActionForm.java
 > > >
 > > >
 > > > Hal,
 > > >
 > > > It was my understanding that since isCancelled is a protected
 > > > method in the
 > > > Action class,
 > > > that it was the Action developer's job to call the method.
 > > >
 > > > -----Original Message-----
 > > > From: Deadman, Hal [mailto:hal.deadman@tallan.com]
 > > > Sent: Friday, May 11, 2001 1:24 PM
 > > > To: struts-dev@jakarta.apache.org
 > > > Subject: RE: cvs commit:
 > > > jakarta-struts/src/share/org/apache/struts/action Action.java
 > > > ActionForm.java
 > > >
 > > >
 > > > Doesn't the Struts framework need to call this new method
 > > > somewhere? The
 > > > application code can't call the isCancelled method because
 > > > the Action class
 > > > code will never be called. If Struts ActionServlet calls the
 > > > form validate
 > > > when a user clicked cancel, the validation will likely fail
 > > > and the user
 > > > will be presented with the input form again. Clicking cancel
 > > > needs to bypass
 > > > the call to the form validate method. If that is done then the new
 > > > isCancelled method may be used in the perform method.
 > > >
 > > > Hal
 > > >
 > > > > -----Original Message-----
 > > > > From: mschachter@apache.org [mailto:mschachter@apache.org]
 > > > > Sent: Friday, May 11, 2001 1:11 PM
 > > > > To: jakarta-struts-cvs@apache.org
 > > > > Subject: cvs commit:
 > > > jakarta-struts/src/share/org/apache/struts/action
 > > > > Action.java ActionForm.java
 > > > >
 > > > >
 > > > > mschachter    01/05/11 10:11:06
 > > > >
 > > > >   Modified:    doc      todo-1.1.xml
 > > > >                src/share/org/apache/struts/action Action.java
 > > > >                         ActionForm.java
 > > > >   Log:
 > > > >    - Add an isCancelled() method to the Action class that takes a
 > > > >      MultipartRequestHandler as an argument.  This should address
 > > > >      issues with the html:cancel tag, as long as the new isCancelled
 > > > >      method is called on for multipart forms.
 > > > >    - Add myself to the EJB Design Pattern TODO
 > > > >
 > > > >   Revision  Changes    Path
 > > > >   1.3       +3 -0      jakarta-struts/doc/todo-1.1.xml
 > > > >
 > > > >   Index: todo-1.1.xml
 > > > >
 > > > ===================================================================
 > > > >   RCS file: /home/cvs/jakarta-struts/doc/todo-1.1.xml,v
 > > > >   retrieving revision 1.2
 > > > >   retrieving revision 1.3
 > > > >   diff -u -r1.2 -r1.3
 > > > >   --- todo-1.1.xml  2001/04/12 16:00:42     1.2
 > > > >   +++ todo-1.1.xml  2001/05/11 17:10:47     1.3
 > > > >   @@ -159,6 +159,9 @@
 > > > >          <assigned>
 > > > >            <a href="mailto:nic.hobbs@uk.pwcglobal.com">Nic Hobbs</a>
 > > > >          </assigned>
 > > > >   +      <assigned>
 > > > >   +        <a href="mailto:mschachter@hp.com">Mike Schachter</a>
 > > > >   +      </assigned>
 > > > >        </task>
 > > > >
 > > > >        <task name="HTML No-Cache Support">
 > > > >
 > > > >
 > > > >
 > > > >   1.20      +27 -4
 > > > > jakarta-struts/src/share/org/apache/struts/action/Action.java
 > > > >
 > > > >   Index: Action.java
 > > > >
 > > > ===================================================================
 > > > >   RCS file:
 > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
 > > > > tion.java,v
 > > > >   retrieving revision 1.19
 > > > >   retrieving revision 1.20
 > > > >   diff -u -r1.19 -r1.20
 > > > >   --- Action.java   2001/02/23 21:13:09     1.19
 > > > >   +++ Action.java   2001/05/11 17:10:55     1.20
 > > > >   @@ -1,7 +1,7 @@
 > > > >    /*
 > > > >   - * $Header:
 > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
 > > > > tion.java,v 1.19 2001/02/23 21:13:09 craigmcc Exp $
 > > > >   - * $Revision: 1.19 $
 > > > >   - * $Date: 2001/02/23 21:13:09 $
 > > > >   + * $Header:
 > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
 > > > > tion.java,v 1.20 2001/05/11 17:10:55 mschachter Exp $
 > > > >   + * $Revision: 1.20 $
 > > > >   + * $Date: 2001/05/11 17:10:55 $
 > > > >     *
 > > > >     *
 > > > > ====================================================================
 > > > >     *
 > > > >   @@ -67,6 +67,7 @@
 > > > >    import java.security.MessageDigest;
 > > > >    import java.security.NoSuchAlgorithmException;
 > > > >    import java.util.Locale;
 > > > >   +import java.util.Hashtable;
 > > > >    import javax.servlet.ServletException;
 > > > >    import javax.servlet.ServletRequest;
 > > > >    import javax.servlet.ServletResponse;
 > > > >   @@ -75,6 +76,7 @@
 > > > >    import javax.servlet.http.HttpSession;
 > > > >    import org.apache.struts.taglib.html.Constants;
 > > > >    import org.apache.struts.util.MessageResources;
 > > > >   +import org.apache.struts.upload.MultipartRequestHandler;
 > > > >
 > > > >
 > > > >    /**
 > > > >   @@ -106,7 +108,7 @@
 > > > >     * by this Action.
 > > > >     *
 > > > >     * @author Craig R. McClanahan
 > > > >   - * @version $Revision: 1.19 $ $Date: 2001/02/23 21:13:09 $
 > > > >   + * @version $Revision: 1.20 $ $Date: 2001/05/11 17:10:55 $
 > > > >     */
 > > > >
 > > > >    public class Action {
 > > > >   @@ -466,6 +468,27 @@
 > > > >     return
 > > > > ((request.getParameter(Constants.CANCEL_PROPERTY) != null) ||
 > > > >
 > > > > (request.getParameter(Constants.CANCEL_PROPERTY_X) != null));
 > > > >
 > > > >   +    }
 > > > >   +
 > > > >   +    /**
 > > > >   +     * Returns <code>true</code> if the current multipart
 > > > > form's cancel button was
 > > > >   +     * pressed.  This method will check if the cancel
 > > > > button generated by
 > > > >   +     * <strong>CancelTag</strong> was pressed by the user in the
 > > > >   +     * current request.  If true, validation performed by an
 > > > >   +     * <strong>ActionForm</strong> validate() method
 > > > will have been
 > > > >   +     * skipped by the controller servlet.  A
 > > > > MultipartRequestHandler instance
 > > > >   +     * can be obtained from a multipart form by calling
 > > > >   +     * {@link ActionForm#getMultipartRequestHandler()
 > > > > ActionForm.getMultipartRequestHandler()}.
 > > > >   +     *
 > > > >   +     * @param request The servlet request we are processing
 > > > >   +     * @see org.apache.struts.taglib.CancelTag
 > > > >   +     * @see org.apache.struts.action.ValidatingActionForm
 > > > >   +     */
 > > > >   +    protected boolean isCancelled(MultipartRequestHandler
 > > > > request) {
 > > > >   +
 > > > >   +        Hashtable elements = request.getTextElements();
 > > > >   +        return ((elements.get(Constants.CANCEL_PROPERTY)
 > > > > != null) ||
 > > > >   +                (elements.get(Constants.CANCEL_PROPERTY_X)
 > > > > != null));
 > > > >        }
 > > > >
 > > > >
 > > > >
 > > > >
 > > > >
 > > > >   1.7       +7 -5
 > > > > jakarta-struts/src/share/org/apache/struts/action/ActionForm.java
 > > > >
 > > > >   Index: ActionForm.java
 > > > >
 > > > ===================================================================
 > > > >   RCS file:
 > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
 > > > > tionForm.java,v
 > > > >   retrieving revision 1.6
 > > > >   retrieving revision 1.7
 > > > >   diff -u -r1.6 -r1.7
 > > > >   --- ActionForm.java       2001/02/21 00:35:43     1.6
 > > > >   +++ ActionForm.java       2001/05/11 17:10:58     1.7
 > > > >   @@ -1,7 +1,7 @@
 > > > >    /*
 > > > >   - * $Header:
 > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
 > > > > tionForm.java,v 1.6 2001/02/21 00:35:43 craigmcc Exp $
 > > > >   - * $Revision: 1.6 $
 > > > >   - * $Date: 2001/02/21 00:35:43 $
 > > > >   + * $Header:
 > > > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
 > > > > tionForm.java,v 1.7 2001/05/11 17:10:58 mschachter Exp $
 > > > >   + * $Revision: 1.7 $
 > > > >   + * $Date: 2001/05/11 17:10:58 $
 > > > >     *
 > > > >     *
 > > > > ====================================================================
 > > > >     *
 > > > >   @@ -94,7 +94,7 @@
 > > > >     * </p>
 > > > >     *
 > > > >     * @author Craig R. McClanahan
 > > > >   - * @version $Revision: 1.6 $ $Date: 2001/02/21 00:35:43 $
 > > > >   + * @version $Revision: 1.7 $ $Date: 2001/05/11 17:10:58 $
 > > > >     */
 > > > >
 > > > >    public abstract class ActionForm implements Serializable {
 > > > >   @@ -134,7 +134,9 @@
 > > > >         * The reasoning behind this is to give form bean developers
 > > > >         * control over the lifecycle of their multipart requests
 > > > >         * through the use of the finish() and/or rollback() methods
 > > > >   -     * of MultipartRequestHandler
 > > > >   +     * of MultipartRequestHandler.  This method will return
 > > > >   +     * <code>null</code> if this form's enctype is not
 > > > >   +     * "multipart/request-data".
 > > > >         * @see org.apache.struts.upload.MultipartRequestHandler
 > > > >         */
 > > > >        public MultipartRequestHandler getMultipartRequestHandler() {
 > > > >
 > > > >
 > > > >
 > > > >
 > > >
 > 
 > 

RE: RE-2: cvs commit: jakarta-struts/src/share/org/apache/struts/acti on Action.java ActionForm.java

Posted by Martin Cooper <ma...@tumbleweed.com>.
As far as I am aware, you cannot add parameters to the request.

I think storing values as request attributes and then looking there for 
parameter values would be very dangerous. You could potentially break 
existing code that uses request attributes to store data for chaining actions.

Incidentally, Hal, I faced a similar problem in chaining actions. What I 
did was to instantiate a separate form bean and store the chaining 
parameters in that, then use one well-known (between our Actions, I mean) 
request attribute to store that bean. The chained-to action checks for that 
bean first, otherwise it uses the one Struts passed to the perform() method.

--
Martin Cooper


At 12:38 PM 5/11/01, Deadman, Hal wrote:
>I thought of that too but I don't know how to add parameters to the request.
>Maybe you could use request.setAttribute and store the multi-part request
>String parameters as attributes in the requet object. Then code that looks
>for parameters could be changed to a method that looks for parameters or
>attributes. I don't know if that would help matters much.
>
>I use something similar in my application so that I can have an action that
>is accessed from a link or from another action. In one case the paramters
>are passed on the url and in the other case parameters are passed as request
>attributes. The receiving action calls a method that checks for one and then
>the other, using the first one it finds.
>
>     protected String findStringParameter(HttpServletRequest request, String
>key)
>     {
>         String value = request.getParameter(key);
>         if (value == null)
>         {
>             value = (String) request.getAttribute(key);
>         }
>         return value;
>     }
>
> > -----Original Message-----
> > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2) [mailto:mschachter@hp.com]
> > Sent: Friday, May 11, 2001 2:19 PM
> > To: 'struts-dev@jakarta.apache.org'
> > Subject: RE-2: cvs commit:
> > jakarta-struts/src/share/org/apache/struts/acti on Action.java
> > ActionForm.java
> >
> >
> > On second thought, I'm going to toy around with putting the request
> > parameters
> > directly into the request from MultipartRequestHandler
> > instead of using
> > MultipartRequestHandler itself to store attributes.  If I can
> > get it to work
> > this will solve all
> > the problems without adding any new methods to anything, or changing
> > anything.
> >
> > -----Original Message-----
> > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2)
> > Sent: Friday, May 11, 2001 2:08 PM
> > To: 'struts-dev@jakarta.apache.org'
> > Subject: RE: cvs commit:
> > jakarta-struts/src/share/org/apache/struts/action Action.java
> > ActionForm.java
> >
> >
> > Is this an acceptable resolution to this problem for
> > everybody?  If so, I'll
> > go ahead and fix the token problem in the Action class, be
> > creating new
> > isTokenValid() method that takes an HttpServletRequest and a
> > MultipartRequestHandler
> > as arguments, when using it for multipart forms.  The other
> > token methods
> > don't
> > need to be changed, as they only deal with retrieiving
> > session information.
> >
> > -----Original Message-----
> > From: SCHACHTER,MICHAEL (HP-NewJersey,ex2) [mailto:mschachter@hp.com]
> > Sent: Friday, May 11, 2001 1:29 PM
> > To: 'struts-dev@jakarta.apache.org'
> > Subject: RE: cvs commit:
> > jakarta-struts/src/share/org/apache/struts/action Action.java
> > ActionForm.java
> >
> >
> > Hal,
> >
> > It was my understanding that since isCancelled is a protected
> > method in the
> > Action class,
> > that it was the Action developer's job to call the method.
> >
> > -----Original Message-----
> > From: Deadman, Hal [mailto:hal.deadman@tallan.com]
> > Sent: Friday, May 11, 2001 1:24 PM
> > To: struts-dev@jakarta.apache.org
> > Subject: RE: cvs commit:
> > jakarta-struts/src/share/org/apache/struts/action Action.java
> > ActionForm.java
> >
> >
> > Doesn't the Struts framework need to call this new method
> > somewhere? The
> > application code can't call the isCancelled method because
> > the Action class
> > code will never be called. If Struts ActionServlet calls the
> > form validate
> > when a user clicked cancel, the validation will likely fail
> > and the user
> > will be presented with the input form again. Clicking cancel
> > needs to bypass
> > the call to the form validate method. If that is done then the new
> > isCancelled method may be used in the perform method.
> >
> > Hal
> >
> > > -----Original Message-----
> > > From: mschachter@apache.org [mailto:mschachter@apache.org]
> > > Sent: Friday, May 11, 2001 1:11 PM
> > > To: jakarta-struts-cvs@apache.org
> > > Subject: cvs commit:
> > jakarta-struts/src/share/org/apache/struts/action
> > > Action.java ActionForm.java
> > >
> > >
> > > mschachter    01/05/11 10:11:06
> > >
> > >   Modified:    doc      todo-1.1.xml
> > >                src/share/org/apache/struts/action Action.java
> > >                         ActionForm.java
> > >   Log:
> > >    - Add an isCancelled() method to the Action class that takes a
> > >      MultipartRequestHandler as an argument.  This should address
> > >      issues with the html:cancel tag, as long as the new isCancelled
> > >      method is called on for multipart forms.
> > >    - Add myself to the EJB Design Pattern TODO
> > >
> > >   Revision  Changes    Path
> > >   1.3       +3 -0      jakarta-struts/doc/todo-1.1.xml
> > >
> > >   Index: todo-1.1.xml
> > >
> > ===================================================================
> > >   RCS file: /home/cvs/jakarta-struts/doc/todo-1.1.xml,v
> > >   retrieving revision 1.2
> > >   retrieving revision 1.3
> > >   diff -u -r1.2 -r1.3
> > >   --- todo-1.1.xml  2001/04/12 16:00:42     1.2
> > >   +++ todo-1.1.xml  2001/05/11 17:10:47     1.3
> > >   @@ -159,6 +159,9 @@
> > >          <assigned>
> > >            <a href="mailto:nic.hobbs@uk.pwcglobal.com">Nic Hobbs</a>
> > >          </assigned>
> > >   +      <assigned>
> > >   +        <a href="mailto:mschachter@hp.com">Mike Schachter</a>
> > >   +      </assigned>
> > >        </task>
> > >
> > >        <task name="HTML No-Cache Support">
> > >
> > >
> > >
> > >   1.20      +27 -4
> > > jakarta-struts/src/share/org/apache/struts/action/Action.java
> > >
> > >   Index: Action.java
> > >
> > ===================================================================
> > >   RCS file:
> > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > > tion.java,v
> > >   retrieving revision 1.19
> > >   retrieving revision 1.20
> > >   diff -u -r1.19 -r1.20
> > >   --- Action.java   2001/02/23 21:13:09     1.19
> > >   +++ Action.java   2001/05/11 17:10:55     1.20
> > >   @@ -1,7 +1,7 @@
> > >    /*
> > >   - * $Header:
> > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > > tion.java,v 1.19 2001/02/23 21:13:09 craigmcc Exp $
> > >   - * $Revision: 1.19 $
> > >   - * $Date: 2001/02/23 21:13:09 $
> > >   + * $Header:
> > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > > tion.java,v 1.20 2001/05/11 17:10:55 mschachter Exp $
> > >   + * $Revision: 1.20 $
> > >   + * $Date: 2001/05/11 17:10:55 $
> > >     *
> > >     *
> > > ====================================================================
> > >     *
> > >   @@ -67,6 +67,7 @@
> > >    import java.security.MessageDigest;
> > >    import java.security.NoSuchAlgorithmException;
> > >    import java.util.Locale;
> > >   +import java.util.Hashtable;
> > >    import javax.servlet.ServletException;
> > >    import javax.servlet.ServletRequest;
> > >    import javax.servlet.ServletResponse;
> > >   @@ -75,6 +76,7 @@
> > >    import javax.servlet.http.HttpSession;
> > >    import org.apache.struts.taglib.html.Constants;
> > >    import org.apache.struts.util.MessageResources;
> > >   +import org.apache.struts.upload.MultipartRequestHandler;
> > >
> > >
> > >    /**
> > >   @@ -106,7 +108,7 @@
> > >     * by this Action.
> > >     *
> > >     * @author Craig R. McClanahan
> > >   - * @version $Revision: 1.19 $ $Date: 2001/02/23 21:13:09 $
> > >   + * @version $Revision: 1.20 $ $Date: 2001/05/11 17:10:55 $
> > >     */
> > >
> > >    public class Action {
> > >   @@ -466,6 +468,27 @@
> > >     return
> > > ((request.getParameter(Constants.CANCEL_PROPERTY) != null) ||
> > >
> > > (request.getParameter(Constants.CANCEL_PROPERTY_X) != null));
> > >
> > >   +    }
> > >   +
> > >   +    /**
> > >   +     * Returns <code>true</code> if the current multipart
> > > form's cancel button was
> > >   +     * pressed.  This method will check if the cancel
> > > button generated by
> > >   +     * <strong>CancelTag</strong> was pressed by the user in the
> > >   +     * current request.  If true, validation performed by an
> > >   +     * <strong>ActionForm</strong> validate() method
> > will have been
> > >   +     * skipped by the controller servlet.  A
> > > MultipartRequestHandler instance
> > >   +     * can be obtained from a multipart form by calling
> > >   +     * {@link ActionForm#getMultipartRequestHandler()
> > > ActionForm.getMultipartRequestHandler()}.
> > >   +     *
> > >   +     * @param request The servlet request we are processing
> > >   +     * @see org.apache.struts.taglib.CancelTag
> > >   +     * @see org.apache.struts.action.ValidatingActionForm
> > >   +     */
> > >   +    protected boolean isCancelled(MultipartRequestHandler
> > > request) {
> > >   +
> > >   +        Hashtable elements = request.getTextElements();
> > >   +        return ((elements.get(Constants.CANCEL_PROPERTY)
> > > != null) ||
> > >   +                (elements.get(Constants.CANCEL_PROPERTY_X)
> > > != null));
> > >        }
> > >
> > >
> > >
> > >
> > >
> > >   1.7       +7 -5
> > > jakarta-struts/src/share/org/apache/struts/action/ActionForm.java
> > >
> > >   Index: ActionForm.java
> > >
> > ===================================================================
> > >   RCS file:
> > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > > tionForm.java,v
> > >   retrieving revision 1.6
> > >   retrieving revision 1.7
> > >   diff -u -r1.6 -r1.7
> > >   --- ActionForm.java       2001/02/21 00:35:43     1.6
> > >   +++ ActionForm.java       2001/05/11 17:10:58     1.7
> > >   @@ -1,7 +1,7 @@
> > >    /*
> > >   - * $Header:
> > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > > tionForm.java,v 1.6 2001/02/21 00:35:43 craigmcc Exp $
> > >   - * $Revision: 1.6 $
> > >   - * $Date: 2001/02/21 00:35:43 $
> > >   + * $Header:
> > > /home/cvs/jakarta-struts/src/share/org/apache/struts/action/Ac
> > > tionForm.java,v 1.7 2001/05/11 17:10:58 mschachter Exp $
> > >   + * $Revision: 1.7 $
> > >   + * $Date: 2001/05/11 17:10:58 $
> > >     *
> > >     *
> > > ====================================================================
> > >     *
> > >   @@ -94,7 +94,7 @@
> > >     * </p>
> > >     *
> > >     * @author Craig R. McClanahan
> > >   - * @version $Revision: 1.6 $ $Date: 2001/02/21 00:35:43 $
> > >   + * @version $Revision: 1.7 $ $Date: 2001/05/11 17:10:58 $
> > >     */
> > >
> > >    public abstract class ActionForm implements Serializable {
> > >   @@ -134,7 +134,9 @@
> > >         * The reasoning behind this is to give form bean developers
> > >         * control over the lifecycle of their multipart requests
> > >         * through the use of the finish() and/or rollback() methods
> > >   -     * of MultipartRequestHandler
> > >   +     * of MultipartRequestHandler.  This method will return
> > >   +     * <code>null</code> if this form's enctype is not
> > >   +     * "multipart/request-data".
> > >         * @see org.apache.struts.upload.MultipartRequestHandler
> > >         */
> > >        public MultipartRequestHandler getMultipartRequestHandler() {
> > >
> > >
> > >
> > >
> >