我应该在JSF中的每个表单、数据表等都拥有一个bean吗?
例如,我有一个用于注册的表单,它只有两个字段和一个按钮,分别是:昵称、密码、提交
提交此表单应该去RegistrationFormBean还是UserBean或UserServiceBean中的某个地方?
什么是最佳实践?
谢谢。
我应该在JSF中的每个表单、数据表等都拥有一个bean吗?
例如,我有一个用于注册的表单,它只有两个字段和一个按钮,分别是:昵称、密码、提交
提交此表单应该去RegistrationFormBean还是UserBean或UserServiceBean中的某个地方?
什么是最佳实践?
谢谢。
@ManagedBean
,我认为您应该考虑设计的模块化程度。该组件是否会在许多页面上重复使用?
例如,在诸如ChangePassword
或DeleteAccount
等敏感页面上,通常您将要求用户输入当前密码以验证其身份,然后才执行任何逻辑。在这种情况下,您绝对应该有一个验证密码组件的专用bean,以便您可以一遍又一遍地重复使用该组件,而不必每次重新编写验证功能。@ManagedBean
作为保存所有相关函数的位置,这些函数工作朝着同一个目标。这些函数的分组可能相当主观。例如,我可以有一个名为CreateProduct.xhtml
的页面,其中包含一个名为CreateProductBean
的bean,该bean具有用于创建产品的所有函数。在这种情况下,就像1 bean per view
一样。另一种方法是拥有一个名为ProductManager
的bean,该bean具有与Product
对象相关的所有功能(即创建、读取、更新、删除)。在这种情况下,就像1 bean for many views
一样(例如,CreateProduct.xhtml
、RemoveProduct.xhtml
)。为了方便未来的维护和工作分割,我通常使用1 bean per view
。第二种方法1 bean for many views
在某些情况下也很好,但我突然还想不出一个例子: P...当我有一个好的例子时,我会更新我的答案;)。@EJB
或@WebServiceRef
以请求后端系统执行必要的逻辑。这绝对是以后更容易维护的:)。RegisterAccount
示例,我将拥有:UserExistenceValidator
的bean,用于检查数据库中是否存在nickname
。在注册过程中,如果用户选择已经被占用的nickname
,我可以抛出错误。我还可以使用此bean检查用户是否存在于AddFriend.xhtml
页面中。
- 另一个名为RegistirationFormBean
的bean,用于捕获用户的输入并与后端交互以保存新帐户。@Scope
是另一回事:P... CreateProductBean
应该明确为 @RequestScoped
。然而,对于 ProductManager
,你可能需要一个名为 List<Product>
的属性来帮助显示产品进行更新、删除等操作。在这些情况下,我大多数时候使用 @ViewScoped
。 - Mr.J4mesJSF
爱好者的思考。因此,我无法抵制并希望进行详细解释。JSF
发明原因是将客户端事件与服务器端应用程序代码进行连接,就像任何Swing应用程序一样,并且无需显式处理请求和响应对象。就像任何Swing应用程序一样,我们现在可以简单地将任何客户端事件(例如按钮单击)与一些服务器端代码绑定以处理该事件,而不必担心编写Web应用程序的事实和复杂性。Controller Managed-Bean
的责任。在分配这种责任时,需要考虑几个问题:controller
处理简单model
的所有视图的CURD操作。但是,如果您需要在单个create
操作中处理多个复杂事务,则将操作分离为多个controllers
将是更好的设计。尽管您的注册过程非常简单,但应使用单独的controller
来处理该任务。因为将任何不足够简单和相关的任务放入相同的托管bean中,这将不是一个好主意。我认为,这样就回答了您的问题!UserManagedBean
来处理与用户相关的操作,例如登录、注册、更改密码等等...UserManagedBean
中放置了一个类型为 User
(或其他类名)的属性,该属性对应于与用户相关的持久化数据(通常在 DB 表 user 中)。nickname
和 password
是 User
类的属性。至于 submit
,它将调用 UserManagedBean
中的方法来验证用户:
<h:inputText value="#{userManagedBean.user.nickname}"/>
<h:inputSecret value="#{userManagedBean.user.password}"/>
<h:commandButton value="Login" action="#{userManagedBean.loginUser}"/>
loginUser
方法将调用服务层的调用,该调用将调用DAO层来检查凭据是否与DB(或其他存储)匹配。你应该为 UI 提交和数据库持久化分别创建一个数据传输对象 Bean 和一个领域 Bean。 使用控制器类,处理你的 UI JSF 提交数据并创建一个干净的领域 Bean,并使用它进行持久化。
最佳实践应该尽可能地解耦进程/实体。 此外,你的 DTO Bean 可能具有比你的领域 Bean 更多的附属数据,这些数据可能需要用于多种目的。