To elaborate, the goal of "ignoring" the double submit is simply to make
the user experience seem as if nothing unusual happened.  The result of
a double submit should be the same as a single submit.

Towards that goal, both of the strategies you describe here seem
reasonable.

> -----Original Message-----
> From: Richard Feit [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, January 04, 2005 3:52 PM
> To: Beehive Developers
> Subject: Re: svn commit: r124028 - in 
> incubator/beehive/trunk/netui: 
> src/compiler/org/apache/beehive/netui/compiler 
> src/compiler/org/apache/beehive/netui/compiler/genmodel 
> src/compiler/org/apache/beehive/netui/compiler/grammar 
> src/compiler/org/apache/beehive/netui
> 
> 
> I think the feature does allow for the second option, but can you 
> describe what you mean by "ignoring" the second request?  
> Currently, I 
> think that there are a few things that can be done to handle this:
> 
> 1) Go to the original results page, by specifying the path 
> explicitly in 
> a @Jpf.Catch for DoubleSubmitException:
> 
>     @Jpf.Action(
>         preventDoubleSubmit=true,
>         forwards={
>             @Jpf.Forward(name="success", path="results.jsp")
>         },
>         catches={
>             @Jpf.Catch(type=DoubleSubmitException.class, 
> path="results.jsp")
>         }
>     )
>     public Forward placeOrder(OrderForm form)
>     {
>         ...
>     }
> 
> 2) If the results page has request-scoped inputs that were 
> sent from the 
> action using @Jpf.ActionOutput annotations, you can use the 
> 'navigateTo' 
> attribute, which lets the framework remember the most recent page as 
> well as the inputs that were passed to it:
> 
>     @Jpf.Action(
>         preventDoubleSubmit=true,
>         forwards={
>             @Jpf.Forward(name="success", path="results.jsp")
>         },
>         catches={
>             @Jpf.Catch(type=DoubleSubmitException.class, 
> navigateTo=Jpf.NavigateTo.currentPage)
>         }
>     )
>     public Forward placeOrder(OrderForm form)
>     {
>         ...
>     }
> 
>     Note that this won't work if the results page is expecting some 
> other request-(or otherwise-)scoped input that we don't keep track of.
> 
> 3) Go to an error page.  You can either specify a custom one (using 
> @Jpf.Catch as in #1) or let the DoubleSubmitException bleed 
> out, to be 
> handled with a generic error page like other exceptions.
> 
> Wherever appropriate, the @Jpf.Catch annotations can be put in more 
> general places -- at the class level in the @Jpf.Controller 
> annotation, 
> or even in a shared flow (referenced in the 'sharedFlows' 
> attribute on 
> @Jpf.Controller).  Also, I was going to look into some client-side 
> options, like disabling a button as soon as it's clicked.  This might 
> improve the experience for users who have client-side script enabled.
> 
> Let me know what you think...
> 
> Thanks,
> Rich
> 
> 
> 
> Karr, David wrote:
> 
> >I'm going to chime in on this for a moment.
> >
> >I've always thought the best strategy for handling double submits 
> >(assuming you can detect them) is to essentially ignore them.  If 
> >possible, if you detect a double submit, then bypass the processing 
> >logic and either ignore the request, or forward to the page 
> that would 
> >have resulted from the original submit (I'm not sure which 
> sub-strategy 
> >is better).
> >
> >Will this functionality you're adding allow this detection and 
> >processing?
> >
> >  
> >
> >>-----Original Message-----
> >>From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> >>
> >>Author: rich
> >>Date: Mon Jan  3 13:42:54 2005
> >>New Revision: 124028
> >>
> >>URL: http://svn.apache.org/viewcvs?view=rev&rev=124028
> >>Log:
> >>First cut at annotation/tag support for double-submit
> >>prevention.  Currently, the feature is simply this: 
> >>
> >>    @Jpf.Action(preventDoubleSubmit=true,...) 
> >>              -or- 
> >>    @Jpf.SimpleAction(preventDoubleSubmit=true,...)
> >>
> >>If you use netui:form, netui:button (with an 'action'),
> >>netui:anchor, or netui:imageAnchor in conjunction with a 
> >>'preventDoubleSubmit=true' action, you will get a 
> >>DoubleSubmitException if you click two or more times on the 
> >>same link/button.
> >>
> >>DRT: netui (WinXP)
> >>BB: self (linux)
> >>
> >>
> >>Added:
> >>   
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/DoubleSubmitException.java
> >>      - copied, changed from r124020,
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/DoubleFormPostException.java
> >>   
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/
> >>   
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/Controller.jpf   (contents, props changed)
> >>   
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/caughtit.jsp   (contents, props changed)
> >>   
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/index.jsp   (contents, props changed)
> >>   
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/submitted.jsp   (contents, props changed)
> >>Removed:
> >>   
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/DoubleFormPostException.java
> >>Modified:
> >>   
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/JpfLanguageConstants.java
> >>   
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/genmodel/GenActionModel.java
> >>   
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/ActionGrammar.java
> >>   
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/SimpleActionGrammar.java
> >>   
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/model/ActionModel.java
> >>   
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/PageFlowRequestProcessor.java
> >>   
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/annotations/Jpf.java
> >>   
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/config/PageFlowActionMapping.java
> >>   
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/AnchorBase.java
> >>   
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Button.java
> >>   
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Form.java
> >>   
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/internal/PageFlowTagUtils.java
> >>   
> >>incubator/beehive/trunk/netui/src/util/org/apache/beehive/netu
> >>i/util/netui.properties
> >>   
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF
> >>/tiles-defs.xml
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/JpfLanguageConstants.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/compiler/org/apache/beehive/netui/compiler/JpfLanguageConsta
> >>nts.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui
> >>/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageCon
> >>stants.java&r1=124027&p2=incubator/beehive/trunk/netui/src/com
> >>piler/org/apache/beehive/netui/compiler/JpfLanguageConstants.j
> >>ava&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/JpfLanguageConstants.java    (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/JpfLanguageConstants.java    Mon Jan  3 13:42:54 2005
> >>@@ -161,6 +161,7 @@
> >>     public static final String RAISE_ACTIONS_ATTR = "raiseActions";
> >>     public static final String MULTIPART_HANDLER_ATTR =
> >>"multipartHandler";
> >>     public static final String SHARED_FLOW_REFS_ATTR = 
> >>"sharedFlowRefs";
> >>+    public static final String PREVENT_DOUBLE_SUBMIT_ATTR =
> >>+ "preventDoubleSubmit";
> >>     
> >>     public static final String MIN_INT_ATTR = "minInt";
> >>     public static final String MAX_INT_ATTR = "maxInt";
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/genmodel/GenActionModel.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/compiler/org/apache/beehive/netui/compiler/genmodel/GenActio
> >>nModel.java?view=diff&rev=124028&p1=incubator/beehive/trunk/ne
> >>tui/src/compiler/org/apache/beehive/netui/compiler/genmodel/Ge
> >>nActionModel.java&r1=124027&p2=incubator/beehive/trunk/netui/s
> >>rc/compiler/org/apache/beehive/netui/compiler/genmodel/GenActi
> >>onModel.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/genmodel/GenActionModel.java (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/genmodel/GenActionModel.java Mon Jan  3 13:42:54 2005
> >>@@ -72,6 +72,12 @@
> >>         setLoginRequired( loginRequired );
> >>         
> >>         //
> >>+        // prevent-double-submit
> >>+        //
> >>+        Boolean preventDoubleSubmit =
> >>CompilerUtils.getBoolean( annotation,
> >>PREVENT_DOUBLE_SUBMIT_ATTR, false );
> >>+        setPreventDoubleSubmit( preventDoubleSubmit );
> >>+        
> >>+        //
> >>         // readOnly
> >>         //
> >>         Boolean readOnly = CompilerUtils.getBoolean(
> >>annotation, READONLY_ATTR, true );
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/ActionGrammar.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/compiler/org/apache/beehive/netui/compiler/grammar/ActionGra
> >>mmar.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netu
> >>i/src/compiler/org/apache/beehive/netui/compiler/grammar/Actio
> >>nGrammar.java&r1=124027&p2=incubator/beehive/trunk/netui/src/c
> >>ompiler/org/apache/beehive/netui/compiler/grammar/ActionGramma
> >>r.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/ActionGrammar.java   (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/ActionGrammar.java   Mon Jan  3 13:42:54 2005
> >>@@ -17,7 +17,6 @@
> >>  */
> >> package org.apache.beehive.netui.compiler.grammar;
> >> 
> >>-import org.apache.beehive.netui.compiler.AnnotationGrammar;
> >> import org.apache.beehive.netui.compiler.RuntimeVersionChecker;
> >> import org.apache.beehive.netui.compiler.AnnotationMemberType;
> >> import org.apache.beehive.netui.compiler.FlowControllerInfo;
> >>@@ -40,6 +39,7 @@
> >>         addMemberType( READONLY_ATTR, new
> >>AnnotationMemberType( VERSION_8_SP2_STRING, this ) );
> >>         addMemberType( USE_FORM_BEAN_ATTR,
> >>                        new WritableFieldType( 
> >>OBJECT_CLASS_NAME, USE_FORM_BEAN_ATTR, 
> VERSION_8_SP2_STRING, this ) );
> >>+        addMemberType( PREVENT_DOUBLE_SUBMIT_ATTR, new
> >>+ AnnotationMemberType( null, this ) );
> >>         
> >>         addMemberArrayGrammar( FORWARDS_ATTR, new
> >>ForwardGrammar( env, diags, null, rvc, fcInfo ) );
> >>         addMemberArrayGrammar( CATCHES_ATTR, new 
> >>CatchGrammar( env, diags, null, rvc, ACTION_TAG_NAME, fcInfo ) );
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/SimpleActionGrammar.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/compiler/org/apache/beehive/netui/compiler/grammar/SimpleAct
> >>ionGrammar.java?view=diff&rev=124028&p1=incubator/beehive/trun
> >>k/netui/src/compiler/org/apache/beehive/netui/compiler/grammar
> >>/SimpleActionGrammar.java&r1=124027&p2=incubator/beehive/trunk
> >>/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/
> >>SimpleActionGrammar.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/SimpleActionGrammar.java     (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/grammar/SimpleActionGrammar.java     Mon Jan 
> >> 3 13:42:54 2005
> >>@@ -58,6 +58,7 @@
> >>         addMemberType( TILES_DEFINITION_ATTR, new
> >>AnnotationMemberType( null, this ) );
> >>         addMemberType( REDIRECT_ATTR, new 
> >>AnnotationMemberType( null , this ) );
> >>         addMemberType( EXTERNAL_REDIRECT_ATTR, new 
> >>AbsolutePathType( null , this ) );
> >>+        addMemberType( PREVENT_DOUBLE_SUBMIT_ATTR, new
> >>+ AnnotationMemberType( null, this ) );
> >>         
> >>         addMemberArrayGrammar( CONDITIONAL_FORWARDS_ATTR,
> >>                                new
> >>SimpleActionForwardGrammar( env, diags, null, rvc, fcInfo ) );
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/model/ActionModel.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/compiler/org/apache/beehive/netui/compiler/model/ActionModel
> >>.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/sr
> >>c/compiler/org/apache/beehive/netui/compiler/model/ActionModel
> >>.java&r1=124027&p2=incubator/beehive/trunk/netui/src/compiler/
> >>org/apache/beehive/netui/compiler/model/ActionModel.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/model/ActionModel.java       (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/
> >>netui/compiler/model/ActionModel.java       Mon Jan  3 13:42:54 2005
> >>@@ -67,6 +67,7 @@
> >>     private boolean _isOverloaded;
> >>     private boolean _readonly;
> >>     private boolean _isSimpleAction = false;
> >>+    private boolean _preventDoubleSubmit = false;
> >>     private String _formMember;     // pageflow-scoped form
> >>     private String _formClass;      // applicable for 
> >>non-ActionForm-derived types
> >>     private Map< String, String > _conditionalForwards;
> >>@@ -115,6 +116,7 @@
> >>         _formClass = src._formClass;
> >>         _roles = src._roles;
> >>         _loginRequired = src._loginRequired;
> >>+        _preventDoubleSubmit = src._preventDoubleSubmit;
> >>         _isSimpleAction = src._isSimpleAction;
> >>         _isOverloaded = src._isOverloaded;
> >>         _readonly = src._readonly;
> >>@@ -222,6 +224,7 @@
> >>         if ( _formMember != null ) addSetProperty( xb,
> >>"formMember", _formMember );
> >>         if ( _formClass != null ) addSetProperty( xb, 
> >>"formClass", _formClass );
> >>         if ( _loginRequired ) addSetProperty( xb, 
> >>"loginRequired", _loginRequired );
> >>+        if ( _preventDoubleSubmit ) addSetProperty( xb,
> >>+ "preventDoubleSubmit", _preventDoubleSubmit );
> >>         if ( _isOverloaded ) addSetProperty( xb,
> >>"overloaded", _isOverloaded );
> >>         if ( _readonly ) addSetProperty( xb, "readonly", 
> _readonly );
> >>         if ( _isSimpleAction ) addSetProperty( xb, 
> >>"simpleAction", _isSimpleAction ); @@ -464,14 +467,14 @@
> >>         _roles = roles;
> >>     }
> >> 
> >>-    public boolean isLoginRequired()
> >>-    {
> >>-        return _loginRequired;
> >>-    }
> >>-
> >>     public void setLoginRequired( boolean loginRequired )
> >>     {
> >>         _loginRequired = loginRequired;
> >>+    }
> >>+    
> >>+    public void setPreventDoubleSubmit( boolean 
> preventDoubleSubmit )
> >>+    {
> >>+        _preventDoubleSubmit = preventDoubleSubmit;
> >>     }
> >> 
> >>     public boolean isSimpleAction()
> >>
> >>Deleted:
> >>/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive
> >>/netui/pageflow/DoubleFormPostException.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostExc
> >>eption.java?view=auto&rev=124027
> >>==============================================================
> >>================
> >>
> >>Copied:
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/DoubleSubmitException.java (from r124020, 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/DoubleFormPostException.java)
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/pageflow/org/apache/beehive/netui/pageflow/DoubleSubmitExcep
> >>tion.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netu
> >>i/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPos
> >>tException.java&r1=124020&p2=incubator/beehive/trunk/netui/src
> >>/pageflow/org/apache/beehive/netui/pageflow/DoubleSubmitExcept
> >>ion.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/DoubleFormPostException.java (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/DoubleSubmitException.java   Mon Jan  3 13:42:54 2005
> >>@@ -20,11 +20,11 @@
> >> import javax.servlet.http.HttpServletResponse;
> >> import java.io.IOException;
> >> 
> >>-public class DoubleFormPostException
> >>+public class DoubleSubmitException
> >>         extends PageFlowException
> >>         implements ResponseErrorCodeSender
> >> {
> >>-    DoubleFormPostException( String actionName, FlowController fc )
> >>+    DoubleSubmitException( String actionName, FlowController fc )
> >>     {
> >>         super( actionName, fc );
> >>     }
> >>@@ -36,7 +36,7 @@
> >> 
> >>     protected String[] getMessageParts()
> >>     {
> >>-        return new String[]{ "A double-post occurred for 
> >>action ", " in page flow ", "." };
> >>+        return new String[]{ "A double-submit occurred for
> >>action ", "
> >>+ in page flow ", "." };
> >>     }
> >>     
> >>     public void sendResponseErrorCode( HttpServletResponse
> >>response ) throws IOException
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/PageFlowRequestProcessor.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestPr
> >>ocessor.java?view=diff&rev=124028&p1=incubator/beehive/trunk/n
> >>etui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRe
> >>questProcessor.java&r1=124027&p2=incubator/beehive/trunk/netui
> >>/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowReques
> >>tProcessor.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/PageFlowRequestProcessor.java        (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/PageFlowRequestProcessor.java        Mon Jan 
>  3 13:42:54 2005
> >>@@ -930,16 +930,13 @@
> >>                                             ActionMapping
> >>mapping, String actionPath )
> >>         throws IOException
> >>     {
> >>-        //
> >>-        // TODO: We haven't yet hooked up the support for 
> >>marking an action as preventDoublePost=true.
> >>-        //
> >>-        if ( false )
> >>+        if ( mapping instanceof PageFlowActionMapping && ( (
> >>+ PageFlowActionMapping ) mapping ).isPreventDoubleSubmit() )
> >>         {
> >>             if ( !
> >>TokenProcessor.getInstance().isTokenValid( request, true ) )
> >>             {
> >>                 FlowController currentFC = 
> >>RequestValues.getCurrentFlowController( request );
> >>                 String actionName = 
> >>InternalUtils.getActionName( mapping );
> >>-                DoubleFormPostException ex = new 
> >>DoubleFormPostException( actionName, currentFC );
> >>+                DoubleSubmitException ex = new
> >>DoubleSubmitException(
> >>+ actionName, currentFC );
> >>                 
> >>                 if ( currentFC != null )
> >>                 {
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/annotations/Jpf.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.j
> >>ava?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/
> >>pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.jav
> >>a&r1=124027&p2=incubator/beehive/trunk/netui/src/pageflow/org/
> >>apache/beehive/netui/pageflow/annotations/Jpf.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/annotations/Jpf.java (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/annotations/Jpf.java Mon Jan  3 13:42:54 2005
> >>@@ -186,7 +186,7 @@
> >>      * was jpf:action
> >>      */
> >>     @Target( METHOD )
> >>-            @Retention( RUNTIME )
> >>+    @Retention( RUNTIME )
> >>     public @interface Action
> >>     {
> >>         /**
> >>@@ -228,6 +228,12 @@
> >>          * forward used when validation fails
> >>          */
> >>         Forward validationErrorForward() default
> >>@Jpf.Forward( name="" );
> >>+        
> >>+        /**
> >>+         * Prevent multiple submits to this action.  If
> >>multiple submits occur, a
> >>+         * [EMAIL PROTECTED]
> >>org.apache.beehive.netui.pageflow.DoubleSubmitException} is thrown.
> >>+         */ 
> >>+        boolean preventDoubleSubmit() default false;
> >>     }
> >>     
> >>     @Target( ANNOTATION_TYPE )
> >>@@ -314,6 +320,12 @@
> >>         String outputFormBean() default "";
> >>         boolean redirect() default false; // optional
> >>         boolean externalRedirect() default false; // optional
> >>+        
> >>+        /**
> >>+         * Prevent multiple submits to this action.  If
> >>multiple submits occur, a
> >>+         * [EMAIL PROTECTED]
> >>org.apache.beehive.netui.pageflow.DoubleSubmitException} is thrown.
> >>+         */ 
> >>+        boolean preventDoubleSubmit() default false;
> >>     }
> >> 
> >>     /**
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/config/PageFlowActionMapping.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowAc
> >>tionMapping.java?view=diff&rev=124028&p1=incubator/beehive/tru
> >>nk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config
> >>/PageFlowActionMapping.java&r1=124027&p2=incubator/beehive/tru
> >>nk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config
> >>/PageFlowActionMapping.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/config/PageFlowActionMapping.java    (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/
> >>netui/pageflow/config/PageFlowActionMapping.java    Mon Jan 
> >> 3 13:42:54 2005
> >>@@ -31,6 +31,7 @@
> >> {
> >>     private String _unqualifiedActionPath;
> >>     private boolean _loginRequired = false;
> >>+    private boolean _preventDoubleSubmit = false;
> >>     private boolean _simpleAction = false;
> >>     private boolean _isOverloaded = false;
> >>     private String _formMember;
> >>@@ -70,6 +71,16 @@
> >>     public void setLoginRequired( boolean loginRequired )
> >>     {
> >>         _loginRequired = loginRequired;
> >>+    }
> >>+
> >>+    public boolean isPreventDoubleSubmit()
> >>+    {
> >>+        return _preventDoubleSubmit;
> >>+    }
> >>+
> >>+    public void setPreventDoubleSubmit( boolean 
> preventDoubleSubmit )
> >>+    {
> >>+        _preventDoubleSubmit = preventDoubleSubmit;
> >>     }
> >> 
> >>     public boolean isSimpleAction()
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/AnchorBase.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java
> >>?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/tag
> >>s-html/org/apache/beehive/netui/tags/html/AnchorBase.java&r1=1
> >>24027&p2=incubator/beehive/trunk/netui/src/tags-html/org/apach
> >>e/beehive/netui/tags/html/AnchorBase.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/AnchorBase.java    (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/AnchorBase.java    Mon Jan  3 13:42:54 2005
> >>@@ -10,6 +10,7 @@
> >> import org.apache.beehive.netui.util.Bundle;
> >> import org.apache.beehive.netui.util.ParamHelper;
> >> import org.apache.beehive.netui.util.logging.Logger;
> >>+import org.apache.struts.taglib.html.Constants;
> >> 
> >> import javax.servlet.ServletContext;
> >> import javax.servlet.ServletRequest;
> >>@@ -327,18 +328,33 @@
> >>             return createPageAnchor(request, trb);
> >>         }
> >> 
> >>-        // report that action is not an action
> >>-        if ((_action != null) && 
> >>(!PageFlowTagUtils.isAction(request, _action))) {
> >>-            String s = null;
> >>-            if (_action.equals("")) {
> >>-                s = Bundle.getString("Tags_NullBadAction", null);
> >>+        if (_action != null) {
> >>+            // report that action is not an action
> >>+            if (!PageFlowTagUtils.isAction(request, _action)) {
> >>+                String s = null;
> >>+                if (_action.equals("")) {
> >>+                    s = 
> Bundle.getString("Tags_NullBadAction", null);
> >>+                }
> >>+                else {
> >>+                    s = Bundle.getString("Tags_BadAction", 
> _action);
> >>+                }
> >>+                registerTagError(s, null);
> >>             }
> >>             else {
> >>-                s = Bundle.getString("Tags_BadAction", _action);
> >>+                //
> >>+                // If the action we're submitting to is
> >>checking for double-submits, save a token in the session.
> >>+                // This will be written out as a param
> >>(below), and will be checked in PageFlowRequestProcessor.
> >>+                //
> >>+                String token =
> >>PageFlowTagUtils.getToken(request, _action);
> >>+                if (token != null) {
> >>+                    if (_params == null) {
> >>+                        _params = new HashMap();
> >>+                    }
> >>+                    _params.put(Constants.TOKEN_KEY, token);
> >>+                }
> >>             }
> >>-            registerTagError(s, null);
> >>         }
> >>-
> >>+        
> >>         // we assume that tagId will over have override id if both
> >>         // are defined.
> >>         if (tagId != null) {
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Button.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/tags-html/org/apache/beehive/netui/tags/html/Button.java?vie
> >>w=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/tags-ht
> >>    
> >>
> >ml/org/apache/beehive/netui/tags/html/Button.jav> 
> >a&r1=124027&p2=incubator/beehive/trunk/netui/src/tags-html/org
> >/apache/beehive/netui/tags/html/Button.java&r2=> 124028
> >  
> >
> >>==============================================================
> >>================
> >>---
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Button.java        (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Button.java        Mon Jan  3 13:42:54 2005
> >>@@ -28,6 +28,7 @@
> >> import org.apache.beehive.netui.tags.rendering.WriteRenderAppender;
> >> import org.apache.beehive.netui.util.Bundle;
> >> import org.apache.beehive.netui.util.ParamHelper;
> >>+import org.apache.struts.taglib.html.Constants;
> >> 
> >> import javax.servlet.http.HttpServletRequest;
> >> import javax.servlet.http.HttpServletResponse;
> >>@@ -233,6 +234,18 @@
> >>         if (_action != null) {
> >>             boolean isAction =
> >>PageFlowTagUtils.isAction(request, _action);
> >>             if (isAction) {
> >>+                //
> >>+                // If the action we're submitting to is
> >>checking for double-submits, save a token in the session.
> >>+                // This will be written out as a param
> >>(below), and will be checked in PageFlowRequestProcessor.
> >>+                //
> >>+                String token =
> >>PageFlowTagUtils.getToken(request, _action);
> >>+                if (token != null) {
> >>+                    if (_params == null) {
> >>+                        _params = new HashMap();
> >>+                    }
> >>+                    _params.put(Constants.TOKEN_KEY, token);
> >>+                }
> >>+                
> >>                 String overrideAction = ACTION_OVERRIDE + _action;
> >>                 overrideAction =
> >>HtmlUtils.addParams(overrideAction, _params, 
> >>response.getCharacterEncoding());
> >>                 String buttonOutput = 
> >>URLRewriterService.rewriteName(pageContext.getServletContext(),
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Form.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/tags-html/org/apache/beehive/netui/tags/html/Form.java?view=
> >>diff&rev=124028&p1=incubator/beehive/trunk/netui/src/tags-html
> >>    
> >>
> >/org/apache/beehive/netui/tags/html/Form.java&r1> 
> >=124027&p2=incubator/beehive/trunk/netui/src/tags-html/org/apa
> >  
> >
> >>che/beehive/netui/tags/html/Form.java&r2=124028
> >>==============================================================
> >>================
> >>---
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Form.java  (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/html/Form.java  Mon Jan  3 13:42:54 2005
> >>@@ -20,6 +20,7 @@
> >> import org.apache.beehive.netui.core.urls.MutableURI;
> >> import org.apache.beehive.netui.core.urls.URLRewriterService;
> >> import org.apache.beehive.netui.pageflow.*;
> >>+import
> >>org.apache.beehive.netui.pageflow.config.PageFlowActionMapping;
> >> import org.apache.beehive.netui.pageflow.internal.ContextCache;
> >> import org.apache.beehive.netui.pageflow.internal.InternalUtils;
> >> import 
> org.apache.beehive.netui.pageflow.internal.InternalConstants;
> >>@@ -30,6 +31,7 @@
> >> import org.apache.beehive.netui.util.ParamHelper;
> >> import org.apache.beehive.netui.util.logging.Logger;
> >> import org.apache.struts.Globals;
> >>+import org.apache.struts.util.TokenProcessor;
> >> import org.apache.struts.action.ActionForm;
> >> import org.apache.struts.action.ActionMapping;
> >> import org.apache.struts.action.ActionServlet;
> >>@@ -723,11 +725,18 @@
> >>         TagRenderingBase br =
> >>TagRenderingBase.Factory.getRendering(TagRenderingBase.FORM_TA
> >>G, request);
> >>         br.doStartTag(writer, _state);
> >> 
> >>+        //
> >>+        // If the action we're submitting to is checking for
> >>double-submits, save a token in the session.
> >>+        // This will be written out as a hidden param
> >>(below), and will be checked in PageFlowRequestProcessor.
> >>+        //
> >>+        String token = PageFlowTagUtils.getToken(request, 
> _mapping);
> >>+        
> >>         // Add a transaction token (if present in our session)
> >>         HttpSession session = pageContext.getSession();
> >>         if (session != null) {
> >>-            String token =
> >>-                    (String) 
> >>session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
> >>+            if (token != null) {
> >>+                token = (String)
> >>session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
> >>+            }
> >>             if (token != null) {
> >>                 writeHiddenParam(Constants.TOKEN_KEY, token,
> >>writer, request, true);
> >>             }
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/internal/PageFlowTagUtils.java
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTag
> >>Utils.java?view=diff&rev=124028&p1=incubator/beehive/trunk/net
> >>ui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFl
> >>owTagUtils.java&r1=124027&p2=incubator/beehive/trunk/netui/src
> >>/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagU
> >>tils.java&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/internal/PageFlowTagUtils.java  (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive
> >>/netui/tags/internal/PageFlowTagUtils.java  Mon Jan  3 13:42:54 2005
> >>@@ -26,10 +26,13 @@
> >> import org.apache.beehive.netui.pageflow.PageFlowUtils;
> >> import org.apache.beehive.netui.pageflow.SecurityProtocol;
> >> import org.apache.beehive.netui.pageflow.SharedFlowController;
> >>+import
> >>org.apache.beehive.netui.pageflow.config.PageFlowActionMapping;
> >> import org.apache.beehive.netui.pageflow.internal.InternalUtils;
> >> import 
> org.apache.beehive.netui.pageflow.internal.InternalConstants;
> >> import org.apache.struts.action.ActionMapping;
> >> import org.apache.struts.config.ActionConfig;
> >>+import org.apache.struts.util.TokenProcessor;
> >>+import org.apache.struts.Globals;
> >> 
> >> import java.net.URISyntaxException;
> >> import java.util.Map;
> >>@@ -38,6 +41,7 @@
> >> import javax.servlet.ServletRequest;
> >> import javax.servlet.http.HttpServletResponse;
> >> import javax.servlet.http.HttpServletRequest;
> >>+import javax.servlet.http.HttpSession;
> >> 
> >> /**
> >>  * This is a utility class for the beehive tags with
> >>routines for helping with URL rewriting. @@ -178,6 +182,44 @@
> >>         return true;
> >>     }
> >> 
> >>+    /**
> >>+     * Get or generate a token used to prevent double
> >>submits to an action.  The token is stored in the session,
> >>+     * and checked (and removed) when processing an action
> >>with the <code>preventDoubleSubmit</code> attribute
> >>+     * set to <code>true</code>.
> >>+     */ 
> >>+    public static String getToken( HttpServletRequest
> >>request, String action )
> >>+    {
> >>+        FlowController flowController =
> >>+ InternalUtils.getCurrentPageFlow( request, false );
> >>+        
> >>+        if ( flowController != null )
> >>+        {
> >>+            MappingAndController mac = getActionMapping(
> >>request, flowController, action );
> >>+            if ( mac != null ) return getToken( request,
> >>mac.mapping );
> >>+        }
> >>+        
> >>+        return null;
> >>+    }
> >>+    
> >>+    /**
> >>+     * Get or generate a token used to prevent double
> >>submits to an action.  The token is stored in the session,
> >>+     * and checked (and removed) when processing an action
> >>with the <code>preventDoubleSubmit</code> attribute
> >>+     * set to <code>true</code>.
> >>+     */ 
> >>+    public static String getToken( HttpServletRequest
> >>request, ActionMapping mapping )
> >>+    {
> >>+        if ( mapping instanceof PageFlowActionMapping && ( (
> >>PageFlowActionMapping ) mapping ).isPreventDoubleSubmit() )
> >>+        {
> >>+            HttpSession session = request.getSession();
> >>+            String token = ( String ) session.getAttribute(
> >>Globals.TRANSACTION_TOKEN_KEY );
> >>+            if ( token != null ) return token;
> >>+            token =
> >>TokenProcessor.getInstance().generateToken( request );
> >>+            request.getSession().setAttribute(
> >>Globals.TRANSACTION_TOKEN_KEY, token );
> >>+            return token;
> >>+        }
> >>+        
> >>+        return null;
> >>+    }
> >>+    
> >>     public static class MappingAndController
> >>     {
> >>         public ActionMapping mapping;
> >>@@ -198,12 +240,32 @@
> >>             
> >>             if ( dot == -1 )
> >>             {
> >>+                //
> >>+                // It's an action in the current page flow,
> >>or in the (deprecated) Global.app.
> >>+                //
> >>                 if ( action.charAt( 0 ) != '/' ) action =
> >>'/' + action;
> >>                 mapping = 
> >>flowController.getModuleConfig().findActionConfig( action );
> >>                 fc = flowController;
> >>+                
> >>+                //
> >>+                // If we don't find it in the current page
> >>flow, look in Global.app.
> >>+                //
> >>+                if ( mapping == null )
> >>+                {
> >>+                    FlowController globalApp =
> >>+                            PageFlowUtils.getSharedFlow(
> >>InternalConstants.GLOBALAPP_CLASSNAME, request );
> >>+                    if ( globalApp != null )
> >>+                    {
> >>+                        mapping =
> >>globalApp.getModuleConfig().findActionConfig( action );
> >>+                        fc = globalApp;
> >>+                    }
> >>+                }
> >>             }
> >>             else if ( dot < action.length() - 1 )
> >>             {
> >>+                //
> >>+                // It's an action in a shared flow.
> >>+                //
> >>                 String sharedFlowName = action.substring( 0, dot );
> >>                 if ( sharedFlowName.length() > 0 &&
> >>sharedFlowName.charAt( 0 ) == '/' )
> >>                 {
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/src/util/org/apache/beehive/netu
> >>i/util/netui.properties
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/sr
> >>c/util/org/apache/beehive/netui/util/netui.properties?view=dif
> >>f&rev=124028&p1=incubator/beehive/trunk/netui/src/util/org/apa
> >>che/beehive/netui/util/netui.properties&r1=124027&p2=incubator
> >>    
> >>
> >/beehive/trunk/netui/src/util/org/apache/beehive> 
> >/netui/util/netui.properties&r2=124028
> >  
> >
> >>==============================================================
> >>================
> >>---
> >>incubator/beehive/trunk/netui/src/util/org/apache/beehive/netu
> >>i/util/netui.properties     (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/src/util/org/apache/beehive/netu
> >>i/util/netui.properties     Mon Jan  3 13:42:54 2005
> >>@@ -452,19 +452,19 @@  PageFlow_ActionNotFoundException_Message= \
> >> Unable to find matching action {0} in page flow {1}.
> >> 
> >>-PageFlow_DoubleFormPostException_Page= \
> >>-<html><head><title>Page Flow Error - Double Form 
> >>Post</title></head>\n \
> >>+PageFlow_DoubleSubmitException_Page= \ 
> <html><head><title>Page Flow 
> >>+Error - Double Submit</title></head>\n \
> >> <body>\n \
> >>-<h1>Page Flow Error - Double Form Post</h1>\n \
> >>+<h1>Page Flow Error - Submit</h1>\n \
> >> <table border="1" cellspacing="0">\n \
> >> <tr><td><b>Page Flow:</b></td><td>{1}</td></tr>\n \
> >><tr><td><b>Action:</b></td><td>{0}</td></tr>\n \  </table><br 
> >>/>\n \ -<span style="color:red">A double-post occurred for 
> >>action <b>{0}</b>.</span>\n \
> >>+<span style="color:red">A double-submit occurred for action
> >>+<b>{0}</b>.</span>\n \
> >> </body></html>\n
> >> 
> >>-PageFlow_DoubleFormPostException_Message= \
> >>-A double-post occurred for action <b>{0}</b> in page flow {1}.
> >>+PageFlow_DoubleSubmitException_Message= \
> >>+A double-submit occurred for action <b>{0}</b> in page flow {1}.
> >> 
> >> PageFlow_UnhandledException_Page = \
> >> <html><head><title>Page Flow Unhandled Exception</title></head>\n \
> >>
> >>Modified:
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF
> >>/tiles-defs.xml
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/te
> >>st/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml?view=diff&rev=12
> >>4028&p1=incubator/beehive/trunk/netui/test/webapps/drt/coreWeb
> >>/WEB-INF/tiles-defs.xml&r1=124027&p2=incubator/beehive/trunk/n
> >>etui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml&r2=124028
> >>==============================================================
> >>================
> >>--- 
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF
> >>/tiles-defs.xml     (original)
> >>+++ 
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF
> >>/tiles-defs.xml     Mon Jan  3 13:42:54 2005
> >>@@ -2,7 +2,7 @@
> >> 
> >>  <!DOCTYPE tiles-definitions PUBLIC
> >>        "-//Apache Software Foundation//DTD Tiles Configuration//EN"
> >>-       "http://jakarta.apache.org/struts/dtds/tiles-config.dtd";>
> >>+       
> "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd";>
> >> 
> >> 
> >> <!--
> >>
> >>Added:
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/Controller.jpf
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/te
> >>st/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/Controlle
> >>r.jpf?view=auto&rev=124028
> >>==============================================================
> >>================
> >>--- (empty file)
> >>+++ 
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/Controller.jpf       Mon Jan  3 13:42:54 2005
> >>@@ -0,0 +1,27 @@
> >>+package miniTests.preventDoubleSubmit;
> >>+
> >>+import org.apache.beehive.netui.pageflow.*;
> >>+import org.apache.beehive.netui.pageflow.annotations.*;
> >>+
> >>[EMAIL PROTECTED](
> >>+    simpleActions={
> >>+        @Jpf.SimpleAction(name="begin", path="index.jsp"),
> >>+        @Jpf.SimpleAction(name="anchorSubmit",
> >>preventDoubleSubmit=true, path="submitted.jsp")
> >>+    },
> >>+    catches={
> >>+        @Jpf.Catch(type=DoubleSubmitException.class,
> >>path="caughtit.jsp")
> >>+    }
> >>+)
> >>+public class Controller extends PageFlowController
> >>+{
> >>+    @Jpf.Action(
> >>+        preventDoubleSubmit=true,
> >>+        forwards={
> >>+            @Jpf.Forward(name="submitted", path="submitted.jsp")
> >>+        }
> >>+    )
> >>+    public Forward formSubmit()
> >>+    {
> >>+        return new Forward("submitted");
> >>+    }
> >>+}
> >>
> >>Added:
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/caughtit.jsp
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/te
> >>st/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/caughtit.
> >>jsp?view=auto&rev=124028
> >>==============================================================
> >>================
> >>--- (empty file)
> >>+++ 
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/caughtit.jsp Mon Jan  3 13:42:54 2005
> >>@@ -0,0 +1,19 @@
> >>+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
> >>+<%@ taglib prefix="netui"
> >>+uri="http://beehive.apache.org/netui/tags-html-1.0"%>
> >>+<%@ taglib prefix="netui-data" 
> >>uri="http://beehive.apache.org/netui/tags-databinding-1.0"%>
> >>+<%@ taglib prefix="netui-template"
> >>uri="http://beehive.apache.org/netui/tags-template-1.0"%>
> >>+
> >>+
> >>+<netui:html>
> >>+    <head>
> >>+        <netui:base/>
> >>+    </head>
> >>+    <netui:body>
> >>+        OK -- caught DoubleSubmitException
> >>+        <br/>
> >>+        <netui:anchor action="begin">start over</netui:anchor>
> >>+    </netui:body>
> >>+</netui:html>
> >>+
> >>+  
> >>+
> >>
> >>Added:
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/index.jsp
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/te
> >>st/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/index.jsp
> >>?view=auto&rev=124028
> >>==============================================================
> >>================
> >>--- (empty file)
> >>+++ 
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/index.jsp    Mon Jan  3 13:42:54 2005
> >>@@ -0,0 +1,27 @@
> >>+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
> >>+<%@ taglib prefix="netui"
> >>+uri="http://beehive.apache.org/netui/tags-html-1.0"%>
> >>+<%@ taglib prefix="netui-data" 
> >>uri="http://beehive.apache.org/netui/tags-databinding-1.0"%>
> >>+<%@ taglib prefix="netui-template"
> >>uri="http://beehive.apache.org/netui/tags-template-1.0"%>
> >>+
> >>+
> >>+<netui:html>
> >>+    <head>
> >>+        <netui:base/>
> >>+    </head>
> >>+    <netui:body>
> >>+        <netui:form action="formSubmit">
> >>+            <netui:button value="netui:form (prevent 
> double post)"/>
> >>+        </netui:form>
> >>+        <netui:form action="begin">
> >>+            <netui:button action="formSubmit"
> >>value="netui:button (prevent double post)"/>
> >>+        </netui:form>
> >>+        <netui:anchor action="anchorSubmit">netui:anchor
> >>(prevent double post)</netui:anchor>
> >>+        <br/>
> >>+        <br/>
> >>+        <netui:imageAnchor action="anchorSubmit"
> >>src="../../resources/images/goButton.jpg">netui:imageAnchor
> >>(prevent double post)</netui:imageAnchor>
> >>+        <br/>
> >>+    </netui:body>
> >>+</netui:html>
> >>+
> >>+  
> >>+
> >>
> >>Added:
> >>incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> >>ts/preventDoubleSubmit/submitted.jsp
> >>Url: 
> >>http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/te
> >>    
> >>
> >st/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/submitte
> d.jsp?view
> >=auto&rev=124028
> >=============================================================
> =================
> >--- (empty file)
> >+++ 
> incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTes
> ts/preventDoubleSubmit/submitted.jsp  Mon Jan  3 13:42:54 2005
> >@@ -0,0 +1,17 @@
> >+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
> >+<%@ taglib prefix="netui"
> >+uri="http://beehive.apache.org/netui/tags-html-1.0"%>
> >+<%@ taglib prefix="netui-data" 
> uri="http://beehive.apache.org/netui/tags-databinding-1.0"%>
> >+<%@ taglib prefix="netui-template" 
> uri="http://beehive.apache.org/netui/tags-template-1.0"%>
> >+
> >+
> >+<netui:html>
> >+    <head>
> >+        <netui:base/>
> >+    </head>
> >+    <netui:body>
> >+        OK -- submitted once.  Use the back button and submit again.
> >+    </netui:body>
> >+</netui:html>
> >+
> >+  
> >+
> >
> >  
> >
> 

Reply via email to