使用指南
1:該組件為jsp頁(yè)面數(shù)據(jù)分頁(yè)通用組件,可用于所有struts或jsp+javabean的頁(yè)面分頁(yè)功能
2:該組件使用非常簡(jiǎn)單,只需設(shè)定好各項(xiàng)屬性,傳入數(shù)據(jù)Vctor或者Sql語(yǔ)句,直接調(diào)用多態(tài)的
getContentHtml方法即可得到分好頁(yè)的表格的html代碼(string),在頁(yè)面中<%=string%>即可
,之后的各種翻頁(yè)操作業(yè)已封裝在該html代碼中,用戶不必再操心。
??
3:該組件設(shè)置步驟
?? a.初始化分頁(yè)組件實(shí)例
???? eg:OperatePage operatePage = new OperatePage();
????
?? b.設(shè)定分頁(yè)表格數(shù)據(jù)所屬的表單名
???? 如不設(shè)置該屬性,組件將自定義一個(gè)名為"form1" 的表單名來存放分頁(yè)表格。
???? eg:operatePage.setFormName("formName");
????
?? c.設(shè)定翻頁(yè)操作時(shí)的跳轉(zhuǎn)頁(yè)面
???? 該屬性必需設(shè)置,否則會(huì)報(bào)錯(cuò)。組件支持翻頁(yè)時(shí)跳轉(zhuǎn)到j(luò)sp頁(yè)面(一般都是原jsp頁(yè)面)
???? 或者某一Action(struts架構(gòu))中。
???? eg:operatePage.setPageUrl("/jsp/managerAction.do");
???? eg:operatePage.setPageUrl("/jsp/testPage.jsp");??
??????
?? d.設(shè)定跳轉(zhuǎn)類型
???? 組件支持jsp和Action兩種跳轉(zhuǎn)類型,兩種類型并無大的區(qū)別,只是設(shè)成Action時(shí)
???? 將在翻頁(yè)操作時(shí)傳遞一個(gè)"flag=OperatePage"的參數(shù)以便在用戶Action中區(qū)分是翻頁(yè)
???? 操作。
???? operatePage.setForwardType(OperateConst.FOWARD_TYPE_ACTION);或者
???? operatePage.setForwardType(OperateConst.FOWARD_TYPE_JSP);
????
?? e.設(shè)定數(shù)據(jù)Vctor(如果傳sql的話在此步驟設(shè)置數(shù)據(jù)庫(kù)連接的Connection)
???? operatePage.setCon(con);? 或者
???? operatePage.setDataVector(vecData);
????
?? f.設(shè)定是否需要單選或者多選列(可不設(shè)置,默認(rèn)為true)
???? opeatePage.operatePage.setHasSelectItem(true);
????
?? g.設(shè)定單選或者多選列類型,元素名及對(duì)應(yīng)的該行數(shù)據(jù)的主鍵值(如f步驟中設(shè)置為false這步省略)
????? //支持checkBox和radioButton兩種
???? operatePage.setSelectType(OperateConst.SELECT_TYPE_RADIOBUTTON);
????? //可不設(shè),默認(rèn)為selectItem1
???? operatePage.setSelectItemName("selectItemName2");
????? //序號(hào)從1開始,可不設(shè),默認(rèn)為該行數(shù)據(jù)的第一列的值
???? operatePage.setSelectKeyArray( new int []{1,2,3});
???????
?? h.設(shè)定數(shù)據(jù)標(biāo)題列(如e步驟中設(shè)置為傳sql此步省略)
???? operatePage.setContentTitle(new String[]{"col1","col2","col3","col4"});
????
?? g.前面的設(shè)置完成后,直接調(diào)以下API即可
?? /**
?? * @傳Vector方式
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,HttpServletRequest request, HttpServletResponse response) throws OperateException;
?
? /**
?? * @傳sql方式
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param pm_sPageUrl?? jsp頁(yè)面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,String pm_sSql,HttpServletRequest request, HttpServletResponse response) throws OperateException;
??
? /**
?? * @傳sql方式
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param pm_sPageUrl?? jsp頁(yè)面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param pm_sDBType??? 數(shù)據(jù)庫(kù)類型,如數(shù)據(jù)庫(kù)直接支持?jǐn)?shù)據(jù)庫(kù)端分頁(yè),可提高效率
? * @param request?????? ServletRequest
? * @param response????? ServletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,String pm_sSql,String pm_sDBType,HttpServletRequest request, HttpServletResponse response) throws OperateException;
??
?
4:實(shí)例
?? 上述可能有點(diǎn)抽象,讓我們來看兩個(gè)完整使用實(shí)例:
??
?? 第一種是直接在jsp頁(yè)面中分頁(yè),即翻頁(yè)操作時(shí)跳回原jsp頁(yè)面中
?? 我們來看看testPage.jsp的源代碼:
<%@ page language="java" contentType="text/html; charset=GB18030"??? pageEncoding="GB18030"%>?
<jsp:useBean id="operatePage" class="Action.OperatePage"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title></title>
</head>
<body>
<%
??
?? /**********這是獲取數(shù)據(jù)vector的代碼***********/
?? DbSelect a = new DbSelect();
?? Vector? b = a.getManagerContentByMain_Key(1);
?
??
? /*form2是你的jsp頁(yè)面中的表單名*/
? operatePage.setFormName("form2");??????
? operatePage.setPageUrl("/jsp/testPage.jsp");
? operatePage.setForwardType(OperateConst.FOWARD_TYPE_JSP);
? operatePage.setDataVector(b);
? operatePage.setHasSelectItem(true);
? operatePage.setSelectType(OperateConst.SELECT_TYPE_CHECKBOX);
?
? /*selectItemName是單選列的元素名,這樣你可以用request.getParamer("selectItemName")來獲取選中的值 ,如不設(shè),默認(rèn)為名字為selectItemName1*/
? operatePage.setSelectItemName("selectItemName");
?
? /*1,2,3表示你用request.getParamer("selectItemName")獲取選中行的value為該行第一列,第二列,第三列的值的集合,各列的值以;分隔*/
? operatePage.setSelectKeyArray( new int []{1,2,3});
?
? operatePage.setContentTitle(new String[]{"col1","col2","col3","col4"});
?
? /****15是初始的頁(yè)大小,0是初始頁(yè)碼,之后翻頁(yè)跳轉(zhuǎn)時(shí)這兩個(gè)值會(huì)被request中的新值自動(dòng)更新*/
? String c = operatePage.getContentHtml(15,0,request,response);
?
%>
<%=c %>
</script>
</body>
</html>
這是傳Vctor方式,如果我們改成傳sql的方式,只需做修改如下:
<%
? /**********這是獲取數(shù)據(jù)庫(kù)連接的代碼***********/
? DbConnect a = new DbConnect();
? Connection con = a.getOracleConnection();
? String sql = "select * from safe_control_object";
?
?
? operatePage.setFormName("form2");
? operatePage.setPageUrl("/jsp/testPage.jsp");
? operatePage.setForwardType(OperateConst.FOWARD_TYPE_JSP);
? operatePage.setCon(con);
?
? operatePage.setHasSelectItem(true);
? operatePage.setSelectType(OperateConst.SELECT_TYPE_CHECKBOX);
? operatePage.setSelectItemName("selectItemName2");
? operatePage.setSelectKeyArray( new int []{1,2,3});
?
? /* OperateConst.DBTYPE_ORACLE是數(shù)據(jù)庫(kù)類型,該字段可傳可不傳,傳的好處在于如果該類型數(shù)據(jù)庫(kù)支持后端分頁(yè),則組件會(huì)采用后端分頁(yè)的方式,效率較前端分頁(yè)要高*/
? String c = operatePage.getContentHtml(15,0,sql,OperateConst.DBTYPE_ORACLE,request,response);
%>
我們?cè)賮砜纯刺D(zhuǎn)到Action中的情況,這是翻頁(yè)Action的源碼示例
??
?? public class ManagerAction extends DispatchAction{
??? OperatePage operatePage = new OperatePage();
??? /**********這是獲取數(shù)據(jù)vector的代碼***********/
??? DbSelect a = new DbSelect();
?? Vector? b = a.getManagerContentByMain_Key(1);
??
??
?? public ActionForward pageOperate(ActionMapping mapping, ActionForm form,
??????????? HttpServletRequest request, HttpServletResponse response)
??? throws Exception
??? {
??? ?String c = operatePage.getContentHtml(15,0,request,response);
??? ?HttpSession session = request.getSession();
??? ?session.setAttribute("testPage",c);
????? return mapping.findForward("testPage");
??? }
???
??? /**初始化的操作**/
??? public ActionForward initPageOperate(ActionMapping mapping, ActionForm form,
??????????? HttpServletRequest request, HttpServletResponse response)
??? throws Exception
??? {
??? ?
??? ?operatePage.setFormName("form2");
??? ?operatePage.setPageUrl("/jsp/managerAction.do");
??? ?operatePage.setForwardType(OperateConst.FOWARD_TYPE_ACTION);
??? ?operatePage.setDataVector(b);
??? ?operatePage.setHasSelectItem(true);
??? ?operatePage.setSelectType(OperateConst.SELECT_TYPE_RADIOBUTTON);
??? ?operatePage.setSelectItemName("selectItemName2");
??? ?operatePage.setSelectKeyArray( new int []{1,2,3});
??? ?operatePage.setContentTitle(new String[]{"col1","col2","col3","col4"});
??? ?
??? ?String c = operatePage.getContentHtml(15,0,request,response);
??? ?/*把獲得的分頁(yè)后的html代碼放到session中去*/
??? ?HttpSession session = request.getSession();
??? ?session.setAttribute("testPage",c);
??? ?/*testPage是你在struts-config.xml中配置的jsp頁(yè)面的跳轉(zhuǎn)forward**/
????? return mapping.findForward("testPage");
??? }
???
}
jps示例頁(yè)面如下:
<%@ page language="java" contentType="text/html; charset=GB18030"??? pageEncoding="GB18030"%>?
<jsp:useBean id="operatePage" class="Action.OperatePage"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title></title>
</head>
<body>
<%
String c = (String)session.getAttribute("testPage");
%>
<%=c %>
//flag=initPageOperate對(duì)應(yīng)Action中初始化的操作
<a href="/jsp/managerAction.do?flag=initPageOperate">測(cè)試Action端分頁(yè)</a>
這是傳Vctor的方式,傳sql和之前跳轉(zhuǎn)到j(luò)sp中的類似,這里就不重復(fù)了
OK!這就是最常見的傳sql和傳Vector,及在原jsp頁(yè)面跳轉(zhuǎn)或者在Action中跳轉(zhuǎn)的數(shù)據(jù)庫(kù)分頁(yè)組件操作,每種不過十幾行代碼即可搞定!
5:如果有什么不清楚的地方,請(qǐng)發(fā)email:qingyuan18@126.com,或者msn:tangqingyuan@chinamobilesz.com,
有做的不好的地方,請(qǐng)不吝賜教!
?
IOperatePage.java?? 文件
package Action;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface IOperatePage {
?/**
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,HttpServletRequest request, HttpServletResponse response) throws OperateException;
?
?/**
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param pm_sPageUrl?? jsp頁(yè)面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,String pm_sSql,HttpServletRequest request, HttpServletResponse response) throws OperateException;
?
?/**
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param pm_sPageUrl?? jsp頁(yè)面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param pm_sDBType??? 數(shù)據(jù)庫(kù)類型,如數(shù)據(jù)庫(kù)直接支持?jǐn)?shù)據(jù)庫(kù)端分頁(yè),可提高效率
? * @param request?????? ServletRequest
? * @param response????? ServletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,String pm_sSql,String pm_sDBType,HttpServletRequest request, HttpServletResponse response) throws OperateException;
?
}
OperateConst.java 文件
??????????????????
package Action;
public final class OperateConst {
?/*
? * 數(shù)據(jù)庫(kù)類型
? */
?public static final String DBTYPE_SQLSERVER = "sqlServer";
?public static final String DBTYPE_DB2 = "DB2";
?public static final String DBTYPE_ORACLE = "oracle";
?/*
? * 行數(shù)據(jù)選擇類型
? * 1:CheckBox
? * 2:RadioButton
? */
?public static final int SELECT_TYPE_CHECKBOX = 1;
?public static final int SELECT_TYPE_RADIOBUTTON = 2;
?
?/*
? * 翻頁(yè)跳轉(zhuǎn)類型
? * 1:跳回原jsp頁(yè)面
? * 2:跳回Action.do(struts框架)
? */
?public static final int FOWARD_TYPE_JSP = 1;
?public static final int FOWARD_TYPE_ACTION =2;
?
?/*
? *錯(cuò)誤類型
? *1:未設(shè)置url
? *2:未設(shè)置標(biāo)題
? *3:Connection為空(傳sql方式)
? *4:未識(shí)別的數(shù)據(jù)庫(kù)
? *5:數(shù)據(jù)vector為空(非傳sql方式)
? *6:查詢sql為空(傳sql方式)
? */
?public static final int EXCEPTION_TYPE_URL_IS_NULL = 1;
?public static final int EXCEPTION_TYPE_TITLE_IS_NULL = 2;
?public static final int EXCEPTION_TYPE_CON_IS_NULL = 3;
?public static final int EXCEPTION_TYPE_DB_NOT_RECOGNIZE = 4;
?public static final int EXCEPTION_TYPE_DATA_VECTOR_IS_NULL = 5;
?public static final int EXCEPTION_TYPE_SQL_IS_NULL = 6;
}
OperateException.java 文件?????
package Action;
public class OperateException extends Exception {
?private String ExceptionMsg= "OperatePage Exception:";
?/**
? * @param pm_iExceptionType 異常類型
? * 根據(jù)定義的異常類型構(gòu)造異常信息
? */
?public OperateException(int pm_iExceptionType)
?{
??if(pm_iExceptionType == OperateConst.EXCEPTION_TYPE_CON_IS_NULL)
??{
???this.ExceptionMsg += "The Connection is null ! ";
??}
??else if(pm_iExceptionType == OperateConst.EXCEPTION_TYPE_DB_NOT_RECOGNIZE)
??{
???this.ExceptionMsg += "unrecoginze DBType!";
??}
??else if(pm_iExceptionType == OperateConst.EXCEPTION_TYPE_TITLE_IS_NULL)
??{
???this.ExceptionMsg += "The title is null";
??}
??else if(pm_iExceptionType == OperateConst.EXCEPTION_TYPE_URL_IS_NULL)
??{
???this.ExceptionMsg += "The pageUrl is null!";
??}
??else if(pm_iExceptionType == OperateConst.EXCEPTION_TYPE_DATA_VECTOR_IS_NULL)
??{
???this.ExceptionMsg += "The Data Vector is null!";
??}
??
??
?}
?
?/**
? * 打印異常信息
? */
?public void printMsg()
?{
??System.out.println(this.ExceptionMsg);
??
?}
}
OperatePage.java? 文件??????
package Action;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import common.Tools;
public class OperatePage implements IOperatePage{
?//表單名,如未設(shè)置,將把分頁(yè)數(shù)據(jù)裝在名為"form1"的表單中
?private String formName = "";
?//分頁(yè)時(shí)跳轉(zhuǎn)的頁(yè)面url
?private String pageUrl = "";
?//數(shù)據(jù)容器,傳sql時(shí)不必設(shè)
?private Vector dataVector;
?//數(shù)據(jù)連接,傳sql時(shí)必需設(shè)置
?private Connection con;?
?//分頁(yè)表格標(biāo)題頭
?private String[] contentTitle;
?//行選擇時(shí)的元素名,在設(shè)定選擇模式時(shí)有效,默認(rèn)為checkboxItem
?private String selectItemName = "checkboxItem";
?//行選擇類型,單選和多選兩種,在設(shè)定選擇模式時(shí)有效,默認(rèn)為多選
?private int selectType = OperateConst.SELECT_TYPE_CHECKBOX;
?//翻頁(yè)跳轉(zhuǎn)類型,到j(luò)sp和到Action兩種(默認(rèn)到j(luò)sp)
?private int forwardType = OperateConst.FOWARD_TYPE_JSP;
?//行選擇時(shí)每行數(shù)據(jù)的值,與數(shù)據(jù)列對(duì)應(yīng),各列數(shù)據(jù)以;分隔(默認(rèn)第一列)
?private int [] selectKeyArray = {1};
?//是否為選擇模式,如為true,分頁(yè)表格頭列將加單選或多選按鈕(默認(rèn)為true)
?private boolean hasSelectItem = true;
?
??? //用戶是否未設(shè)置formName,組件自我控制邏輯,用戶不必關(guān)心該屬性
?private boolean isSelfForm ;
?
?/**
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param pm_vecContent 數(shù)據(jù)內(nèi)容
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize, int pm_iPageIndex, HttpServletRequest request, HttpServletResponse response) throws OperateException {
??
??StringBuffer strBuf = new StringBuffer("");
??int pageSize=pm_iPageSize;
??int pageIndex=pm_iPageIndex;
??String pageUrlReal = this.pageUrl;
????
??//檢查必要設(shè)置
??if(this.contentTitle == null)? /*如未設(shè)置標(biāo)題頭,拋出異常*/
??{
???throw new OperateException(OperateConst.EXCEPTION_TYPE_TITLE_IS_NULL);
???
??}
??if(this.pageUrl == null)?? /*如傳遞的跳轉(zhuǎn)頁(yè)面為空,拋出異常*/
??{
???throw new OperateException(OperateConst.EXCEPTION_TYPE_URL_IS_NULL);
??}
??if(this.dataVector == null) /*如未設(shè)置待分頁(yè)數(shù)據(jù),拋出異常*/
??{
???throw new OperateException(OperateConst.EXCEPTION_TYPE_DATA_VECTOR_IS_NULL);
??}
??
??
??// 判斷是第一次進(jìn)入還是翻頁(yè)操作,設(shè)置相應(yīng)的pageSize和pageIndex
??if(request.getParameter("pageSizeText")==null)
??{
???pageSize = pm_iPageSize;
?????
??}
??else if(!request.getParameter("pageSizeText").equals(""))
??{
???pageSize = Integer.parseInt(request.getParameter("pageSizeText"));
??}
??if(request.getParameter("pageIndex")==null)
??{
???pageIndex = pm_iPageIndex;
??}
??else if(request.getParameter("pageIndex")!=null)
??{
???pageIndex = Integer.parseInt(request.getParameter("pageIndex"));
??}
??
??//如跳轉(zhuǎn)類型為Action,在url中加flag=pageOperate參數(shù)以便在用戶的Action中標(biāo)識(shí)跳轉(zhuǎn)操作(默認(rèn)為跳轉(zhuǎn)到原jsp)
??if(this.forwardType == OperateConst.FOWARD_TYPE_ACTION)
??{
???pageUrlReal = this.pageUrl+"?flag=pageOperate&";
??}
??else if(this.forwardType == OperateConst.FOWARD_TYPE_JSP)
??{
???pageUrlReal = this.pageUrl+"?";
??}
??
??//如未設(shè)置form名,則將分頁(yè)數(shù)據(jù)封裝在名為"form1"的表單中
??if(this.getFormName().equals(""))
??{
???this.setFormName("form1");
???this.setSelfForm(true);
???strBuf.append("<form name="+this.formName+" action='' method=post>");
???strBuf.append("\n");
??}
??else if( (!this.getFormName().equals(""))&&this.isSelfForm==true)
??{
???this.setFormName("form1");
???strBuf.append("<form name="+this.formName+" action='' method=post>");
???strBuf.append("\n");
??}
??
??//主體操作
??Vector vecContent = this.dataVector;
??strBuf.append("<table width=100% cellspacing=1 cellpadding=0 background=blue>");
??//表格標(biāo)題欄
??strBuf.append("<tr >");
??if(this.hasSelectItem)
??{
???strBuf.append("<td >");
???if(this.selectType == OperateConst.SELECT_TYPE_CHECKBOX)
???{
????strBuf.append("<input type='checkbox' name='checkAll' onclick='doSelectAll();'/>");
???}
???strBuf.append("</td>");
??}
??
??for(int i=0;i<contentTitle.length;i++)
??{
???strBuf.append("<td>"+contentTitle[i]+"</td>");???
??}
??strBuf.append("</tr>");
??
??
??//表內(nèi)容
??//分頁(yè)操作
??int totalCount = vecContent.size();
??int totalPage = totalCount/pageSize;
??if(totalPage*pageSize<totalCount)
??{
???totalPage = totalPage + 1;
??}
??
??int beginIndex = pageIndex*pageSize ;
??int endIndex = beginIndex + pageSize - 1;
??if(endIndex >= totalCount)
??{
???endIndex = totalCount -1;
??}
??
??
??for(int i=beginIndex;i<=endIndex;i++)
??{
???Vector tmp = (Vector)vecContent.get(i);
???strBuf.append("<tr>");
???if(this.hasSelectItem)? /*如設(shè)置行選擇,增加selectItem列*/
???{
????strBuf.append("<td>");
????if(this.selectType == OperateConst.SELECT_TYPE_CHECKBOX)
????{
?????strBuf.append("<input type='checkbox' name='"+this.getSelectItemName()+"' value='");
?????for(int k=0;k<this.selectKeyArray.length;k++)
?????{
??????strBuf.append(tmp.get(selectKeyArray[k]-1)+";");
?????}
?????strBuf.append("'/>");
????}
????else if(this.selectType == OperateConst.SELECT_TYPE_RADIOBUTTON)
????{
?????strBuf.append("<input type='radio' name='"+this.getSelectItemName()+"' value='");
?????for(int k=0;k<this.selectKeyArray.length;k++)
?????{
??????strBuf.append(tmp.get(selectKeyArray[k]-1)+";");
?????}
?????strBuf.append("'/>");
????}
????strBuf.append("</td>");
???}
???for(int j=0;j<tmp.size();j++)
???{???
????strBuf.append("<td>"+tmp.get(j)+"</td>");
???}
???strBuf.append("</tr>");
???
??}
??
??strBuf.append("</table>");
??
??strBuf.append("<br>");
??
??
??if(pageIndex>0)
??{
???strBuf.append("|<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex=0' onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
???strBuf.append("<font color='red'>首頁(yè)</font>");
???strBuf.append("</a>|");
???strBuf.append("<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex="+String.valueOf(pageIndex-1)+"'? onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
???strBuf.append("<font color='red'>上一頁(yè)</font>");
???strBuf.append("</a>|");
???
??}
??if(pageIndex<totalPage-1)
??{
???
???strBuf.append("<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex="+String.valueOf(pageIndex+1)+"'? onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
???strBuf.append("<font color='red'>下一頁(yè)</font>");
???strBuf.append("</a>|");
???strBuf.append("<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex="+String.valueOf(totalPage-1)+"'? onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
???strBuf.append("<font color='red'>末頁(yè)</font>");
???strBuf.append("</a>|");
??}
????
??strBuf.append("<font color='red'>每頁(yè)顯示</font>");
??strBuf.append("<input type=text name=pageSizeText size=10 value="+pageSize+">");
??strBuf.append("</input>");
??strBuf.append("<font color='red'>行</font>");
??
??//js腳本
??strBuf.append("\n");
??strBuf.append("<script language='JavaScript'>\n");
??? //提交翻頁(yè)操作腳本
??strBuf.append("function commonSubmit(formObject,url)"+"\n");
??strBuf.append("{\n");
??strBuf.append("formObject.action=url"+"\n");
??//strBuf.append("alert(formObject.action)\n");
??strBuf.append("formObject.submit();"+"\n");
??strBuf.append("}"+"\n");
??
??//如果選擇類型為checkbox,增加全選的腳本
??if(this.getSelectType() == OperateConst.SELECT_TYPE_CHECKBOX)
??{
????? //行選擇腳本(用于checkBox)
???strBuf.append("function doSelectAll()"+"\n");
???strBuf.append("{"+"\n");
???strBuf.append("var ItemName = '"+this.selectItemName+"'"+"\n");
???strBuf.append("var ItemObj ;\n");
???strBuf.append("var i ;\n");
???strBuf.append("for(i=0;i<"+this.formName+".length;i++)\n");
???strBuf.append("{\n");
???strBuf.append("if("+this.formName+".elements[i].name == '"+this.selectItemName+"')\n");
???strBuf.append("{\n");
???strBuf.append("ItemObj = "+this.formName+".elements[i];\n");
???strBuf.append("if("+this.formName+".checkAll.checked == true)\n");
???strBuf.append("{\n");
???strBuf.append("ItemObj.checked = true;\n");
???strBuf.append("}\n");
???strBuf.append("else\n");
???strBuf.append("{\n");
???strBuf.append("ItemObj.checked = false;\n");
???strBuf.append("}\n");??
???strBuf.append("}\n");
???strBuf.append("}\n");
???strBuf.append("}\n");
??}
??strBuf.append("</script>\n");
??if(this.formName.equals(""))
??{?
???strBuf.append("</form>");
??}
??return strBuf.toString();
?}
?
?/**
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param pm_sPageUrl?? jsp頁(yè)面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize, int pm_iPageIndex, String pm_sSql, HttpServletRequest request, HttpServletResponse response) throws OperateException {
??//檢查必要設(shè)置
??if(this.con == null)
??{
???throw new OperateException(OperateConst.EXCEPTION_TYPE_CON_IS_NULL);
??}
??this.contentTitle = new String[100];
??PageDbBean dbBean = new PageDbBean(con);
??Vector result = dbBean.getResultBySql(pm_sSql,this.contentTitle);
??this.setDataVector(result);
??return getContentHtml(pm_iPageSize,pm_iPageIndex,request,response);
?}
????
?
?
?/**
? * @param pm_iPageSize? 頁(yè)大小
? * @param pm_iPageIndex 頁(yè)碼
? * @param pm_sPageUrl?? jsp頁(yè)面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param pm_sDBType??? 數(shù)據(jù)庫(kù)類型,如數(shù)據(jù)庫(kù)直接支持?jǐn)?shù)據(jù)庫(kù)端分頁(yè),可提高效率
? * @param request?????? ServletRequest
? * @param response????? ServletResponse
? * @return 數(shù)據(jù)庫(kù)分頁(yè)后的Table HTML(帶分頁(yè)按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize, int pm_iPageIndex, String pm_sSql, String pm_sDBType, HttpServletRequest request, HttpServletResponse response) throws OperateException {
??//判斷數(shù)據(jù)庫(kù)類型,如支持?jǐn)?shù)據(jù)庫(kù)端分頁(yè),重新組裝sql
??String sql = pm_sSql;
??if(pm_sDBType.equals(OperateConst.DBTYPE_ORACLE))/*支持?jǐn)?shù)據(jù)庫(kù)端分頁(yè)*/
??{
???
??????????? //檢查必要設(shè)置
???if(this.con == null)
???{
????throw new OperateException(OperateConst.EXCEPTION_TYPE_CON_IS_NULL);
???}
???//檢查必要設(shè)置
???if(this.pageUrl == null)?? /*如傳遞的跳轉(zhuǎn)頁(yè)面為空,拋出異常*/
???{
????throw new OperateException(OperateConst.EXCEPTION_TYPE_URL_IS_NULL);
???}
???
???//主體操作
???StringBuffer strBuf = new StringBuffer("");
???int pageSize=pm_iPageSize,pageIndex=pm_iPageIndex;
???// 判斷是第一次進(jìn)入還是翻頁(yè)操作,設(shè)置相應(yīng)的pageSize和pageIndex
???if(request.getParameter("pageSizeText")==null)
???{
????pageSize = pm_iPageSize;
????
???}
???else if(!request.getParameter("pageSizeText").equals(""))
???{
????pageSize = Integer.parseInt(request.getParameter("pageSizeText"));
???}
???if(request.getParameter("pageIndex")==null)
???{
????pageIndex = pm_iPageIndex;
???}
???else if(request.getParameter("pageIndex")!=null)
???{
????pageIndex = Integer.parseInt(request.getParameter("pageIndex"));
???}
???
???//如跳轉(zhuǎn)類型為Action,在url中加flag=pageOperate參數(shù)以便在用戶的Action中標(biāo)識(shí)跳轉(zhuǎn)操作(默認(rèn)為跳轉(zhuǎn)到原jsp)
???if(this.forwardType == OperateConst.FOWARD_TYPE_ACTION)
???{
????this.pageUrl = this.pageUrl+"?flag=pageOperate&";
???}
???else if(this.forwardType == OperateConst.FOWARD_TYPE_JSP)
???{
????this.pageUrl = this.pageUrl+"?";
???}
???
???int pageBegin = pageSize*pageIndex;
???int pageEnd = pageSize*(pageIndex+1)-1;
???String pageUrlReal = this.pageUrl;
???int pageTotal = 0;
???sql = "select * from (select rownum r, t. *? from ("+pm_sSql +") t where rownum <="+(pageEnd+1)+") t_out where r >="+(pageBegin+1);
??????
???
???//獲取總頁(yè)數(shù)
???PageDbBean dbBean = new PageDbBean(this.con);
???
???int rowTotal = dbBean.getTotalCount(pm_sSql);
???pageTotal = rowTotal/pm_iPageSize;
???if(pageTotal*pm_iPageSize<rowTotal)
???{
????pageTotal = pageTotal + 1;
???}
???
???
???//如未設(shè)置form名,則將分頁(yè)數(shù)據(jù)封裝在名為"form1"的表單中
???if(this.getFormName().equals(""))
???{
????this.setFormName("form1");
????this.setSelfForm(true);
????strBuf.append("<form name="+this.formName+" action='' method=post>");
????strBuf.append("\n");
???}
???else if( (!this.getFormName().equals(""))&&this.isSelfForm==true)
???{
????this.setFormName("form1");
????strBuf.append("<form name="+this.formName+" action='' method=post>");
????strBuf.append("\n");
???}
???
???//主體操作
???this.contentTitle = new String[100];
???Vector result = dbBean.getResultBySql2(sql,this.contentTitle);
???Vector vecContent = result;
???strBuf.append("<table width=100% cellspacing=1 cellpadding=0>");
???//表格標(biāo)題欄
???strBuf.append("<tr >");
???if(this.hasSelectItem)
???{
????strBuf.append("<td >");
????if(this.selectType == OperateConst.SELECT_TYPE_CHECKBOX)
????{
?????strBuf.append("<input type='checkbox' name='checkAll' onclick='doSelectAll();'/>");
????}
????strBuf.append("</td>");
???}
???for(int i=0;i<contentTitle.length;i++)
???{
????strBuf.append("<td>"+contentTitle[i]+"</td>");???
???}
???strBuf.append("</tr>");
???
???for(int i=0;i<vecContent.size();i++)
???{
????Vector tmp = (Vector)vecContent.get(i);
????strBuf.append("<tr>");
????if(this.hasSelectItem)
????{
?????strBuf.append("<td>");
?????if(this.selectType == OperateConst.SELECT_TYPE_CHECKBOX)
?????{
??????strBuf.append("<input type='checkbox' name='"+this.getSelectItemName()+"' value='");
??????for(int k=0;k<this.selectKeyArray.length;k++)
??????{
???????strBuf.append(tmp.get(selectKeyArray[k]-1)+";");
??????}
??????strBuf.append("'/>");
?????}
?????else if(this.selectType == OperateConst.SELECT_TYPE_RADIOBUTTON)
?????{
??????strBuf.append("<input type='radio' name='"+this.getSelectItemName()+"' value='");
??????for(int k=0;k<this.selectKeyArray.length;k++)
??????{
???????strBuf.append(tmp.get(selectKeyArray[k]-1)+";");
??????}
??????strBuf.append("'/>");
?????}
?????strBuf.append("</td>");
????}
????for(int j=0;j<tmp.size();j++)
????{???
?????strBuf.append("<td>"+tmp.get(j)+"</td>");
????}
????strBuf.append("</tr>");
????
???}
???
???strBuf.append("</table>");
???
???strBuf.append("<br>");
???
???
???if(pageIndex>0)
???{
????strBuf.append("|<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex=0' onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
????strBuf.append("<font color='red'>首頁(yè)</font>");
????strBuf.append("</a>|");
????strBuf.append("<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex="+String.valueOf(pageIndex-1)+"'? onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
????strBuf.append("<font color='red'>上一頁(yè)</font>");
????strBuf.append("</a>|");
????
???}
???if(pageIndex<pageTotal-1)
???{
????
????strBuf.append("<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex="+String.valueOf(pageIndex+1)+"'? onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
????strBuf.append("<font color='red'>下一頁(yè)</font>");
????strBuf.append("</a>|");
????strBuf.append("<a href='"+pageUrlReal+"pageSize="+String.valueOf(pageSize)+"&pageIndex="+String.valueOf(pageTotal-1)+"'? onClick=\"commonSubmit("+this.formName+",this.href);return false;\">");
????strBuf.append("<font color='red'>末頁(yè)</font>");
????strBuf.append("</a>|");
???}
???
???strBuf.append("<font color='red'>每頁(yè)顯示</font>");
???strBuf.append("<input type=text name='pageSizeText' size=10 value="+pageSize+">");
???strBuf.append("</input>");
???strBuf.append("<font color='red'>行</font>");
???
???//js腳本
???strBuf.append("\n");
???strBuf.append("<script language='JavaScript'>\n");
???//提交翻頁(yè)操作腳本
???strBuf.append("function commonSubmit(formObject,url)"+"\n");
???strBuf.append("{\n");
???strBuf.append("formObject.action=url"+"\n");
???//strBuf.append("alert(formObject.action)\n");
???strBuf.append("formObject.submit();"+"\n");
???strBuf.append("}"+"\n");
???
???//如果選擇類型為checkbox,增加全選的腳本
???if(this.getSelectType() == OperateConst.SELECT_TYPE_CHECKBOX)
???{
????//行選擇腳本(用于checkBox)
????strBuf.append("function doSelectAll()"+"\n");
????strBuf.append("{"+"\n");
????strBuf.append("var ItemName = '"+this.selectItemName+"'"+"\n");
????strBuf.append("var ItemObj ;\n");
????strBuf.append("var i ;\n");
????strBuf.append("for(i=0;i<"+this.formName+".length;i++)\n");
????strBuf.append("{\n");
????strBuf.append("if("+this.formName+".elements[i].name == '"+this.selectItemName+"')\n");
????strBuf.append("{\n");
????strBuf.append("ItemObj = "+this.formName+".elements[i];\n");
????strBuf.append("if("+this.formName+".checkAll.checked == true)\n");
????strBuf.append("{\n");
????strBuf.append("ItemObj.checked = true;\n");
????strBuf.append("}\n");
????strBuf.append("else\n");
????strBuf.append("{\n");
????strBuf.append("ItemObj.checked = false;\n");
????strBuf.append("}\n");??
????strBuf.append("}\n");
????strBuf.append("}\n");
????strBuf.append("}\n");
???}
???strBuf.append("</script>\n");
???if(this.getFormName().equals(""))
???{?
????strBuf.append("</form>");
???}
???return strBuf.toString();
???
???
???
??}
??else?? /*不支持?jǐn)?shù)據(jù)庫(kù)端分頁(yè)*/
??{
???return getContentHtml(pm_iPageSize,pm_iPageIndex,pm_sSql,request,response);
??}
??
??
??
??
?}
?
?
?//屬性get/set方法
?public String getFormName() {
??return formName;
?}
?
?
?public void setFormName(String formName) {
??this.formName = formName;
?}
?public String[] getContentTitle() {
??return contentTitle;
?}
?public void setContentTitle(String[] contentTitle) {
??this.contentTitle = contentTitle;
?}
?public String getSelectItemName() {
??return selectItemName;
?}
?public void setSelectItemName(String selectItemName) {
??this.selectItemName = selectItemName;
?}
?public int[] getSelectKeyArray() {
??return selectKeyArray;
?}
?public void setSelectKeyArray(int[] selectKeyArray) {
??this.selectKeyArray = selectKeyArray;
?}
?public int getSelectType() {
??return selectType;
?}
?public void setSelectType(int selectType) {
??this.selectType = selectType;
?}
?public boolean hasSelectItem() {
??return hasSelectItem;
?}
?public void setHasSelectItem(boolean hasSelectItem) {
??this.hasSelectItem = hasSelectItem;
?}
?
?
?public int getForwardType() {
??return forwardType;
?}
?public void setForwardType(int forwardType) {
??this.forwardType = forwardType;
?}
?public String getPageUrl() {
??return pageUrl;
?}
?public void setPageUrl(String pageUrl) {
??this.pageUrl = pageUrl;
?}
?public void setSelfForm(boolean isSelfForm) {
??this.isSelfForm = isSelfForm;
?}
?public void setDataVector(Vector dataVector) {
??this.dataVector = dataVector;
?}
?public void setCon(Connection con) {
??this.con = con;
?}
?
?
}
PageDbBean.java 文件
package Action;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
public class PageDbBean {
?private Connection con;
?private Statement stmt;
?private ResultSet rs;
?
?public PageDbBean(Connection pm_objCon)
?{
??con = pm_objCon;
?}
?
?/**
? * @param pm_sSql sql語(yǔ)句
? * @param pm_sTitle 設(shè)置標(biāo)題
? * @return 結(jié)果集
? */
?public Vector getResultBySql(String pm_sSql,String [] pm_sTitle)
?{
??try
??{
???stmt = this.con.createStatement();
???rs = stmt.executeQuery(pm_sSql);
???Vector result = new Vector();
???
???ResultSetMetaData meta = rs.getMetaData();
???int colNum = meta.getColumnCount();
???for(int j=0;j<colNum;j++)
???{
????pm_sTitle[j] = meta.getColumnName(j+1);
???}
???while(rs.next())
???{
????Vector rowVector = new Vector();
????for(int i=0;i<colNum;i++)
????{
?????rowVector.add(rs.getString(i+1));
????}
????result.add(rowVector);
????
???}
???return result;
??}
??catch(SQLException es)
??{
???System.out.println("PageDbBean:SQL操作異常!");
???es.printStackTrace();
???return null;
??}
??finally
??{
???try {
????rs.close();
????stmt.close();
???}
???catch (SQLException e)
???{
????System.out.println("資源回收失敗!");
????e.printStackTrace();
????
???}
???
??}
?}
?
?/**
? * @param pm_sSql sql語(yǔ)句
? * @param pm_sTitle 設(shè)置標(biāo)題
? * @return 結(jié)果集
? */
?public Vector getResultBySql2(String pm_sSql,String [] pm_sTitle)
?{
??try
??{
???stmt = this.con.createStatement();
???rs = stmt.executeQuery(pm_sSql);
???Vector result = new Vector();
???
???ResultSetMetaData meta = rs.getMetaData();
???int colNum = meta.getColumnCount();
???for(int j=1;j<colNum;j++)
???{
????pm_sTitle[j-1] = meta.getColumnName(j+1);
???}
???while(rs.next())
???{
????Vector rowVector = new Vector();
????for(int i=1;i<colNum;i++)
????{
?????rowVector.add(rs.getString(i+1));
????}
????result.add(rowVector);
????
???}
???return result;
??}
??catch(SQLException es)
??{
???System.out.println("PageDbBean:SQL操作異常!");
???es.printStackTrace();
???return null;
??}
??finally
??{
???try {
????rs.close();
????stmt.close();
???}
???catch (SQLException e)
???{
????System.out.println("資源回收失敗!");
????e.printStackTrace();
????
???}
???
??}
?}
?/**
? * @param pm_sSql
? * @return 總記錄數(shù)
? */
?public int getTotalCount(String pm_sSql)
?{
??try
??{
???stmt = con.createStatement();
???rs = stmt.executeQuery("select count(*) from ("+pm_sSql+")");
???rs.next();
???int rowTotal = rs.getInt(1);
???return rowTotal;
??}
??catch(SQLException es)
??{
???System.out.println("PageDbBean:SQL操作異常");
???es.printStackTrace();
???return -1;
??}
??finally
??{
???try
???{
????this.rs.close();
????this.stmt.close();
???}
???catch(SQLException es2)
???{
????System.out.println("PageDbBean:資源回收失敗!");
????es2.printStackTrace();
????
???}
??}
?}
}
posted on 2007-08-06 16:21
蠻哥♂楓 閱讀(1294)
評(píng)論(0) 編輯 收藏 所屬分類:
Java