首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF 2生命周期

JSF 2生命周期
EN

Stack Overflow用户
提问于 2011-03-23 15:17:14
回答 1查看 2K关注 0票数 2

我有一个用于BookModel.java的代码:

代码语言:javascript
复制
@Entity
@Table(name = "BOOK")
@NamedNativeQuery(name = "BookModel.findBookTitle", query = "SELECT @rownum:=@rownum+1 'no', m.title, m.author, REPLACE(SUBSTRING_INDEX(m.content, ' ', 30), '<br>', ' '), m.viewed, m.hashid FROM book m, (SELECT @rownum:=0) r WHERE m.title like 'a%'")
public class BookModel implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ_GEN")
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "title")
    private String title;

    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "author")
    private String author;
}   

以及业务层的BookService.java:

代码语言:javascript
复制
@Stateless
public class BookService
{
    @SuppressWarnings("unchecked")
    public List<BookModel> getBook() {
       Query query = entityManager.createNamedQuery("BookModel.findBookTitle");
       List<BookModel> result = query.getResultList();
       return result;
    }
 }

和表示层的BookBean.java:

代码语言:javascript
复制
@ManagedBean(name = "BookBean")
@RequestScoped
public class BookBean implements Serializable
{
    @EJB
    private BookService bookService;
    private DataModel<BookModel> book;

    public DataModel<BookModel> getBook() {
       return book;
    }
}   

而页面book.xhtml:

代码语言:javascript
复制
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.prime.com.tr/ui">
    <p:dataTable id="bookList" value="#{BookBean.book}" var="book">
    ...
    </p:dataTable> 
 </html>

我的问题是:如何将getBook()BookBean中的方法限制为只执行一次而不是六次--大概是在JSF生命周期的每个阶段。以前有没有其他人遇到过这种情况?请帮帮忙。一直坚持到最后一天都没有成功。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-23 17:26:58

这不可能。通常不会有什么害处。Getter只是为了提供bean属性的访问点,而不是做一些业务工作。

如果您确实在该托管bean方法中调用了@EJBgetBook()方法,如下所示

代码语言:javascript
复制
public DataModel<BookModel> getBook() {
   return new ListDataModel<BookModel>(bookService.getBook());
}

这确实会很昂贵,因为它会在调用getter时多次调用DB。您希望在bean的构造函数或@PostConstruct中执行此工作。

代码语言:javascript
复制
@PostConstruct
public void init() {
    book = new ListDataModel<BookModel>(bookService.getBook());
}

另请参阅:

与具体问题无关的是,方法名称getBook()和变量名称book实际上并不是自文档化的,因为它实际上包含了多本书。我会用getBooks()books代替。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5407453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档