我有一个对象的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()
,我不能重用该对象。
我不想使用会话来存储对象,因为我只需要一次,而且我认为我不想使用转换器,因为Book
有ArrayList
个注释(我认为这是繁琐而复杂的)
答案 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.
}
如下所示设置所选书籍(如果您使用UIData
或h:dataTable
而不是t:dataList
等ui: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>