On 5/9/06, A. Alonso Dominguez <[EMAIL PROTECTED]> wrote:

Hi there!

I'm trying to use the new struts-action framework, version 1.3.3 with
tiles
and faces. I'm following the example applications but I found possibly a
bug
when rendering a struts-based FormBean.

The jsp code that I was using is as follows:

<s:errors />
<s:form action="/login" id="login" styleClass="loginForm"
focus="username">
    <h:panelGrid columns="2">
        <f:facet name="header">
            <h:panelGroup>
                <h:graphicImage
url="/common/skin/social-labs/img/circle1.png"
/>
                <s:message key="page.logon.form">
                    <f:param name="arg0" value="Social Labs" />
                </s:message>
            </h:panelGroup>
        </f:facet>
        <h:outputLabel for="username">
            <s:message key="form.logon.username" />
        </h:outputLabel>
        <h:inputText id="username" size="25" value="#{logonForm.username}"
/>

        <h:outputLabel for="password">
            <s:message filter="false" key="form.logon.password" />
        </h:outputLabel>
        <h:inputSecret id="password" size="25" value="#{logonForm.password}"
/>

        <f:facet name="footer">
            <h:commandButton id="submit" type="SUBMIT" styleClass="img"
image="/common/skin/social-labs/img/login.png" />
        </f:facet>
    </h:panelGrid>
</s:form>

but when it's rendered to the view, the HTML form's "action" attribute
references "/common/skin/default/layout/base.do". There is not any action
in
my application with that url. Instead there is a file
"/common/skin/default/layout/base.jsp" which is the base file for the
tiles
definitions:

<definition name="base.layout"
page="/common/skin/default/layout/base.jsp">
        <put name="title" value="" />
        <put name="navigation" value="" />
        <put name="body" value="" />
        <putList name="scripts">
            <add value="" />
        </putList>
    </definition>

I dived inside "the org.apache.struts.faces.renderer.FormRenderer" code
and
I found this code (line 280):

protected String action(FacesContext context, UIComponent component) {
        String actionURL =
            context.getApplication().getViewHandler().
            getActionURL(context, context.getViewRoot().getViewId());
        if (log.isTraceEnabled()) {
            log.trace("getActionURL(" + context.getViewRoot().getViewId()
+
                      ") --> " + actionURL);
        }
        return (context.getExternalContext().encodeActionURL(actionURL));

    }


which really does nothing with the actionURL, It just takes de ViewRootId
and returns it to the caller.
Playing with this code I have now the following:

protected String action(FacesContext context, UIComponent component,
ModuleConfig moduleConfig) {
        //String actionURL =
        //    context.getApplication ().getViewHandler().
        //    getActionURL(context, context.getViewRoot().getViewId());
        FormComponent form = (FormComponent) component;
        String actionURL = context.getApplication().getViewHandler().
              getActionURL(context, moduleConfig.getPrefix() +
form.getAction());
        if (log.isTraceEnabled()) {
            log.trace("getActionURL(" + context.getViewRoot().getViewId()
+
                      ") --> " + actionURL);
        }
        return (context.getExternalContext().encodeActionURL(actionURL));

    }

I don't know if this is the correct way for retrieving the real actionURL
but It works now and I'm using it.

Should this be posted as a bug??

Yes, this does sound like a bug.  Could you please file an issue on it,
using project name "Struts Action 1" and component "Faces"?

 http://issues.apache.org/struts/

Craig

Reply via email to