【发布时间】:2013-01-27 20:14:05
【问题描述】:
JSF 2.0 的 ui:repeat 标记获取 java bean(arraylist) 的值,因为它是 value 属性,但 size 属性没有。我在数据表中使用 ui repeat,它迭代地显示状态,ui repeat 显示每个状态的 cmets。我从 java 类中给出了 ui repeat 的 size 属性,因为每个状态都有不同数量的 cmets。因此大小应该动态决定。这是我所做的总结。模型类:
@ManagedBean
@RequestScoped
public class Comment {
private String commentAuthorName;
//getter and setter
}
这表示具有 cmets 列表的 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 repeat 看起来最好显示每个状态的每个评论。
<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 ,它会给出预期的结果。
【问题讨论】:
-
如果您想获得具体帮助,请发布您的代码的 sscce,否则没有人能够或想要回答您的问题。作为旁注,您的代码显示出对 Java 命名约定的一些不尊重,这可能会使一些读者拒绝回答。
-
感谢您对实习生的有用评论。由于您的建议,我更新了我的问题顺便说一句我今天感觉不太好,对错误表示抱歉。
-
我不明白你想在
<p:dataTable>中使用内部<ui:repeat>来实现什么。您还有其他 PrimeFaces 组件可以帮助您喜欢<p:subTable>和<p:rowExpansion>。 -
我的意思是每个状态元素已经包含 cmets 列表,并且它们是实体类或 DTO,而不是托管 bean(具有请求范围)。接下来,会话范围 bean 的静态方法是一个非常糟糕的主意。最好在 post 构造方法或页面操作方法中填充值。此外,第二个列表的迭代是多余的,因为评论对象上没有方法调用。
-
看答案,享受 JSF 的“隐藏”功能!
标签: jsf jsf-2 primefaces datatable uirepeat