【问题标题】:using @Model `javax.enterprise.inject.Model` for JSF backing bean? [duplicate]使用 @Model `javax.enterprise.inject.Model` 作为 JSF 支持 bean? [复制]
【发布时间】:2018-08-15 00:29:18
【问题描述】:

我正在尝试使用 CDI bean 实现 JSF 支持 bean,正如 @ManagedBean 的贬值和它的范围注释所建议的那样,但我正在努力使用正确的使用示例,我正在尝试使用 @ 实现视图支持 bean模型(javax.enterprise.inject.Model),即@Named @RequestScoped。

我找到了这个question,但它使用的是 ViewScope bean,我将如何使用 RequestScoped(最好是 @Model)实现相同的功能,@Model 一般的最佳实践是什么?

编辑 1: 我尝试在 EditProduct PostConstruct 中创建一个新产品:

@Model
public class EditProduct {

    private Product product; // +getter +setter

    @Inject
    private ProductService productService;

    @PostConstruct
    public void init(){
        product = new Product();        
    }
    public String save() {
        productService.save(product);
        return "/products?faces-redirect=true";
    }

    // ...
}

然后通过

设置产品
<f:viewParameter name="product-id" target="#{editProduct.product}"
converter="#{productConverter}" />

它正在工作,但我正在寻找最佳做法。

【问题讨论】:

  • 1:你尝试了什么? 2:尝试使用搜索引擎? 3:在 SO 中,通常每个问题问 1 个问题
  • 谢谢,记下了。 @Kukeltje

标签: cdi jsf-2.2 java-ee-7


【解决方案1】:

您还应该能够添加@Named 注释,它将显示为editProduct

https://memorynotfound.com/cdi-managed-bean-example-with-named/

编辑:见评论

【讨论】:

  • 注解@Model = @Named + @RequestScope已经暴露了,这个没意义。
  • @alibttb 是对的……这个答案基本上是“错误的”
【解决方案2】:

请求范围的支持 bean 旨在使应用程序内存占用尽可能低,因此使用它们来支持带有 @Model 注释的视图很有意义,缺点是必须达到持久性数据存储每个处理数据的请求,所以@Model bean 的最佳用例是:

基本上每件事。 比如:

  1. JSF 页面的事件处理
  2. 数据延迟加载
  3. 验证和转换以及其他代码执行
  4. ETC.... 是的,其他的一切

这些事情在请求范围的 bean 中很容易做到最好,但是其他 bean 的作用是什么?

简单来说,我们可以假设:

  1. @ViewScoped 支持数据繁重的页面,其中用户通过多次交互来编辑数据,每次交互都是一个请求,但每次访问数据库的成本都很高。

  2. @SessionScoped 用于用户的会话数据、身份验证、凭据和配置。

  3. @ApplicationScoped CDI 的全状态单例。

....每个其他范围都有它的用途,但对于一个好的 Web 应用程序,@Model 应该是默认值,其他范围有特定的用例。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 2015-07-03
    • 2011-04-04
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2011-07-23
    • 2016-10-15
    • 2011-06-29
    相关资源
    最近更新 更多