JSF将数据库逻辑与@Named bean

时间:2018-04-04 10:03:56

标签: jsf model-view-controller jsf-2

美好的一天

这个问题更像是一个元问题,而不是一个基于特定问题的问题。

将任何和所有数据库代码从与视图相关的代码和视图文件中分离出来总是一个好主意,对吗?

因此,我在使用JSF时的假设是正确的:

  1. xhtml文件构成了MVC中视图的一部分。
  2. @Named支持bean也构成视图的一部分。
  3. 为了确保可以相对轻松地从JSF迁移到另一种类型的技术,可以确保在@Named支持bean中没有任何数据库代码。
  4. 所有数据库代码都应驻留在控制器/服务类中。
  5. 控制器/服务类将包含所有数据库访问代码和业务逻辑。这因此形成了MVC的控制器。
  6. @Entity类用于将DB映射到JPA,因此形成了MVC的模型。
  7. 现在,如果我对上述内容的理解是正确的,那么在处理以下场景时最好的方法和方法是什么:

    我有一个显示JSF组件(Primefaces)的XHTML文件。将JSF组件链接到Java代码的列表和组件链接成员都驻留在@Named支持bean中。

    现在为了论证,让我们说特定的表格用于CRUD供应商的信息,建议将以下哪种方法作为最佳实践(同时尽量保持关注的分离)当在XHTML表单上进行编辑时,在View和Controller Java代码之间进行编辑:

    1. 在@Named支持bean文件中强制执行ZERO数据库代码(因此永远不会定义或使用实体管理器)。在所有输入验证成功完成后保持更改的代码将驻留在Controller中。为了将这些值传递给Controller,我们将有一个函数看起来像这样(基本上将xhtml表单上的所有组件作为参数发送到Controller中的函数):public void supplierService (String supName, String SupAddress, String supTel....)当然这个问题是最终可能会遇到需要数十个参数的方法。非常丑陋,难以维护。
    2. 接受分离某些数据库代码是不可能的,并且每个@Named文件必须具有所需的JPA DB代码才能持久化或合并对模型的更改(但是,如果这被认为是最佳实践,那么使用Controller类有什么用处? ?)。
    3. 创建与模型类型相同的临时对象,并将此临时对象的属性设置为从XHTML映射组件获取的值。然后只将此临时对象传递给Controller中的方法。然后,Controller中的此方法将持久化或合并传递的对象的信息。但是我觉得这可能会引入不必要的对象实例化开销。此外,我并不是百分之百确定在幕后发生了什么'当我有一个名为SupplierEntity.java的模型通过JPA映射到PostgreSQL数据库并且我调用此代码时:SupplierEntity tempSup = new SupplierEntity(); JPA通过Hibernate在Wildfly上实际创建一个新的实体(DB中的记录),因此我不能使用它来创建一个临时对象来保存我作为底层JPA实体的临时实例传递给Controller的值,或者Hibernate(使用JPA 2.1)只在我{{{{{{ 1}}因此可以安全地使用此方法将对象传递给控制器​​的持久化方法,而不是将数十个参数传递给持久化方法。
    4. 与我上面提到的完全不同的东西被认为是尽可能多地分离JSF中的MVC组件的最佳实践,同时仍然防止必须将50个参数传递给Controller。
    5. 请在开头说,这是关于最佳做法的元问题。如果Stackoverflow不是这些问题的正确论坛,请告诉我相应的问题,我会很高兴从这里删除问题,并在正确的论坛上创建。

0 个答案:

没有答案