兔八哥翻译的 ValueList 帮助
版本:0.3
文档说明:
本文档译自 ValueList 的官方网站的文档,因为 ValueList 的文档很少,所以我把他开放,
供大家参考,我的项目最近准备使用 ValueList,如果您有好的建议或者忠告,请不吝赐教,
谢谢!
如果您发现文档中有任何错误或者建议,请发送邮件至:ltf_ty2001@yahoo.com.cn,或
者到我的 Blog 留言:rabbit8.bokee.com
谢谢!
版权说明:
兔八哥
2005 年 4 月 7 日 12:52 北京
本文版权归原作者所有,在免费、且无任何附加条件的前提下,可在网络媒体中自由传
播。
版本说明:
版本
0.1
日期
2005-3-4
译者
兔八哥
说明
翻译了 ValueList 网站提供的文档
0.2
2005-4-12
兔八哥
翻 译 了 在 Struts 或 其 他 框 架 中 使 用
ValueList
0.3
2005-5-30
兔八哥
修改了 0.2 版本中的 2 处错误。
兔八哥
2005 年 9 月 13 日 北京
第 1页 共 23页
rabbit8.bokee.com
兔八哥翻译的 ValueList 帮助
版本:0.3
ValueList 的 OverView
概述
在很多情况下,使用 JDBC 是很繁琐的,有很多方法可以替换 JDBC,比如 JDO、Hibernate 等。
即使在从 service 中接收 POJO 的 List 的解决方案中,我们仍然鼓励使用 ValueListHandler 来统一访
问所有的 service。在这种情况下,你应该实现自己的 ValueListAdapter,它的作用是调用你的业务方法,
同时也要把查询结果转换为一个 ValueList。
配置
mlavwilson.properties 文件是 ValueListHandler 服务标签库的配置文件,它包含了定制外观和定制
属性的一些配置。但是,这个文件现在已经不再推荐使用了。
对于在 Web 下怎么使用 Spring,请看 www.springframework.org/docs/reference/beans.html。
下面这个文件是例子中的配置文件:
上面配置文件中的 bean“valueListHandler”是一个服务,这个服务有用于 valueListHandler 的
adapter 的 map,使用 Spring 关联 adapter,可以使这些 adapter 以统一的方式配置。下图是一个真实项
目的配置文件:
第 2页 共 23页
rabbit8.bokee.com
兔八哥翻译的 ValueList 帮助
版本:0.3
第 3页 共 23页
rabbit8.bokee.com
兔八哥翻译的 ValueList 帮助
版本:0.3
怎么使用 service?
上文简述了怎么向 valueListHandler 中添加 adapter 和 query,从例子中的配置片断中你可以看到有
一个叫做"nbaTeams"的 adapter,它是从 team 表中 select 数据的查询。通过这个查询,我们将逐步解决
查询返回的数据。
得到 service 的实例
ValueListHandler 是一个接口,所以你要实现它。在 Web 环境中,最简单的获取 ValueListHandler
的方法是使用 Spring 来获取。
准备调用 service
在服务被调用之前,必须创建 ValueListInfo,它包含下面的内容:
Filter
排序列
构造查询的 Map
用于排序的列(一个或者多个)
排序方向
用于排序的方向(一个或者多个列)
页号
当前页号,如果为空的话,则 service 会设置它
总记录数
调用后,被 server 设置
行数/页
每页上显示的记录的行数
条件的属性
用于指定条件查询的属性名,相当于列名
条件的值
指定条件的值,相当于指定的列的值
创建 info 对象,按照“team”列排序
从服务中请求 ValueList
这个方法将返回一个 ValueList,它包含一个 List 和传给 service 的 info。ValueList 也是一个
Iterator,下面是接收它的方法:
1. 第一个参数是 adapter 的名字,上面的代码中的 adapter 的名字是“nbateams”,这个 adapter 在上面
的 xml 文件中已经配置好了。
2. adapter 用于从数据库中接收数据。作为“ValueListHandler”配置中的 adapter,它必须实现
ValueListAdapter 接口。
第 4页 共 23页
rabbit8.bokee.com
兔八哥翻译的 ValueList 帮助
版本:0.3
3. 现在 service 已经有数据了。service 还有一个机会去更改 ValueList:如果 service 想对数据进行排
序、分页、过滤,它可以使用 adapter 的方法 getAdapterType。这样如果需要,adpater 就可以代理
分页、排序、过滤等功能。
4. service 返回 ValueList。
第 5页 共 23页
rabbit8.bokee.com
兔八哥翻译的 ValueList 帮助
版本:0.3
显示 ValueList:
在 Web 环境下,有一些标签用于显示 ValueList,它们将在以后讨论。显示 ValueList 也有一个 Jtable
的实现。当然我们并不限制你用哪种方式。
标签的例子:
代码说明:
行号
名称
描述
1
2
vlh:root
这个标签是必须的,他是所有 vlh 元素的顶级元素。
vlh:retrieve 它调用 ValueListHandler,并请求 ValueList,然后把 ValueList
0.1.1
传给 vlh:root 标签。
注意:如果你不使用 MVC 的 push 模式的话,应该使用该标签。(push:
是指数据是由数据是由框架推向显示页面的,显示页面并不能主动
取得数据,相对于“拉”)
Since
0.1.3
5
vlh:row
这是一个 iterate 标签,它对 ValueList 进行循环显示。
6-11
vlh:column
它指定显示哪个属性(字段)。
0.1.0
0.1.0
更多的细节和示例,请参见 valuelist.war。
内置的 adapter
DefaultDynaBeanAdapter 返回 DynaBean 的一个 ValueList。对于简单的程序或者例子来说,它是很有用
的。但我们不推荐你在真正的程序里面使用它。
DefaultDynclassAdapter
返回 Dynclass 的一个 ValueList。对于简单的程序或者例子来说,它是很有
用的。但我们不推荐你在真正的程序里面使用它。
DefaultWrapperAdapter 返回封装了 ResultSet 的 ValueList,我推荐在在下列情况下使用:Hibernate
的 HQL 太复杂,不能控制所有的复合连接。
FileSystemAdapter
返回 FileInfo 的 ValueList,在 Web 上浏览一个文件系统时,它是很有用的。
Hibernate20Adapter
返回 POJO 的 ValueList。它也能返回指定条件的一条记录。
除了 FileSystemAdapter,其他的 adapter 都可以调用行的校验。
你可以在 Hibernate20Adapter 找到简单的用法。
第 6页 共 23页
rabbit8.bokee.com
兔八哥翻译的 ValueList 帮助
版本:0.3
在 MVC 框架中怎么使用 ValueList
这部分的主要目的是要解决“刷新按钮问题”(就是点击“刷新”按钮引起的问题)。
在 Web 程序中,你可能常常 redirect 到一个“view”上,并且要保证不能丢失分页、排序、查询条件的信
息(focus:在原文中多次出现“focus”,按照上下文的理解应该是按照指定条件进行查询的意思)。
请考虑下面的情况:
你要删除一条数据,如果你是通过向请求字符串中添加一个转向参数(注:这个请求类似于:
http://localhost:8080/jbxx.do?method=delete&id=123456)来实现的话,可能在删除数据后,转向到一
个显示结果的 jsp。但是如果用户点击“刷新”按钮,则还会提交同样的请求。(注:我在使用 AppFuse 的
过程中也遇到这样的问题,DisplayTag 没有处理这种情况,所以会执行同样的动作,但是数据已经在前一
步被删除了,所以数据库会报错,我使用 Struts 的 saveToken 的方法来解决了这个问题,但我发现 AppFuse
的原来的用户部分就不会报这个错误,后来发现它转向的视图还是当前页面,所以没有这个问题。)。
所以,我们需要实现一个 service helper 类来解决这个问题。
得到 service 的 helper 的实例
ValueListHandlerHelper 是在设置任何 ValueListHandler 实现前必须创建的一个类,在 Web 环境下,
最简单的办法是使用 Spring 的 bean Factory 来创建它。
下一步是告诉你的 Controller 你要使用哪个 service 的 helper 类的实例。
“刷新”按钮问题的解决方案
现在,我们来关注更多的细节,设想一下:
在 jsp 中,我们有一个 id="MyTable".的表,Struts 的 Controller 的代码可能如下:
第 7页 共 23页
rabbit8.bokee.com
兔八哥翻译的 ValueList 帮助
版本:0.3
首先,我们必须得到 ValueList 的实际的 info,我们可以修改它,然后,把它备份到 Session 中。
如果请求中没有任何 id=”MyTable”的 Table 的信息,它会试着从上一个保存的备份
(ValueListInfo)中获取。因此,在执行每个 Action 后,必须备份 ValueList 的 info。
更多的信息,请参见:
javadoc for the ValueListHadlerHelper 或者看
source the code of this struts's controller 或者看例子
valuelist.war 的下面的部分: '经过 MVC 的 ValueListHandlerHelper 备份 ValueListInfo 到
session 中'。
例子
如果你想找一个好的、使用 ValueList 的例子的话,请参见 Fantasy Sports Components 的配置文件。
这个文件里面有一个叫做“playerRank”的查询,这个查询有 left join, inline view 和大量的 group by,
它使用的是 DefaultDynaBeanAdapter。
2005-03-04 13:36
第 8页 共 23页
rabbit8.bokee.com