В JSF какой кратчайший способ вывести List <SomeObj>как разделенный запятыми список свойств "name" SomeObj - PullRequest
14 голосов
/ 12 июля 2010

У меня есть вопрос о выводе списка объектов в виде списка через запятую в JSF.

Допустим,

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

и Список :

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 или может быть также можно использовать тег ?

Ответы [ 3 ]

25 голосов
/ 13 июля 2010

Учитывая List<Person> persons, где Person имеет свойство name,

  • Если вы уже используете Java EE 7 с EL 3.0, используйте API потока EL.

    #{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>
    
  • Или, если вы все еще используете JSP юрского периода, используйте JSTL <c:forEach>.

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

См. Также:

7 голосов
/ 12 июля 2010

используйте <ui:repeat> (из фейслетов).Это похоже на c:forEach

Или предварительно вычислите разделенную запятыми строку в управляемом компоненте и получите ее через геттер.

5 голосов
/ 22 февраля 2011

Если вы не можете использовать varStatus, потому что вы застряли с использованием JSF 1.2, вы можете сделать:

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

Отсутствие пробела вокруг EL-выражений является преднамеренным, мы не хотим, чтобы в визуализированном HTML там было место.

...