3

JSF 2.0 の HtmlDataTable に問題があります。私の Web ページには、ah:dataTable と、ユーザーがログインしている場合にのみ表示されるその他のコンテンツがあります。

HtmlDataTable のコンテンツは、データベースから読み込まれます。ユーザーがログインしていない場合、h:dataTable はレンダリングされませんが、コンテンツは引き続き評価されます。

Web ページのコードは次のとおりです。

<h:panelGroup rendered="#{userBean.loggedIn}">
    <h:dataTable value="#{xxxBean.allXxx}"
                 var="c">
        <h:column>
            <h:outputText value="#{c.name}"/>
        </h:column>
    </h:dataTable>
    <!-- some other content -->
</h:panelGroup>

getAllXxx() メソッドでは、メソッドの呼び出しを記録しています。ただし、h:dataTable (および他のすべてのコンテンツ) がレンダリングされない場合でも、getAllXxx() メソッドが呼び出されます。

h:panelGroup の代わりに c:if を使用しようとしました。それは機能しますが、ログインプロセス中に問題が発生するため、これは適切な解決策ではありません.

これを修正する方法を知っている人はいますか?前もって感謝します。

4

1 に答える 1

1

次のSSCCEを使用して、Tomcat 7.0.5 上の Mojarra 2.0.3 で問題を再現できません。

test.xhtml

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>SO question 4774516</title>
    </h:head>
    <h:body>
        <h:panelGroup rendered="#{param.show}">
            <h:dataTable value="#{bean.list}" var="item">
                <h:column>#{item}</h:column>
            </h:dataTable>
        </h:panelGroup>
    </h:body>  
</html>

com.example.Bean

package com.example;

import java.util.Arrays;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class Bean {

    private List<String> list = Arrays.asList("one", "two", "three");

    public List<String> getList() {
        System.out.println("getList() called");
        return list;
    }

}

http://localhost:8080/playground/test.jsfを開くと、stdout 行が表示されません。http://localhost:8080/playground/test.jsf?show=trueを開くと、それらが表示されます。

あなたの問題は他の何かによって引き起こされています。JSF 実装のバグであるか、手順を誤って解釈しただけです。たとえば、実際には、リクエスト値の適用フェーズ中に getter が呼び出され、#{userBean.loggedIn}アクションの呼び出しフェーズ中にのみ結果が変更されるポストバック リクエストである可能性があります。または、getter が別の何かによって呼び出されています。

于 2011-01-23T15:35:13.370 に答える