解决方案 »
- 请教怪问题,struts2的action返回字符串后就没有反应了?
- 求大神解释代码
- 向大家问一下为什么ajax xmlhttp不能有返回值那状态错误
- Java web service 方法使用
- 有关struts中的logic:iterator标签的奇怪问题
- struts中一个活见鬼的问题!!谁能过来解决一下!!
- 在tomcat 5.0下,下载小文件时,报java.lang.IllegalStateException: getOutputStream() has already been called for this response错,下载大文件时没有问题,js
- 请问j2ee上有没有类似.net上的服务器端控件?
- 如何使用date?
- 大家做ejb练习时都用什么数据库
- 各位老大谁有比较详细的log4j介绍
- 怎么样处理如下的jsp操作sql server 的问题啊 急球方案
[email protected]
小弟的邮箱是:[email protected]
[email protected]
[email protected]
终于开发出“数据库连接池+JavaBean+JSP+SQL Server+JDBC3.0的数据库分页技术”,
现公布全部开发代码,有不好之处请高手指点。
主要特色:
1.使用最新的JDBC3.0数据库驱动。
2.大幅度减化了JSP的反复调用JavaBean,可以直接写SQL,无须再使用连接数据库连接池。
3.将大量的工作交给JavaBean做,JSP负责页面控制。
4.最大特色是极其简单,程序编写也极其简单,非常适合初学者。
5.使用的是"汤母猫"数据库连接池,方便快速。《page.jsp》*******************************************************************
文件名《page.jsp》
<%@ page language="java" import="java.sql.*, my.*" %>
<%@ page contentType="text/html; charset=gb2312" %>
<jsp:useBean id="pagi" scope="page" class="my.Pagi"/>
<html>
<body>
<table align="center" border=1>
<%
String CountQuery="select count(*) from 商品资料";
String query = "select * from 商品资料";
ResultSet rs = pagi.querySql(CountQuery,query, request);
String footer = pagi.PageFooter();
%>
<tr>
<td >商品编号</font></td>
<td >商品名称</font></td>
</tr>
<%
if (pagi.intPageCount>0)
{
int i=0;
while (rs.next())
{
i++;
if (i>((pagi.intPage-1)*pagi.intPageSize) &&(i<=pagi.intPage*pagi.intPageSize))
{
%>
<tr>
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
</tr>
<%
}
}
}
out.println("<tr><td colspan=2>"+footer+"</td></tr>");
rs.close();
pagi.close_all();
%>
</table>
</body>
</html>
****************************************文件名《pagi.java》*********************************************************文件名《pagi.java》
package my; import java.util.*;
import java.sql.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import my.DB.*;public class Pagi
{
ResultSet CountTopicrs=null; //初始化总记录数Rs变量
ResultSet Pagirs=null; //初始化分页时Rs变量
public int intCountTopic=0; //主题总数
public int intPageSize;//每页显示主题数
public int intPageCount;//总页数
public int intPage=1; //当前页数
public String nowPage; // int i;
public String HttpFile;//初始化当前页intPage变量,以准确便获取当前页。 //当前的地址栏的文件
DB db; //定义Linkdb类的一个对象。public Pagi()//定义构造器,初始化每页显示的主题数和数据库的连接。
{
intPageSize=4; //每页显示的记录数目
db = new DB();
}//Countsql:总记录的Query字符串。[形式为select count(*) from tablename]
//Pagisql :要分页的Query字符串。[形式为select * from tablename where ...]
//request :参数传递过程中的变量。[用来控制翻页时的pages变量]
public ResultSet querySql(String Countsql,String Pagisql,HttpServletRequest request)throws Exception
{
HttpFile=request.getRequestURI(); //获取当前文件名。
nowPage=request.getParameter("pages"); //获取当前页,将数值赋予intPage变量。[分页栏中必须要有pages参数]
if (nowPage==null)
{
intPage=1;
}
else
{
intPage=Integer.parseInt(nowPage);
if (intPage<1)
intPage=1;
} CountTopicrs=db.executeQuery(Countsql); //@@@@@@@@@@@@获取总记录数的结果集。 if (CountTopicrs.next())
{
intCountTopic=CountTopicrs.getInt(1);
}
intPageCount = (intCountTopic+intPageSize-1)/intPageSize; //获取总页数。if (intPage>intPageCount)//如果当前页大于总页数,则当前页等于总页数。
{
intPage=intPageCount;
}
CountTopicrs.close(); //关闭总主题数的数据集。
db.close_all();
Pagirs=db.executeQuery(Pagisql); //@@@@@@@@@@@@@@@获取执行分页的结果集。
return Pagirs;
}//end querySql function.
public int getCountTopic()//获取记录总数。
{
return intCountTopic;
}
public int getPageCount() //获取总页数。
{
return intPageCount;
}
public int getIntPage() //获取当前页数。
{
return intPage;
} public String PageFooter()
{
String str = "";
int next, prev;
prev=intPage-1;
next=intPage+1;
str += "查询到<font color=red>"+getCountTopic()+"</font>条记录"+
" 共<font color=red>"+getPageCount()+"</font>页";
str +=" 第<font color=red>"+getIntPage()+"</font>页 ";
if(intPage>1)
str += " <A href=" + HttpFile + "?pages=1"+">首页</A> ";
else
str += " 首页 ";
if(intPage>1)
str += " <A href=" + HttpFile + "?pages=" + prev + ">上一页</A> ";
else
str += " 上一页 ";
if(intPage<intPageCount)
str += " <A href=" + HttpFile + "?pages=" + next + ">下一页</A> ";
else
str += " 下一页 ";
if(intPageCount>1&&intPage!=intPageCount)
str += " <A href=" + HttpFile + "?pages=" + intPageCount +
">尾页</A>";
else
str += " 尾页 "; return str;
}
public void close_all()
{
db.close_all();
}
}************************************************文件名《DB.java》********************************************************
文件名《DB.java》
package my;import java.sql.*;
import javax.naming.*;
import javax.sql.DataSource;
//一个用于查找数据源的工具类。
public class DB {
private Connection con=null;
private Statement stmt=null;
ResultSet rs=null;public ResultSet executeQuery(String sql) throws Exception
{
rs=null;
try
{
Context initCtx = new javax.naming.InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/bn");
con=ds.getConnection();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery (sql);
}
catch(SQLException e){throw e;}
catch(NamingException e){throw e;}return rs;
}
//执行Insert,Update语句
public void executeUpdate(String sql) throws Exception
{
stmt = null;
rs=null;
try
{
Context initCtx = new javax.naming.InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/bn");
con=ds.getConnection();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt.executeQuery(sql);
stmt.close();
con.close();
}
catch(SQLException ex)
{
System.err.println("执行SQL语句出错: " + ex.getMessage());
}
}
// 关闭stmt和关闭连接
public void close_all()
{
try{
stmt.close();
con.close();
}
catch(SQLException e){e.printStackTrace();}
}
}
***************************************《汤母猫中的数据库连接池的设置》********************************************************************************
……
……
……
<Context path="/SQL" docBase="D:\SQL_JSP" debug="0" reloadable="true" crossContext="true">
<Resource name="jdbc/bn" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/bn">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter> <parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter> <parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev</value>
</parameter> <parameter>
<name>username</name>
<value>cyg</value>
</parameter> <parameter>
<name>password</name>
<value>325345353</value>
</parameter> <parameter>
<name>maxActive</name>
<value>20</value>
</parameter> <parameter>
<name>maxIdle</name>
<value>20</value>
</parameter> <parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>
</Host> </Engine> </Service></Server>
谢谢先!
1.为了计算记录集的总数,总共访问了两次数据库,没有必要,而且这样开销有点大!只需访问数据库一次即可!
2.每页显示的记录条数在javabean中固定死了,不能灵活修改每页显示的条数!
所以我对上面的代码进行了修改,还请各位高手指点!
//Pagi.java
package my;import java.sql.*;
import javax.servlet.http.*;public class Pagi {
ResultSet CountTopicrs = null; //初始化总记录数Rs变量
ResultSet Pagirs = null; //初始化分页时Rs变量
public int intCountTopic = 0; //主题总数
public int intPageSize; //每页显示主题数
public int intPageCount; //总页数
public int intPage = 1; //当前页数
public String nowPage; // int i;
public String HttpFile; //初始化当前页intPage变量,以准确便获取当前页。 //当前的地址栏的文件
DB db; //定义Linkdb类的一个对象。 public Pagi() { //定义构造器,初始化每页显示的主题数和数据库的连接。
db = new DB();
}//pageSize:每页显示主题数
//Pagisql :要分页的Query字符串。[形式为select * from newstable where ...]
//request :参数传递过程中的变量。[用来控制翻页时的pages变量]
public ResultSet querySql(int pageSize, String Pagisql, HttpServletRequest request) throws Exception {
intPageSize = pageSize;
HttpFile = request.getRequestURI(); //获取当前文件名。
nowPage = request.getParameter("pages"); //获取当前页,将数值赋予intPage变量。[分页栏中必须要有pages参数]
if (nowPage == null) {
intPage = 1;
}
else {
intPage = Integer.parseInt(nowPage);
if (intPage < 1) {
intPage = 1;
}
} Pagirs = db.executeQuery(Pagisql); //@@@@@@@@@@@@@@@获取执行分页的结果集。 Pagirs.last();
intCountTopic = Pagirs.getRow(); //@@@@@@@@@@@@获取总记录数的结果集。
Pagirs.beforeFirst(); //定位到第一条记录集的之前! intPageCount = (intCountTopic + intPageSize - 1) / intPageSize; //获取总页数。 if (intPage > intPageCount) { //如果当前页大于总页数,则当前页等于总页数。
intPage = intPageCount;
} return Pagirs;
} //end querySql function. public int getCountTopic() { //获取记录总数。
return intCountTopic;
} public int getPageCount() { //获取总页数。
return intPageCount;
} public int getIntPage() { //获取当前页数。
return intPage;
} public String PageFooter() {
String str = "";
int next, prev;
prev = intPage - 1;
next = intPage + 1;
str += "查询到<font color=red>" + getCountTopic() + "</font>条记录" + " 共<font color=red>" +
getPageCount() + "</font>页";
str += " 第<font color=red>" + getIntPage() + "</font>页 ";
if (intPage > 1) {
str += " <A href=" + HttpFile + "?pages=1" + ">首页</A> ";
}
else {
str += " 首页 ";
}
if (intPage > 1) {
str += " <A href=" + HttpFile + "?pages=" + prev + ">上一页</A> ";
}
else {
str += " 上一页 ";
}
if (intPage < intPageCount) {
str += " <A href=" + HttpFile + "?pages=" + next + ">下一页</A> ";
}
else {
str += " 下一页 ";
}
if (intPageCount > 1 && intPage != intPageCount) {
str += " <A href=" + HttpFile + "?pages=" + intPageCount + ">尾页</A>";
}
else {
str += " 尾页 "; }
return str;
} public void close_all() {
db.close_all();
}
}//
《page.jsp》*******************************************************************
文件名《page.jsp》
<%@ page language="java" import="java.sql.*, my.*" %>
<%@ page contentType="text/html; charset=gb2312" %>
<jsp:useBean id="pagi" scope="page" class="my.Pagi"/>
<html>
<body>
<table align="center" border=1>
<%
int intPageSize=20;
String query = "select * from 商品资料";
ResultSet rs = pagi.querySql(intPageSize,query, request);
String footer = pagi.PageFooter();
%>
<tr>
<td >商品编号</font></td>
<td >商品名称</font></td>
</tr>
<%
if (pagi.intPageCount>0)
{
int i=0;
while (rs.next())
{
i++;
if (i>((pagi.intPage-1)*pagi.intPageSize) &&(i<=pagi.intPage*pagi.intPageSize))
{
%>
<tr>
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
</tr>
<%
}
}
}
out.println("<tr><td colspan=2>"+footer+"</td></tr>");
rs.close();
pagi.close_all();
%>
</table>
</body>
</html>另外我认为在DB.java访问数据库的bean中对数据库驱动的加载和连接的获取部分,放在DB.java的构造方法中是否要好一点呢?
Context initCtx = new javax.naming.InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/bn");
con=ds.getConnection();
麻烦楼主给我一个 [email protected]
[email protected]
大家看看 bluelily22(丁丁) 和huyc_fly()
的帖学习下