原因:查询页面一般有两个form,第一个form是我们提交查询条件所用(这里暂定name为form1),第二个是ecside生成(这里暂定name为ecform)。
为了实现ecside的翻页,我们将ecform的action地址写的与form1一样。不同是,为了使ecside翻页时带
上我们的查询条件,以防翻页时不至于将全部数据查出来 ,我们在ecform的action地址中使用了url跟上查询条件的字段。
当点击form1的提交按钮,而后到action执行查询,完成后形成一个list集合,然后返回到查询页面。这时
当页面解析ecside标签时发生第二次提交,这次提交的肯定就是ecform请求的(第二次是提交的ecform是可以肯定,
但,是解析ecside标签时提交,还是当我们点form1的提交按钮时本来就将两个form都提交了,这点还需要考察。)
一般情况下,两次提交的条件一样,两次查询的结果也一样,那么翻页的效果也可以正常实现。但是还是不能排除一些特殊情况,查询完成后能显示正确结果,但当我们点击ecside翻页时发生空白或者没有数据了,这种情况在我们这次项目中出现很多。
提交两次的原因找到了,相信大家都有自己的解决办法。目前本人还没有个通用的办法避免两次提交。但是针对翻页发生空白和无数据的情况,该如何查找原因和解决问题呢。
翻页空白或无数据的常见原因。我针对一种情况和大家讨论一下。前面说到我们ecform的action带有查询条件,现在我们假定其中的个条件是按编号(myid)查询,那么ecform的action地址中就有个myid=。同时这个编号又是ecside里面显示的一个字段。
我们现在要显示myid的字段中增加一个隐藏域,以便我们同时操作多条记录。
<ec:column property="myid" title="编号">
<input name="myid" type="hidden" value="${press.myid}" />
</ec:column>
myid在这页中隐藏域的值有1,2,3,4,5 。 那么当我们点击翻页时ecside提交ecform,这个时候 action类中对于这个按编号查询时接收值是什么样的呢?
假定myid是 action类model的一个字段(是属性也可),因为model不仅可以接收post方式提交的值,也可以接收get方式提交的值,这是this.getModel().getMyid()返回的值是这样的形式:",1,2,3,4,5" 。到hibernte查询条件则是:criteria.add(Expression.eq("myid", ",1,2,3,4,5"));。很明显这样按ID查询是得不到结果的。这样就造成了第一次有结果,翻页时且数据集合变成了空。
知道原因解决方法就很简单了,可以给隐藏域另起个名字,避免和查询条件的重名。当然还很多其他更好的解决办法,可以根据自己的情况而定。