如何将 Bean 中的项目列表显示到 JSF 网页上?
我是 JSF 的新手,正在学习构建在线书店应用程序的过程中。
我有 1 个类和 1 个 bean:Book.java
和 BookCatelogBean.java
。 Book 类有 3 个属性:id
、title
和 author
及其相应的 getter 和 setter。 BookCatelogBean
包含一个 ArrayList
,我在其中填充 Books
(将来我会将其连接到数据库)。
我有两个页面:index.xhtml
和 book.xhtml
。我想在 index.xhtml
上显示每个格式为 REST 链接的书名列表及其 ID book.xhtml
,如下所示:
我知道如何使用 BookCatelogBean
显示 1 book
但我想显示所有这些?我有一个想法,从 BookCatelogBean
中调用一个名为 getAllBooks()
的方法,该方法返回每一本书的标题,但是我如何将它们中的每一本书作为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>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
JSF2 提供了两个现成的迭代组件:
和。前者不向响应呈现任何内容(因此您可以 100% 控制最终的 HTML 输出),而后者向响应呈现 HTML
并需要
表示一列List
作为值。因此,您可以像下面这样使用托管 bean:
并且您可以使用
生成例如:
(请注意,
var
属性基本上通过组件内 EL 范围内的给定名称公开当前迭代的项)以下是如何使用
相反:对于 JSTL
,这也是很有可能的,但是你应该记住 JSTL 标签有不同的生命周期比 JSF 组件更重要。长话短说:JSF2 Facelets 中的 JSTL...有意义吗?另请参阅:
JSF2 offers two iterating components out the box:
<ui:repeat>
and<h:dataTable>
. The former renders nothing to the response (so you have 100% control over the final HTML output), while the latter renders a HTML<table>
to the response and requires a<h:column>
to represent a column of<td>
s. Both components can take among others aList<E>
as value.So, you can just have your managed bean like follows:
And you can use
<ui:repeat>
to generate for example an<ul><li>
:(note that the
var
attribute basically exposes the currently iterated item by exactly the given name in the EL scope within the component)And here's how to use a
<h:dataTable>
instead:As to the JSTL
<c:forEach>
, that's also quite possible, but you should keep in mind that JSTL tags have a different lifecycle than JSF components. Long story short: JSTL in JSF2 Facelets... makes sense?See also:
您还可以使用 PrimeFaces 库
链接:PrimeFaces 数据表
You can also use PrimeFaces library
Link: PrimeFaces datatable