ValueList的OverView
概述
在很多情况下,使用JDBC是很繁琐的,有很多方法可以替换JDBC,比如JDO、Hibernate等。
即使在从service中接收POJO的List的解决方案中,我们仍然鼓励使用ValueListHandler来统一访问所有的service。在这种情况下,你应该实现自己的ValueListAdapter,它的作用是调用你的业务方法,同时也要把查询结果转换为一个ValueList。
配置
mlavwilson.properties文件是ValueListHandler服务标签库的配置文件,它包含了定制外观和定制属性的一些配置。但是,这个文件现在已经不再推荐使用了。
对于在Web下怎么使用Spring,请看/docs/reference/beans.html。
下面这个文件是例子中的配置文件:
上面配置文件中的bean“valueListHandler”是一个服务,这个服务有用于valueListHandler的a
dapter的map,使用Spring关联adapter,可以使这些adapter以统一的方式配置。下图是一个真实项目的配置文件:
怎么使用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接口。
3. 现在service已经有数据了。service还有一个机会去更改ValueList:如果service想对数据
进行排序、分页、过滤,它可以使用adapter的方法getAdapterType。这样如果需要,adpater就可以代理分页、排序、过滤等功能。
4. service返回ValueList。
显示ValueList:
显示ValueList:
在Web环境下,有一些标签用于显示ValueList,它们将在以后讨论。显示ValueList也有一个Jtable的实现。当然我们并不限制你用哪种方式。
标签的例子:
代码说明:
行号 | 名称 | 描述 | Since |
1 | vlh:root | 这个标签是必须的,他是所有vlh元素的顶级元素。 | 0.1.3 |
2 | vlh:retrieve | 它调用ValueListHandler,并请求ValueList,然后把ValueList传给vlh:root标签。 注意:如果你不使用MVC的push模式的话,应该使用该标签。(push:是指数据是由数据是由框架推向显示页面的,显示页面并不能主动取得数据,相对于“拉”) | 0.1.1 |
5 | vlh:row | 这是一个iterate标签,它对ValueList进行循环显示。 | 0.1.0 |
6-11 | vlh:column | 它指定显示哪个属性(字段)。 | 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到简单的用法。
在MVC框架中怎么使用ValueList
这部分的主要目的是要解决“刷新按钮问题”(就是点击“刷新”按钮引起的问题)。
在Web程序中,你可能常常redirect到一个“view”上,并且要保证不能丢失分页、排序、查询条件的信息(focus:在原文中多次出现“focus”,按照上下文的理解应该是按照指定条件进行查询的意思)。
请考虑下面的情况:
你要删除一条数据,如果你是通过向请求字符串中添加一个转向参数(注:这个请求类似于:localhost:8080/jbxx.do?method=delete&id=123456)来实现的话,可能在删除数据后,转向到一个显示结果的jsp。但是如果用户点击“刷新”按钮,则还会提交同样的请求。
(注:我在使用AppFuse的过程中也遇到这样的问题,DisplayTag没有处理这种情况,所以会执行同样的动作,但是数据已经在前一步被删除了,所以数据库会报错,我使用Struts的saveToken的方法来解决了这个问题,但我发现AppFuse的原来的用户部分就不会报这个错误,后来发现它转向的视图还是当前页面,所以没有这个问题。)。
所以,我们需要实现一个service helper类来解决这个问题。
得到service的helper的实例
ValueListHandlerHelper是在设置任何ValueListHandler实现前必须创建的一个类,在Web环境下,最简单的办法是使用Spring的bean Factory来创建它。
sortedlist下一步是告诉你的Controller你要使用哪个service的helper类的实例。
“刷新”按钮问题的解决方案
现在,我们来关注更多的细节,设想一下:
在jsp中,我们有一个id="MyTable".的表,Struts的Controller的代码可能如下:
首先,我们必须得到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
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 | "" | 从Hibernate的SQL语法中得到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" 。它用于filter的conjuction |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论