【问题标题】:JSF 2: h:link and getrowdataJSF 2:h:link 和 getrowdata
【发布时间】:2011-07-31 21:33:15
【问题描述】:

如果我在 books.xhtml 中有一个 h:dataTable 提供记录列表,并且我想查看特定记录,然后添加或编辑该记录,目前我有这个:

<h:dataTable #{BookBean.books}" var="books">
   <h:link outcome="bookview" value="#{books[1]}">
      <f:param name="id" value="#{books[2]}" />
   </h:link>
</h:dataTable>

我发现我需要包含&lt;f:param&gt;才能显示点击链接的CSS状态;否则如果我没有&lt;f:param&gt;,每次我点击上面代码中h:link标签呈现的链接时,所有的链接都会变成CSS点击状态。

另外,我在某处读到过有关getrowdata() 的信息,但我无法让它工作。这是比使用&lt;f:param&gt; 更好的选择吗?

我已经在我的 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 捆绑在一起)

【问题讨论】:

  • 我完全不知道您所说的“CSS 状态”是什么意思,以及这到底是个什么问题。 CSS 只是一种样式语言,它不应该以任何方式影响任何 JSF 功能。能详细点吗?
  • @BalusC:我上面提到的 CSS 状态 与 a:visited 有关。我希望这能消除任何误解。 :-)

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


【解决方案1】:

代码有两个缺陷:

  • h:link 触发 GET 请求,而不是 POST 请求。 DataModel#getRowData() 在这里也没有用,因为您无法将 bean 操作附加到触发 GET 请求的组件。

  • &lt;h:dataTable value="#{BookBean.view}"&gt;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 模式无关。

【讨论】:

  • 很好的答案!虽然这个问题很不清楚。 @user463053 - 查看 BaluC 的 balusc.blogspot.com/2010/06/… 帖子,了解 CRUD 的绝佳示例。特别是对于正确使用 getRowData()。 @BaluC - 顺便说一句,我想他的 CSS 状态是指锚标签将 a:visited 样式应用于他的所有链接。
  • @BalusC:是的,你很清楚我想要实现的目标。我在上面尝试了您建议的更改,但遇到了此错误: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。抱歉,我应该在原始帖子中提到我使用 OpenJPA。我已经用更多信息更新了我的原始帖子,以向您展示我正在尝试做的事情。
  • @Nikhil:感谢您的链接。
  • @BalusC:我删除了 post-redirect-get 标签并用其他标签更新了帖子,我希望这些标签与我手头的问题更密切相关。跨度>
  • 根据您的编辑,清理/重建/重新部署/重新启动您的网络应用程序/服务器。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 2012-05-30
  • 1970-01-01
  • 2012-03-21
  • 2018-01-18
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多