【问题标题】:JSF activate rendered property with commandbuttonJSF 使用命令按钮激活呈现的属性
【发布时间】:2011-05-04 12:06:00
【问题描述】:

我所拥有的是 jsf 页面,它在表格中显示用户,其中一列是命令按钮,隐藏该表格并显示另一个表格,其中包含该用户拥有的所有文章。这里一切正常。文章表再次包含带有 commandbuttons 的列,该列必须隐藏该表并显示文章内容,但它显示了用户表。在我的 bean 中,我有 3 个属性

    private Boolean usersViewActive;
    private Boolean articlesViewActive;
    private Boolean articleContentViweActive;

以及激活其中一个并停用其他的方法

    public void activateUsersView() {
        this.usersViewActive = true;
        this.articlesViewActive = false;
        this.articleContentViweActive=false;
    }

    public void activateArticleView() {
        this.usersViewActive = false;
        this.articlesViewActive = true;
        this.articleContentViweActive = false;
    }

    public void activateArticleContentView() {
        this.articleContentViweActive = true;
        this.usersViewActive = false;
        this.articlesViewActive = false;
    }

我的豆

@ManagedBean
@RequestScoped
public class DataBean {
    private List<UserAcc> users;
    private List<Article> articles;
    private List<ArticleComment> articleComments;

    private Article currentArticle;

    private Boolean usersViewActive;
    private Boolean articlesViewActive;
    private Boolean articleContentViweActive;

    public DataBean() {
        DataBaseUtil dbu = new DataBaseUtil();
        users = dbu.loadUsers();
        this.usersViewActive = true;
    }

    public void activateUsersView() {
        this.usersViewActive = true;
        this.articlesViewActive = false;
        this.articleContentViweActive=false;
    }

    public void activateArticleView() {
        this.usersViewActive = false;
        this.articlesViewActive = true;
        this.articleContentViweActive = false;
    }

    public void activateArticleContentView() {
        this.articleContentViweActive = true;
        this.usersViewActive = false;
        this.articlesViewActive = false;
    }

    public void loadArticles(ActionEvent e) {
        DataBaseUtil dbu = new DataBaseUtil();
        int userId = (Integer) e.getComponent().getAttributes().get("userId");
        articles = dbu.loadUserArticles(userId);
    }

    public void loadComments(ActionEvent e) {
        DataBaseUtil dbu = new DataBaseUtil();
        int articleId = (Integer) e.getComponent().getAttributes()
                .get("articleId");
        articleComments = dbu.loadArticleComments(articleId);
    }

    public void loadCurrentArticle(ActionEvent e) {
        DataBaseUtil dbu = new DataBaseUtil();
        int articleId = (Integer) e.getComponent().getAttributes()
                .get("articleId");
        this.currentArticle = dbu.loadArticleById(articleId);
    }

  Getters and Setters...
}

我的页面:

<h:body>
    <h:panelGroup rendered="#{loginBean.authorised}">
        User: <h:outputText value="#{loginBean.name}"></h:outputText>
        <a href="new_article.jsf">Add article</a>
    </h:panelGroup>
    <h:panelGroup rendered="#{not loginBean.authorised}">
        <h:outputText>You are not authorised to be here!</h:outputText>
        <a href="index.jsf">Login or Registrate</a>
    </h:panelGroup>

    <h:form>
        <h:panelGroup rendered="#{loginBean.authorised}">

            <!--                    All users -->
            <h:panelGroup rendered="#{dataBean.usersViewActive}">
                <rich:dataTable value="#{dataBean.users}" var="user" rows="10">
                    <f:facet name="header">Users</f:facet>
                    <rich:column>
                        <f:facet name="header">User Id</f:facet>
                        <h:outputText value="#{user.id}"></h:outputText>
                    </rich:column>
                    <rich:column>
                        <f:facet name="header">User Name</f:facet>
                        <h:outputText value="#{user.name}"></h:outputText>
                    </rich:column>
                    <rich:column>
                        <h:commandButton value="Show articles"
                            action="#{dataBean.activateArticleView}"
                            actionListener="#{dataBean.loadArticles}">
                            <f:attribute name="userId" value="#{user.id}"></f:attribute>
                        </h:commandButton>
                    </rich:column>
                    <f:facet name="footer">
                        <rich:dataScroller></rich:dataScroller>
                    </f:facet>
                </rich:dataTable>
            </h:panelGroup>

            <!--                    All articles -->
            <h:panelGroup rendered="#{dataBean.articlesViewActive}">
                <h:commandButton value="Back to users"
                    action="#{dataBean.activateUsersView}"></h:commandButton> 
                <rich:dataTable value="#{dataBean.articles}" var="article" rows="10">
                    <f:facet name="header">Articles</f:facet>
                    <rich:column>
                        <f:facet name="header">Article Id</f:facet>
                        <h:outputText value="#{article.id}"></h:outputText>
                    </rich:column>
                    <rich:column>
                        <f:facet name="header">Article Title</f:facet>
                        <h:outputText value="#{article.title}"></h:outputText>
                    </rich:column>
                    <rich:column>
                    <!-- Here is the problem  -->
                    <!-- This button renders all users instead article content -->
                        <h:commandButton value="Show article content and comments" 
                        action="#{dataBean.activateArticleContentView}"
                        actionListener="#{dataBean.loadCurrentArticle}">
                            <f:attribute name="articleId" value="#{article.id}"></f:attribute>
                        </h:commandButton>
                    </rich:column>
                    <f:facet name="footer">
                        <rich:dataScroller></rich:dataScroller>
                    </f:facet>
                </rich:dataTable>
            </h:panelGroup>

                <!-- Article content -->
            <h:panelGroup rendered="#{dataBean.articleContentViweActive}">
                <h:outputText value="#{dataBean.currentArticle.title}"></h:outputText>
                <h:outputText value="#{dataBean.currentArticle.text}"></h:outputText>
            </h:panelGroup>
        </h:panelGroup>
    </h:form>

</h:body>

【问题讨论】:

    标签: jsf


    【解决方案1】:

    您的 bean 是请求范围的,并且您没有为后续请求维护/保留 rendered 属性后面的值。当在表单提交时构建新的请求范围 bean 时,所有这些值默认为 false。当rendered 属性在表单提交期间评估false 时,不会调用命令按钮的操作。 JSF 将在处理表单提交之前再次对其进行测试。

    将 bean 放在视图范围内。

    @ManagedBean
    @ViewScoped
    public class DataBean implements Serializable {
        // ...
    }
    

    这样,只要您通过在操作方法中返回 void 或 null 与同一个视图交互,bean 就会一直存在。

    【讨论】:

    • 当将其更改为 ViewScoped 时,当单击用户表中的单击命令按钮时,我得到此“无法找到视图标识符的已保存视图状态:/content.jsf”
    • 多么模糊的错误。谷歌让我相信它来自 MyFaces。我不使用它(我只使用 Mojarra)并且我猜您需要让 bean 实现可序列化。顺便说一句,这也是 Mojarra 规定的,但它会发出更清晰的警告消息,提示 在 bean 完全构造之前。
    • @JustinKSU:问题与 JSF2 有关,因此答案肯定假定为 JSF2。如果您仍然使用 JSF1,请寻找替代方法,例如 stackoverflow.com/questions/5897262/…,或者如果您遇到问题,请提出新问题。
    • 我没有在问题中看到 JSF2。感谢您提供指向其他页面的链接。我刚刚放弃并切换到 Session 范围,但 t:saveState 将完全满足我的需要。感谢您的帮助。
    • @Justin: @ManagedBean、&lt;h:body&gt; 等是特定于 JSF2 的。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2021-03-17
    • 2017-10-04
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多