创建与ManagedBean关联的对象的新实例

时间:2014-06-03 13:28:05

标签: jsf managed-bean

我正在尝试一个小型的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对象,并手动复制非常繁琐的属性,并且仍然可以将旧属性复制到新对象。如何解决这个问题?

1 个答案:

答案 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>