DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20389>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20389

Need mechanism that lets more than one forms points to the same form bean instance in 
a HTML page

           Summary: Need mechanism that lets more than one forms points to
                    the same form bean instance in a HTML page
           Product: Struts
           Version: 1.1 RC1
          Platform: All
        OS/Version: Other
            Status: NEW
          Severity: Enhancement
          Priority: Other
         Component: Custom Tags
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


Sometimes in a HTML page, we have more than one HTML forms, where the forms 
must have different name attribute value, otherwise our javascripts cannot 
work on those forms; On the other hand, we need to let those forms' form bean 
point to the same bean instance in seesion scope or request scope. Is there 
any way we can achieve that goal?

We tried to use name and "attribute" attribute in action tag of struts-
config.xml, but we get the HTML form name as the attribute value of action 
tag, so it make no sense.

Here is our version of FormTag, but I don't think that's a good way, and also 
it might affect validator funcation. Hope you guys have a good mechanism.

//--------------------------------------------------------------------
package com.aon.chor.org.apache.struts.taglib.html;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.config.FormBeanConfig;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.MessageResources;
import org.apache.struts.util.RequestUtils;
import org.apache.struts.util.ResponseUtils;
import org.apache.struts.taglib.html.Constants;

/**
 * Custom tag that represents an input form, associated with a bean whose
 * properties correspond to the various fields of the form.
 *
 * @author Craig R. McClanahan
 * @author Martin Cooper
 * @author James Turner
 * @version $Revision: 1.43 $ $Date: 2003/01/28 05:18:03 $
 */

public class FormTag extends org.apache.struts.taglib.html.FormTag {

    // ----------------------------------------------------- Instance Variables
    /**
     * The message resources for this package.
     */
    protected static MessageResources messages =
        MessageResources.getMessageResources(Constants.Package 
+ ".LocalStrings");

    // --------------------------------------------------------- Public Methods

    /**
     * Render the beginning of this form.
     *
     * @exception JspException if a JSP exception has occurred
     */
    public int doStartTag() throws JspException {

        // Look up the form bean name, scope, and type if necessary
        lookup();

        // Create an appropriate "form" element based on our parameters
        HttpServletResponse response = (HttpServletResponse) 
pageContext.getResponse();
        StringBuffer results = new StringBuffer("<form");
        results.append(" name=\"");
        
        //---------------------------------------------------------------------
        //In a HTML page, we have more than one HTML forms, which must have 
different name attribute value for 
        //html:form tag as rule of part HTML spec; however, we need let those 
three forms' form bean point to 
        //the same bean in seesion scope or request scope.
        //We tried to use name and attribute attribute in action tag of struts-
config.xml, but we get the HTML form
        //name as the attribute value of action tag
        //---------------------------------------------------------------------
                //results.append(beanName);
        results.append(mapping.getName());
        
        results.append("\"");
         results.append(" method=\"");
         results.append(method == null ? "post" : method);
         results.append("\" action=\"");
         results.append(response.encodeURL(RequestUtils.getActionMappingURL
(action, pageContext)));
         results.append("\"");
         if (styleClass != null) {
             results.append(" class=\"");
            results.append(styleClass);
            results.append("\"");
        }
        if (enctype != null) {
            results.append(" enctype=\"");
            results.append(enctype);
            results.append("\"");
        }
        if (onreset != null) {
            results.append(" onreset=\"");
            results.append(onreset);
            results.append("\"");
        }
        if (onsubmit != null) {
            results.append(" onsubmit=\"");
            results.append(onsubmit);
            results.append("\"");
        }
        if (style != null) {
            results.append(" style=\"");
            results.append(style);
            results.append("\"");
        }
        if (styleId != null) {
            results.append(" id=\"");
            results.append(styleId);
            results.append("\"");
        }
        if (target != null) {
            results.append(" target=\"");
            results.append(target);
            results.append("\"");
        }
        results.append(">");

        // 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) {
                results.append("<input type=\"hidden\" name=\"");
                results.append(Constants.TOKEN_KEY);
                results.append("\" value=\"");
                results.append(token);
                if (this.isXhtml()) {
                    results.append("\" />");
                } else {
                    results.append("\">");
                }
            }
        }

        // Print this field to our output writer
        ResponseUtils.write(pageContext, results.toString());

        // Store this tag itself as a page attribute
        pageContext.setAttribute(Constants.FORM_KEY, this, 
PageContext.REQUEST_SCOPE);

        // Locate or create the bean associated with our form
        int scope = PageContext.SESSION_SCOPE;
        if ("request".equals(beanScope)) {
            scope = PageContext.REQUEST_SCOPE;
        }
        Object bean = pageContext.getAttribute(beanName, scope);
        if (bean == null) {
            if (type != null) {
                // Backwards compatibility - use explicitly specified values
                try {
                    bean = RequestUtils.applicationInstance(beanType);
                    if (bean != null) {
                        ((ActionForm) bean).setServlet(servlet);
                    }
                } catch (Exception e) {
                    throw new JspException(
                        messages.getMessage("formTag.create", type, e.toString
()));
                }
            } else {
                // New and improved - use the values from the action mapping
                bean =
                    RequestUtils.createActionForm(
                        (HttpServletRequest) pageContext.getRequest(),
                        mapping,
                        moduleConfig,
                        servlet);
            }
            if (bean instanceof ActionForm) {
                ((ActionForm) bean).reset(mapping, (HttpServletRequest) 
pageContext.getRequest());
            }
            if (bean == null) {
                throw new JspException(messages.getMessage("formTag.create", 
beanType));
            }
            pageContext.setAttribute(beanName, bean, scope);
        }
        pageContext.setAttribute(Constants.BEAN_KEY, bean, 
PageContext.REQUEST_SCOPE);

        // Continue processing this page
        return (EVAL_BODY_INCLUDE);

    }
    /**
     * Render the end of this form.
     *
     * @exception JspException if a JSP exception has occurred
     */
    public int doEndTag() throws JspException {

        // Remove the page scope attributes we created
        pageContext.removeAttribute(Constants.BEAN_KEY, 
PageContext.REQUEST_SCOPE);
        pageContext.removeAttribute(Constants.FORM_KEY, 
PageContext.REQUEST_SCOPE);

        // Render a tag representing the end of our current form
        StringBuffer results = new StringBuffer("</form>");

        // Render JavaScript to set the input focus if required
        if (this.focus != null) {
            results.append("\r\n");
            results.append(this.getJsStartElement());

            // xhtml script content shouldn't use the browser hiding trick
            if (!this.isXhtml()) {
                results.append("  <!--\r\n");
            }

            // Construct the control name that will receive focus.
            // This does not include any index.
                //-------------------------------------------------------------
--------
                //In a HTML page, we have more than one HTML forms, which must 
have different name attribute value for 
                //html:form tag as rule of part HTML spec; however, we need 
let those three forms' form bean point to 
                //the same bean in seesion scope or request scope.
                //We tried to use name and attribute attribute in action tag 
of struts-config.xml, but we get the HTML form
                //name as the attribute value of action tag
                //-------------------------------------------------------------
--------
            //String focusControl =
            //    "document.forms[\"" + beanName + "\"].elements[\"" + 
this.focus + "\"]";
            String focusControl =
                "document.forms[\"" + mapping.getName() + "\"].elements[\"" + 
this.focus + "\"]";

            results.append("  var focusControl = " + focusControl 
+ ";\r\n\r\n");

            results.append("  if (focusControl.type != \"hidden\") {\r\n");

            // Construct the index if needed and insert into focus statement
            String index = "";
            if (this.focusIndex != null) {
                index = "[" + this.focusIndex + "]";
            }
            results.append("     focusControl" + index + ".focus();\r\n  } 
\r\n");

            if (!this.isXhtml()) {
                results.append("  // -->\r\n");
            }

            results.append("</script>\r\n");
        }

        // Print this value to our output writer
        JspWriter writer = pageContext.getOut();
        try {
            writer.print(results.toString());
        } catch (IOException e) {
            throw new JspException(messages.getMessage("common.io", e.toString
()));
        }

        // Continue processing this page
        return (EVAL_PAGE);

    }
    /**
     * Returns the starting javascript element formatted for xhtml if needed.
     */
    private String getJsStartElement() {
        String start = "<script type=\"text/javascript\"";

        if (!this.isXhtml()) {
            start += " language=\"JavaScript\"";
        }
        start += ">\r\n";

        return start;
    }

    /**
     * Returns true if this tag should render as xhtml.
     */
    private boolean isXhtml() {
        String xhtml =
            (String) this.pageContext.getAttribute(Globals.XHTML_KEY, 
this.pageContext.PAGE_SCOPE);

        return ("true".equalsIgnoreCase(xhtml));
    }

}

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

Reply via email to