1

JSF 2.0 の ui:repeat タグは、value プロパティとして Java bean(arraylist) の値を取得しますが、size プロパティは取得しません。ステータスを繰り返し表示するデータテーブル内で ui 繰り返しを使用しており、ui 繰り返しは各ステータスのコメントを表示します。各ステータスには異なる数のコメントがあるため、Java クラスから ui repeat の size プロパティを指定しています。したがって、サイズは動的に決定する必要があります。これが私がやったことの要約です。モデル クラス:

@ManagedBean
@RequestScoped
public class Comment {
     private String commentAuthorName;
//getter and setter
}

これは、コメントのリストを持つ Status クラスを表します。

@ManagedBean
@RequestScoped
public class Status {
    private ArrayList<Comment> commentList;
    private int numOfComments;
//getter and setter
}

これは StatusBean クラスについての考えを与えています:

@ManagedBean
@SessionScoped
public class StatusBean {
    List<Status> panelList = new ArrayList<Status>();
    List<Comment> commentList = new ArrayList<Comment>();
    public static void process() {
        panelList = StatusService.getPersonalStatus(log.getLoggeduser());//means fill list
        commentList = StatusService.getPersonalComments(panelList);//gets comments via related statuses
        for (int i=0; i<panelList.size(); i++) { //for each status
             Status status = panelList.get(i);
             for(Comment comment : commentList) { //for each comment of each status
             status.setNumOfCommentsShown(1);
           }
        }
    }
}

そして、ビューレイヤーは以下のようなものです。各ステータスの各コメントを表示できるように、PrimeFaces DataTable に含まれる UI の繰り返し。ライブスクロールがあり、すべてのステータスを繰り返し表示する必要があり、ステータスごとに各コメントを表示するのに ui の繰り返しが最適に見えるため、データテーブルを使用しています。

<p:dataTable liveScroll="true" value="#{StatusBean.panelList}" 
             var="Status" scrollable="true">
   <ui:repeat var="Comment" value="#{Status.commentList}" 
           size="#{Status.numOfComments}"></ui:repeat>
</p:dataTable>

デバッグ結果は、 #{Status.numOfComments} が予想される整数で正しく埋められていることを示していますが、それでも機能していません。しかし、手動で size=3 と書くと、期待どおりの結果が得られます。

4

1 に答える 1

5

私が見る限り、今日まで答えはありません。そのため、あなたの質問に答えて、あなたのスタックで間違いなく変更されたであろうことについていくつかのアイデアを提供します。

あなたの問題の分析

<ui:repeat>マネージド Bean プロパティによって指定された属性の使用に関して、あなたと同様のコードを作成しsizeましたが、それも機能しませんでした。ELで属性の値を設定しようとしてもうまくいきませんでした。さらに、最も単純なELのようなものでも機能しませんでした#{5}。問題がどこから生じているのかはわかりませんが、ここでの経験は、なぜそれが起こっているのかを教えてくれると思いますよね?

おそらくJSF<ui:repeat>コンポーネントの不具合であり、それに関する問題を引き起こします。それが機能である場合は、それを完全に理解するとよいでしょう。

私が理解しているように、あなたのコードの実例

上記のコードに関しては、多くの簡単な回避策があります。コンポーネントの使用に固執している場合<ui:repeat>は、基本的な作業例を提供します。ビュー層は、JSF マネージド Bean と 2 つのモデル クラスによって支えられています。私のソリューションは<ui:param>とを使用し<ui:fragment>ます。どうぞ。

景色:

<p:dataTable value="#{statusBean.statusesList}" var="status">
    <p:column headerText="Status name">
        <h:outputText value="#{status.statusName}"/>
    </p:column>
    <p:column headerText="Status comments">
        <ul>
            <ui:param name="max" value="#{status.numOfComments}"/>
            <ui:repeat var="comment" value="#{status.commentList}" varStatus="statusVar">
                <ui:fragment rendered="#{statusVar.index lt max}">
                    <li>
                        <h:outputText value="Author: #{comment.authorName}; comment: #{comment.description}"/>
                    </li>
                </ui:fragment>
            </ui:repeat>
        </ul>
    </p:column>
</p:dataTable>

モデル:

public class Comment {

    private String authorName;
    private String description;

}

public class Status {

    private List<Comment> commentList;
    private int numOfComments;
    private String statusName;

}

マネージド Bean:

@ManagedBean
@RequestScoped
public class StatusBean {

    private List<Status> statusesList;

    public StatusBean() {
        Status status;
        List<Status> statusesList = new ArrayList<Status>();
        Comment comment;
        List<Comment> commentList;
        for(int s = 0; s < 10; s++) {
            commentList = new ArrayList<Comment>();
            for(int c = 0; c < 20; c++) {
                commentList.add(new Comment("User " + (s + 1) + "-" + (c + 1), "Description for comment " + (s + 1) + "-" + (c + 1)));
            }
            statusesList.add(new Status(commentList, (s + 1), "Status " + (s + 1)));
        }
        this.statusesList = statusesList;
    }

}

あなたのコードで私が間違いなく変更すること

コードが機能するようになったら、改善点をいくつか述べたいと思います。

  1. モデルをモデル@ManagedBeanにする :および@...Scopedアノテーションを取り除き、@Entity代わりにサービス Bean によって掘り下げられる (切り離された) クラスにします。
  2. アプリケーションの機能を維持しながら、モデルをできるだけ単純にするようにしてください。Status私の例では、Bean のデータ ホルダーとしてステータスのリストのみを使用しています。コメントのリストは、オブジェクト内に既に存在するため、重複する必要はありません。
  3. preRenderViewBean 内で静的メソッドを使用しないでください。ページ アクション メソッド (サーブレット 3.0)、リスナー (サーブレット 2.5)、またはメソッドで必要なデータを (事前に) ロードします@PostConstruct。Bean スコープを適切に選択してください。BalusCによる優れた概要を参照することは、出発点として最適です。
  4. サービス メソッド呼び出しを使用して、データ ソースから必要なデータのみをプリロードします。限られた量のコメントを表示したい場合、データ ソースからコメントをフェッチする必要はありません。必要に応じて結果セットを制限します (「すべて表示」機能を実装したい場合は、要素を ajax で更新し、残りをロードすることを忘れないでください)。このように動作させると、size="...";を使用する必要がなくなります。
  5. 標準の UI コンポーネント、または選択したコンポーネント ライブラリのコンポーネント (Primefaces) を使用するため、Luiggi Mendoza の提案に従うようにしてください。

マネージド Bean のサンプル キックオフの例は次のとおりです。

@ManagedBean
@RequestScoped
public class StatusBean {

    private List<Status> statusesList;

    @EJB
    private StatusService statusService;

    @ManagedProperty(value="#{user}")
    private User user;

    @PostConstruct
    public void init() {
        statusesList = statusService.getStatuses(user);
    }

    public List<Status> getStatusesList() {
        return statusesList;
    }

}
于 2013-02-13T13:05:09.427 に答える