[prev in list] [next in list] [prev in thread] [next in thread] 

List:       struts-dev
Subject:    cvs commit: jakarta-struts/src/share/org/apache/struts/taglib/html FormTag.java LocalStrings.propert
From:       craigmcc () apache ! org
Date:       2001-01-27 23:21:10
[Download RAW message or body]

craigmcc    01/01/27 15:21:09

  Modified:    src/doc  struts-html.xml
               src/share/org/apache/struts/taglib/html FormTag.java
                        LocalStrings.properties
  Log:
  Improve the mechanism by which the <html:form> tag calculates the action
  mapping to which this form will be submitted.  Now, it should work for
  all of the following cases:
  
  * Extension mapped:  "logon.do" or "/logon.do" or "/admin/logon.do"
  
  * Path mapped:  "/execute/logon"
  
  In all cases, a server-relative URL will be generated by prepending the
  context path.
  
  This patch is based on the patch submitted by Chris Smith
  <chris.smith@b-i-s.co.uk>, but modified to work for path mapped
  servlets as well.
  
  Revision  Changes    Path
  1.4       +54 -24    jakarta-struts/src/doc/struts-html.xml
  
  Index: struts-html.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/doc/struts-html.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- struts-html.xml	2001/01/27 20:09:42	1.3
  +++ struts-html.xml	2001/01/27 23:21:07	1.4
  @@ -985,15 +985,25 @@
   		
   		<attribute>
   			<name>action</name>
  -			<required>false</required>
  +			<required>true</required>
   			<rtexprvalue>true</rtexprvalue>
   			<info>
  -				The URL to which this form will be submitted. Typically, this will
  -				match a mapping for the ActionServlet managing this application.
  -				URL rewriting will automatically be performed on this URL, to
  -				maintain session state in the absence of cookies. [Form will be
  -				submitted to this page itself] 
  -			</info>
  +                        <p>The URL to which this form will be submitted.  This
  +                        value is also used to select the ActionMapping we are
  +                        assumed to be processing, from which we can identify
  +                        the appropriate form bean and scope.</p>
  +
  +                        <p>If you are using extension mapping for selecting the
  +                        controller servlet, this value should be equal to the
  +                        <code>path</code> attribute of the corresponding
  +                        <code>&lt;action&gt;</code> element, plus the correct
  +                        file extension suffix.</p>
  +
  +                        <p>If you are using path mapping to select the
  +                        controller servlet, this value should be exactly equal
  +                        to the <code>path</code> attribute of the corresponding
  +                        <code>&lt;action&gt;</code> element.</p>
  +                        </info>
   		</attribute>
   		
   		<attribute>
  @@ -1034,14 +1044,22 @@
   			<required>false</required>
   			<rtexprvalue>true</rtexprvalue>
   			<info>
  -				Name of the request scope or session scope bean (as defined by
  -				the scope attribute) whose properties will be used to populate
  -				input field values. If no such bean is found, a new bean will
  -				be created (and added to the appropriate scope), using the Java
  -				class name specified by the type attribute. 
  -			</info>
  -		</attribute>
  -		
  +                        <p>Name of the request scope or session scope bean
  +                        (as defined by the <code>scope</code> attribute)
  +                        whose properties will be used to populate the input
  +                        field values.  If no such bean is found, a new bean
  +                        will be created and added to the appropriate scope,
  +                        using the Java class name specified by the
  +                        <code>type</code> attribute.</p>
  +
  +                        <p>If this attribute is not specified, it will be
  +                        calculated by using the value of the
  +                        <code>action</code> attribute to look up the
  +                        corresponding ActionMapping element, from which
  +                        we will select the specified form bean name.</p>
  +                        </info>
  +                </attribute>
  +
   		<attribute>
   			<name>onreset</name>
   			<required>false</required>
  @@ -1065,9 +1083,17 @@
   			<required>false</required>
   			<rtexprvalue>true</rtexprvalue>
   			<info>
  -				JSP scope within which the associated bean will be accessed
  -				or created (request, session). [session]
  -			</info>
  +                        <p>Scope within which the form bean associated with
  +                        this input form will be accessed or created (must be
  +                        either <code>request</code> or <code>session</code>.
  +                        </p>
  +
  +                        <p>If this attribute is not specified, it will be
  +                        calculated by using the value of the
  +                        <code>action</code> attribute to look up the
  +                        corresponding ActionMapping element, from which
  +                        we will select the specified form bean scope.</p>
  +                        </info>
   		</attribute>
   		
   		<attribute>
  @@ -1103,12 +1129,16 @@
   			<required>false</required>
   			<rtexprvalue>true</rtexprvalue>
   			<info>
  -				Fully qualified Java class name of the bean to be created
  -				if no bean is found for the specified name and scope. To
  -				be used successfully with the Struts ActionServlet, this class
  -				must implement the org.apache.struts.action.ActionForm interface.
  -				[Runtime error if bean creation is attempted]
  -			</info>
  +                        <p>Fully qualified Java class name of the form bean to
  +                        be created, if no such bean is found in the specified
  +                        scope.</p>
  +
  +                        <p>If this attribute is not specified, it will be
  +                        calculated by using the value of the
  +                        <code>action</code> attribute to look up the
  +                        corresponding ActionMapping element, from which
  +                        we will select the specified form bean type.</p>
  +                        </info>
   		</attribute>
   	</tag>
   	
  
  
  
  1.4       +130 -68   \
jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java  
  Index: FormTag.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FormTag.java	2001/01/26 19:27:23	1.3
  +++ FormTag.java	2001/01/27 23:21:08	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java,v \
                1.3 2001/01/26 19:27:23 craigmcc Exp $
  - * $Revision: 1.3 $
  - * $Date: 2001/01/26 19:27:23 $
  + * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java,v \
1.4 2001/01/27 23:21:08 craigmcc Exp $  + * $Revision: 1.4 $
  + * $Date: 2001/01/27 23:21:08 $
    *
    * ====================================================================
    *
  @@ -64,12 +64,12 @@
   
   
   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.JspTagException;
   import javax.servlet.jsp.tagext.TagSupport;
   import org.apache.struts.action.Action;
   import org.apache.struts.action.ActionFormBean;
  @@ -85,7 +85,7 @@
    * properties correspond to the various fields of the form.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.3 $ $Date: 2001/01/26 19:27:23 $
  + * @version $Revision: 1.4 $ $Date: 2001/01/27 23:21:08 $
    */
   
   public class FormTag extends TagSupport {
  @@ -184,28 +184,7 @@
   
       // ------------------------------------------------------------- Properties
   
  -    /**
  -     * Returns a form action converted into an action mapping path.
  -     * Anything after a period (".") is considered a name extension and ignored.
  -     * Anything before the last forward slash ("/") is considered a name 
  -     * extension and ignored.
  -     */
  -    protected String getActionMappingName() {
  -        String retString = action;
  -        int period = action.lastIndexOf(".");
  -        int slash = action.lastIndexOf("/");
  -        if (period < slash)
  -            period = -1;
  -        if (period > -1) {
  -            retString = action.substring(0, period);
  -        }
  -        if (slash > -1) {
  -            retString = retString.substring(slash+1, retString.length());
  -        }
  -        return "/" + retString;
  -    }
  -    
  -    
  +
       /**
        * Return the action URL to which this form should be submitted.
        */
  @@ -458,41 +437,8 @@
        */
       public int doStartTag() throws JspException {
   
  -        //get unspecified values
  -        if ((name == null) || (type == null)) {
  -            //get ActionMapping specified by "action"
  -            ActionMappings mappings = (ActionMappings)
  -                 pageContext.getAttribute(Action.MAPPINGS_KEY,
  -                                          PageContext.APPLICATION_SCOPE);
  -            ActionFormBeans formBeans = (ActionFormBeans)
  -                pageContext.getAttribute(Action.FORM_BEANS_KEY,
  -                                         PageContext.APPLICATION_SCOPE);
  -            if ((mappings != null) && (formBeans != null)) {
  -              String actionMappingName = getActionMappingName();
  -              ActionMapping mapping = mappings.findMapping(actionMappingName); 
  -            
  -              if (mapping != null) {
  -                  this.scope = mapping.getScope();
  -                  if (name == null) {
  -                    this.name = mapping.getAttribute();
  -                  }
  -                  if (type == null) {
  -                    ActionFormBean formBean =
  -                        formBeans.findFormBean(mapping.getName());
  -                    if (formBean != null)
  -                        this.type = formBean.getType();
  -                  }
  -                }
  -                else {
  -                    throw new JspTagException("Cannot retrieve mapping for \
                specified form " +
  -                        "action path \"" + actionMappingName + "\"");
  -                }
  -            }
  -            else {
  -                throw new JspTagException("Cannot retrieve ActionMappings under \
                key \"" + 
  -                    Action.MAPPINGS_KEY + "\"");
  -            }
  -        }
  +        // Look up the form bean name, scope, and type if necessary
  +        lookup();
   
   	// Create an appropriate "form" element based on our parameters
   	HttpServletResponse response =
  @@ -503,12 +449,10 @@
   	results.append("\"");
   	results.append(" method=\"");
   	results.append(method);
  -	results.append("\"");
  -	if (action != null) {
  -	    results.append(" action=\"");
  -	    results.append(response.encodeURL(BeanUtils.filter(action)));
  -	    results.append("\"");
  -	}
  +        results.append("\" action=\"");
  +        results.append
  +            (response.encodeURL(BeanUtils.filter(getActionMappingURL())));
  +        results.append("\"");
           if (styleClass != null) {
               results.append(" class=\"");
               results.append(styleClass);
  @@ -654,6 +598,124 @@
   	styleClass = null;
   	target = null;
   	type = null;
  +
  +    }
  +
  +
  +    // ------------------------------------------------------ Protected Methods
  +
  +
  +    /**
  +     * Return the form action converted into an action mapping path.  The
  +     * value of the <code>action</code> property is manipulated as follows in
  +     * computing the name of the requested mapping:
  +     * <ul>
  +     * <li>Any filename extension is removed (on the theory that extension
  +     *     mapping is being used to select the controller servlet).</li>
  +     * <li>If the resulting value does not start with a slash, then a
  +     *     slash is prepended.</li>
  +     * </ul>
  +     */
  +    protected String getActionMappingName() {
  +
  +        String value = action;
  +        int slash = action.lastIndexOf("/");
  +        int period = action.lastIndexOf(".");
  +        if ((period >= 0) && (period > slash))
  +            value = value.substring(0, period);
  +        if (value.startsWith("/"))
  +            return (value);
  +        else
  +            return ("/" + value);
  +
  +    }
  +
  +
  +    /**
  +     * Return the form action converted into a server-relative URL.  The
  +     * URL string is composed of the following pieces:
  +     * <ul>
  +     * <li>The context path of this web application.</li>
  +     * <li>If the <code>action</code> property value does not start with
  +     *     a slash, a slash is inserted.</li>
  +     * <li>The <code>action</code> property value.</li>
  +     */
  +    protected String getActionMappingURL() {
  +
  +        HttpServletRequest request =
  +            (HttpServletRequest) pageContext.getRequest();
  +        StringBuffer value = new StringBuffer(request.getContextPath());
  +        if (!action.startsWith("/"))
  +            value.append("/");
  +        value.append(action);
  +        return (value.toString());
  +
  +    }
  +
  +
  +    /**
  +     * Look up values for the <code>name</code>, <code>scope</code>, and
  +     * <code>type</code> properties if necessary.
  +     *
  +     * @exception JspException if a required value cannot be looked up
  +     */
  +    protected void lookup() throws JspException {
  +
  +        // Were the required values already specified?
  +        if (name != null) {
  +            if (scope == null)
  +                scope = "session";
  +            if (type == null) {
  +                JspException e = new JspException
  +                    (messages.getMessage("formTag.nameType"));
  +                pageContext.setAttribute(Action.EXCEPTION_KEY, e,
  +                                         PageContext.REQUEST_SCOPE);
  +                throw e;
  +            }
  +            return;
  +        }
  +
  +        // Look up the application scope collections that we need
  +        ActionMappings mappings = (ActionMappings)
  +            pageContext.getAttribute(Action.MAPPINGS_KEY,
  +                                     PageContext.APPLICATION_SCOPE);
  +        ActionFormBeans formBeans = (ActionFormBeans)
  +            pageContext.getAttribute(Action.FORM_BEANS_KEY,
  +                                     PageContext.APPLICATION_SCOPE);
  +        if ((mappings == null) || (formBeans == null)) {
  +            JspException e = new JspException
  +                (messages.getMessage("formTag.collections"));
  +            pageContext.setAttribute(Action.EXCEPTION_KEY, e,
  +                                     PageContext.REQUEST_SCOPE);
  +            throw e;
  +        }
  +
  +        // Look up the action mapping we will be submitting to
  +        String mappingName = getActionMappingName();
  +        ActionMapping mapping = mappings.findMapping(mappingName);
  +        if (mapping == null) {
  +            JspException e = new JspException
  +                (messages.getMessage("formTag.mapping", mappingName));
  +            pageContext.setAttribute(Action.EXCEPTION_KEY, e,
  +                                     PageContext.REQUEST_SCOPE);
  +            throw e;
  +        }
  +
  +        // Look up the form bean definition
  +        ActionFormBean formBean =
  +            formBeans.findFormBean(mapping.getName());
  +        if (formBean == null) {
  +            JspException e = new JspException
  +                (messages.getMessage("formTag.formBean", mapping.getName()));
  +            pageContext.setAttribute(Action.EXCEPTION_KEY, e,
  +                                     PageContext.REQUEST_SCOPE);
  +            throw e;
  +        }
  +
  +        // Calculate the required values
  +        name = mapping.getName();
  +        scope = mapping.getScope();
  +        type = formBean.getType();
   
       }
   
  
  
  
  1.2       +4 -0      \
jakarta-struts/src/share/org/apache/struts/taglib/html/LocalStrings.properties  
  Index: LocalStrings.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LocalStrings.properties,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- LocalStrings.properties	2001/01/06 21:50:39	1.1
  +++ LocalStrings.properties	2001/01/27 23:21:08	1.2
  @@ -1,6 +1,10 @@
   common.io=Encountered input/output error: {0}
   enumerateTag.enumeration=Cannot create enumeration for {0}
  +formTag.collections=Cannot find ActionMappings or ActionFormBeans collection
   formTag.create=Exception creating bean of class {0}: {1}
  +formTag.formBean=Cannot retrieve definition for form bean {0}
  +formTag.mapping=Cannot retrieve mapping for action {0}
  +formTag.nameType=Must specify type attribute if name is specified
   forwardTag.forward=Error forwarding to page {0}: {1}
   forwardTag.lookup=Cannot find global forward named {0}
   forwardTag.redirect=Error redirecting to path {0}: {1}
  
  
  


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic