大明白的天地

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  5 随笔 :: 3 文章 :: 58 评论 :: 0 Trackbacks

我的评论

推荐你用我新写的一个分页标签。那个比较好用,看我的blog

@new
不需要特殊的配置
valuelist我看了一下,好像还得和spring结合,有些麻烦,好好的一个标签还得用spring,所以没再看她,我倒是觉得,一个这样的表格标签实际上只是显示了一页的数据,无所谓适不适和大数据量和小数据量的问题

所以只要这个标签在一页中显示的好,灵活,这个标签就是好标签,前提是用着要不麻烦,如果你把整个数据集都传给了他显示那就使开发者的问题了,而不是标签的问题?

现在我发现displaytag总是在第二页出现显示不全的问题,不知为什么,不知道有没有人遇到过这样的问题.就是第二页特殊,其他也均没有问题!!!!怪异!!!
to even
实际上我也没用过displaytag的导出功能,所以我也不知道displaytag是如何设定导出数据的,我想他导出时应该走一遍后台,你可以看看是如何导出的,这应该是displaytag的功能,如果他要所有的数据,那你就dt通过标志位,在CustomHandler里面取就是了,要多少有多少!
to keith
你还是没有理解我坐的标签的意思
我坐的标签没有用dt的分页功能,而是自己做的,抛弃了dt的分页,正因为dt有像你说的那个缺点,所以只有把所有数据传过去,他才能正确分页,所以我自己做了一个分页的栏,而传递给dt的只有一页数据,所以自然它就不分页了,但是还要显示所有数据的分页怎么办,所以就设置了一个setmaxCount虚拟的总数,尔并没有给他那么多数据显示,但是 我的标签却可以根据这个数来计算分页,达到传递一页数据仍然能够很好处理分页的目的,难道你没有明白吗,你还是再看看我的代码吧!!
一句话就是:dt只显示一页,dtp分页
我现在只发现dt有这样几个参数,s,p,o其他均作为addminInfo参数传递,应该不丢失,只是位置放错了,可以从addinInfo中得到,如果有问题可以自己修改,反正有源码!

注意事项看我的主题帖子!
to keith
第一点,提取数据问题,这个标签只是给出一个要提取数据的范围,倒是你是要用 select top 提,还是oracle的特殊语法提取,那就是开发者的事情了,所以这里不能给出针对不同数据的在sql上的提取,那是进一步对数据库的处理,和这个标签没有关系,否则,我不做了一个hibernate分页功能了,还的定义不同数据库的语义,你觉得那时这个标签该做的事情吗!!!
注意:那只是演示代码,当然提取数据也不止那一种,而且我用的是absolute来直接定位游标位置的,而不是用的循环,只有在提取数据时用了循环, 还有就是用select top 10 ....(sql server)还有其它数据库类似用法提取数据,我现在就知道这两种快速提取数据的办法,你还有其他的好的方法提取数据吗?高效的!可以告诉我吗?

第二点,你说的排序问题,实际上你又把问题搅到一块去了,这个标签提供了当前是按第几列进行排序信息,至于有用到这个信息,在sql语句添加不同 order by的问题,那是利用这个标签的开发者的事情,同样不是这个标签的问题,

所以利用这个标签的人只能做这些事情
根据页面传过来的消息,来作整理数据集合的事情,
标签提供了用户接口信息,
例如,从那条到那条,那列处于排序状态等等,志与开发者如何利用这信息,那就不是这个标签的事情了,实际上,完全可以在这个基础上在进一步的对这些信息在针对不同数据再进行封装,会更好,而不应该做到这个标签里面

不知道你同不同意这个观点

如果你不太讲究结构的化,我以前做的qixin000tag标签完全可以达到你的要求,适用范围不一样,那个很省事,开发也很快,但是由于数据访问都封装到里面去了,有些开发者可能不愿意,所以,我又做了着更开放的小标签,
大家可以在这个基础上再进行更改,实际上也没有太大的更改之处了,因为就是一个通过页面信息进行提取数据的功能,至于如何提取,是进一步的事情!!!!
所以大家可不要说将一个标签的功能弄得大而全,那就没有了灵活性,而应该都弄成小的模块,来组合更好,就像DisplayTag没有作更好的针对数据的分页功能一样,那不是他该做的事情,你说对不对!
你编译一下就能够看出来那些错误的地方,然后在改吧!,我也不太记得,因该就是用了foreach的缘故,没有别的了,你可以检查一下,把那里改成普通的for即可
to lyjjq
span.pagebanner {
margin-top: 0px;
margin-bottom: 0px;
visibility: hidden; //这里隐藏了
}

span.pagelinks {
margin-top: 0px;
margin-bottom: 0px;
visibility: hidden; //这里隐藏了
}
//这个是我的标签的分页栏样式单:
span.pagelinkspro {
background-color: #eee;
border: 1px dotted #999;
padding: 2px 4px 2px 4px;
width: 79%;
display:block;
border-top: none;
margin-bottom: -5px;
display:block;
direction:rtl; //这里可以设置左右显示,但是不能设置居中,遗憾
}

个人意见,不推荐更改dt标签!


如果你要实现一行显示多个,如果dt页面控制不了的话,那你就更该输出的Collection,它支持很多集合类,你可以在输出的集合中进行设计,应该可以实现的,我没有试过!
to lyjjq
如果你想把所有数据显示在一行或者你想灵活控制
你的dt用法错误
你应该dispaly:table中加一个display:column软后在其中提取数据循环,而不是像你这样在display:table加了一个<table>
上传图片及其现实的问题都是dt的事,都可以实现,自己发现吧!

去掉displaytag的分页栏,请修改样式单将其变为hidden即可
可能是我理解错误,现在说几点你的用法,如果理解错误,见谅:
//dispalytagpro==dtp
//displaytag == dt
你把dt的属性requestURI放到了dtp上,那dt的排序等功能好象就不好使了,你就的自己处理了,传递的信息也会错误,或者根本没有传递过来,或者传递过来了,会丢失一些QueryString信息,所以不推荐改这里,所以我坐的那个标签是比较充分考虑利用dt的所有功能的前提下来做的这个标签,如果你修改了dt,那以后,dt作者增加了功能,你不由得改dt,多麻烦,而且dt有很多隐含的功能,等待去发掘,dtp只是提供数据而已,所以尽量在挖掘dt的功能基础上来改善dtp功能,我觉得更好
还有就是append属性,这个可能你没有发现,我里面有一个提取QueryString除了d -\d+-[s|o|p]字符串以外的其他传递信息给PageInfo.AddinInfo属性,你从哪里可以获得到你设置的 request.parameter,attribute值,所以这里有点多余,不信你试一试在request里设置一个attribute,然后翻一下页你就会看到 ,查询字符串多了一项,而且你也可以从后台pageInfo.getAddinInfo()中或得到这些信息

还有就是一个居中的问题,你可以调整样式单,而不用该代码,我觉得居中有个问题就是,当你点那些直接跳转的1,23,4,5时,会出现两面同时动的情况,因为他们有时是一位数字,有时是两位数字,会出现同时左右伸缩问题,很难受,左对齐有个好处就是,一侧缩放! 所以说各司其责,dt显示,dtp提供数据,如果你想在一行显示任意多的数据,你可以细细的查一查dt的功能里有没有,我想很多功能你么没有发现,dt很强的,比如那个自由格式的显示,见我的另一篇随笔,那就是我不知道dt有没有这个能力的前提下,仔细想的,结果实现了,所以不要重复做工作。 现在dt做的工作,已经实现了大部分.net里datagrid的功能,很不错, 所以在java里显示数据,我现在不愁了,完全用这两个标签实现一个现在一个典型论坛的显示,很强,但是我做一个样例给大家看看 不好意思,又给提意见了, lyjjq
自觉的还有不好的地方所以一直没有拿出来,如果大家需要,现在奉上:
http://www.blogjava.net/Files/qixin000/displaytagpro.rar
出于演示目的,切勿模仿,否则让人给批了,后果自负! : )

package com.qixin.taglib.displaytagpro.test;

import com.qixin.taglib.displaytagpro.PageInfo;
import com.qixin.taglib.displaytagpro.handle.AbstractHandler;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
* Created by qixin.
* User: qixin
* Date: 2005-7-25
* Time: 18:54:17
*/
public class CustomerHandler extends AbstractHandler {
protected Object getDisplayCollection(PageInfo pageInfo) {
// TestList list = new TestList(143, false);
// pageInfo.setMaxCount(143);
// List subList = list.subList(pageInfo.getStart() - 1, pageInfo.getEnd() > list.size() ? list.size() : pageInfo.getEnd());
// return subList;

List list = new ArrayList();
try {
/**
* 数据库部分可以进一步封装,可以不在这里写,这里只是演示如何提取部分数据
*/
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url = "jdbc:microsoft:sqlserver://192.168.0.177:1433;DatabaseName=paper";
Connection conn = DriverManager.getConnection(url, "sa", "");
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.executeQuery("select ID,编号,存货人 from 入库单");
rs.last();
int maxCount = rs.getRow();
pageInfo.setMaxCount(maxCount);
rs.beforeFirst();
int begin = pageInfo.getStart() - 1;
if (begin > 1) rs.absolute(begin);
int i = 0;
while (rs.next() && i < pageInfo.getPageSize()) {
CustomerBean bean = new CustomerBean();
bean.setId(rs.getString("id"));
bean.setNo(rs.getString("编号"));
bean.setPerson(rs.getString("存货人"));
list.add(bean);
i++;
}
return list;
}
catch (Exception e) {
e.printStackTrace();
}
return list;
}
}


其中:
这里有很重要的两句:
1,就是根据
pageInf.getStart(), pageInfo.getEnd()获得要提取的数据范围

2,就是要设置
pageInfo.setMaxCount(int); 设置要分页的总记录数,这个可以是一个虚拟的,你想设置多少都行,但是最好和你的集合的记录数相同,否则,分页到最后,如果你的处理类没有处理好数据的提取,会出错的!

还有如果泥提取数据不仅仅是根据这个来的,还有你页面定制的自定义信息,那么可以通过pageInfo.getAddinInfo()来获得一个Map来供自己进一步处理数据之用,可以达到更好的效果.
这里有个例子你可以看一看:
http://www.blogjava.net/Files/qixin000/1.1.rar
里有四个文件,但是没有给出完整的例子,如何使用看这里
http://www.blogjava.net/qixin000/articles/8474.html
其中一个就是演示如何从数据库中提取部分数据,主义这个只是演示,至于你在哪里进行数据库连接,那里传递数据,根据你的需要定:
CustomerHandler.java
这个给出了一个如何从数据库中提取部分数据的例子.返回给页面

如果你想快速开发而不太在乎结构是否合理,可以采用qixin000tag我写的一个标签,就是把数据访问也放到了标签里,所以各不用你去管如何提取数据,只需配置好配置文件即可.
改起来倒是很简单,因为这个标签本来就没多东西,代码也很简单
但是请注意:
这个标签是在jdk1.5上开发的,检查一下你的是不是1.5
运行环境jboss,tomcat5;其他的我没有测试过,应该不会出问题,这个标签没有用到什么特别的技术

另外你提的修改方案都已经有了,实际上是重复的
Collection要显示的结果及实际上就是这里的name,他把生成结果集命名为你定义的name,可以在你定义的scope范围内找到这个集合
pagesize已经有了,这个不说
rowsize,我的这个标签中形成的结果集的对象的属性个数;
style:我是充分利用了DisplayTag的显示功能,所以我自己的标签只有一个class,是固定的叫
span.pagelinkspro {
background-color: #eee;
border: 1px dotted #999;
padding: 2px 4px 2px 4px;
width: 79%;
display:block;
border-top: none;
margin-bottom: -5px;
}
其他的全部是DispalyTag的,他怎么定义就怎么用,所以也没有必要取其一个style,因为就一个pagelinkspro,固定的,就是定义下面分页栏风格的

不好意思,给你的全否了
实际上要解决这样的问题,大家应该想法都差不多
为什么DisplayTag没有实现很好的分页,并不是他不能够实现,因为这和他做的显示工作无关,他只是负责把需要的数据显示出来,而且做得很好。
开发DisplayTag标签的人,应该想的是让我们应用他很好的处理显示,灵活的定义显示的功能,而且这点他做到了,而且很好用

处理大数据量问题是,实际上就是如何提取部分信息,给DispalyTag显示,但是又得让它正确处理分页,这点DisplayTag做不到,因为这也不是他的职责

我的基本思路是这样的:
因为DisplayTag计算分页也是根据实际的记录数计算的,而我们传递的是部分数据,所以DT计算不正确,必须给他看到好像是全部数据,他才能分页得很好,如果他做不到,我们就在传递部分数据的同时,在传递一个总数不就可以正确计算分页了.
那就给他一个虚的总数呗;
我们自己用这个虚的总数来计算该分多少页,我们自己做这个分页功能
而让DisplayTag来显示不就行了吗,每次都经过我们自定一个处理类来完成信息的提取数据给它显示。

所以这里没有什么技术难度,只是一个思路的问题,开始我倒是想改DisplayTag的源代码了,但是他复杂,怕给改坏了,而且不易于升级版本,所以就作了一个标签,来由用户产生数据给DT显示,而分页有我的DTP来显示;现在得到了很好的应用!

关键这里的一个我认为好的扩展是:可以自定义一些信息来处理筛选信息用的AddinInfo,达到了复杂查询等的目的。
是的,这个标签在设计上确实有些问题,但是挺实用,但不适合应用于现在的框架设计,因为它的内部被我给封死了,所以用户没有办法控制

如果快速开发的化,还是挺好用的,内部实现实际上,我还是分开了,只不过为了方便,把他都写到了一个标签里面,一个默认的实现,用户向扩展的话,我没有留接口

如果想更好的控制,而且结构更合理的看我的另一个标签
DisplayTagPro
它可以达到用户自己控制的程度,而且可以和现在的框架结合得很好
但是我现在刚发上去后就发现有个缺点就是,要求用户实现的是一个抽象类AbstractHandler,不是一个接口,这样就限制了用户的实用。
大体思路:

GridBean:标签的属性信息,和一个包含sql语句中的结果的总记录数
PageInfo:页面信息,包含一些当前页,排序条件,筛选条件等信息
DBTool:数据库工具,用于根据GridBean从文件中读取sql语句结合PageInfo形成需要的结果集.

DataTable:发送到页面的一页信息;
TableGenerator:结合PageInfo及其GridBean形成发送到页面的html表格

1)startTag:
setinfo(gridbean)
setinfo(pageinfo)
datatable = DBTool(gridbean,pageinfo)
request.setAttribute(gridbean)
request.setAttribute(datatable)

2)bodyhandle
在这里实际上可以拦截修改gridbean,及其datatable信息,
根据自己的要求控制要显示信息;

3)endTag
htmltable = TableGenerator(gridbean,pageinfo,datatable)
out.println(htmltable)
我就会想到大家可能会对这个问题进行讨论!这也是很多人喜欢框架设计人员都关心的问题!这个问题,我是知道的!
实际上我的标签内部starttag已经实现了返回所有的结合,只是在endtag的时候进行显示的,只是没有进行分开.完全可以分开,但是我现在觉得给应用的人会带来麻烦,用于显示的数据被分配到了配置文件中,完全可以根据你的替换条件完成不同的业务,(这个替换条件就是你的业务,你完全可以自己开发),但这个理由不充分,我仍然会把他改的结构更合理.
displaytag和valuelist分开了,但是并不实用,所以我现在针对大多数一般地快速开发应用.
更好的结构,我会在今后改进!
样例代码:
http://www.blogjava.net/Files/qixin000/tagtest.rar

配置文件说明
http://www.blogjava.net/Files/qixin000/displaytable_readme.rar

标签用法很简单:
id:是table的id;
xmlfile:只是标签到那个配置文件里寻找显示样式
table:到指定的配置文件中寻找该值的table段
select:定义选择样式 checkbox,radio两种值可以定义
pageSize:每页要显示的记录数