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

如上圖(在此只做為一舉例),一個表單一般分為表頭,表內容和表尾,還有一些頁數的選擇,
在此我們討論幾種實現的方法:
一,一公用頁面和公用java類實現法---將表頭及表內容查詢的sql及表尾內容寫入一xml文件中,當調用表單時,在javat程序中設用xml文件中的相應ID,找到及解析相應的內容,存放在java對象中,然后在jsp頁面得到相應的java對象加以顯示,此為一過程, 在此可謂第一次調用完成。
當點擊第二次調用時,此處有多種方法,1,在頁面隱藏保存相應xml中的ID,后面同第一次程序實現相同,但此處解析xml文件的開銷過大。2,將第一次存放在java對象存放在session中,這樣,先判斷session中是否有值,有值直接取出,沒有就到xml文件中解析, 此方法省去了多次解析xml文件的操作,但增加了session的負擔,而且當不再做表單查詢操作也不能很好釋放session中內容。
二,一查詢對應一頁面和java類,此方法實現比較簡單,表樣式可以先畫好,傳入一些相應變量進行展現,但這種做法很難統一管理,要對表結構和樣式做變動時較難解決,而且代碼冗余度大。
三,目前我認為較好些的辦法, 把表中表頭即表的B部分抽取成一靜態頁面,而表ACD部分都放入xml文件中定義,此定義內容相比之下比第一種方法減少很多,因為表B部分是對xml最難對應的一部分,寬度、位置,名稱及對應java變量名稱等都要定義,而對于多行表頭是更難定義,
因為表ACD我們可以在xml中定義(此處采用spring的xml解析
<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%>
<%要輸出的內容

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映射代碼略.............
總結:我們清楚,當一次調用報表時,無論是點第幾頁,它的ABD部分是不會變的,因此,能把此三部分都在第一次調用都生成靜態頁或此三部分在第一次生成調用后,翻頁操作就不在調用(曾試過用frame,效果不是很好),若能解決此部分,可將再次提高java和頁面的執行效率................
在此,我所說的是一般的jsp頁面展現報表的討論,

如上圖(在此只做為一舉例),一個表單一般分為表頭,表內容和表尾,還有一些頁數的選擇,
在此我們討論幾種實現的方法:
一,一公用頁面和公用java類實現法---將表頭及表內容查詢的sql及表尾內容寫入一xml文件中,當調用表單時,在javat程序中設用xml文件中的相應ID,找到及解析相應的內容,存放在java對象中,然后在jsp頁面得到相應的java對象加以顯示,此為一過程, 在此可謂第一次調用完成。
當點擊第二次調用時,此處有多種方法,1,在頁面隱藏保存相應xml中的ID,后面同第一次程序實現相同,但此處解析xml文件的開銷過大。2,將第一次存放在java對象存放在session中,這樣,先判斷session中是否有值,有值直接取出,沒有就到xml文件中解析, 此方法省去了多次解析xml文件的操作,但增加了session的負擔,而且當不再做表單查詢操作也不能很好釋放session中內容。
二,一查詢對應一頁面和java類,此方法實現比較簡單,表樣式可以先畫好,傳入一些相應變量進行展現,但這種做法很難統一管理,要對表結構和樣式做變動時較難解決,而且代碼冗余度大。
三,目前我認為較好些的辦法, 把表中表頭即表的B部分抽取成一靜態頁面,而表ACD部分都放入xml文件中定義,此定義內容相比之下比第一種方法減少很多,因為表B部分是對xml最難對應的一部分,寬度、位置,名稱及對應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>發票出庫</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, '建筑發票' cc, t.billstatus dd,t.taxofficialcode ee, '1000' ff, '1005' gg, 0.98 hh,
9
t.taxtotal ii, '調撥' 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>統計日期</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為傳入參數(表頭B部分靜態頁面地址);
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42













































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