JSF UI:重复次数不得到的Java bean值(Jsf ui:repeat size doesn

2019-10-17 16:44发布

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

Answer 1:

据我看到有没有答案到了今天,所以我会回答你的问题,并给你什么,我会在你的筹码肯定已经改变了一些想法。

你的问题的分析

我已经写了关于使用类似你代码<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;
    }

}

事情我肯定会在你的代码更改

该代码后的工作,我想说明一些改进我会做。

  1. 让你的模型的模型 :摆脱@ManagedBean@...Scoped注解,让他们(分离) @Entity类,而不是由您的服务豆delvered;
  2. 尽量使模型尽可能简单,保留了您的应用程序的功能。 我的例子仅使用一个状态在你Bean数据持有人的名单:因为它已经在那里为你在你不需要的意见的副本列表Status对象;
  3. 不要使用内部豆,而在你的页面的操作方法(预)负载nesessary数据(Servlet的3.0),或静态方法preRenderView监听器(Servlet 2.5的),或在@PostConstruct方法。 制作豆腐的作用域一个不错的选择。 咨询通过BalusC了很好的概述将是一个伟大的起点;
  4. 预紧只有你从一个服务方法调用数据源需要的数据:如果你愿意显示评论数量有限,为什么从数据源获取它们? 这取决于你所需要的(记住,如果你想实现“视图中的所有”功能可能会使用Ajax更新的元素和加载休息)限制结果集。 使其工作这种方式消除了的使用需要size="..." ;
  5. 使用标准的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;
    }

}


文章来源: Jsf ui:repeat size doesn't gets java bean value