jsf - Jsf 2的Jsf ui:repeat 大小不获取javabean值

  显示原文与译文双语对照的内容

在JSF属性的值属性中,JSF的标记获取了 java bean(arraylist)的值,但大小属性不。 我在数据表中使用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重复,以便显示每个状态的每个注释。 我正在使用 datatable,因为它有现场滚动,它必须显示所有状态,并且用户界面重复显示每个状态。


<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,它会给出预期结果。

时间:

到今天我看到没有回答,所以我会回答你的问题,给你一些关于我在你的堆栈上的。

分析你的问题

我写了一个类似于你的代码,关于使用由托管bean属性指定的<ui:repeat> 属性的,它无法使用。 不管我如何努力设置属性的值,它没有工作。 此外,它对像 #{5} 这样最简单的EL并没有作用。 我不知道问题源于哪里,但我认为这里的经验会引发我们的发生,你会发生什么?

可以能这是 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 类,而不是服务bean的delvered ;
  • 尽量使模型简单,保持应用程序的功能。 我的示例仅使用了一个状态列表作为你的bean中的数据持有者: 你不需要重复的注释列表,因为它已经在 Status 对象中存在;
  • 不要在bean中使用 static 方法,而是在页面操作方法( Servlet 3.0 ) 或者 preRenderView 监听器( Servlet 2.5 ) 中或者在 @PostConstruct 方法中加载nesessary数据。 对bean作用域做出良好的选择。 咨询是BalusC的优秀概述,将是一个不错的起点;
  • 仅将你需要的数据从数据源加载到服务方法调用中: 如果你愿意显示有限数量的注释,为什么从你的数据源中获取它们? 根据需要( 请记住如果你想'查看所有'。你可以使用ajax更新你的元素,并加载其他元素) 来限制结果集。 这样做可以避免使用 size="..."的需要;
  • 使用标准的UI组件或者你选择的组件库组件,这是 Primefaces,因此尝试遵循Mendoza的Luiggi建议。

托管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;


 }



}



...