gpt4 book ai didi

jsf - 我应该如何以及何时从数据库中为 h :dataTable 加载模型

转载 作者:行者123 更新时间:2023-12-03 23:34:32 25 4
gpt4 key购买 nike

我有一个数据表如下:

<h:dataTable value="#{bean.items}" var="item">

我想用从服务方法获得的数据库中的集合填充它,以便在初始(GET)请求期间打开页面时立即呈现它。我应该什么时候调用服务方法?为什么?
  • 在页面加载之前调用它。但是怎么做?
  • 在页面加载期间调用它。如何?
  • 在 getter 方法中调用它。但它被多次调用。
  • 还有什么?
  • 最佳答案

    在 bean 的 @PostConstruct 中进行操作方法。

    @ManagedBean
    @RequestScoped
    public class Bean {

    private List<Item> items;

    @EJB
    private ItemService itemService;

    @PostConstruct
    public void init() {
    items = itemService.list();
    }

    public List<Item> getItems() {
    return items;
    }

    }
    value引用属性(不是方法!)。
    <h:dataTable value="#{bean.items}" var="item">
    @PostConstruct您的优势在于它在构建后执行 依赖注入(inject)。因此,如果您使用 EJB 执行 DB 交互任务, @PostConstruct绝对是正确的地方,因为注入(inject)的依赖项在普通的构造函数中还不可用。此外,当使用使用代理的 bean 管理框架时,例如 CDI @Named , 构造函数可能会也可能不会按照您期望的方式调用。在检查类、生成代理和/或创建代理期间可能会多次调用它。
    至少做 不是 在 getter 中执行 DB 交互工作,除非它是延迟加载并且你真的无能为力。也就是说,它将在每一轮迭代中被调用。在每一轮迭代中调用 service 方法效率很低,并且可能会在演示和回发期间产生“奇怪”的副作用,例如来自 DB 的旧值似乎仍然存在于模型中,而不是新提交的值。
    如果你依赖 GET 请求参数,那么使用 <f:viewParam><f:viewAction>反而。另见 Creating master-detail pages for entities, how to link them and which bean scope to choose .
    如果您想在同一 View (例如 CRUD 表/对话框)上的回发中保留模型( items 属性),则创建 bean @ViewScoped , 否则当同一模型在其他地方同时编辑时,模型将不会与 View 同步。另见 Creating master-detail table and dialog, how to reuse same dialog for create and edit .
    如果您使用 JPA 的 @Version模型上的特征,然后您可以捕获 OptimisticLockException处理它并显示一条消息,例如“数据已被其他人编辑,请刷新/查看所需的更改是否符合预期”。另见 Letting the presentation layer (JSF) handle business exceptions from service layer (EJB) .
    也可以看看:
  • Why JSF calls getters multiple times
  • What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
  • How to choose the right bean scope?
  • JSF Controller, Service and DAO
  • 关于jsf - 我应该如何以及何时从数据库中为 h :dataTable 加载模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765853/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com