如果我在 books.xhtml 中有一个h:dataTable
提供了一个记录列表,并且我想要查看特定记录,那么添加或编辑该记录,目前我有这个:< / p>
<h:dataTable #{BookBean.books}" var="books">
<h:link outcome="bookview" value="#{books[1]}">
<f:param name="id" value="#{books[2]}" />
</h:link>
</h:dataTable>
我发现我需要包含<f:param>
才能显示点击链接的CSS状态;否则如果我没有<f:param>
,每次我点击上面代码中由h:link标签呈现的链接时,所有链接都会更改为CSS点击状态。
另外,我在某处读到getrowdata()
,但我无法让它发挥作用。这是使用<f:param>
吗?
我已经在我的BookBean类中尝试了getrowdata()
方法,如下所示:
private DataModel<BookModel> books;
private BookModel currentBook;
public String view()
{
currentBook = books.getRowData();
return "bookview";
}
并在bookview.xhtml中我有:
<h:dataTable value="#{BookBean.view}" var="item">
... // render content here
<h:dataTable>
但是我收到有关未找到的属性的错误。很抱歉提出这个问题,但我还是不了解JSF 2的一些强大功能。有些专家了解h:link
和getrowdata
的用法,请以外行或术语向我解释用一些基本的代码示例。谢谢。
更新 根据以下@BalusC建议更改了类。 BookModel 类是:
@Entity
public class BookModel implements Serializable
{
private Long id;
private String title;
private String author;
// getters and setters here
}
BookService 类如下所示:
@Stateless
public class BookService
{
@PersistenceContext(unitName = "persistentUnit")
protected EntityManager entityManager;
public BookModel create() {
return new BookModel();
}
public void delete(BookModel bookModel) {
bookModel = entityManager.merge(bookModel);
entityManager.remove(bookModel);
}
public BookModel update(BookModel bookModel) {
return entityManager.merge(bookModel);
}
public BookModel find(Long id) {
return entityManager.find(BookModel.class, id);
}
}
BookBean 类是:
@ManagedBean(name = "bookBean")
@RequestScoped
public class BookBean implements Serializable
{
@EJB
private BookService bookService;
@ManagedProperty(value = "#{param.id}")
private Long id;
private DataModel<BookModel> books;
private BookModel currentBook;
@PostConstruct
public void init() {
currentBook = bookService.find(id);
}
public BookModel getCurrentBook() {
return currentBook;
}
public void setCurrentBook(BookModel currentBook) {
this.currentBook = currentBook;
}
}
上面运行BookBean类导致了这个错误:java.lang.IllegalStateException: WEB9031: WebappClassLoader unable to load resource [org.apache.openjpa.util.LongId], because it has not yet been started, or was already stopped
。这就是我现在被困住的地方。
仅供参考:我的开发环境是Glassfish 3.1,Apache OpenJPA 2.1和JSF 2.1.0(与Glassfish捆绑在一起)
答案 0 :(得分:3)
代码中有两个缺陷:
h:link
触发GET请求,而不是POST请求。 DataModel#getRowData()
在此处没有用,因为您无法将bean操作附加到触发GET请求的组件。
<h:dataTable value="#{BookBean.view}">
public String view()
毫无意义。数据表的值必须是项的集合,而不是bean操作方法。
据我所知,您希望在表格中的每个图书项目上都有一个GET链接,该链接指向有关图书项目的一些详细信息页面。修复详细信息页面如下:
bookview.xhtml
<h:outputText value="#{bookBean.currentBook.id}" />
<h:outputText value="#{bookBean.currentBook.author}" />
<h:outputText value="#{bookBean.currentBook.title}" />
...
BookBean
如下:
@ManagedBean
@RequestScoped
public BookBean {
@ManagedProperty(value="#{param.id}")
private Long id;
private BookModel currentBook;
@PostConstruct
public void init() {
currentBook = bookDAO.find(id);
}
// ...
}
@ManagedProperty
将设置GET请求参数。 @PostConstruct
将根据参数预加载正确的图书。
请注意,这与POST-Redirect-GET模式无关。