ValueListOverView
概述
在很多情况下,使用JDBC是很繁琐的,有很多方法可以替换JDBC,比如JDOHibernate等。
即使在从service中接收POJOList的解决方案中,我们仍然鼓励使用ValueListHandler来统一访问所有的service。在这种情况下,你应该实现自己的ValueListAdapter,它的作用是调用你的业务方法,同时也要把查询结果转换为一个ValueList
配置
mlavwilson.properties文件是ValueListHandler服务标签库的配置文件,它包含了定制外观和定制属性的一些配置。但是,这个文件现在已经不再推荐使用了。
对于在Web下怎么使用Spring,请看/docs/reference/beans.html 
                                       
下面这个文件是例子中的配置文件:
上面配置文件中的beanvalueListHandler”是一个服务,这个服务有用于valueListHandlera
daptermap,使用Spring关联adapter,可以使这些adapter以统一的方式配置。下图是一个真实项目的配置文件:

怎么使用service
上文简述了怎么向valueListHandler中添加adapterquery,从例子中的配置片断中你可以看到有一个叫做"nbaTeams"adapter,它是从team表中select数据的查询。通过这个查询,我们将逐步解决查询返回的数据。
得到service的实例
ValueListHandler是一个接口,所以你要实现它。在Web环境中,最简单的获取ValueListHandler的方法是使用Spring来获取。
准备调用service
在服务被调用之前,必须创建ValueListInfo,它包含下面的内容:
Filter
构造查询的Map
排序列
用于排序的列(一个或者多个)
排序方向
用于排序的方向(一个或者多个列)
页号
当前页号,如果为空的话,则service会设置它
总记录数
调用后,被server设置
行数/
每页上显示的记录的行数
条件的属性
用于指定条件查询的属性名,相当于列名
条件的值
指定条件的值,相当于指定的列的值
创建info对象,按照“team”列排序
从服务中请求ValueList
这个方法将返回一个ValueList,它包含一个List和传给serviceinfoValueList也是一个Iterator,下面是接收它的方法:
1. 第一个参数是adapter的名字,上面的代码中的adapter的名字是“nbateams”,这个adapter在上面的xml文件中已经配置好了。
2. adapter用于从数据库中接收数据。作为“ValueListHandler”配置中的adapter,它必须实现ValueListAdapter接口。
3. 现在service已经有数据了。service还有一个机会去更改ValueList:如果service想对数据
进行排序、分页、过滤,它可以使用adapter的方法getAdapterType。这样如果需要,adpater就可以代理分页、排序、过滤等功能。
4. service返回ValueList
显示ValueList
Web环境下,有一些标签用于显示ValueList,它们将在以后讨论。显示ValueList也有一个Jtable的实现。当然我们并不限制你用哪种方式。
标签的例子:
代码说明:
行号
名称
描述
Since
1
vlh:root
这个标签是必须的,他是所有vlh元素的顶级元素。
0.1.3
2
vlh:retrieve
它调用ValueListHandler,并请求ValueList,然后把ValueList传给vlh:root标签。
注意:如果你不使用MVCpush模式的话,应该使用该标签。(push:是指数据是由数据是由框架推向显示页面的,显示页面并不能主动取得数据,相对于“拉”)
0.1.1
5
vlh:row
这是一个iterate标签,它对ValueList进行循环显示。
0.1.0
611
vlh:column
它指定显示哪个属性(字段)。
0.1.0
更多的细节和示例,请参见valuelist.war
内置的adapter
DefaultDynaBeanAdapter
返回DynaBean的一个ValueList。对于简单的程序或者例子来说,它是很有用的。但我们不推荐你在真正的程序里面使用它。
DefaultDynclassAdapter
返回Dynclass的一个ValueList。对于简单的程序或者例子来说,它是很有用的。但我们不推荐你在真正的程序里面使用它。
DefaultWrapperAdapter
返回封装了ResultSetValueList,我推荐在在下列情况下使用:HibernateHQL太复杂,不能控制所有的复合连接。
FileSystemAdapter
返回FileInfoValueList,在Web上浏览一个文件系统时,它是很有用的。
Hibernate20Adapter
返回POJOValueList。它也能返回指定条件的一条记录。
除了FileSystemAdapter,其他的adapter都可以调用行的校验。
你可以在Hibernate20Adapter到简单的用法。

在MVC框架中怎么使用ValueList
这部分的主要目的是要解决“刷新按钮问题”(就是点击“刷新”按钮引起的问题)。
Web程序中,你可能常常redirect到一个“view”上,并且要保证不能丢失分页、排序、查询条件的信息(focus:在原文中多次出现“focus”,按照上下文的理解应该是按照指定条件进行查询的意思)。
请考虑下面的情况:
你要删除一条数据,如果你是通过向请求字符串中添加一个转向参数(注:这个请求类似于:localhost:8080/jbxx.do?method=delete&id=123456)来实现的话,可能在删除数据后,转向到一个显示结果的jsp。但是如果用户点击“刷新”按钮,则还会提交同样的请求。
(注:我在使用AppFuse的过程中也遇到这样的问题,DisplayTag没有处理这种情况,所以会执行同样的动作,但是数据已经在前一步被删除了,所以数据库会报错,我使用StrutssaveToken的方法来解决了这个问题,但我发现AppFuse的原来的用户部分就不会报这个错误,后来发现它转向的视图还是当前页面,所以没有这个问题。)。
所以,我们需要实现一个service helper类来解决这个问题。
得到service的helper的实例
ValueListHandlerHelper是在设置任何ValueListHandler实现前必须创建的一个类,在Web环境下,最简单的办法是使用Springbean Factory来创建它。
sortedlist下一步是告诉你的Controller你要使用哪个servicehelper类的实例。
“刷新”按钮问题的解决方案
现在,我们来关注更多的细节,设想一下:
jsp中,我们有一个id="MyTable".的表,StrutsController的代码可能如下:
首先,我们必须得到ValueList的实际的info,我们可以修改它,然后,把它备份到Session中。
如果请求中没有任何id=MyTableTable的信息,它会试着从上一个保存的备份(ValueListInfo)中获取。因此,在执行每个Action后,必须备份ValueListinfo
更多的信息,请参见:
javadoc for the ValueListHadlerHelper 或者看
source the code of this struts's controller 或者看例子
valuelist.war 的下面的部分: '经过MVCValueListHandlerHelper备份ValueListInfosession'
例子
如果你想一个好的、使用ValueList的例子的话,请参见Fantasy Sports Components的配置文件。这个文件里面有一个叫做“playerRank”的查询,这个查询有left join, inline view和大量的group by,它使用的是DefaultDynaBeanAdapter
2005-03-04 13:36

Hibernate20Adapter的文档
原文:valuelist.sourceforge/adapters/Hibernate20Adapter.html
属性
名称
必需
默认值
描述
adapterType
N
0
1.JVM中排序
2.JVM中分页
4.JVM中过滤(还没有实现)
sessionFactory
Y
N/A
Hibernate SessionFactory的实例
hsql
废弃
建议使用hql代替
hql
Y
必需有一个
2个中的一个
Spring配置文件中定义的查询
namedQuery
N
定义在你的Hibernate的映射文件中查询的名字。如果你想使用排序和条件查询的话,我们推荐你不要使用这个属性。
defaultNumberPerPage
N
Integer.MAX_VALUE
每页显示的记录数,可以被ValueListInfo中的值覆盖。
defaultSortColumn
N
N/A
结果集排序的列,可以被ValueListInfo中的值覆盖。
defaultSortDirection
N
N/A
可以被ValueListInfo中的值覆盖。
allowCreate
N
true
如果在绑定的线程中没有发现,允许创建一个新的Session
maxRowsForFocus
N
Long.MAX_VALUE
进行focus查询的结果集的最大行数
defaultFocusPropertyObjectAlias
N
""
HibernateSQL语法中得到focus属性的对象的名字:SELECT defaultFocusPropertyObjectAlias.focusProperty FROM XXX
removeEmptyStrings
N
false
是否使用给定的filter 的值的长度检测,如果filter的值是null或者“”,将从查询中被删除。
validator
N
null
对已经查询出来的记录进行后期处理的Validator
focusOptimalization
N
true
focus查询的时候,是否使用statement的优化功能
statementBuilder
N
所有属性的字符串setter的隐式对象(Implicit object)
支持Long, Timestamps和其他的hibernate类型设置Hibernate查询的"preparedStatement" 。它用于filterconjuction

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。