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]