0

输入 Textarea 值永远不会在 bean 端设置。JSF 1.2 和 RichaFaces 3.3.3。有下一个代码:

<h:form id="name" rendered="#{not empty controller}">
            <h:panelGrid columns="1" styleClass="medium" columnClasses="subtitle,medium" style="text-align: left;" cellspacing="3px">
                <f:facet name="header">
                    <h:outputText value="Comments"/>
                </f:facet>

                <h:inputTextarea value="#{controller.comments}" rows="10" cols="80"
                        immediate="true"></h:inputTextarea>

                <div align="right">
                    <a4j:commandButton value="#{msg['label.save']}" action="#{controller.saveData()}" reRender="name" />
                </div>
            </h:panelGrid>
        </h:form>

在 bean 中:

public void saveData(){
    //logic
}

public String getComments(){
    return "comments";
}

public void setComments(String comments){
    //logic
}

jsf 页面通过 ui:include 包含在另一个页面中,并获取所需的 bean 作为控制器参数。

注释是通过 get 方法读取的,但是,setter 永远不会被调用,saveData函数也不会被调用。相同的控制器用于另一个页面上的一些其他数据,并且从字面上看,相同的saveData方法效果很好。我想知道为什么永远不会设置 Textarea 值?

4

1 回答 1

1

你得到的错误是这一行:

<a4j:commandButton value="#{msg['label.save']}"
    action="#{controller.saveData()}" reRender="name" />

在 JSF1.2 中,您不应该在操作中使用括号。改变它

<a4j:commandButton value="#{msg['label.save']}"
    action="#{controller.saveData}" reRender="name" />

另外,当您调用它时,请检查您发布的页面是否不在另一个表单中。

更新:

根据您最后的评论,我想您的问题可能出在这句话中:

<h:form id="name" rendered="#{not empty controller}">

如果controller是请求 bean,那么它在请求中将为空,因此不会发送或激活表单中的值。您可以尝试将您的 bean 保留在请求范围内,并为您的 bean 类添加 @KeepAlive 注释:

@KeepAlive(ajaxOnly=false)
public class ControllerBean {
    //your bean logic...
    public void saveData(){
    //logic
    }

    public String getComments(){
        return "comments";
    }

    public void setComments(String comments){
        //logic
    }
}
于 2012-04-05T13:40:08.340 回答