Как отобразить список элементов из Бина на веб-странице JSF? - PullRequest
16 голосов
/ 08 февраля 2012

Я новичок в JSF, и в процессе обучения я создаю приложение для онлайн-магазина книг.

У меня есть 1 класс и 1 боб: Book.java и BookCatelogBean.java.Класс Book имеет 3 свойства: id, title и author с соответствующими геттерами и сеттерами.BookCatelogBean содержит ArrayList<Book>, где я заполняю его Books (в будущем я подключу его к базе данных).

У меня есть две страницы: index.xhtml и book.xhtml.Я хочу отобразить список названий книг на index.xhtml, каждый из которых отформатирован как ссылка REST, и их идентификатор на book.xhtml, например: <h:link outcome="book?id=#{bookCatelogBean.id}" value="#{bookCatelogBean.title}" />

Я знаю, как использовать BookCatelogBean для отображения 1book но я хочу показать их все?У меня есть идея вызвать метод из BookCatelogBean с именем getAllBooks(), который возвращает каждое из названий книг, но как мне вернуть каждый из них в index.xhtml как ссылку JavaserverFace вместо строки?

Спасибо

Вот мой код:

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>

Ответы [ 2 ]

32 голосов
/ 08 февраля 2012

JSF2 предлагает два итерирующих компонента: <ui:repeat> и <h:dataTable>. Первый ничего не отображает в ответе (таким образом, вы имеете 100% контроль над окончательным выводом HTML), в то время как второй выводит HTML <table> в ответ и требует <h:column> для представления столбца <td> s. Оба компонента могут принимать List<E> в качестве значения.

Итак, вы можете просто иметь свой управляемый компонент следующим образом:

@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;
    }

}

И вы можете использовать <ui:repeat> для генерации, например, <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>

(обратите внимание, что атрибут var в основном предоставляет текущий итерированный элемент точно по указанному имени в области видимости EL в компоненте)

А вот как использовать <h:dataTable> вместо:

<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>

Что касается JSTL <c:forEach>, это также вполне возможно, но вы должны помнить, что теги JSTL имеют жизненный цикл, отличный от компонентов JSF. Короче говоря: JSTL в JSF2 Facelets ... имеет смысл?

Смотри также:

1 голос
/ 29 июля 2013

также вы можете использовать библиотеку простых лиц Данные простых чисел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...