我发现自己在这个问题上进退两难。对于简单的POJO,将简单字段绑定到组件通常相当简单:
<h:outputText value="#{myPage.user.name}"/>
<h:outputText value="#{myPage.user.birthday}">
<f: ....
但是,当涉及到管理集合或对象时,我发现自己想要一个更容易管理的"包装"对象。例如,管理POJO中的Collection需要(至少在JSF 2.1中)将其包装在数据模型或列表中。因此,包装对象将有getter/setter/actionlistener来帮助方便管理。
现在JSF 2.2已经出现了,您可以将集合映射到JSF组件…因此,JSF似乎使直接映射到实体变得越来越容易。
我想保持一致。人们通常尽可能多地映射到实体,然后在他们的页面中使用包装器方法来管理异常吗?还是用组件绑定包装整个对象?
一种大小并不适合所有场景,直接将实体bean绑定到页面在一些框架中是可能的,但不一定是一个好主意。一个简单的项目可以从直接绑定的即时性中受益,但是很容易遇到这种规则的例外情况。
这背后的原因是UI不一定是支持实体的精确表示(即,您输入到输入字段中的信息不完全适合实体字段,需要转换)。假设有一个简单的示例,您可能需要将三个不同输入字段的值(例如日期的日、月和年)放入java.util.Date
类型实体中的单个字段中。这是一种UI与后台数据模型不匹配的情况。约束其中一个或两个来适应另一个的约束并不是一个好的解决方案(在本例中,您要么将三个输入字段更改为单个字段,或者更糟的是将实体bean更改为具有三列来存储日期)。
这类问题通常是通过引入一个隔离数据模型和视图的层来解决的,以DTO或类似的数据承载对象的形式来处理映射中的差异(同样从示例中,您有一个DTO,它提供三个字段来存储解构的日期,并通过组合这三个值来合成一个java.util.Date
对象)。
在JSF中,这些问题中的许多都可以通过使用转换器来解决,但是这些解决方案很难维护(您更改了一个页面,您发现自己不得不更改转换器)。还有一些用例太复杂而无法在转换器中处理(例如集合)。
简而言之,答案是"视情况而定"。具有简单交互和UI需求的简单应用程序可以安全地使用直接绑定。更复杂的应用程序通常需要层之间的更多分离和直接绑定无法解决的附加功能。