Hi Toll,

Your observation is correct. If you use LookupDispatchAction for creating
your own action class, and if you specify validate="true" in your
struts-config.xml then Struts will always validate the input regardless
which method in your action class is invoked.

One of the solution is to set validate="true" in the struts-config.xml and
ask Struts to perform or bypass the validation in your corresponding execute
methods in the action class. Like:

errors = form.validate(mapping, request);
if (!errors.isEmpty()) {
        saveMessages(request, errors);
        return new ActionForward(mapping.getInput());
}

I hope this will help you.

Moreover, try to avoid LookupDispatchAction because of the performance
issues in it because it creates a reverse map to lookup the method to
execute. Rather try to use the plain DispatchAction. It is just a suggestion
from my own experience.

Regards
Sujan
<contact>
    <name>Sujan Deb</name>
    <email>[EMAIL PROTECTED]</email>
    <address>
        20 Dundas Street W, 6th Floor
        Toronto, ON, Canada
    </address>
    <tel>416-861-5242</tel>
    <extn>2-5242</extn>
</contact>



-----Original Message-----
From: Toll, Marvin (M.) [mailto:[EMAIL PROTECTED]
Sent: Tuesday, January 25, 2005 11:01 AM
To: user@struts.apache.org
Subject: LookupDispatchAction : Cancel Button : html:cancel



It appears that extending LookupDispatchAction does *not* cause
validation to be bypassed when the following tag is used in a JSP:

<html:cancel property="method">
    <bean:message key="common.button.cancel" />
</html:cancel>


Two Questions

1) Are we incorrect in our observation?

2) Does anyone have a better solution than the attached?

    // Message for cancel button.
    public static final String CANCEL_BUTTON_RESOURCE =
"common.button.cancel";
    public static final String BACK_BUTTON_RESOURCE =
"common.button.back";
    // LookupDispatchAction parameter name.
    public static final String LOOKUP_DISPATCH_ACTION_PARAMETER =
"method";
 

    /**
     * <p> This method is overridden to support page
     * submission without validating in three specific contexts
     * when the action class extends LookupDispatchAction.
     * (1) A drop-down list box submitted via JavaScript
     * whose selection is used to trigger initialization of other
attributes.
     * (2) A cancel button was used for submission.  (3) A back button
was
     * used for submission.</p>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     * @param form The ActionForm instance we are populating
     * @param mapping The ActionMapping we are using
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception occurs
     */
    protected boolean processValidate(
        HttpServletRequest request,
        HttpServletResponse response,
        ActionForm form,
        ActionMapping mapping)
        throws IOException, ServletException {

        String METHOD_NAME = "processValidate";
        log.entering(CLASS_NAME, METHOD_NAME);

        // Declaration.
        boolean valid;

        // Determine if LookupDispatchAction is being extended for this
request. 
        if (mapping.getParameter() != null
            && mapping.getParameter().equals(
                Constants.LOOKUP_DISPATCH_ACTION_PARAMETER)) {

            // Obtain the message resource bundle.
            MessageResources messageResources =
this.getResources(request);

            // Determine if a value has not been established in the
request object.
            if (request
 
.getParameter(Constants.LOOKUP_DISPATCH_ACTION_PARAMETER)
                == null) {

                // Initialize the method name to be supported in a
LookupDispatchAction.
                String[] methodName = { Constants.METHOD_RETURN_TO_PAGE
};

                // Establish the default - supportable as a base class
method.
                request.getParameterMap().put(
                    Constants.LOOKUP_DISPATCH_ACTION_PARAMETER,
                    methodName);

                // Return without validating.
                valid = true;

                // Determine if the cancel or back button was selected.

            } else if (
                request.getParameter(
                    Constants.LOOKUP_DISPATCH_ACTION_PARAMETER).equals(
                    messageResources.getMessage(
                        Constants.CANCEL_BUTTON_RESOURCE))
                    || request.getParameter(
 
Constants.LOOKUP_DISPATCH_ACTION_PARAMETER).equals(
                        messageResources.getMessage(
                            Constants.BACK_BUTTON_RESOURCE))) {

                // Return without validating.
                valid = true;

            } else {
                // Process validations.
                valid = super.processValidate(request, response, form,
mapping);
            }
        } else {
            // Process validations.
            valid = super.processValidate(request, response, form,
mapping);
        }

        log.exiting(CLASS_NAME, METHOD_NAME);
        return valid;
    }

****************************************
*  Cell Phone: 248.866.4897 (free incoming calls)
****************************************


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to