JSF 2.0的UI:repeat标签获得的Java bean(数组列表)的值,因为它的价值属性,但大小属性没有。 我使用的是数据表内的UI重复,显示状态反复和UI重复显示每个情况的意见。 我从一个Java类给UI重复的大小属性,因为每种状态都有不同数量的意见。 因此,大小应该是动态决定。 下面是我所做的事情的总结。 模型类:
@ManagedBean
@RequestScoped
public class Comment {
private String commentAuthorName;
//getter and setter
}
这代表它有评论列表中的状态类:
@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正确充满期待整数但它仍然不工作。 但是,如果我手动编写大小= 3,它给出了预期的结果。
据我看到有没有答案到了今天,所以我会回答你的问题,并给你什么,我会在你的筹码肯定已经改变了一些想法。
你的问题的分析
我已经写了关于使用类似你代码<ui:repeat>
与size
由被管理bean属性指定的属性,它并没有为我工作的。 不管我如何努力通过EL来设置属性的值,它没有工作。 此外,它并没有为最简单的EL像上班#{5}
为好。 我不知道问题出在哪里源于,但我认为经验的人在这里会启发我们,为什么它正在发生的,你愿意吗?
也许这是JSF的毛刺<ui:repeat>
组件,然后我们将产生一个问题,关于它。 如果它是一个功能它会是不错的完全理解。
你的代码的工作示例,按照我的理解
对于上面的代码,有很多简单的解决方法。 如果你是在使用这样坚持<ui:repeat>
组件,我会为您提供基本的工作示例。 您的视图层是由JSF托管bean和两个模型类的支持。 我的解决方案使用<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;
}
}
事情我肯定会在你的代码更改
该代码后的工作,我想说明一些改进我会做。
- 让你的模型的模型 :摆脱
@ManagedBean
和@...Scoped
注解,让他们(分离) @Entity
类,而不是由您的服务豆delvered; - 尽量使模型尽可能简单,保留了您的应用程序的功能。 我的例子仅使用一个状态在你Bean数据持有人的名单:因为它已经在那里为你在你不需要的意见的副本列表
Status
对象; - 不要使用内部豆,而在你的页面的操作方法(预)负载nesessary数据(Servlet的3.0),或静态方法
preRenderView
监听器(Servlet 2.5的),或在@PostConstruct
方法。 制作豆腐的作用域一个不错的选择。 咨询通过BalusC了很好的概述将是一个伟大的起点; - 预紧只有你从一个服务方法调用数据源需要的数据:如果你愿意显示评论数量有限,为什么从数据源获取它们? 这取决于你所需要的(记住,如果你想实现“视图中的所有”功能可能会使用Ajax更新的元素和加载休息)限制结果集。 使其工作这种方式消除了的使用需要
size="..."
; - 使用标准的UI组件或您的选择,这是Primefaces的组件库的组成部分,因此要尽量遵循Luiggi门多萨的建议。
一个managed 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;
}
}