JSF 2.0:对于CRUD应用程序,使用DataModel <T>而不是List <T>是否有任何优势

The*_*heo 14 java jsf jsf-2

数据模型的一个优点是可以在表中获取行索引.但我发现这是不必要的,因为您可以使用varh:datatable 的属性访问当前行元素.我经常需要转换为要列出的数据模型,因为某些组件库需要列表.我想完全放弃DataModel.你怎么看?DataModel有什么优点吗?

谢谢,西奥

Bal*_*usC 10

另一个优点是您可以获取当前处理的行DataModel#getRowData().当您想要在事件期间访问当前行(转换/验证,值更改侦听器,操作方法等)时,这尤其有用.

例如

<h:column>
    <h:commandButton value="edit" action="#{bean.edit}" />
</h:column>
Run Code Online (Sandbox Code Playgroud)

public String edit() {
    Item item = dataModel.getRowData();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

您可以在此博客中找到一个基本的CRUD示例.如果你没有使用DataModel,你将被迫使用f:setPropertyActionListener这个只是笨拙而且不适用于验证器/转换器或值更改侦听器.从EL 2.2开始,您也可以将当前var项作为方法参数传递,如下所示:

<h:commandButton value="edit" action="#{bean.edit(item)}" />
Run Code Online (Sandbox Code Playgroud)

public String edit(Item item) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

虽然很好,但这只会使您的webapp与基于Java EE 5的容器不兼容.

至于开销,从"转换" List<T>DataModel<T>特别便宜.没有新项目被复制或创建等等,它只是一个包装类,它将方法委托给包装类并向其添加另一个方法(另请参见适配器模式).

  • 我们能否得出结论:"DataModel"只存在于两个函数中:用于提供行信息(EL 2.2不需要)和允许监听器(猜测这有时可能很好)?注意:使用EL 2.2不会使应用程序与JEE5容器不兼容(您可以手动更新其EL库),但它确实使应用程序与JEE5规范不兼容. (2认同)