0

嗨伙计们,我是 JSF 的新手,我陷入了 JSF 问题。我想在我的 JSF 页面中动态添加我的内容。我的要求是我有一个 facelets,我必须在某些事件之后将其添加到我的页面中。

我的页面包含

两个字段“用户名”和“答案”
以及
两个按钮“登录”和“恢复密码”

Facelet 包含

一个字段和一个按钮

现在我希望当我运行我的这个页面时,它应该只显示页面内容(如上所述)
,如果用户按下按钮,'recover password'那么它应该在同一页面上的页面组件下显示 facelet 意味着按下按钮后,页面可能包括小面。
但是现在当我运行我的代码时,它会显示两者,因为我没有放置任何逻辑来动态添加第二个 facelet。
这是下面给出的我的代码补丁

 <h:inputText id="txtLogin" styleClass="textEntry" required="true" requiredMessage="Username is required."> 
                    </h:inputText>
<h:inputText id="answer" styleClass="textEntry" autocomplete="off" required="true" requiredMessage="Answer is required."></h:inputText>
                                    <h:commandButton id="btnSave" value="Save" styleClass="formbutton" onclick="btnSave_Click" />
                    <h:commandButton id="btnRecover" value="Recover" styleClass="formbutton" onclick="btnRecover_Click"/>

现在我想在btnRecover_click单击时包含此 facelet 或运行此代码

<div class="divPadding">
            <ui:include id="passrecov" src="ucPasswordRecovery.xhtml" rendered="false"/>
        </div>

请记住,我必须使用 JSF 执行此操作,并且不想使用 JavaScript 执行此操作
谢谢

4

1 回答 1

2

我将发布一个使用 1 列的示例,请记住您可以使用另一个 ui 容器。

<h:form>
    <h:panelGrid id="login">
        <h:panelGrid>
            <h:inputText id="txtLogin" styleClass="textEntry" required="true"
                requiredMessage="Username is required."> 
            </h:inputText>
            <h:inputText id="answer" styleClass="textEntry" autocomplete="off"
                required="true" requiredMessage="Answer is required.">
            </h:inputText>
            <h:commandButton id="btnSave" value="Save" styleClass="formbutton"
                onclick="btnSave_Click" />
            <h:commandButton id="btnRecover" value="Recover" styleClass="formbutton"
                action="#{loginBean.showPassRecovery}" />
        </h:panelGrid>
    </h:panelGrid>

    <h:panelGrid id="passRecovery">
        <h:panelGrid rendered="#{not loginBean.loginEnabled}">
        <ui:include id="passrecov" src="ucPasswordRecovery.xhtml" />
        </h:panelGrid>
    </h:panelGrid>
</h:form>

还有你的托管bean:

@ManagedBean
@ViewScoped
public class LoginBean {
    private boolean loginEnabled;

    public LoginBean() {
        loginEnabled = true;
    }

    //getters and setters...

    //this method will return void, so the page will be refreshed with the new
    //loginEnabled value. this time the components inside "login" panelGrid won't be rendered
    //but "passRecovery" panelGrid components will.
    public void showPassRecovery() {
        loginEnabled = false;
    }
}
于 2012-08-03T07:08:35.243 回答