JSF 2:h:link和getrowdata

时间:2011-04-07 17:20:30

标签: jsf-2 jpa-2.0 glassfish-3

如果我在 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:linkgetrowdata的用法,请以外行或术语向我解释用一些基本的代码示例。谢谢。

更新 根据以下@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捆绑在一起)

1 个答案:

答案 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模式无关。