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>
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?
vous pouvez également utiliser la bibliothèque primefaces Primefaces datatable