??xml version="1.0" encoding="utf-8" standalone="yes"?>
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.mdcl.mocha.fe.developer.template.util.TemplateUtil;
public class ParamUtil {
/**
* 把request取到的参数放C个Map?br /> * @param request
* @return
*/
public static Map parseRequest(HttpServletRequest request){
Map map = new HashMap();
String key = null;
String value = null;
for(Enumeration enumeration = request.getParameterNames(); enumeration.hasMoreElements(); map.put(key, value))
{
key = (String)enumeration.nextElement();
String as[] = request.getParameterValues(key);
value = as[0];
for(int i = 1; i < as.length; i++)
value = value + "," +as[i];
}
return map;
}
}
public class OS {
public static final String CLASS_PATH;
public static final boolean isLinux;
static {
URL resource = OS.class.getResource("OS.class");
String classPath = resource.getPath();
String className = OS.class.getName().replace('.', '/') + ".class";
String classesPath = classPath.substring(0, classPath.indexOf(className));
if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") != -1&& classesPath.startsWith("/")) {
classesPath = classesPath.substring(1);
isLinux = false;
} else {
isLinux = true;
}
CLASS_PATH = classesPath;
}
public static void main(String arg[]){
System.out.println(OS.isLinux);
}
}
Date created = new Date(session.getCreationTime());
//得到session对象创徏的时?br />Date accessed = new Date(session.getLastAccessedTime());
//得到最后访问该session对象的时?br />out.println("<br>"+"ID " + session.getId()+" ");
//得到该session的idQƈ打印
out.println("<br>"+"Created: " + created+" ");
//打印session创徏旉
out.println("<br>"+"Last Accessed: " + accessed+" ");
//打印最后访问时?/p>
session.setAttribute("Name","Tom");
//在session中添加变量Name=Tom
session.setAttribute("UID","12345678");
//在session中添加变量UID=12345678
Enumeration e = session.getAttributeNames();
//得到session中变量名的枚丑֯?br />while (e.hasMoreElements()) { //遍历每一个变?br />String name = (String)e.nextElement(); //首先得到名字
String value = session.getAttribute(name).toString();
//由名字从session中得到?br />out.println("<br>"+name + " = " + value+" "); //打印
}
%>
</body>
</html>
<script language="javascript">
function overlib(s){
document.all.ChartTip.style.display="block";
top.document.getElementById('ChartTip').innerHTML=s;
document.all.ChartTip.style.left=document.body.scrollLeft+event.x;
document.all.ChartTip.style.top=document.body.scrollTop+event.y-20;
}
function nd(s){
document.all.ChartTip.style.display="none";
}
</script>
<jsp:useBean id="barchart01" scope="session"
class="com.mdcl.fso.homepage.chart.BarChart01" />
</head>
<body>
<%
String fileName = barchart01.drawPic(request.getSession(), out);
String graphURL = request.getContextPath()
+ "/servlet/DisplayChart?filename=" + fileName;
%>
<br />
<img src="<%= graphURL %>" border="0" usemap="#<%=fileName %>" />
<br />
<div id="ChartTip"
style="position:absolute; font-family:'宋体'; font-size: 12px;line-height: 20px;background-color:#FFFFEC; border: 1px solid #999999;display:none;left:0px;top:1px;">试昄</div>
</body>
</html>
=========================================================================
java文g
=========================================================================
package com.mdcl.fso.homepage.chart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.urls.StandardCategoryURLGenerator;
import org.jfree.chart.urls.StandardPieURLGenerator;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.labels.*;
import org.jfree.ui.*;
import java.util.*;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
import com.mdcl.fso.homepage.*;
public class BarChart01 {
private static DefaultCategoryDataset dataset = new DefaultCategoryDataset();
private DefaultCategoryDataset getDataset() {// 取数?/p>
List expense = new ArrayList();
String sql = "select ftr.organ_id ,fs.dept_name,ftr.subject_id,fft.finance_type_name,ftr.rpt_date ,ftr.rpt_data "
+ "from fso_t_rpt_expense ftr,fso_sdept fs,fso_finance_type fft "
+ "where ftr.type_id='D' "
+ "and ftr.organ_id=fs.dept_id "
+ "and ftr.rpt_date='2007-08' "
+ "and fft.finance_type_id=ftr.subject_id "
+ "and ftr.organ_id='1140'";
expense = DBDao.DbQueryExpense(sql);
for (int i = 0; i < expense.size(); i++) {
HashMap param = new HashMap();
param = (HashMap) expense.get(i);
double dt = Double.parseDouble(String.valueOf(param.get("rpt_data")));
String a = (String) param.get("organ");
String b = (String) param.get("subject");
dataset.addValue(dt, a, b);
}
return dataset;
}
public String drawPic(HttpSession session, JspWriter out) {
String fileName = null;
JFreeChart chart = ChartFactory.createBarChart3D("2007-08成本l计", "费用cd",
"金额Q单位:元)", getDataset(), PlotOrientation.VERTICAL, true, true,
true);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot plot = chart.getCategoryPlot();// 获取l图?/p>
plot.setBackgroundPaint(new Color(255, 255, 255)); // 讄l图景色
plot.setRangeGridlinePaint(Color.gray); // 讄水^方向背景UK?/p>
plot.setRangeGridlinesVisible(true); // 讄是否昄水^方向背景U?默认gؓTrue
plot.setDomainGridlinePaint(Color.black); // 讄垂直方向背景UK?/p>
// plot.setDomainGridlinesVisible(true); // 讄是否昄垂直方向背景U?默认gؓFalse
CategoryAxis domainAxis = plot.getDomainAxis();// 获取l计U类轴标题(X_
plot.setDomainAxis(domainAxis);// dX?/p>
BarRenderer3D renderer = new BarRenderer3D();// 获得BarRenderer3Dcȝ实例Q目的是讄柱Ş的绘制属?/p>
renderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());//
renderer.setBaseItemURLGenerator(new StandardCategoryURLGenerator("index2.jsp"));// 生成热点,用于链接
renderer.setItemMargin(0.1);// 讄每个l所包含的^行柱的之间距?/p>
renderer.setSeriesPaint(0, Color.GREEN);// 讄柱子的颜?br /> renderer.setSeriesPaint(1, Color.blue);// 讄柱子的颜?/p>
renderer.setBaseOutlinePaint(Color.BLACK);
renderer.setWallPaint(Color.gray);// 讄 Wall 的颜?/p>
renderer.setItemLabelAnchorOffset(10D);// 讄柱Ş图上的文字偏d?/p>
renderer.setBaseItemLabelFont(new Font("arial", Font.PLAIN, 10), true);// 讄柱Ş图上的文?/p>
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());// //昄每个q数|q修改该数值的字体属?/p>
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER));
renderer.setBaseItemLabelsVisible(true);
renderer.setMaximumBarWidth(0.050000000000000003D);
plot.setRenderer(renderer);
plot.setForegroundAlpha(0.80f);// 讄q透明?/p>
// plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);//讄昄位置
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);// 讄昄位置
try {
PrintWriter pw = new PrintWriter(out);
StandardEntityCollection sec = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
fileName = ServletUtilities.saveChartAsPNG(chart, 640, 400, info,
session);
// ChartUtilities.writeChartAsPNG(op,chart, 640, 400, info,true,0);
ChartUtilities.writeImageMap(pw, fileName, info, true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fileName;
}
}
=========================================================================
一行一行读取数?br /><%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>文gd</title>
</head>
<body>
<%
String path=request.getRealPath("");//取得当前目录的\?br /> FileReader fr=new FileReader(path + "file://file//inc//t.txt%22);//建立FileReader对象Qƈ实例化ؓfr
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓbr
String Line=br.readLine();//从文件读取一行字W串
//判断d到的字符串是否不为空
while(Line!=null){
out.println(Line + "<br>");//输出从文件中d的数?br /> Line=br.readLine();//从文件中l箋d一行数?br /> }
br.close();//关闭BufferedReader对象
fr.close();//关闭文g
%>
</body>
</html>
略过文g中的字符不读?br /><%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>略过字节不读?lt;/title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileReader fr=new FileReader(path + "file://ReadData.txt/");
fr.skip(2);//跌2个字?br />int c=fr.read();//d一个字?br />while(c!=-1){
out.print((char)c);
c=fr.read();
}
fr.close();
%>
</body>
</html>
数据写入文?br /><%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>数据写入文?lt;/title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "file://WriteData.txt%22);//建立FileWriter对象Qƈ实例化fw
//字W串写入文g
fw.write("大家好!");
fw.write("本书是《JSP~程技巧?);
fw.write("请多多指教!");
fw.write("email:stride@sina.com");
fw.close();
FileReader fr=new FileReader(path + "file://WriteData.txt/");
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓbr
String Line=br.readLine();
//d一行数?br />out.println(Line + "<br>");
br.close();//关闭BufferedReader对象
fr.close();
%>
</body>
</html>
写入文件的数据分行
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>写入文件的数据分行</title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "file://WriteData.txt/");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("大家好!");
bw.write("本书是《JSP~程技巧》?);
bw.newLine();//断行
bw.write("请多多指教!");
bw.newLine();//断行
bw.write("email: stride@sina.com");
bw.flush();//数据更新至文g
fw.close();//关闭文g?br />out.println("写入文g内容为:<br>");
FileReader fr=new FileReader(path + "file://WriteData.txt/");
BufferedReader br=new BufferedReader(fr);
String Line=br.readLine();//d一行数?br />while(Line!=null){
out.println(Line + "<br>");
Line=br.readLine();
}
fr.close();
%>
</body>
</html>
如何数据追加写入到文g
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>写入文件的数据分行</title>
</head>
<body>
<%
String path=request.getRealPath(".");
RandomAccessFile rf=new RandomAccessFile(path + "file://WriteData.txt%22,%22rw%22);//定义一个类RandomAccessFile的对象,q实例化
rf.seek(rf.length());//指针移动到文g末尾
rf.writeBytes("\nAppend a line to the file!");
rf.close();//关闭文g?br />out.println("写入文g内容为:<br>");
FileReader fr=new FileReader(path + "file://WriteData.txt/");
BufferedReader br=new BufferedReader(fr);//d文g的BufferedRead对象
String Line=br.readLine();
while(Line!=null){
out.println(Line + "<br>");
Line=br.readLine();
}
fr.close();//关闭文g
%>
</body>
</html>
import java.util.*;
import java.io.*;
public class ReadIni
{
public static void main(String[] args)
throws Exception
{
Properties proDB = new Properties();
FileInputStream in = new FileInputStream("DBConfig.ini");
proDB.load(in);
String jdbc = proDB.getProperty("jdbc");
String dburl = proDB.getProperty("dburl");
String userid = proDB.getProperty("userid");
String password = proDB.getProperty("password");
System.out.println(jdbc);
System.out.println(dburl);
System.out.println(userid);
System.out.println(password);
}
}
DBConfig.ini:
dburl=jdbcracle:thin:@202.16.147.104:1521ub
userid=user
password=password
jdbc=oracle.jdbc.driver.OracleDriver
if((pNO != null) && (!pNO.equals(""))){
pageNo=Integer.parseInt(pNO);
}
if (countall > pageSize) {
if ((countall / pageSize) * pageSize < countall) {
pageCount = (countall / pageSize) + 1;
}
else{
pageCount = (countall / pageSize);
}
}
else if (countall / pageSize == 1) {
pageCount = 1;
}
else {
pageCount = 1;
}
if (pageNo >= pageCount) {
pageNo = pageCount;
}
else if (pageNo < 1) {
pageNo = 1;
}
mixNum = (pageNo-1) * pageSize;
maxNum = pageNo*pageSize;
if((mixNum + pageSize) > countall){
maxNum = countall;
}
else{
maxNum = mixNum+pageSize;
}
%>
---------------------------------------------------------------------------------------------
<html>
<head>
<script language="JavaScript" type="text/JavaScript">
function check(){
if(Jtrim(document.forms.meslistForm.textfield.value)==""){
alert("误入页?);
}
else if(checkNum(document.forms.meslistForm.textfield.value)){
window.location.href="?pageNo="+document.forms.meslistForm.textfield.value;
}else{
alert("误入数字?);
}
document.forms.meslistForm.textfield.value = "";
document.forms.meslistForm.textfield.select();
}
function checkNum(str){
return str.match(/\D/)==null;
}
function Jtrim(str)
{
var i = 0;
var len = str.length;
if ( str == "" ) return( str );
j = len -1;
flagbegin = true;
flagend = true;
while ( flagbegin == true && i< len)
{
if ( str.charAt(i) == " " )
{
i=i+1;
flagbegin=true;
}
else
{
flagbegin=false;
}
}
while (flagend== true && j>=0)
{
if (str.charAt(j)==" ")
{
j=j-1;
flagend=true;
}
else
{
flagend=false;
}
}
if ( i > j ) return ("")
trimstr = str.substring(i,j+1);
return trimstr;
}</script>
</head>
<body>
<%
for(int i=mixNum;i<maxNum;i++){
//此处用list循环下标用i
}
%>
<table align="center" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="4%" height="27" align="center" valign="middle"
class="word"> </td>
<td width="56%" align="center" valign="middle" class="word"><img
src="<%=path%>/images/pagination/list_home.gif" width="13"
height="13"> <%
if (pageNo > 1) {
%> <a href="?pageNo=1"> 首页</a>
<%
}else{
%> 首页 <%
}
%> <img src="<%=path%>/images/pagination/list_pre.gif"
width="13" height="13"> <%
if (pageNo > 1) {
%> <a href="?pageNo=<%=(pageNo-1)%>"> 前一?lt;/a>
<%
}else{
%> 前一?amp;nbsp; <%
}
%> <img
src="<%=path%>/images/pagination/list_next.gif" width="13"
height="13"> <%
if (pageCount>pageNo) {
%> <a href="?pageNo=<%=(pageNo+1)%>"> 后一?lt;/a>
<%
}else{
%> 后一?amp;nbsp; <%
}
%> <img src="<%=path%>/images/pagination/list_end.gif"
width="13" height="13"> <%
if (pageCount>pageNo) {
%> <a href="?pageNo=<%=(pageCount)%>"> N</a> <%
}else{
%> N <%
}
%>
<td width="26%" align="center" valign="middle" class="word">?lt;%=pageCount%>?amp;nbsp;W?lt;%=pageNo%>?amp;nbsp;
跌{</td>
<td width="4%" align="center" valign="middle" class="word"><input
name="textfield" type="text" class="input" size="1"></td>
<td width="6%" align="center" valign="middle" class="word"><a
href="javascript:check()"><img
src="<%=path%>/images/pagination/go.gif" border="0" width="18"
height="18"></a></td>
<td width="4%" align="left" valign="middle" class="word"> </td>
</tr>
</table></body>
</html>
因此比较好的分页做法应该是每ơ翻늚时候只从数据库里检索页面大的块区的数据。这栯然每ơ翻都需要查询数据库Q但查询出的记录数很,|络传输数据量不大,如果使用q接池更可以略过最耗时的徏立数据库q接q程。而在数据库端有各U成熟的优化技术用于提高查询速度Q比在应用服务器层做~存有效多了?/p>
在oracle数据库中查询l果的行号用伪列ROWNUM表示Q从1开始)。例如select * from employee where rownum<10 q回?0条记录。但因ؓrownum是在查询之后排序之前赋值的Q所以查询employee按birthday排序的第100?20条记录应该这么写Q?br />[pre] select * from (
select my_table.*, rownum as my_rownum from (
select name, birthday from employee order by birthday
) my_table where rownum <120
) where my_rownum>=100
[/pre]
mySQL可以使用LIMIT子句Q?br /> select name, birthday from employee order by birthday LIMIT 99,20
DB2有rownumber()函数用于获取当前行数?br /> SQL Server没研I过Q可以参考这文章:http://www.csdn.net/develop/article/18/18627.shtm
在WebE序中分会被频J用,但分늚实现l节却是~程q程中比较麻烦的事情。大多分|C的查询操作都同旉要处理复杂的多重查询条gQsql语句需要动态拼接组成,再加上分需要的记录定位、总记录条数查询以及查询结果的遍历、封装和昄Q程序会变得很复杂ƈ且难以理解。因此需要一些工L化分代码,使程序员专注于业务逻辑部分。下面是我设计的两个工具c:
PagedStatement 装了数据库q接、总记录数查询、分|询、结果数据封装和关闭数据库连接等操作Qƈ使用了PreparedStatement支持动态设|参数?br /> RowSetPage 参考PetStore的page by page iterator模式Q?设计RowSetPage用于装查询l果Q用OracleCachedRowSet~存查询出的一|据,关于使用CachedRowSet装数据库查询结果请参考JSP面查询昄常用模式Q以及当前页码、总记录条数、当前记录数{信息, q且可以生成单的HTML分页代码?br /> PagedStatement 查询的结果封装成RowsetPage?/p>
下面是简单的使用CZQ?/p>
//DAO查询数据部分代码Q?
?
public RowSetPage getEmployee(String gender, int pageNo) throws Exception{
String sql="select emp_id, emp_code, user_name, real_name from employee where gender =?";
//使用Oracle数据库的分页查询实现,每页昄5?
PagedStatement pst =new PagedStatementOracleImpl(sql, pageNo, 5);
pst.setString(1, gender);
return pst.executeQuery();
}
//Servlet处理查询h部分代码Q?
?
int pageNo;
try{
//可以通过参数pageno获得用户选择的页?
pageNo = Integer.parseInt(request.getParameter("pageno") );
}catch(Exception ex){
//默认为第一?
pageNo=1;
}
String gender = request.getParameter("gender" );
request.setAttribute("empPage", myBean.getEmployee(gender, pageNo) );
?
//JSP昄部分代码
<%@ page import = "page.RowSetPage"%>
?
<script language="javascript">
function doQuery(){
form1.actionType.value="doQuery";
form1.submit();
}
</script>
?
<form name=form1 method=get>
<input type=hidden name=actionType>
性别Q?
<input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">
<input type=button value=" 查询 " onclick="doQuery()">
<%
RowSetPage empPage = (RowSetPage)request.getAttribute("empPage");
if (empPage == null ) empPage = RowSetPage.EMPTY_PAGE;
%>
?
<table cellspacing="0" width="90%">
<tr> <td>ID</td> <td>代码</td> <td>用户?lt;/td> <td>姓名</td> </tr>
<%
javax.sql.RowSet empRS = (javax.sql.RowSet) empPage.getRowSet();
if (empRS!=null) while (empRS.next() ) {
%>
<tr>
<td><%= empRS.getString("EMP_ID")%></td>
<td><%= empRS.getString("EMP_CODE")%></td>
<td><%= empRS.getString("USER_NAME")%></td>
<td><%= empRS.getString("REAL_NAME")%></td>
</tr>
<%
}// end while
%>
<tr>
<%
//昄总页数和当前|(pageno)以及分页代码?
//此处doQuery为页面上提交查询动作的javascript函数名, pageno为标识当前页码的参数?
%>
<td colspan=4><%= empPage .getHTML("doQuery", "pageno")%></td>
</tr>
</table>
</form>
效果如图Q?/p>
因ؓ分页昄一般都会伴有查询条件和查询动作Q页面应已经有校验查询条件和提交查询的javascriptҎQ如上面的doQueryQ,所以RowSetPage.getHTML()生成的分代码在用户选择新页码时直接回调前面的处理提交查询的javascriptҎ。注意在昄查询l果的时候上ơ的查询条g也需要保持,?lt;input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">。同时由于页码的参数名可以指定,因此也支持在同一面中有多个分页区?br /> 另一U分代码实现是生成每一늚URLQ将查询参数和页码作为QueryString附在URL后面。这U方法的~陷是在查询条g比较复杂旉以处理,q且需要指定处理查询动作的servletQ可能不适合某些定制的查询操作?br /> 如果对RowSetPage.getHTML()生成的默认分代码不满意可以~写自己的分处理代码,RowSetPage提供了很多getterҎ用于获取相关信息Q如当前늠、总页数?总记录数和当前记录数{)?br /> 在实际应用中可以分|询和昄做成jsp taglibQ?q一步简化JSP代码Q屏蔽Java Code?/p>
附:分页工具cȝ源代码, 有注释,应该很容易理解?/p>
1.Page.java
2.RowSetPage.java(RowSetPagel承Page)
3.PagedStatement.java
4.PagedStatementOracleImpl.java(PagedStatementOracleImpll承PagedStatement)
您可以Q意用这些源代码Q但必须保留author evan_zhao@hotmail.com字样
///////////////////////////////////
//
// Page.java
// author: evan_zhao@hotmail.com
//
///////////////////////////////////
package page;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
* Title: 分页对象<br>
* Description: 用于包含数据及分信息的对象<br>
* PagecdC用于昄分页信息的基本方法,但未指定所含数据的cdQ?
* 可根据需要实C特定方式l织数据的子c,<br>
* 如RowSetPage以RowSet装数据QListPage以List装数据<br>
* Copyright: Copyright (c) 2002 <br>
* @author evan_zhao@hotmail.com <br>
* @version 1.0
*/
public class Page implements java.io.Serializable {
public static final Page EMPTY_PAGE = new Page();
public static final int DEFAULT_PAGE_SIZE = 20;
public static final int MAX_PAGE_SIZE = 9999;
private int myPageSize = DEFAULT_PAGE_SIZE;
private int start;
private int avaCount,totalSize;
private Object data;
private int currentPageno;
private int totalPageCount;
/**
* 默认构造方法,只构造空?
*/
protected Page(){
this.init(0,0,0,DEFAULT_PAGE_SIZE,new Object());
}
/**
* 分页数据初始ҎQ由子类调用
* @param start 本页数据在数据库中的起始位置
* @param avaCount 本页包含的数据条?
* @param totalSize 数据库中总记录条?
* @param pageSize 本页定w
* @param data 本页包含的数?
*/
protected void init(int start, int avaCount, int totalSize, int pageSize, Object data){
this.avaCount =avaCount;
this.myPageSize = pageSize;
this.start = start;
this.totalSize = totalSize;
this.data=data;
//System.out.println("avaCount:"+avaCount);
//System.out.println("totalSize:"+totalSize);
if (avaCount>totalSize) {
//throw new RuntimeException("记录条数大于L敎ͼQ?);
}
this.currentPageno = (start -1)/pageSize +1;
this.totalPageCount = (totalSize + pageSize -1) / pageSize;
if (totalSize==0 && avaCount==0){
this.currentPageno = 1;
this.totalPageCount = 1;
}
//System.out.println("Start Index to Page No: " + start + "-" + currentPageno);
}
public Object getData(){
return this.data;
}
/**
* 取本|据容量(本页能包含的记录敎ͼ
* @return 本页能包含的记录?
*/
public int getPageSize(){
return this.myPageSize;
}
/**
* 是否有下一?
* @return 是否有下一?
*/
public boolean hasNextPage() {
/*
if (avaCount==0 && totalSize==0){
return false;
}
return (start + avaCount -1) < totalSize;
*/
return (this.getCurrentPageNo()<this.getTotalPageCount());
}
/**
* 是否有上一?
* @return 是否有上一?
*/
public boolean hasPreviousPage() {
/*
return start > 1;
*/
return (this.getCurrentPageNo()>1);
}
/**
* 获取当前늬一条数据在数据库中的位|?
* @return
*/
public int getStart(){
return start;
}
/**
* 获取当前|后一条数据在数据库中的位|?
* @return
*/
public int getEnd(){
int end = this.getStart() + this.getSize() -1;
if (end<0) {
end = 0;
}
return end;
}
/**
* 获取上一늬一条数据在数据库中的位|?
* @return 记录对应的rownum
*/
public int getStartOfPreviousPage() {
return Math.max(start-myPageSize, 1);
}
/**
* 获取下一늬一条数据在数据库中的位|?
* @return 记录对应的rownum
*/
public int getStartOfNextPage() {
return start + avaCount;
}
/**
* 获取M늬一条数据在数据库中的位|,每页条数使用默认?
* @param pageNo 号
* @return 记录对应的rownum
*/
public static int getStartOfAnyPage(int pageNo){
return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE);
}
/**
* 获取M늬一条数据在数据库中的位|?
* @param pageNo 号
* @param pageSize 每页包含的记录数
* @return 记录对应的rownum
*/
public static int getStartOfAnyPage(int pageNo, int pageSize){
int startIndex = (pageNo-1) * pageSize + 1;
if ( startIndex < 1) startIndex = 1;
//System.out.println("Page No to Start Index: " + pageNo + "-" + startIndex);
return startIndex;
}
/**
* 取本包含的记录?
* @return 本页包含的记录数
*/
public int getSize() {
return avaCount;
}
/**
* 取数据库中包含的总记录数
* @return 数据库中包含的总记录数
*/
public int getTotalSize() {
return this.totalSize;
}
/**
* 取当前页?
* @return 当前늠
*/
public int getCurrentPageNo(){
return this.currentPageno;
}
/**
* 取总页?
* @return 总页?
*/
public int getTotalPageCount(){
return this.totalPageCount;
}
/**
*
* @param queryJSFunctionName 实现分页的JS脚本名字Q页码变动时会自动回调该Ҏ
* @param pageNoParamName 늠参数名称
* @return
*/
public String getHTML(String queryJSFunctionName, String pageNoParamName){
if (getTotalPageCount()<1){
return "<input type='hidden' name='"+pageNoParamName+"' value='1' >";
}
if (queryJSFunctionName == null || queryJSFunctionName.trim().length()<1) {
queryJSFunctionName = "gotoPage";
}
if (pageNoParamName == null || pageNoParamName.trim().length()<1){
pageNoParamName = "pageno";
}
String gotoPage = "_"+queryJSFunctionName;
StringBuffer html = new StringBuffer("\n");
html.append("<script language=\"Javascript1.2\">\n")
.append("function ").append(gotoPage).append("(pageNo){ \n")
.append( " var curPage=1; \n")
.append( " try{ curPage = document.all[\"")
.append(pageNoParamName).append("\"].value; \n")
.append( " document.all[\"").append(pageNoParamName)
.append("\"].value = pageNo; \n")
.append( " ").append(queryJSFunctionName).append("(pageNo); \n")
.append( " return true; \n")
.append( " }catch(e){ \n")
// .append( " try{ \n")
// .append( " document.forms[0].submit(); \n")
// .append( " }catch(e){ \n")
.append( " alert('未定义查询ҎQfunction ")
.append(queryJSFunctionName).append("()'); \n")
.append( " document.all[\"").append(pageNoParamName)
.append("\"].value = curPage; \n")
.append( " return false; \n")
// .append( " } \n")
.append( " } \n")
.append( "}")
.append( "</script> \n")
.append( "");
html.append( "<table border=0 cellspacing=0 cellpadding=0 align=center width=80%> \n")
.append( " <tr> \n")
.append( " <td align=left><br> \n");
html.append( " ? ).append( getTotalPageCount() ).append( "?)
.append( " [") .append(getStart()).append("..").append(getEnd())
.append("/").append(this.getTotalSize()).append("] \n")
.append( " </td> \n")
.append( " <td align=right> \n");
if (hasPreviousPage()){
html.append( "[<a href='javascript:").append(gotoPage)
.append("(") .append(getCurrentPageNo()-1)
.append( ")'>上一?lt;/a>] \n");
}
html.append( " W?)
.append( " <select name='")
.append(pageNoParamName).append("' onChange='javascript:")
.append(gotoPage).append("(this.value)'>\n");
String selected = "selected";
for(int i=1;i<=getTotalPageCount();i++){
if( i == getCurrentPageNo() )
selected = "selected";
else selected = "";
html.append( " <option value='").append(i).append("' ")
.append(selected).append(">").append(i).append("</option> \n");
}
if (getCurrentPageNo()>getTotalPageCount()){
html.append( " <option value='").append(getCurrentPageNo())
.append("' selected>").append(getCurrentPageNo())
.append("</option> \n");
}
html.append( " </select>?\n");
if (hasNextPage()){
html.append( " [<a href='javascript:").append(gotoPage)
.append("(").append((getCurrentPageNo()+1))
.append( ")'>下一?lt;/a>] \n");
}
html.append( "</td></tr></table> \n");
return html.toString();
}
}
///////////////////////////////////
//
// RowSetPage.java
// author: evan_zhao@hotmail.com
//
///////////////////////////////////
package page;
import javax.sql.RowSet;
/**
* <p>Title: RowSetPage</p>
* <p>Description: 使用RowSet装数据的分对?lt;/p>
* <p>Copyright: Copyright (c) 2003</p>
* @author evan_zhao@hotmail.com
* @version 1.0
*/
public class RowSetPage extends Page {
private javax.sql.RowSet rs;
/**
*I页
*/
public static final RowSetPage EMPTY_PAGE = new RowSetPage();
/**
*默认构造方法,创徏I页
*/
public RowSetPage(){
this(null, 0,0);
}
/**
*构造分对?
*@param crs 包含一|据的OracleCachedRowSet
*@param start 该页数据在数据库中的起始位置
*@param totalSize 数据库中包含的记录L
*/
public RowSetPage(RowSet crs, int start, int totalSize) {
this(crs,start,totalSize,Page.DEFAULT_PAGE_SIZE);
}
/**
*构造分对?
*@param crs 包含一|据的OracleCachedRowSet
*@param start 该页数据在数据库中的起始位置
*@param totalSize 数据库中包含的记录L
*@pageSize 本页能容U的记录?
*/
public RowSetPage(RowSet crs, int start, int totalSize, int pageSize) {
try{
int avaCount=0;
if (crs!=null) {
crs.beforeFirst();
if (crs.next()){
crs.last();
avaCount = crs.getRow();
}
crs.beforeFirst();
}
rs = crs;
super.init(start,avaCount,totalSize,pageSize,rs);
}catch(java.sql.SQLException sqle){
throw new RuntimeException(sqle.toString());
}
}
/**
*取分对象中的记录数?
*/
public javax.sql.RowSet getRowSet(){
return rs;
}
}
///////////////////////////////////
//
// PagedStatement.java
// author: evan_zhao@hotmail.com
//
///////////////////////////////////
package page;
import foo.DBUtil;
import java.math.BigDecimal;
import java.util.List;
import java.util.Iterator;
import java.util.Collections;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import javax.sql.RowSet;
/**
* <p>Title: 分页查询</p>
* <p>Description: Ҏ查询语句和页码查询出当页数据</p>
* <p>Copyright: Copyright (c) 2002</p>
* @author evan_zhao@hotmail.com
* @version 1.0
*/
public abstract class PagedStatement {
public final static int MAX_PAGE_SIZE = Page.MAX_PAGE_SIZE;
protected String countSQL, querySQL;
protected int pageNo,pageSize,startIndex,totalCount;
protected javax.sql.RowSet rowSet;
protected RowSetPage rowSetPage;
private List boundParams;
/**
* 构造一查询出所有数据的PageStatement
* @param sql query sql
*/
public PagedStatement(String sql){
this(sql,1,MAX_PAGE_SIZE);
}
/**
* 构造一查询出当|据的PageStatement
* @param sql query sql
* @param pageNo 늠
*/
public PagedStatement(String sql, int pageNo){
this(sql, pageNo, Page.DEFAULT_PAGE_SIZE);
}
/**
* 构造一查询出当|据的PageStatementQƈ指定每页昄记录条数
* @param sql query sql
* @param pageNo 늠
* @param pageSize 每页定w
*/
public PagedStatement(String sql, int pageNo, int pageSize){
this.pageNo = pageNo;
this.pageSize = pageSize;
this.startIndex = Page.getStartOfAnyPage(pageNo, pageSize);
this.boundParams = Collections.synchronizedList(new java.util.LinkedList());
this.countSQL = "select count(*) from ( " + sql +") ";
this.querySQL = intiQuerySQL(sql, this.startIndex, pageSize);
}
/**
*生成查询一|据的sql语句
*@param sql 原查询语?
*@startIndex 开始记录位|?
*@size 需要获取的记录?
*/
protected abstract String intiQuerySQL(String sql, int startIndex, int size);
/**
*使用l出的对象设|指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param obj 包含参数值的对象
*/
public void setObject(int index, Object obj) throws SQLException{
BoundParam bp = new BoundParam(index, obj);
boundParams.remove(bp);
boundParams.add( bp);
}
/**
*使用l出的对象设|指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param obj 包含参数值的对象
*@param targetSqlType 参数的数据库cd
*/
public void setObject(int index, Object obj, int targetSqlType) throws SQLException{
BoundParam bp = new BoundParam(index, obj, targetSqlType);
boundParams.remove(bp);
boundParams.add(bp );
}
/**
*使用l出的对象设|指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param obj 包含参数值的对象
*@param targetSqlType 参数的数据库cd(帔R定义在java.sql.Types?
*@param scale _ֺQ小数点后的位数
* Q只对targetSqlType是Types.NUMBER或Types.DECIMAL有效Q其它类型则忽略Q?
*/
public void setObject(int index, Object obj, int targetSqlType, int scale) throws SQLException{
BoundParam bp = new BoundParam(index, obj, targetSqlType, scale) ;
boundParams.remove(bp);
boundParams.add(bp);
}
/**
*使用l出的字W串讄指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param str 包含参数值的字符?
*/
public void setString(int index, String str)throws SQLException{
BoundParam bp = new BoundParam(index, str) ;
boundParams.remove(bp);
boundParams.add(bp);
}
/**
*使用l出的字W串讄指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param timestamp 包含参数值的旉?
*/
public void setTimestamp(int index, Timestamp timestamp)throws SQLException{
BoundParam bp = new BoundParam(index, timestamp) ;
boundParams.remove(bp);
boundParams.add( bp );
}
/**
*使用l出的整数设|指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param value 包含参数值的整数
*/
public void setInt(int index, int value)throws SQLException{
BoundParam bp = new BoundParam(index, new Integer(value)) ;
boundParams.remove(bp);
boundParams.add( bp );
}
/**
*使用l出的长整数讄指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param value 包含参数值的长整?
*/
public void setLong(int index, long value)throws SQLException{
BoundParam bp = new BoundParam(index, new Long(value)) ;
boundParams.remove(bp);
boundParams.add( bp );
}
/**
*使用l出的双_ֺ点数设|指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param value 包含参数值的双精度QҎ
*/
public void setDouble(int index, double value)throws SQLException{
BoundParam bp = new BoundParam(index, new Double(value)) ;
boundParams.remove(bp);
boundParams.add( bp);
}
/**
*使用l出的BigDecimal讄指定参数的?
*@param index W一个参Cؓ1Q第二个?Q。。?
*@param bd 包含参数值的BigDecimal
*/
public void setBigDecimal(int index, BigDecimal bd)throws SQLException{
BoundParam bp = new BoundParam(index, bd ) ;
boundParams.remove(bp);
boundParams.add( bp);
}
private void setParams(PreparedStatement pst) throws SQLException{
if (pst==null || this.boundParams==null || this.boundParams.size()==0 ) return ;
BoundParam param;
for (Iterator itr = this.boundParams.iterator();itr.hasNext();){
param = (BoundParam) itr.next();
if (param==null) continue;
if (param.sqlType == java.sql.Types.OTHER){
pst.setObject(param.index, param.value);
}else{
pst.setObject(param.index, param.value, param.sqlType, param.scale);
}
}
}
/**
* 执行查询取得一|据,执行l束后关闭数据库q接
* @return RowSetPage
* @throws SQLException
*/
public RowSetPage executeQuery() throws SQLException{
System.out.println("executeQueryUsingPreparedStatement");
Connection conn = DBUtil.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try{
pst = conn.prepareStatement(this.countSQL);
setParams(pst);
rs =pst.executeQuery();
if (rs.next()){
totalCount = rs.getInt(1);
} else {
totalCount = 0;
}
rs.close();
pst.close();
if (totalCount < 1 ) return RowSetPage.EMPTY_PAGE;
pst = conn.prepareStatement(this.querySQL);
System.out.println(querySQL);
pst.setFetchSize(this.pageSize);
setParams(pst);
rs =pst.executeQuery();
//rs.setFetchSize(pageSize);
this.rowSet = populate(rs);
rs.close();
rs = null;
pst.close();
pst = null;
this.rowSetPage = new RowSetPage(this.rowSet,startIndex,totalCount,pageSize);
return this.rowSetPage;
}catch(SQLException sqle){
//System.out.println("executeQuery SQLException");
sqle.printStackTrace();
throw sqle;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e.toString());
}finally{
//System.out.println("executeQuery finally");
DBUtil.close(rs, pst, conn);
}
}
/**
*ResultSet数据填充qCachedRowSet
*/
protected abstract RowSet populate(ResultSet rs) throws SQLException;
/**
*取封装成RowSet查询l果
*@return RowSet
*/
public javax.sql.RowSet getRowSet(){
return this.rowSet;
}
/**
*取封装成RowSetPage的查询结?
*@return RowSetPage
*/
public RowSetPage getRowSetPage() {
return this.rowSetPage;
}
/**
*关闭数据库连?
*/
public void close(){
//因ؓ数据库连接在查询l束或发生异常时卛_闭,此处不做M事情
//留待扩充?
}
private class BoundParam {
int index;
Object value;
int sqlType;
int scale;
public BoundParam(int index, Object value) {
this(index, value, java.sql.Types.OTHER);
}
public BoundParam(int index, Object value, int sqlType) {
this(index, value, sqlType, 0);
}
public BoundParam(int index, Object value, int sqlType, int scale) {
this.index = index;
this.value = value;
this.sqlType = sqlType;
this.scale = scale;
}
public boolean equals(Object obj){
if (obj!=null && this.getClass().isInstance(obj)){
BoundParam bp = (BoundParam)obj;
if (this.index==bp.index) return true;
}
return false;
}
}
}
///////////////////////////////////
//
// PagedStatementOracleImpl.java
// author: evan_zhao@hotmail.com
//
///////////////////////////////////
package page;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.RowSet;
import oracle.jdbc.rowset.OracleCachedRowSet;
/**
* <p>Title: 分页查询Oracle数据库实?lt;/p>
* <p>Copyright: Copyright (c) 2002</p>
* @author evan_zhao@hotmail.com
* @version 1.0
*/
public class PagedStatementOracleImpl extends PagedStatement {
/**
* 构造一查询出所有数据的PageStatement
* @param sql query sql
*/
public PagedStatementOracleImpl(String sql){
super(sql);
}
/**
* 构造一查询出当|据的PageStatement
* @param sql query sql
* @param pageNo 늠
*/
public PagedStatementOracleImpl(String sql, int pageNo){
super(sql, pageNo);
}
/**
* 构造一查询出当|据的PageStatementQƈ指定每页昄记录条数
* @param sql query sql
* @param pageNo 늠
* @param pageSize 每页定w
*/
public PagedStatementOracleImpl(String sql, int pageNo, int pageSize){
super(sql, pageNo, pageSize);
}
/**
*生成查询一|据的sql语句
*@param sql 原查询语?
*@startIndex 开始记录位|?
*@size 需要获取的记录?
*/
protected String intiQuerySQL(String sql, int startIndex, int size){
StringBuffer querySQL = new StringBuffer();
if (size != super.MAX_PAGE_SIZE) {
querySQL.append("select * from (select my_table.*,rownum as my_rownum from(")
.append( sql)
.append(") my_table where rownum<").append(startIndex + size)
.append(") where my_rownum>=").append(startIndex);
} else {
querySQL.append("select * from (select my_table.*,rownum as my_rownum from(")
.append(sql)
.append(") my_table ")
.append(") where my_rownum>=").append(startIndex);
}
return querySQL.toString();
}
/**
*ResultSet数据填充qCachedRowSet
*/
protected RowSet populate(ResultSet rs) throws SQLException{
OracleCachedRowSet ocrs = new OracleCachedRowSet();
ocrs.populate(rs);
return ocrs;
}
}