Jsf ui:重复大小不会获得java bean值

Öme*_*alı 1 datatable jsf primefaces jsf-2 uirepeat

JSF 2.0的ui:repeat标签获取java bean(arraylist)的值,因为它是value属性但size属性没有.我在数据表中使用ui repeat,迭代显示状态,ui repeat显示每个状态的注释.我从java类中给出了ui repeat的size属性,因为每个状态都有不同数量的注释.因此,应该动态决定大小.以下是我所做的总结.型号类:

@ManagedBean
@RequestScoped
public class Comment {
     private String commentAuthorName;
//getter and setter
}
Run Code Online (Sandbox Code Playgroud)

这表示Status类,其中包含注释列表:

@ManagedBean
@RequestScoped
public class Status {
    private ArrayList<Comment> commentList;
    private int numOfComments;
//getter and setter
}
Run Code Online (Sandbox Code Playgroud)

这是关于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);
           }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且查看图层如下所示.Ui重复包含在PrimeFaces DataTable中,以便能够显示每个状态的每个评论.我正在使用数据表,因为它有实时滚动,它必须迭代显示所有状态,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>
Run Code Online (Sandbox Code Playgroud)

调试结果显示#{Status.numOfComments}正确填充了预期的整数,但仍然无法正常工作.但是如果我手动编写size = 3,它会给出预期的结果.

sku*_*sel 5

据我所知,到目前为止还没有答案,所以我会回答你的问题并给你一些关于我在堆栈中肯定会有什么变化的想法.

分析你的问题

我编写了一个类似于你的代码,关于托管bean属性指定的<ui:repeat>with size属性的用法,它也不适用于我.无论我多么努力地设置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>
Run Code Online (Sandbox Code Playgroud)

该模型:

public class Comment {

    private String authorName;
    private String description;

}
Run Code Online (Sandbox Code Playgroud)

public class Status {

    private List<Comment> commentList;
    private int numOfComments;
    private String statusName;

}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

我肯定会在你的代码中改变的东西

在代码工作之后,我想说明一些改进.

  1. 使你的模型成为一个模型:取消@ManagedBean@...Scoped注释,然后使它们成为(分离的)@Entity类,由服务bean提供;
  2. 尽量使模型尽可能简单,保留应用程序的功能.我的示例仅使用状态列表作为bean中的数据持有者:您不需要重复的注释列表,因为它已经存在于Status对象中;
  3. 不要在bean中使用静态方法,而是(pre)在页面操作方法(Servlet 3.0)或preRenderView侦听器(Servlet 2.5)或@PostConstruct方法中加载nesessary数据.做一个很好的bean范围选择.咨询BalusC的优秀概述将是一个很好的起点;
  4. 使用服务方法调用仅从数据源预加载所需的数据:如果您愿意显示有限数量的注释,为什么要从数据源中获取它们?根据您的需要限制结果集(请记住,如果您想实现'查看全部'功能,您可以使用ajax更新元素并加载其余部分).以这种方式工作消除了使用的需要size="...";
  5. 使用标准UI组件或您选择的组件库的组件,即Primefaces,因此请尝试遵循Luiggi Mendoza的建议.

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

}
Run Code Online (Sandbox Code Playgroud)