我应该为JSF中的每个表单,数据表等都有一个bean吗?
例如,我有一个注册表单,它只有2个字段和一个按钮,它们是: 昵称,密码,提交
是否应该提交此表单转到RegistirationFormBean或UserBean或UserServiceBean中的某个位置?
最佳做法是什么?
谢谢。
答案 0 :(得分:4)
要决定是否应该专门为页面组件创建@ManagedBean
(例如表单,数据表),我相信您应该考虑 modularity
你的设计。
您应该问自己的第一个问题是:Will the component be re-used in many pages?
。例如,在ChangePassword
或DeleteAccount
等敏感页面上,通常会要求用户输入当前密码以在执行任何逻辑之前验证其身份。在这种情况下,您肯定应该有一个用于验证密码组件的独占bean,以便您可以反复使用该组件,而无需每次都重新编写验证函数。
其次,我通常使用@ManagedBean
作为保存所有相关功能的地方,这些功能朝向同一目标。这种功能分组可能非常主观。例如,我可以有一个名为CreateProduct.xhtml
的页面,其中包含一个名为CreateProductBean
的bean,它具有创建产品的所有功能。在这种情况下,它就像1 bean per view
。另一种方法是使用一个名为ProductManager
的bean,它具有与Product
对象相关的所有内容的功能(即创建,读取,更新,删除)。在这种情况下,它就像1 bean for many views
(例如CreateProduct.xhtml
,RemoveProduct.xhtml
)。为了便于日后维护和分工,我通常使用1 bean per view
。第二种方法1 bean for many views
在某些情况下也很好,但我突然想不出一个例子:P ......当我得到一个好的时候,我会更新我的答案;)。
第三,我更喜欢遵循3层MVC模型,并将后端逻辑与前端分开。例如,要在数据库中保留新帐户,我将注入@EJB
或@WebServiceRef
以请求后端系统执行必要的逻辑。它在未来肯定更加便于维护:)。
因此,使用您的RegisterAccount
示例,我将
UserExistenceValidator
的bean,用于检查数据库中是否存在nickname
。在注册期间,如果用户选择了nickname
,我可能会抛出错误。我也可以使用这个bean来检查AddFriend.xhtml
页面中是否存在用户。RegistirationFormBean
的bean,用于捕获用户的输入并与后端通信以保留新帐户。答案 1 :(得分:2)
它实际上是一个非常有趣的话题来调整任何JSF
爱人的大脑,所以我无法抗拒自己,我想详细解释。
JSF
发明背后的一个非常有趣且重要的原因是,将客户端事件连接到服务器端应用程序代码,就像任何swing应用程序一样,并明确地摆脱请求和响应对象的处理。与任何swing应用程序一样,我们现在可以简单地将任何客户端事件(例如,按钮单击)与一些服务器端代码绑定来处理该事件,而不必担心编写Web应用程序的事实和复杂性。
因此,在设计使用JSF的任何Web应用程序时,设计人员可以像设计事件驱动的swing应用程序一样轻松地关注用户体验。因此,您可以设计视图页面并标识要执行任务的事件以及在视图之间导航。最后,您编写了一些服务器端代码,以便在这些事件中执行,以完成您想要的工作。这些服务器端代码驻留在托管bean中。
如果我们根据类型责任进行分类,则有几种类型的托管bean:
您可以在this article中找到每种类型的详细信息。
您的问题是,如何分配Controller Managed-Bean
的职责。在分发这类职责时,有几个问题需要考虑:
您可以使用单个controller
将系统设计为model
的简单 CURD 操作的所有视图。但是,如果您需要在单create
个操作中处理多个复杂事务,那么将操作分成多个controllers
将是更好的设计。虽然您的注册过程非常简单,但您应该使用单独的controller
来处理任务。因为将任何任务放在同一个托管bean中并不是一个好主意,这不是简单且相关的,足以驻留在任务“注册”中。我想这就结束了你的询问!
答案 2 :(得分:0)
你应该分别为ui提交和db中的持久性提供数据传输对象bean和域bean。 使用控制器类,处理你的ui jsf提交数据并创建一个干净的域bean并使用它来保持。
如果可能,最佳做法应始终解除流程/实体的耦合。 此外,您的dto bean可能具有附件和更多数据,而您的域bean可能需要用于多种用途。
答案 3 :(得分:0)
在类似的情况下,我总是有UserManagedBean
来处理用户相关操作,例如登录,注册,更改密码等......
为了处理这些操作,我在UserManagedBean
类型User
(或任何类名)中放置了一个属性,该属性对应于与用户相关的持久数据(通常在DB表用户中)。
在您的情况下,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(或其他存储)的凭据。
如果登录成功,则使用来自DB的返回对象初始化托管bean中的用户属性(应该是会话作用域)。