web-dev-qa-db-fra.com

Comment afficher une liste d'éléments d'un Bean sur une page Web JSF?

Je suis nouveau à JSF et j'apprends à créer une application de librairie en ligne.

J'ai 1 classe et 1 bean: Book.Java Et BookCatelogBean.Java. La classe Book a 3 propriétés: id, title et author avec ses getters et setters correspondants. Le BookCatelogBean contient un ArrayList<Book> Où je le remplis avec Books (à l'avenir je le connecterai à une base de données).

J'ai deux pages: index.xhtml Et book.xhtml. Je souhaite afficher la liste des titres de livres sur index.xhtml Chacun formaté sous la forme d'un lien REST et leur ID vers book.xhtml, Comme ceci: <h:link outcome="book?id=#{bookCatelogBean.id}" value="#{bookCatelogBean.title}" />

Je sais comment utiliser BookCatelogBean pour afficher 1 book mais je veux les afficher tous? J'ai une idée d'appeler une méthode à partir de BookCatelogBean appelée getAllBooks() qui renvoie chacun des titres des livres, mais comment pourrais-je retourner chacun d'eux à index.xhtml en tant que lien JavaserverFace au lieu d'un chaîne?

Merci

Voici mon code:

Book.Java

package bookshop;

import Java.io.Serializable;

public class Book implements Serializable {

    private int id;
    private String title;
    private String author;

    public Book(int id, String title, String author){
        this.title = title;
        this.id = id;
        this.author = author;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

BookCatelogBean.Java

package bookshop;

import Java.io.Serializable;
import Java.util.ArrayList;
import Java.util.Arrays;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class BookCatelogBean implements Serializable {
    private int currentItem = 0;

    private ArrayList<Book> books = new ArrayList<Book>(Arrays.asList(
            new Book(1, "Theory of Money and Credit", "Ludwig von Mises"),
            new Book(2, "Man, Economy and State", "Murry Rothbard"),
            new Book(3, "Real Time Relationships", "Stefan Molyneux")));

    public String getTitle(){
        return books.get(currentItem).getTitle();
    }

    public int getId(){
        return books.get(currentItem).getId();
    }

    public String getAuthor(){
        return books.get(currentItem).getAuthor();
    }

}

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://Java.Sun.com/jsf/html">
    <h:head>
        <title>BookShop</title>

    </h:head>
    <h:body>
        <h:link outcome="book?id=#{bookCatelogBean.id}" value="#{bookCatelogBean.title}" />
    </h:body>
</html>
16
Jonathan

JSF2 propose deux composants itératifs prêts à l'emploi: <ui:repeat> et <h:dataTable> . Le premier ne rend rien à la réponse (vous avez donc un contrôle à 100% sur la sortie HTML finale), tandis que le second rend un HTML <table> à la réponse et nécessite un <h:column> pour représenter une colonne de <td>s. Les deux composants peuvent prendre entre autres un List<E> comme valeur.

Ainsi, vous pouvez simplement avoir votre bean géré comme suit:

@ManagedBean
@RequestScoped
public class BookCatalog implements Serializable {

    private List<Book> books;

    @PostConstruct
    public void init() {
        books = new ArrayList<Book>();
        books.add(new Book(1, "Theory of Money and Credit", "Ludwig von Mises"));
        books.add(new Book(2, "Man, Economy and State", "Murry Rothbard"));
        books.add(new Book(3, "Real Time Relationships", "Stefan Molyneux"));
    }

    public List<Book> getBooks() {
        return books;
    }

}

Et vous pouvez utiliser <ui:repeat> pour générer par exemple un <ul><li>:

<ul>
    <ui:repeat value="#{bookCatalog.books}" var="book">
        <li>
            <h:link value="#{book.title}" outcome="book">
                <f:param name="id" value="#{book.id}" />
            </h:link>
        </li>
    </ui:repeat>
</ul>

(notez que l'attribut var expose essentiellement l'élément actuellement itéré par exactement le nom donné dans la portée EL du composant)

Et voici comment utiliser un <h:dataTable> au lieu:

<h:dataTable value="#{bookCatalog.books}" var="book">
    <h:column>
        <h:link value="#{book.title}" outcome="book">
            <f:param name="id" value="#{book.id}" />
        </h:link>
    </h:column>
</h:dataTable>

Quant au JSTL <c:forEach>, c'est également tout à fait possible, mais vous devez garder à l'esprit que les balises JSTL ont un cycle de vie différent de celui des composants JSF. Pour faire court: JSTL dans les facettes JSF2 ... est-il logique?

Voir également:

32
BalusC

vous pouvez également utiliser la bibliothèque primefaces Primefaces datatable

1
Kemal Duran