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 と書くと、期待どおりの結果が得られます。