You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by bu...@apache.org on 2003/06/01 02:35:39 UTC
DO NOT REPLY [Bug 20389] New: -
Need mechanism that lets more than one forms points to the same form bean instance in a HTML page
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: struts-dev@jakarta.apache.org
ReportedBy: charleliujcn@yahoo.com
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: struts-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-dev-help@jakarta.apache.org