當(dāng)今的報表分頁在很多系統(tǒng)中都扮演著十分重要的角色,對于很多組件技術(shù)如CR、BO,等都是很好的報表工具,分頁技術(shù)當(dāng)然不在話下,
在此,我所說的是一般的jsp頁面展現(xiàn)報表的討論,

如上圖(在此只做為一舉例),一個表單一般分為表頭,表內(nèi)容和表尾,還有一些頁數(shù)的選擇,
在此我們討論幾種實現(xiàn)的方法:
一,一公用頁面和公用java類實現(xiàn)法---將表頭及表內(nèi)容查詢的sql及表尾內(nèi)容寫入一xml文件中,當(dāng)調(diào)用表單時,在javat程序中設(shè)用xml文件中的相應(yīng)ID,找到及解析相應(yīng)的內(nèi)容,存放在java對象中,然后在jsp頁面得到相應(yīng)的java對象加以顯示,此為一過程, 在此可謂第一次調(diào)用完成。
當(dāng)點擊第二次調(diào)用時,此處有多種方法,1,在頁面隱藏保存相應(yīng)xml中的ID,后面同第一次程序?qū)崿F(xiàn)相同,但此處解析xml文件的開銷過大。2,將第一次存放在java對象存放在session中,這樣,先判斷session中是否有值,有值直接取出,沒有就到xml文件中解析, 此方法省去了多次解析xml文件的操作,但增加了session的負(fù)擔(dān),而且當(dāng)不再做表單查詢操作也不能很好釋放session中內(nèi)容。
二,一查詢對應(yīng)一頁面和java類,此方法實現(xiàn)比較簡單,表樣式可以先畫好,傳入一些相應(yīng)變量進(jìn)行展現(xiàn),但這種做法很難統(tǒng)一管理,要對表結(jié)構(gòu)和樣式做變動時較難解決,而且代碼冗余度大。
三,目前我認(rèn)為較好些的辦法, 把表中表頭即表的B部分抽取成一靜態(tài)頁面,而表ACD部分都放入xml文件中定義,此定義內(nèi)容相比之下比第一種方法減少很多,因為表B部分是對xml最難對應(yīng)的一部分,寬度、位置,名稱及對應(yīng)java變量名稱等都要定義,而對于多行表頭是更難定義,
因為表ACD我們可以在xml中定義(此處采用spring的xml解析
1
<?xml version="1.0" encoding="GB2312"?>
2
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
3
<beans>
4
<bean id="queryinfo" class="online.common.query.vo.QueryInfo">
5
<property name="title"><value>發(fā)票出庫</value></property>
6
<property name="headInfo"><ref local="headInfo"/></property>
7
<property name="footInfo"><ref local="footInfo"/></property>
8
<property name="sqlStr"><value><![CDATA[select t.billdataid aa,'200501' bb, '建筑發(fā)票' cc, t.billstatus dd,t.taxofficialcode ee, '1000' ff, '1005' gg, 0.98 hh,
9
t.taxtotal ii, '調(diào)撥' jj
10
from billdata t
11
]]></value></property>
12
</bean>
13
<bean id="headInfo" class="online.common.query.vo.HeadInfo">
14
<property name="lineItemNum"><value>2</value></property>
15
<property name="itemList">
16
<list>
17
<value>出庫單位</value>
18
<value>統(tǒng)計日期</value>
19
</list>
20
</property>
21
<property name="engList">
22
<list>
23
<value>gljg</value>
24
<value>tjlq</value>
25
</list>
26
</property>
27
</bean>
28
<bean id="footInfo" class="online.common.query.vo.FootInfo">
29
<property name="itemList">
30
<list>
31
<value>驗收單位:</value>
32
<value>驗收日期:</value>
33
</list>
34
</property>
35
<property name="engList">
36
<list>
37
<value>theuser</value>
38
<value>thedate</value>
39
</list>
40
</property>
41
</bean>
42
</beans> 然后在公用的查詢jsp頁面中expression為傳入?yún)?shù)(表頭B部分靜態(tài)頁面地址);
<jsp:include page="<%= expression %>" /> 公用頁面ACD部分

for(int i=0;i<=headItemList.size()/lineItemNum;i++)
{
headStr += "<tr>";

if(i==headItemList.size()/lineItemNum)
{
ind =headItemList.size()%lineItemNum ;
}

for(int j=0;j<ind;j++)
{
headStr += " <td align=\"center\" colspan=\"2\">"+ headItemList.get(i*lineItemNum+j) + "£o" + paramMap.get(engItemList.get(i*lineItemNum+j)) +"</td>";
}
headStr += "</tr>";
}
%>
<%=headStr%>
<%要輸出的內(nèi)容

for(int i=0;i<pageList.size();i++)
{
pageStr += "<tr>";
HashMap obj =(HashMap) pageList.get(i);
for(int j=0;j<coumNum;j++)
pageStr += " <td class=\"tdbg0\" >"+obj.get(engnList.get(j)) +"</td>";
pageStr += "</tr>";
}

%>
<%=pageStr%>
<% //表尾
String footStr = "";
footStr += "<tr>";

for(int j=0;j<footList.size();j++)
{
footStr += " <td align=\"center\" colspan=\"2\">"+ footList.get(j) + "£o" + paramMap.get(engfootList.get(j)) +"</td>";
}
footStr += "</tr>";
%>
<%=footStr%>

spring映射代碼略.............
總結(jié):我們清楚,當(dāng)一次調(diào)用報表時,無論是點第幾頁,它的ABD部分是不會變的,因此,能把此三部分都在第一次調(diào)用都生成靜態(tài)頁或此三部分在第一次生成調(diào)用后,翻頁操作就不在調(diào)用(曾試過用frame,效果不是很好),若能解決此部分,可將再次提高java和頁面的執(zhí)行效率................