Привязка массива объектов к внешнему интерфейсу в Java Server Faces - PullRequest
0 голосов
/ 05 октября 2009

У меня есть сервлет, который вызывается для действия, и предполагается, что этот сервлет возвращает список объектов. Теперь, имея структуру данных в конце моего поста, мой сервлет вызывает Person.fetch(), который возвращает список / массив персон.

Я хочу, чтобы мой Java Server Face перебрал этот список и вызвал метод getPresentation для каждого объекта.

Возможно ли это, и если да, то как?

public class Person
{
    private String name;
    private String surname;
    private int age;

    /// -- GET --- ///
    public String getName() { return name; }
    public String getSurname() { return surname; }
    public int getAge() { return age; }

    /// -- SET --- ///
    public void setName(String name) { this.name = name; }
    public void setSurname(String surname) { this.surname = surname; }
    public void setAge(int age) { this.age = age; }

    /// -- OPERATIONS --- ///
    public String getPresentation()
    {
      return "Hi, I am " + getName() + " " + getSurname();
    }

    public Person(String name, String surname, int age)
    {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }


    /// --- STATIC METHODS --- ///
    public static Person[] fetch()
    {
        Person[] toReturn = new Person[3];
        toReturn[0] = new Person("Filip", "Ekberg", 22);
        toReturn[1] = new Person("Adam", "Sandler", 99);
        toReturn[2] = new Person("Jon", "Skeet", Math.Rand());
    }
}

Ответы [ 2 ]

3 голосов
/ 05 октября 2009

Какие библиотеки компонентов JSF вы используете?

Вы можете использовать <c:forEach/> компонент из JSTL:

<c:forEach items="#{myBean.personList}" var="person">
    <h:ouputText value="#{person.presentation"/>
</c:forEach>

Если вы используете Facelets, вы можете использовать <ui:repeat> component . Richfaces также предоставляет сложные итерационные компоненты, такие как <a4j:repeat/> one . Принцип тот же, что и для компонента JSTL, хотя ...

<Ч />

Редактировать

Поскольку вы сказали, что собираетесь использовать <c:forEach> компонент, я предлагаю прочитать этот пост о " c: forEach с JSF может испортить ваш день " ...

1 голос
/ 06 октября 2009

Использование основного JSF с использованием JSP или Facelets в качестве технологии просмотра, стандартный способ итерации и отображения данных - использование элемента управления dataTable . Вы выражение, которое оценивает массив как атрибут value и устанавливает атрибут var в строку, которая станет объектом строки (записи массива). Недостатком dataTable является то, что средство визуализации будет генерировать только таблицу - предложение romaintaz * Facelets ui: повтор даст больше контроля.

<h:dataTable value="#{people.everyone}" var="_row">
  <h:column>
    <f:facet name="header">
      <h:outputText value="People" />
    </f:facet>
    <h:outputText value="#{_row.name}" />
  </h:column>
</h:dataTable>

Управляемый компонент:

public class People {
  private final Person[] everyone = { new Person("Bill"), new Person("Ben") };

  public Person[] getEveryone() {
    return everyone;
  }

  public static class Person {
    private String name;
    public Person(String name) { this.name = name; }
    public Person() {}
    public String getName() { return name; }
  }
}

faces-config.xml

  <managed-bean>
    <managed-bean-name>people</managed-bean-name>
    <managed-bean-class>people.People</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>

Теги JSTL (в пространстве имен http://java.sun.com/jsp/jstl/core), такие как c:forEach, не должны использоваться с элементами управления JSF в JSP. Можно использовать фиктивные JSTL-теги в Facelets, но я бы по возможности их избегал. Некоторые из них склонны к оценке во время создания представления, что может привести к неожиданному поведению. В любом случае внимательно прочитайте документы.

...