在jsf中通过ajax渲染<h:panelGroup>

Mar*_*n P 2 java jsf-2

我有这段代码,这与我的想法完全不同.我尝试通过Ajax设置属性,然后重新渲染一个组件.我的.xhtml看起来像这样

    <h:form>
        <h:commandButton value="Render!" >
            <f:ajax render=":result" listener="#{eFindUser.findUser}" />
        </h:commandButton>

    </h:form>

    <h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" >
        This is some text that is supposed to be rendered later
    </h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

支持bean看起来像这样

@Named(value = "eFindUser")
@ViewScoped
public class EFindUserManagedBean implements Serializable{
    private boolean responseRendered = false;
    /**
     * Creates a new instance of EFindUserManagedBean
     */

    public EFindUserManagedBean() {
    }

    public void findUser(AjaxBehaviorEvent abe) {
        responseRendered = !responseRendered;
        System.out.println("finding..... ("+ responseRendered+")" + this);
    }
    public boolean isResponseRendered() {
        return responseRendered;
    }

    public void setResponseRendered(boolean responseRendered) {
        this.responseRendered = responseRendered;
    }       
}
Run Code Online (Sandbox Code Playgroud)

当我重新单击该按钮时,属性不会更改.在serverlog中有一条消息,它说

INFO: finding..... (true)backingbeans.EFindUserManagedBean@5736b751
INFO: finding..... (true)backingbeans.EFindUserManagedBean@23959d6f
Run Code Online (Sandbox Code Playgroud)

很明显,托管bean存在一些问题,因为每次有请求时都会创建它,即使它应该是视图范围的.

我应该更改什么,以便面板组(id:"结果")可以改变它的可见性?不允许使用丰富的表面或任何其他技术.

非常感谢您的回答

Ale*_*oie 6

您无法动态呈现未全时呈现的JSF组件.该对象必须存在于DOM客户端.使用rendered ="false"时,服务器端不会生成输出.

像这样更改你的代码:

<h:form>
    <h:commandButton value="Render!" >
        <f:ajax render=":result" listener="#{eFindUser.findUser}" />
    </h:commandButton>

</h:form>

<h:panelGroup id="result">
    <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" >
        This is some text that is supposed to be rendered later
    </h:panelGroup>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

有了它,DOM将始终包含id ="result"的内容.