使用指南
1:該組件為jsp頁面數據分頁通用組件,可用于所有struts或jsp+javabean的頁面分頁功能
2:該組件使用非常簡單,只需設定好各項屬性,傳入數據Vctor或者Sql語句,直接調用多態的
getContentHtml方法即可得到分好頁的表格的html代碼(string),在頁面中<%=string%>即可
,之后的各種翻頁操作業已封裝在該html代碼中,用戶不必再操心。
??
3:該組件設置步驟
?? a.初始化分頁組件實例
???? eg:OperatePage operatePage = new OperatePage();
????
?? b.設定分頁表格數據所屬的表單名
???? 如不設置該屬性,組件將自定義一個名為"form1" 的表單名來存放分頁表格。
???? eg:operatePage.setFormName("formName");
????
?? c.設定翻頁操作時的跳轉頁面
???? 該屬性必需設置,否則會報錯。組件支持翻頁時跳轉到jsp頁面(一般都是原jsp頁面)
???? 或者某一Action(struts架構)中。
???? eg:operatePage.setPageUrl("/jsp/managerAction.do");
???? eg:operatePage.setPageUrl("/jsp/testPage.jsp");??
??????
?? d.設定跳轉類型
???? 組件支持jsp和Action兩種跳轉類型,兩種類型并無大的區別,只是設成Action時
???? 將在翻頁操作時傳遞一個"flag=OperatePage"的參數以便在用戶Action中區分是翻頁
???? 操作。
???? operatePage.setForwardType(OperateConst.FOWARD_TYPE_ACTION);或者
???? operatePage.setForwardType(OperateConst.FOWARD_TYPE_JSP);
????
?? e.設定數據Vctor(如果傳sql的話在此步驟設置數據庫連接的Connection)
???? operatePage.setCon(con);? 或者
???? operatePage.setDataVector(vecData);
????
?? f.設定是否需要單選或者多選列(可不設置,默認為true)
???? opeatePage.operatePage.setHasSelectItem(true);
????
?? g.設定單選或者多選列類型,元素名及對應的該行數據的主鍵值(如f步驟中設置為false這步省略)
????? //支持checkBox和radioButton兩種
???? operatePage.setSelectType(OperateConst.SELECT_TYPE_RADIOBUTTON);
????? //可不設,默認為selectItem1
???? operatePage.setSelectItemName("selectItemName2");
????? //序號從1開始,可不設,默認為該行數據的第一列的值
???? operatePage.setSelectKeyArray( new int []{1,2,3});
???????
?? h.設定數據標題列(如e步驟中設置為傳sql此步省略)
???? operatePage.setContentTitle(new String[]{"col1","col2","col3","col4"});
????
?? g.前面的設置完成后,直接調以下API即可
?? /**
?? * @傳Vector方式
? * @param pm_iPageSize? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,HttpServletRequest request, HttpServletResponse response) throws OperateException;
?
? /**
?? * @傳sql方式
? * @param pm_iPageSize? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param pm_sPageUrl?? jsp頁面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,String pm_sSql,HttpServletRequest request, HttpServletResponse response) throws OperateException;
??
? /**
?? * @傳sql方式
? * @param pm_iPageSize? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param pm_sPageUrl?? jsp頁面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param pm_sDBType??? 數據庫類型,如數據庫直接支持數據庫端分頁,可提高效率
? * @param request?????? ServletRequest
? * @param response????? ServletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,String pm_sSql,String pm_sDBType,HttpServletRequest request, HttpServletResponse response) throws OperateException;
??
?
4:實例
?? 上述可能有點抽象,讓我們來看兩個完整使用實例:
??
?? 第一種是直接在jsp頁面中分頁,即翻頁操作時跳回原jsp頁面中
?? 我們來看看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>
<%
??
?? /**********這是獲取數據vector的代碼***********/
?? DbSelect a = new DbSelect();
?? Vector? b = a.getManagerContentByMain_Key(1);
?
??
? /*form2是你的jsp頁面中的表單名*/
? 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")來獲取選中的值 ,如不設,默認為名字為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是初始的頁大小,0是初始頁碼,之后翻頁跳轉時這兩個值會被request中的新值自動更新*/
? String c = operatePage.getContentHtml(15,0,request,response);
?
%>
<%=c %>
</script>
</body>
</html>
這是傳Vctor方式,如果我們改成傳sql的方式,只需做修改如下:
<%
? /**********這是獲取數據庫連接的代碼***********/
? 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是數據庫類型,該字段可傳可不傳,傳的好處在于如果該類型數據庫支持后端分頁,則組件會采用后端分頁的方式,效率較前端分頁要高*/
? String c = operatePage.getContentHtml(15,0,sql,OperateConst.DBTYPE_ORACLE,request,response);
%>
我們再來看看跳轉到Action中的情況,這是翻頁Action的源碼示例
??
?? public class ManagerAction extends DispatchAction{
??? OperatePage operatePage = new OperatePage();
??? /**********這是獲取數據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);
??? ?/*把獲得的分頁后的html代碼放到session中去*/
??? ?HttpSession session = request.getSession();
??? ?session.setAttribute("testPage",c);
??? ?/*testPage是你在struts-config.xml中配置的jsp頁面的跳轉forward**/
????? return mapping.findForward("testPage");
??? }
???
}
jps示例頁面如下:
<%@ 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對應Action中初始化的操作
<a href="/jsp/managerAction.do?flag=initPageOperate">測試Action端分頁</a>
這是傳Vctor的方式,傳sql和之前跳轉到jsp中的類似,這里就不重復了
OK!這就是最常見的傳sql和傳Vector,及在原jsp頁面跳轉或者在Action中跳轉的數據庫分頁組件操作,每種不過十幾行代碼即可搞定!
5:如果有什么不清楚的地方,請發email:qingyuan18@126.com,或者msn:tangqingyuan@chinamobilesz.com,
有做的不好的地方,請不吝賜教!
?
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? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,HttpServletRequest request, HttpServletResponse response) throws OperateException;
?
?/**
? * @param pm_iPageSize? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param pm_sPageUrl?? jsp頁面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize,int pm_iPageIndex,String pm_sSql,HttpServletRequest request, HttpServletResponse response) throws OperateException;
?
?/**
? * @param pm_iPageSize? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param pm_sPageUrl?? jsp頁面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param pm_sDBType??? 數據庫類型,如數據庫直接支持數據庫端分頁,可提高效率
? * @param request?????? ServletRequest
? * @param response????? ServletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @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 {
?/*
? * 數據庫類型
? */
?public static final String DBTYPE_SQLSERVER = "sqlServer";
?public static final String DBTYPE_DB2 = "DB2";
?public static final String DBTYPE_ORACLE = "oracle";
?/*
? * 行數據選擇類型
? * 1:CheckBox
? * 2:RadioButton
? */
?public static final int SELECT_TYPE_CHECKBOX = 1;
?public static final int SELECT_TYPE_RADIOBUTTON = 2;
?
?/*
? * 翻頁跳轉類型
? * 1:跳回原jsp頁面
? * 2:跳回Action.do(struts框架)
? */
?public static final int FOWARD_TYPE_JSP = 1;
?public static final int FOWARD_TYPE_ACTION =2;
?
?/*
? *錯誤類型
? *1:未設置url
? *2:未設置標題
? *3:Connection為空(傳sql方式)
? *4:未識別的數據庫
? *5:數據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 異常類型
? * 根據定義的異常類型構造異常信息
? */
?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{
?//表單名,如未設置,將把分頁數據裝在名為"form1"的表單中
?private String formName = "";
?//分頁時跳轉的頁面url
?private String pageUrl = "";
?//數據容器,傳sql時不必設
?private Vector dataVector;
?//數據連接,傳sql時必需設置
?private Connection con;?
?//分頁表格標題頭
?private String[] contentTitle;
?//行選擇時的元素名,在設定選擇模式時有效,默認為checkboxItem
?private String selectItemName = "checkboxItem";
?//行選擇類型,單選和多選兩種,在設定選擇模式時有效,默認為多選
?private int selectType = OperateConst.SELECT_TYPE_CHECKBOX;
?//翻頁跳轉類型,到jsp和到Action兩種(默認到jsp)
?private int forwardType = OperateConst.FOWARD_TYPE_JSP;
?//行選擇時每行數據的值,與數據列對應,各列數據以;分隔(默認第一列)
?private int [] selectKeyArray = {1};
?//是否為選擇模式,如為true,分頁表格頭列將加單選或多選按鈕(默認為true)
?private boolean hasSelectItem = true;
?
??? //用戶是否未設置formName,組件自我控制邏輯,用戶不必關心該屬性
?private boolean isSelfForm ;
?
?/**
? * @param pm_iPageSize? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param pm_vecContent 數據內容
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @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;
????
??//檢查必要設置
??if(this.contentTitle == null)? /*如未設置標題頭,拋出異常*/
??{
???throw new OperateException(OperateConst.EXCEPTION_TYPE_TITLE_IS_NULL);
???
??}
??if(this.pageUrl == null)?? /*如傳遞的跳轉頁面為空,拋出異常*/
??{
???throw new OperateException(OperateConst.EXCEPTION_TYPE_URL_IS_NULL);
??}
??if(this.dataVector == null) /*如未設置待分頁數據,拋出異常*/
??{
???throw new OperateException(OperateConst.EXCEPTION_TYPE_DATA_VECTOR_IS_NULL);
??}
??
??
??// 判斷是第一次進入還是翻頁操作,設置相應的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"));
??}
??
??//如跳轉類型為Action,在url中加flag=pageOperate參數以便在用戶的Action中標識跳轉操作(默認為跳轉到原jsp)
??if(this.forwardType == OperateConst.FOWARD_TYPE_ACTION)
??{
???pageUrlReal = this.pageUrl+"?flag=pageOperate&";
??}
??else if(this.forwardType == OperateConst.FOWARD_TYPE_JSP)
??{
???pageUrlReal = this.pageUrl+"?";
??}
??
??//如未設置form名,則將分頁數據封裝在名為"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>");
??//表格標題欄
??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>");
??
??
??//表內容
??//分頁操作
??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)? /*如設置行選擇,增加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'>首頁</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'>上一頁</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'>下一頁</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'>末頁</font>");
???strBuf.append("</a>|");
??}
????
??strBuf.append("<font color='red'>每頁顯示</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");
??? //提交翻頁操作腳本
??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? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param pm_sPageUrl?? jsp頁面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param request?????? SevletRequest
? * @param response????? SevletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize, int pm_iPageIndex, String pm_sSql, HttpServletRequest request, HttpServletResponse response) throws OperateException {
??//檢查必要設置
??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? 頁大小
? * @param pm_iPageIndex 頁碼
? * @param pm_sPageUrl?? jsp頁面路徑
? * @param pm_sSql?????? 查詢的sql
? * @param pm_sDBType??? 數據庫類型,如數據庫直接支持數據庫端分頁,可提高效率
? * @param request?????? ServletRequest
? * @param response????? ServletResponse
? * @return 數據庫分頁后的Table HTML(帶分頁按鈕)
? * @throws OperateException
? */
?public String getContentHtml(int pm_iPageSize, int pm_iPageIndex, String pm_sSql, String pm_sDBType, HttpServletRequest request, HttpServletResponse response) throws OperateException {
??//判斷數據庫類型,如支持數據庫端分頁,重新組裝sql
??String sql = pm_sSql;
??if(pm_sDBType.equals(OperateConst.DBTYPE_ORACLE))/*支持數據庫端分頁*/
??{
???
??????????? //檢查必要設置
???if(this.con == null)
???{
????throw new OperateException(OperateConst.EXCEPTION_TYPE_CON_IS_NULL);
???}
???//檢查必要設置
???if(this.pageUrl == null)?? /*如傳遞的跳轉頁面為空,拋出異常*/
???{
????throw new OperateException(OperateConst.EXCEPTION_TYPE_URL_IS_NULL);
???}
???
???//主體操作
???StringBuffer strBuf = new StringBuffer("");
???int pageSize=pm_iPageSize,pageIndex=pm_iPageIndex;
???// 判斷是第一次進入還是翻頁操作,設置相應的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"));
???}
???
???//如跳轉類型為Action,在url中加flag=pageOperate參數以便在用戶的Action中標識跳轉操作(默認為跳轉到原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);
??????
???
???//獲取總頁數
???PageDbBean dbBean = new PageDbBean(this.con);
???
???int rowTotal = dbBean.getTotalCount(pm_sSql);
???pageTotal = rowTotal/pm_iPageSize;
???if(pageTotal*pm_iPageSize<rowTotal)
???{
????pageTotal = pageTotal + 1;
???}
???
???
???//如未設置form名,則將分頁數據封裝在名為"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>");
???//表格標題欄
???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'>首頁</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'>上一頁</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'>下一頁</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'>末頁</font>");
????strBuf.append("</a>|");
???}
???
???strBuf.append("<font color='red'>每頁顯示</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");
???//提交翻頁操作腳本
???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?? /*不支持數據庫端分頁*/
??{
???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語句
? * @param pm_sTitle 設置標題
? * @return 結果集
? */
?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語句
? * @param pm_sTitle 設置標題
? * @return 結果集
? */
?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 總記錄數
? */
?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)
評論(0) 編輯 收藏 所屬分類:
Java