如何通过多个页面保留对象

时间:2010-11-01 14:21:16

标签: java jsf facelets

我有一个对象的ArrayList,我按如下方式使用它们:

<ui:repeat value="#{BookReview.books}" var="book" >
    <li>
        <h:commandLink value="#{book.bookName}" action="detail" />
    </li>
</ui:repeat>

在详情页面中我会看到这本书的评论,我有一个表格来注册新评论:

<h:form>
    Name:<h:inputText value="#{Comment.author}" />
    Rate:<h:inputText value="#{Comment.rate}" />
    Text:<h:inputText value="#{Comment.comment}" />
    <h:commandButton action="#{book.addComment(Comment)}" value="Add Comment" />
</h:form>

我的问题是book在下一个请求后才会被保留,而#{book.addComment(Comment)}会导致Target Unreachable, identifier 'book' resolved to null

我试过将这本书注释为RequestScoped,但没有用,然后我修改为ViewScoped,也没有用,然后我尝试使用<inputHidden >保持对象,但它只使用.toString(),我不能重用该对象。

我不想使用会话来存储对象,因为我只需要一次,而且我认为我不想使用转换器,因为BookArrayList个注释(我认为这是繁琐而复杂的)

2 个答案:

答案 0 :(得分:1)

将您的BookReview bean放到session范围内(或者,如果您使用的是JSF-2.0,那么请让它具有view范围。)

答案 1 :(得分:1)

你必须在某个地方处理当前的书,并将新评论与它联系起来。

创建一个新的bean BookDetail

@ManagedBean
@ViewScoped
public class BookDetail {
    private Book book;
    private Comment comment = new Comment();

    public String addComment() {
        book.getComments().add(comment);
        // You need to persist book here if necessary.
        return "list";
    }

    // Add/generate getters/setters the usual way.
}

如下所示设置所选书籍(如果您使用UIDatah:dataTable而不是t:dataListui:repeat组件,可以做得更好:

<h:commandLink value="#{book.name}" action="detail">
    <f:setPropertyActionListener target="#{bookDetail.book}" value="#{book}" />
</h:commandLink>

重写详细信息表格如下:

<h:form>
    Name:<h:inputText value="#{bookDetail.comment.author}" />
    Rate:<h:inputText value="#{bookDetail.comment.rate}" />
    Text:<h:inputText value="#{bookDetail.comment.comment}" />
    <h:commandButton action="#{bookDetail.addComment}" value="Add Comment" />
</h:form>