在JSF中,输出List <someobj>的最短方式是SomeObj的“name”属性的逗号分隔列表</someobj>

时间:2010-07-12 18:03:47

标签: jsf facelets

我有一个关于在JSF中输出对象列表作为逗号分隔列表的问题。

让我们说:

public class SomeObj {
  private String name;
  ... constructors, getters and setters ...
}

和List&lt; SomeObj&gt;:

List<SomeObj> lst = new ArrayList<SomeObj>();
lst.add(new SomeObj("NameA"));
lst.add(new SomeObj("NameB"));
lst.add(new SomeObj("NameC"));

将其作为列表框输出我可以使用此代码:

<h:selectManyListbox id="id1"
                  value="#{listHolder.selectedList}">
  <s:selectItems value="#{listHolder.lst}"
                   var="someObj"
                 label="#{someObj.name}"/>
  <s:convertEntity />
</h:selectManyListbox>

但输出列表的最简单方法是什么,逗号分隔?像这样:

NameA, NameB, NameC

我应该使用JSTL&lt; c:forEach /&gt;或者可能是&lt; s:selectItems /&gt;标签也可以用?

3 个答案:

答案 0 :(得分:24)

给定List<Person> persons其中Person具有name属性

  • 如果您已经使用EL 3.0的Java EE 7,那么请使用EL流API。

    #{bean.persons.stream().map(p -> p.name).reduce((p1, p2) -> p1 += ', ' += p2).get()}
    
  • 如果您还没有使用EL 3.0,但手头有JSF 2.x,那么请使用Facelets <ui:repeat>

    <ui:repeat value="#{bean.persons}" var="person" varStatus="loop">
        #{person.name}#{not loop.last ? ', ' : ''}
    </ui:repeat>
    
  • 或者,如果您仍然使用jurassic JSP,请使用JSTL <c:forEach>

    <c:forEach items="#{bean.persons}" var="person" varStatus="loop">
        ${person.name}${not loop.last ? ', ' : ''}
    </c:forEach>
    

另见:

答案 1 :(得分:7)

使用<ui:repeat>(来自facelets)。它类似于c:forEach

或预先计算托管bean中逗号分隔的字符串,并通过getter获取它。

答案 2 :(得分:5)

如果您因使用JSF 1.2而无法使用varStatus,则可以执行以下操作:

<ui:repeat value="#{listHolder.lst}" var="someObj">#{someObj != listHolder.lst[0] ? ',' : ''}
#{someObj.name}</ui:repeat>

EL表达式周围没有空格是故意的,我们不希望在渲染的HTML中出现空格。