Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 使用什么,托管bean(支持bean)还是实体bean?_Jsf 2_Entity_Bean Validation_Managed Bean - Fatal编程技术网

Jsf 2 使用什么,托管bean(支持bean)还是实体bean?

Jsf 2 使用什么,托管bean(支持bean)还是实体bean?,jsf-2,entity,bean-validation,managed-bean,Jsf 2,Entity,Bean Validation,Managed Bean,我看到很多例子将bean标记为实体bean(@entity)和命名bean(CDI),这样可以避免创建两个类(托管bean和实体bean),还可以使用bean验证,以便在客户端和服务器上都可以执行验证 因此,我是否应该使用单个类,是否存在任何问题,或者我应该让我的托管bean或服务层使用托管bean中的数据创建实体bean?通常使用@Named或@ManagedBean注释来允许bean容器(CDI/JSF)运行当JSF中的表达式语言引用bean时,按需创建bean实例 对于@Entity be

我看到很多例子将bean标记为实体bean(@entity)和命名bean(CDI),这样可以避免创建两个类(托管bean和实体bean),还可以使用bean验证,以便在客户端和服务器上都可以执行验证


因此,我是否应该使用单个类,是否存在任何问题,或者我应该让我的托管bean或服务层使用托管bean中的数据创建实体bean?

通常使用@Named或@ManagedBean注释来允许bean容器(CDI/JSF)运行当JSF中的表达式语言引用bean时,按需创建bean实例

对于@Entity bean,仅仅获取任意新实例通常没有多大意义。一个@实体与一个持久标识紧密相连。因此,这样的实体是从
实体管理器
请求的,而不是从bean容器请求的

典型的模式是有一个名为调用服务的(slim)支持bean(在javaee中通常是@Stateless)。然后服务返回实体

在一些非常简单的系统中,人们有时确实会将服务命名为,从而直接提供给EL。然而,最终您通常希望让“支持代码”生成面消息或处理(表)选择,这些都不应该是纯业务服务所关心的

另一个常见的快捷方式是让支持bean直接包含业务代码(例如,检索实体的实体管理器)。这使得业务代码很难重复使用,但是如果应用程序很简单,不需要重复使用,那么您可能会侥幸逃脱

但是让实体成为支持bean是很少见的,而且与常见的JavaEE模式背道而驰


请注意,支持bean可以直接返回实体,因此仍然可以使用bean验证。没有必要使用很久以前出现的奇怪的“分散/聚集”模式(参见中的第二个示例)

例如

假设@Entity注释bean中有
SomeEntity
,现在可以在Facelet上使用bean验证,如:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
>    
    <h:body>   
        <h:form>      
            <h:inputText value="#{backingBean.myEntity.name}" />                        
            <h:commandButton value="Save" action="#{backingBean.save}" />
        </h:form>            
    </h:body>
</html>


如果对
SomeEntity.name
有限制,它将被验证。

谢谢你的帖子,这很有用,但是您是否有完整的JSF代码示例,我们可以使用并理解编写JSF应用程序的适当方式,或者如果您能为我指出一些方向,这将是非常好的。+1提供了一个非常清晰的答案,同时也提供了更广泛的问题背景只需注意,支持bean可以直接返回实体,因此仍然可以使用bean验证。根本不需要很早以前就出现的奇怪的“分散/聚集”模式。“我想知道你是否可以对此进行详细说明。这种“分散/聚集”模式是什么?是否类似:我听说一些人主张在视图和模型之间进行更大的分离,因此他们将Facelets字段映射到支持bean属性上(通常是原语),然后他们使用无状态服务来接受属性、执行验证、填充和持久化实体。@Nimnio District/gather将模型的各个属性分散到支持bean的属性中,然后在action方法中收集其所有值并再次将其存储在原始模型中。因此,假设您有一个模型使用属性
name
age
的用户,则支持bean还被赋予两个额外的属性
name
age
,这些属性被绑定到表单中。在action方法中,还有类似于“User.setAge(this.age);User.setName(this.name)”的代码;`。如果他们的模型有20个属性,而且到处都是,这会变得特别混乱。参见散射/聚集(反)模式的示例
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
>    
    <h:body>   
        <h:form>      
            <h:inputText value="#{backingBean.myEntity.name}" />                        
            <h:commandButton value="Save" action="#{backingBean.save}" />
        </h:form>            
    </h:body>
</html>