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 2001/11/22 07:19:08 UTC

DO NOT REPLY [Bug 5023] New: - html:form does not handle "action" attribute correctly

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=5023>.
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=5023

html:form does not handle "action" attribute correctly

           Summary: html:form does not handle "action" attribute correctly
           Product: Struts
           Version: 1.0 Final
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Blocker
          Priority: Other
         Component: Unknown
        AssignedTo: struts-dev@jakarta.apache.org
        ReportedBy: ttcowan@us.ibm.com


The bug is in the handling of the "action" attribute of the html:form tag. The 
form tag does not correctly process URL's that do not either start or end with a 
wildcard ("*"). The symptom is that a legitimate URL (e.g. "/MyLink" in the web 
app with root context "/rootcontext" gets mapped to "/rootcontext" rather than 
either leaving it as the relative URL "/MyLink" (which is my preferred approach) 
or mapping it to a server relative URL "/rootcontext/MyLink" as happens to the 
wildcard URL's.

The problem is in the FormTag.java file (no surprizes there). The following 
snippet is from that file and shows how the code does not handle the issue 
correctly.

The stated aim of this method is to return the action converted to a 
server-relative URL. The method creates a variable called "value" which it 
manipulates then returns as the action. The "value" variable is initially set to 
the context root (e.g. "/rootcontext"). A series of "if/then/else" statements 
precludes further processing of the "value" variable until it is finnaly 
returned containg only the context root. The particular case that affects me now 
is when the servletMapping is not null, and the action does not contain a "?", 
and doesn't start with or end with a "*".

    /**
     * Return the form action converted into a server-relative URL.
     */
    protected String getActionMappingURL() {

        HttpServletRequest request =
            (HttpServletRequest) pageContext.getRequest();
        StringBuffer value = new StringBuffer(request.getContextPath());

        // Use our servlet mapping, if one is specified
        String servletMapping = (String)
            pageContext.getAttribute(Action.SERVLET_KEY,
                                     PageContext.APPLICATION_SCOPE);
        if (servletMapping != null) {
            String queryString = null;
            int question = action.indexOf("?");
            if (question >= 0)
                queryString = action.substring(question);
            String actionMapping = getActionMappingName();
            if (servletMapping.startsWith("*.")) {
                value.append(actionMapping);
                value.append(servletMapping.substring(1));
            } else if (servletMapping.endsWith("/*")) {
                value.append(servletMapping.substring
                             (0, servletMapping.length() - 2));
                value.append(actionMapping);
            }
            if (queryString != null)
                value.append(queryString);
        }

        // Otherwise, assume extension mapping is in use and extension is
        // already included in the action property
        else {
            if (!action.startsWith("/"))
                value.append("/");
            value.append(action);
        }

        // Return the completed value
        return (value.toString());

    }

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>