我正在尝试一个小型的jsf应用程序,它显示一本关于书籍的表格,例如isbn,价格,标题,描述等。在提交时,会创建一个书籍对象,持久化并显示已经在db中的书籍列表。以下是ManagedBean的代码:
@ManagedBean
@SessionScoped
public class BookController implements Serializable{
private static final long serialVersionUID = 1L;
@EJB
private BookEJB bookEJB;
private Book book = new Book();
private List<Book> bookList = new ArrayList<Book>();
public BookController()
{
}
public String doCreateBook()
{
bookEJB.createBook(newBook);
bookList = bookEJB.findBooks();
return "listBooks.xhtml";
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public List<Book> getBookList() {
return bookList;
}
}
由于我的ManagedBean具有会话范围,我面临的问题是使用上面的代码,只有一个book对象与整个会话的ManagedBean保持关联,并且每次提交表单时,都会添加相同的对象db的结果是,在新添加之后,db中的所有条目都具有与上次提交的书类似的属性,因为同一个对象一次又一次地被持久化。如何解决这个问题呢?一种方法是在doCreate()函数内创建一个新的Book对象,并手动复制非常繁琐的属性,并且仍然可以将旧属性复制到新对象。如何解决这个问题?
答案 0 :(得分:1)
解决此问题的一种方法是保留一个单独的托管bean,以便根据请求存储图书数据。
@ManagedBean
@SessionScoped
public class BookList implements Serializable{
@EJB
private BookEJB bookEJB;
private List<Book> bookList = new ArrayList<Book>();
public List<Book> getBooks() {
bookList = bookEJB.findBooks();
return bookList;
}
}
保留一个单独的请求范围bean来编辑,创建book。
@ManagedBean
@RequestScoped
public class BookBean implements Serializable{
@EJB
private BookEJB bookEJB;
private Book book = new Book();
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public String createBook()
{
bookEJB.createBook(book);
return "listBooks.xhtml";
}
}
在你的createBook.xhtml
中<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Create Book</title>
</h:head>
<h:body>
<h3>Add book</h3>
<h:form>
<h:inputText value="#{bookBean.book.name}"></h:inputText>
....
....
<h:commandButton action="#{bookBean.createBook()}"
value="Create Book"></h:commandButton>
</h:form>
</h:body>
</html>
您的列表页面,
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Book List</title>
</h:head>
<h:body>
<h3>Book List</h3>
<h:dataTable value="#{bookList.books}" var="o">
....
....
</h:dataTable>
</h:body>
</html>