jsf dataTable 中"<h:commandLink"有时不生效分析
在
jsf
架构中
有个
dataTable
组件非常好用
,
只要指列表表格的数据源
(backing bean
写一返回一
list
的
get
方法
)
即可
,
我们一般会在
[get*List]
的方法可调用逻辑层或
DAO
层的数据库的查询所需列表数据的动作。
这样看起来好像一切都没问题,但当我们要将查询与
dataTable
组件结合一起使用时,
[get*List]
进行数据库查询时是依页面输入的条件生成的,当在
dataTable
中的一列中加入"<h:commandLink",以便在数据表格中直接链接到本条数据明细或编辑功能的action时,发现有一个非常奇怪的现象,有时在
dataTable
组件中的某条数据上点击有关功能的"<h:commandLink"时并未进入我们所需的功能中去,中是在原
dataTable
组件页面中刷新了一下而已。我看过很多
JSF
的例子,好像不存在这样的问题,也并未提到这个问题有关此问题注意事项,我在做
OA
项目中修改几个功能时都遇到了这样的问题,后台经过反复的摸索终于找到了问题症结所在,并找到了解决方法,
下面我结合我所开发功能的例子对这个问题存在及解决单要说明一下,以便遇到相同问题的人可理解及解决这个问题。
在一个“企业填报系统-依企业是否填报过查询企业列表”的功能中:
企业填报状态
:
未填报过
已填报过
填报的时段
:
| ||||||||
|
当查询“已填报过”的企业时,查出的企业无论[编辑]还是[
填报]功能都进不去,后台经分析发现,
dataTable
组件中的"<h:commandLink"操作要重新进行一次查询的,这个时候如果与之前列表中的查询结果不一至那么就不进行有关的操作的,那么问题就在查询条件不一样上,因为在"<h:commandLink"操作上重新进行一次查询时,上面的条件未完未提交,生成的查询条件就一定如出列表时的条件不一样,查询结果就不同,所以"<h:commandLink"操作失效;现要解决此问题就是怎样让未提交form时与提交form后的查询保持一至呢,在一些JSF例子中的managed-bean-scope定义都是session的,所以不存在这个问题,但我们在开发中一般managed-bean-scope定义都是request的,那就每次请求的数据都要维持作条件的输入元素数据一至性,用<t:saveState value="#{managed-bean.property}" />就能解决此问题,<t:saveState 是将元素属性值的保持方式是以客户端持久化方式存在,当每次就新请求要初始managed-bean是将持久化的属性还原到原属性中的,这样可保证两次查询是一致的。
希望这个问题的分析能给大家对JSF组件的工件方式有新的认识。