JSP_分页查询技术的实例
- 格式:doc
- 大小:150.50 KB
- 文档页数:13
今天,我给大家写出我的一个分页例子,希望对大家有用:首先inbox.jsp<%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@taglib prefix="c"uri="/jsp/jstl/core"%><%@taglib prefix="f"uri="/jsp/jstl/fmt"%><%@taglib prefix="fn"uri="/jsp/jstl/functions"%><html><head><title>无标题文档</title><meta http-equiv="Content-Type"content="text/html; charset=utf-8"/><meta name="viewport"content="width=device-width, initial-scale=1.0"><!-- 最新 Bootstrap 核心 CSS 文件 --><link rel="stylesheet"href="${pageContext.request.contextPath}/css/jPages.css"><!-- 待修改 --><!-- jQuery文件。
务必在bootstrap.min.js 之前引入 --><link rel="stylesheet"href="/twitter-bootstrap/3.0.3/css/bootstrap.min.css"><link rel="stylesheet"href="/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css"><link rel="stylesheet"href="/bootstrap-datepicker/1.3.0/css/datepicker.min.css"><!-- jQuery文件。
ShowRecordByPage.javapackage database.operation;import java.sql.*;import com.sun.rowset.*;public class ShowRecordByPage{ int pageSize=10; //每页显示的记录数int pageAllCount=0; //分页后的总页数int showPage=1 ; //当前显示页StringBuffer presentPageResult; //显示当前页内容CachedRowSetImpl rowSet; //用于存储ResultSet对象String databaseName="user"; //数据库名称String tableName="user_tab"; //表的名字String user="sa" ; //用户String password="123" ; //密码String 字段[]=new String[100] ;int 字段个数=0;public ShowRecordByPage(){ presentPageResult=new StringBuffer();try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newIns tance();}catch(Exception e){}}public void setPageSize(int size){ pageSize=size;字段个数=0;Stringuri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName="+databaseName;try{ Connectioncon=DriverManager.getConnection(uri,user,password);DatabaseMetaData metadata=con.getMetaData();ResultSet rs1=metadata.getColumns(null,null,tableName,null);int k=0;while(rs1.next()){ 字段个数++;字段[k]=rs1.getString(4); //获取字段的名字k++;}Statementsql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs=sql.executeQuery("SELECT * FROM"+tableName);rowSet=new CachedRowSetImpl(); //创建行集对象rowSet.populate(rs);con.close(); //关闭连接st();int m=rowSet.getRow(); //总行数int n=pageSize;pageAllCount=((m%n)==0)?(m/n):(m/n+1);}catch(Exception exp){}}public int getPageSize(){ return pageSize;}public int getPageAllCount(){ return pageAllCount;}public void setShowPage(int n){ showPage=n;}public int getShowPage(){ return showPage;}public StringBuffer getPresentPageResult(){ if(showPage>pageAllCount)showPage=1;if(showPage<=0)showPage=pageAllCount;presentPageResult=show(showPage);return presentPageResult;}public StringBuffer show(int page){ StringBuffer str=new StringBuffer();str.append("<table border=1>");str.append("<tr>");for(int i=0;i<字段个数;i++){ str.append("<th>"+字段[i]+"</th>");}str.append("</tr>");try{ rowSet.absolute((page-1)*pageSize+1);for(int i=1;i<=pageSize;i++){ str.append("<tr>");for(int k=1;k<=字段个数;k++){ str.append("<td>"+rowSet.getString(k)+"</td>");}str.append("</tr>");rowSet.next();}}catch(SQLException exp){}str.append("</table>");return str;}public void setDatabaseName(String s){ databaseName=s.trim();}public String getDatabaseName(){ return databaseName;}public void setTableName(String s){ tableName=s.trim();}public String getTableName(){ return tableName;}public void setPassword(String s){ password=s.trim();;}public void setUser(String s){ user=s.trim();}public String getUser(){ return user;}}showByPage.jsp<%@ page contentType="text/html;charset=GB2312" %><%@ page import="java.sql.*" %><%@ page import="database.operation.*" %><jsp:useBean id="look" class="database.operation.ShowRecordByPage" scope="session" /><jsp:setProperty name="look" property="databaseName" value="factory" /><jsp:setProperty name="look" property="tableName" value="employee" /> <jsp:setProperty name="look" property="user" value="sa" /><jsp:setProperty name="look" property="password" value="sa" /><jsp:setProperty name="look" property="pageSize" value="2" /><HTML><BODY>数据库<jsp:getProperty name= "look" property="databaseName"/>中<jsp:getProperty name= "look" property="tableName"/>表的记录将被分页显示。
分页的实现原理:1.获得需要显示的总的记录数rowCount—》从数据库中取2.设定每页最多显示的记录数size—》103.指定显示的页码:num 作为参数得到4.根据rowCount,size,num可计算出其余的元素:a)本页面从多少行记录开始:startRow = (this.num-1) * size ;b)共有多少页:pageCount = (int) Math.ceil((double)rowCount/size);c)下一页:next=Math.min( this.pageCount, this.num+1)d)上一页:prev = Math.max(1 , this.num-1)e)页号控制元素:numCount:每页最多显示多少页号。
(一共显示numCount+1个页号)start = Math.max(this.num-numCount/2, first); //本页显示页号从多少页开始end = Math.min(start+numCount, last); //本页显示页号在多少页结束页号控制:if(end-start < numCount){ //当本页总显示的页号数不够numCount时,如何计算起始页号。
start = Math.max(end-numCount, 1);}分页实现步骤:1.将Page类引入。
需要自己修改的可自行修改。
package com.puckasoft.video.util;public class Page {private int num; //当前页号, 采用自然数计数 1,2,3,...private int size; //页面大小:一个页面显示多少个数据private int rowCount;//数据总数:一共有多少个数据private int pageCount; // 页面总数private int startRow;//当前页面开始行, 第一行是0行private int first = 1;//第一页页号private int last;//最后页页号private int next;//下一页页号private int prev;//前页页号private int start;//页号式导航, 起始页号private int end;//页号式导航, 结束页号private int numCount = 10;//页号式导航, 最多显示页号数量为numCount+1;这里显示11页。
JSP 实现数据的分页显示在JSP中,数据的分页显示非常实用,它的应用可以使数据表中的多条数据实现分页显示,使数据的显示更加条理清晰。
本扩展练习的目的是:使数据表bookinfo 中的数据实现分页显示,并实现数据的翻页功能。
实例中有两个文件Pagescount.jsp 和Pages.jsp,其中Pagescount.jsp实现数据库的连接并查询数据返回数据集,同时设置每页显示的记录数和计算数据页数。
Pages.jsp实现数据的分页显示。
(1)创建一个命名为Pagescount.jsp的信息查询页面。
【新建】|【JSP (advanced Templates)】命令,弹出【新建JSP页面】对话框,在对话框的文件名称中输入Pagescount.jsp,单击【完成】按钮。
(2)添加JSP文件要用到的Java类包、编码。
查询bookinfo数据表中数据并返回数据集,最后,计算数据集中的记录数并设置显示的页数。
(4)创建一个命名为Pages.jsp的信息查询页面。
【新建】|【JSP (advanced Templates)】命令,弹出【新建JSP页面】对话框,在对话框的文件名称中输入Pages.jsp,单击【完成】按钮。
(5)添加JSP文件要用到的Java类包、编码。
(6)在JSP文件中输出如下内容并保存。
</TD><%}%><TD Width=150><FORM action=Pages.jsp method=POST>到<INPUT type="text" name=ToPage style="HEIGHT: 25px; WIDTH: 40px"value=<%= ShowPage%> > 页</FORM></TD></TR></TABLE></CENTER></BODY></HTML>(7)执行上述代码,结果如图10-18所示。
JSP制作简单登录界⾯实例现在很多web项⽬都能⽤到登录界⾯,本⽂介绍⼀下JSP制作简单登录界⾯,分享给⼤家,具体如下:运⾏环境eclipse+tomcat+MySQL 不知道的可以参考项⽬列表这⾥我先把jsp⽂件先放在Web-INF外⾯访问1.需要建⽴的⼏个⽂件在图上.jsp2.还要导⼊MySQL的jar包mysql-5.0.5.jar,导到WEB-INF中的lib⽂件夹就可以不需要Bulid Path3.开始编写代码:代码演⽰:index.jsp就好像⼀般⽹站的⾸页⼀样感觉,将header.jsp和footer.jsp引⼊其中<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>⾸页</title><style>#nav>ul>li{float:left;margin-left:50px;}#login{clear:both;}</style></head><body><!-- 引⼊header.jsp的头部⽂件 --><%@ include file="header.jsp" %><div id="login"><a href="login.jsp" rel="external nofollow" ><button>登陆</button></a></div><!-- 引⼊footer.jsp的脚部⽂件 --><%@include file="footer.jsp" %></body></html>header.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><div id="nav"><ul><li ><a href="">导航1</a></li><li><a href="">导航2</a></li><li><a href="">导航3</a></li><li><a href="">导航4</a></li><li><a href="">导航5</a></li><li><a href="">导航6</a></li></ul></div>footer.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><div><p>xxxxxxxxxxx可以试试|xxxxxxxxxxxx技术有限公司</p><p>京 ICP 证 1234567 号|Copyright © 1999-2017, All Rights Reserved </p></div>页⾯内容展⽰:login.jsp登陆⽤户名密码填写界⾯<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>登陆页⾯</title></head><body><%--表单--%><fieldset><legend>登陆界⾯</legend><form action="test.jsp" method="post"><input type="text" name="username"><br><input type="password" name="password"><br><input type="submit" value="登陆"><!-- EL语句,后⾯验证表单时,验证错误反回信息-->${error}</form></fieldset></body></html>内容显⽰:test.jsp 是对表单login.jsp 的提交的内容与数据库中的数据对⽐验证,再相应的跳转<%@page import="java.sql.*"%><%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%//请求获取login.jsp的⽤户名username的值String username=request.getParameter("username");//请求获取login.jsp的密码password的值String password=request.getParameter("password");//数据库MySQL的地址String DBURL="jdbc:mysql://localhost:3306/zhou?useUnicode=true&characterEncoding=utf-8";String DBName="root"; //登⼊⽤户名String DBPwd="123456";//登⼊密码//加载mysql驱动Class.forName("com.mysql.jdbc.Driver");//连接数据库Connection conn=DriverManager.getConnection(DBURL,DBName,DBPwd);//创建Statement对象Statement st=conn.createStatement();//sql语句,搜索这个username和password在数据库是否存在String sql="select * from user where name='"+username+"'and pwd='"+password+"'";//运⾏sql语句,并把得到的结果放⼊结果集ResultSet中ResultSet rs=st.executeQuery(sql);//判断这个结果集是否存在,⼀般username只有⼀个if(rs.next()){//设置⼀个username,将后⾯username其内容赋值给前⾯⼀个username,可以以便下⼀个页⾯使⽤request.setAttribute("username", username);//跳转页⾯到userpage.jsprequest.getRequestDispatcher("userpage.jsp").forward(request, response);}else{//设置⼀个error,将后⾯的字赋给这个error,以便先⼀个跳转页⾯的使⽤,request的作⽤域有限request.setAttribute("error", "⽤户名或密码错误");request.getRequestDispatcher("login.jsp").forward(request, response);}conn.close();rs.close();%>登陆错误显⽰的页⾯内容:userpage.jsp这个页⾯就是登陆成功之后显⽰的页⾯<%@page import="javafx.scene.chart.PieChart.Data"%><%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>⽤户界⾯</title></head><body><div><!-- ${username}是获取到test.jsp 中判断中重新设置的username,知道是谁登陆了,这个是谁的页⾯ --> <p>${username},你好,登陆成功!!</p></div><%//session的作⽤域问题,可以记录⼀个⽹站的浏览量。
JSP存储二进制文件和分页技术1. 文件存储到数据库将图像以二进制数据格式存储到数据库中,创建bindata的数据表,添加filename(char),binfile(longBlob),当然第一个位置id自动生成,然后创建一个selectImage.jsp页面:<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>上传图片</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form name="form1"method="post"action="testimage.jsp"> <p align="center">请选择图片的URL: <input type="file"name="image"/> </p><p align="center"><input type="submit"name="Submit"value="提交"/></p></form></body></html>然后创建一个selectImage.jsp页面,提交图片信息<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%@page import="java.sql.*"%><%@page import="java.text.*"%><%@page import="java.io.*"%><%@page import="java.nio.*"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>存储图片</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%Class.forName("com.mysql.jdbc.Driver").newInstance(); //加载JDBC驱动程序String url="jdbc:mysql://localhost/firstjsp"; //firstjsp为数据库的名称String user="root";String password="lfw123";String filename=request.getParameter("image");filename="C:\\Documents and Settings\\Administrator\\桌面\\12444033Z-0.jpg";//现在的浏览器上传过来的image就只有名字了,没有绝对路径了!!!File file=new File(filename); //获取表单传过来的图片的urltry{out.println("这里对吧?"+filename+"<br/>");//打开文件FileInputStream fin=new FileInputStream(file);//建一个缓冲保存数据ByteBuffer nbf=ByteBuffer.allocate((int)file.length());byte[] array=new byte[1024];int offset=0, len=0;//读取数据while((len=fin.read(array))>0 ){if(len!=1024) nbf.put(array,0,len);else nbf.put(array);offset+=len;}//新建一个数组保存要写的内容byte[] content=nbf.array();//创建数据库连接out.println("content is "+content+"<br/>");Connection conn=DriverManager.getConnection(url, user, pas sword);//保存数据Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL _INSENSITIVE, ResultSet.CONCUR_UPDATABLE);String sqlstr="select * from bindata where filename='02'";//查找名字为02的文件ResultSet rs=stmt.executeQuery(sqlstr);if(rs.next()){rs.updateBytes(3,content);rs.updateRow();}else{//如果没有,添加,已经有更新,注意,第一个位置是自动编号,所以在2,3位置rs.moveToInsertRow();rs.updateString(2,"02");rs.updateBytes(3,content);rs.insertRow();}rs.close();fin.close();out.println("恭喜,已经将新的记录成功添加到数据库中!");}catch(FileNotFoundException e){e.printStackTrace();out.println("没找到图片?");}catch(IOException e){e.printStackTrace();out.println("没输入?");}%></body></html>最后创建一个showImage.jsp页面,读取图片:<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%@page import="java.sql.*"%><%@page import="java.text.*"%><%@page import="java.io.*"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>显示图片</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://localhost/firstjsp";String user="root";String password="lfw123";Connection conn=DriverManager.getConnection(url,user,password);String sql="select binfile from bindata where filename='02'"; Statement stmt=null;ResultSet rs=null;try{stmt=conn.createStatement();rs=stmt.executeQuery(sql);}catch(SQLException e){out.println("连接OK?");}try{while(rs.next()){response.setContentType("image/jpg");ServletOutputStream sout=response.getOutputStream();InputStream in=rs.getBinaryStream(1); //获取二进制输入流byte[] b=new byte[0x7a120]; //创建byte数组用作缓冲for(int i=in.read(b);i!=-1;){sout.write(b); //写入页面in.read(b); //读取数据}sout.flush();sout.close();}}catch(Exception e){out.println(e);}%></body></html>截图:(long1 vs longpo 转载请注明出处:/lfw2565295@126)(long1 vs longpo 转载请注明出处:/lfw2565295@126)声音,视频也可以二进制数据格式存储到数据库中,方法类似,用到<param>标签等,但这些技术但只是一般的方法,以后能学到更好的(long1 vs longpo 转载请注明出处:/lfw2565295@126) 2. 分页技术使用游标定位,丢弃不属于页面的数据,使用缓存结果集,一次查询所有数据,使用数据库提供的定位集的SQL语句,返回特定行的数据,使用JavaBean实现,建立bean包,然后写个splitPage.java:package bean;import java.sql.*;import java.util.*;public class splitPage {//定义数据库连接对象和结果集对象private Connection con=null;private Statement stmt=null;private ResultSet rs=null;private ResultSetMetaData rsmd=null;//SQL查询语句private String sqlstr;//总记录数目private int rowCount=0;//所分页的逻辑页数private int pageCount=0;//每页显示的记录数目private int pageSize=0;//设置参数值public void setCon(Connection con){this.con=con;if(this.con==null){System.out.println("Failure to get a connection!");}else{System.out.println("Success to get a connection!");}}//初始化,获取数据表中的信息public void initialize(String sql,int pageSize,int ipage){int irows=pageSize*(ipage-1);sqlstr=sql;this.pageSize=pageSize;try{stmt=this.con.createStatement();rs=stmt.executeQuery(this.sqlstr);if(rs!=null){st();this.rowCount=rs.getRow();rs.first();this.pageCount=(this.rowCount-1)/this.pageSize+1; }this.sqlstr=sql+" limit "+irows+","+pageSize;stmt=this.con.createStatement();rs=stmt.executeQuery(this.sqlstr);rsmd=rs.getMetaData();}catch(SQLException e){System.out.println(e.toString());}}//将显示结果存到VECTOR集合类中public Vector getPage(){Vector vData=new Vector();try{if(rs!=null){while(rs.next()){String[] sData=new String[6];for(int j=0; j<rsmd.getColumnCount(); j++){sData[j]=rs.getString(j+1);}vData.addElement(sData);}}rs.close();stmt.close();}catch(SQLException e){System.out.println(e.toString());}return vData;}//获得页面总数public int getPageCount(){return this.pageCount;}//获取数据表中记录总数public int getRowCount(){return this.rowCount;}}建立words数据表,有自动增长的id,有varchar(100)的wtitle,text的wcontent,datetime的wtime,int的uid,不能为空words.jsp:<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%@page import="java.sql.*"%><%@page import="java.io.*"%><%@page import="bean.*"%><jsp:useBean id="pages"scope="page"class="bean.splitPage"/><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> <%//每页显示的记录数int pageSize=3;String sql="";//当前页int showPage=1;//数据库用户名,密码String userName="root";String password="lfw123";//数据库的url包括连接数据库所用的编码格式String url="jdbc:mysql://localhost:3306/firstjsp?useUnicode=true& characterEncoding=gb2312";//定义连接对象Connection conn=null;%><%try{//加载驱动程序Class.forName("com.mysql.jdbc.Driver");//获得数据库的连接对象conn=DriverManager.getConnection(url,userName,password);}catch(SQLException e){//打印出异常信息out.println(e.toString());}//给pages中参数con赋值pages.setCon(conn);sql="select * from words order by Id";//查询数据表,获得查询结果String strPage=null;//获取跳转到的目的页面strPage=request.getParameter("showPage");if(strPage==null){showPage=1;}else{try{showPage=Integer.parseInt(strPage);}catch(NumberFormatException e){showPage=1;}}pages.initialize(sql, pageSize, showPage);//获取要显示的数据集合Vector vData=pages.getPage();%><html><head><base href="<%=basePath%>"><title>分页显示</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body bgcolor="#FFFFFF"text="#000000"><h1align=center>留言簿</h1><div align=center><table border="1"cellspacing="0"cellpadding="0"width="80%"> <tr><th width="20%">编号</th><th width="20%">留言标题</th><th width="30">留言时间</th></tr><%for(int i=0; i<vData.size(); i++){//显示数据String[] sData=(String[])vData.get(i);%><tr><td><%=sData[0]%></td><td align=left><%=sData[1] %></td><td align=left><%//显示留言时间String wtime=sData[3];if(wtime.indexOf(".")>-1){wtime=wtime.substring(0,wtime.indexOf("."));}out.println(wtime);%></td></tr><%}%></table><form action="words.jsp"method="get"target="_self">共<fort color=red><%=pages.getRowCount() %></fort>条<%=pageSize %>条/页第<font color=red><%=showPage %></font>页/共<font color=red><%=pages.getPageCount() %></font>页<a href="words.jsp?showPage=1"target="_self">[首页]</a><%//判断“上一页”连接是否显示if(showPage>1){%><a href="words.jsp?showPage=<%=showPage-1 %>"target="_self">[上一页]</a><%}else{%>[上一页]<%}//判断“下一页”连接是否显示if(showPage<pages.getPageCount()){%><a href="words.jsp?showPage=<%=showPage+1 %>"target="_self" >[下一页]</a><%}else{%>[下一页]<%}%><a href="words.jsp?showPage=<%=pages.getPageCount() %>"tar get="_self">[尾页]</a>转到<select name="showPage"><%for(int x=1; x<=pages.getPageCount(); x++){%><option value="<%=x %>"<%if(showPage==x) out.println("sel ected"); %>><%=x %></option><%}%></select>页<input type="submit"name="go"value="提交"/></form><%//关闭数据库连接conn.close();%></div></body></html>效果:。
JSP 分页查询1.首先创建数据库,以图书信息查询系统为例,在SQL Server 中创建一个名为BOOKDB的数据库,并在其库中创建一个TBL_BOOK 表,存储图书信息。
SQL 脚本如下:/*---设置当前数据库为master ,以便访问sysdatabases 表---*/USE masterGO/*---检测是否已经存在bookDB 数据库:查询master 数据库中的系统表sysdatabases ,如果存在则删除该数据库---*/IF EXISTS(SELECT*FROM sysdatabases WHERE name='BOOKDB') DROP DATABASE BOOKDB --删除数据库GO/*-----创建数据库-----*/CREATE DATABASE BOOKDBON primary(/*--数据文件的具体描述--*/NAME='BOOKDB_data',--主数据文件的逻辑名称FILENAME='D:\BOOKDB_data.mdf',--主数据文件的物理名称SIZE= 5mb,--主数据文件的初始大小MAXSIZE= 80mb,--主数据文件增长的最大值FILEGROWTH= 15%--主数据文件的增长率)LOG ON(/*--日志文件的具体描述--*/NAME='BOOKDB_log',--日志文件的逻辑名称FILENAME='d:\BOOKDB_log.ldf',--日志文件的物理名称SIZE= 3mb,--日志文件的初始大小MAXSIZE= 20mb,--日志文件增长的最大值FILEGROWTH= 2mb --日志文件的增长率)GO/*---设置当前数据库为bookDB ,以便访问bookDB 数据库---*/USE BOOKDBGO/*---检测在bookDB 数据库中是否已经存TBL_BOOK 表:查询系统表sysobjects ,如果存在则删除该表---*/IF EXISTS(SELECT*FROM sysobjects WHERE name='TBL_BOOK') DROP TABLE TBL_BOOK --删除数据库/*-----创建数据库表TBL_BOOK (图书信息)-----*/CREATE TABLE TBL_BOOK(book_id INT IDENTITY(1000,1)PRIMARY KEY,--标识列,自增,主键book_name VARCHAR(50),--图书名称book_num VARCHAR(50)NOT NULL,--图书编号,非空book_author VARCHAR(50)NOT NULL,--图书作者,非空book_price MONEY,--图书价格book_synopsis TEXT,--图书简介book_publishTime DATETIME--图书出版日期)GO/*--添加唯一约束(将bookNum 作为唯一键)--*/ALTER TABLE TBL_BOOKADD CONSTRAINT UQ_book_num UNIQUE(book_num)/*--添加默认约束(如果publishTime 不填,默认当前时间)--*/ALTER TABLE TBL_BOOKADD CONSTRAINT DF_book_publishTime DEFAULT(GETDATE())FORbook_publishTimeGO/*--添加数据--*/INSERT INTO TBL_BOOKVALUE'SQL Server 高级编程','XV001001','张无忌','86','重点讲解T-SQL 编程','2010-08-08'UNIONSELECT'MySQL 高级编程','XV001002','张国荣','36','重点讲解MySQL 的高级运用','2010-08-07'UNIONSELECT'JAVA 高级编程','XV001003','周杰伦','130','零基础学JAVA','2010-02-06'UNIONSELECT'C# 高级编程','XV001004','张三丰','99','c# 从入门到精通','2010-07-07'UNIONSELECT'JSP 高级编程','XV001005','陆逊','65','JSP 新手入门新教材','2010-02-03'UNIONSELECT'PHP 高级编程','XV001006','周瑜','45','好学好用PHP 经典教材','2010-04-07'UNIONSELECT'ASP 高级编程','XV001007','诸葛亮','180','最牛的c# 教程体系','2010-09-08'UNIONSELECT'ASP.ENT 高级编程','XV001008','曹操','250','一看就会的教材','2010-08-23'UNIONSELECT'Oracle 高级编程','XV001009','李白','140','Oracle 新手解惑','2010-08-18'UNIONSELECT'DB2 高级编程','XV001010','孔子','860','db2 程序员的宝典','2010-08-01'UNIONSELECT'MySQL 手册','XV001011','孙子','43','MySQL 编程最佳助手','2010-02-02'UNIONSELECT'SQL 手册','XV001012','老子','100','数据库通用手册,程序员必备','2010-01-07'UNIONSELECT'JAVA API 文档','XV001013','周仓','110','JAVA 程序员必备手册','2010-02-05'UNIONSELECT'C# 完全手册','XV001014','鲁迅','92','c# 程序员的良伴','2010-03-07' UNIONSELECT'C 高级编程','XV001015','和珅','120','一切程序的起点','2010-02-13' UNIONSELECT'C++ 高级编程','XV001016','纪晓岚','145','学会C++,走片天下都不怕','2010-04-27'UNIONSELECT'C++ 完全手册','XV001017','薛宝钗','118','选手册,C++ 完全手册才是好手册','2010-09-18'UNIONSELECT'C 语言入门到精通','XV001018','雷锋','150','不要让程序把你拒之门外','2010-08-21'UNIONSELECT'数据结构与算法C++ 版','XV001019','雄霸','108','最简单的设计思维','2010-08-11'UNIONSELECT'设计模式','XV001020','徐峥','148','最具权威的程序设计书籍','2010-09-21'UNIONSELECT'数据结构与算法JAVA 版','XV001021','李寻欢','240','最好的程序设计书籍','2010-05-18'GO2.在Eclipse 中新建一个项目名为BookPagin ,并在其项目的src 下创建mons (公共包)、com.book.entity(实体包)、com.book.pagin(JavaBean 包) ,然后将SQL Server 的JDBC 驱动包复制到WebRoot 下的WEB-INF 下的lib 目录中。
3.在公共包中编写一个名为GetConncetion 的数据库连接的基类:package mons;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class GetConnection {protected Connection conn = null;//连接字符串protected PreparedStatement ps = null;//预编译并存储 SQL 指令protected ResultSet rs = null;//查询结果集private static final String DRIVER ="com.microsoft.sqlserver.jdbc.SQLServerDriver";//加载数据库驱动的字符串private static final String URL ="jdbc:sqlserver://localhost:1433;databaseName=BOOKDB";//连接数据库的字符串private static final String USERNAME = "sa";//数据库用户名private static final String PASSWORD = "accp";//数据库用户密码/***获得数据库连接*@return*/public Connection getConn() {Connection conn = null;try {Class.forName(DRIVER);//加载数据库驱动conn =DriverManager.getConnection(URL,USERNAME,PASSWORD);//连接数据库} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;}/** 释放资源*/public void closeAll(){try {if(rs != null){rs.close();}if(ps != null){ps.close();}if(conn != null){conn.close();}} catch (SQLException e) {e.printStackTrace();}finally{conn = null;ps = null;rs = null;}}}4.根据数据库中的TBL_BOOK 表编写实体类:package com.book.entity;public class Book {private int book_id;private String book_name;private String book_num;private String book_author;private double book_price;private String book_synopsis;private String book_publishTime;public String getBook_author() {return book_author;}public void setBook_author(String book_author) { this.book_author = book_author;}public int getBook_id() {return book_id;}public void setBook_id(int book_id) {this.book_id = book_id;}public String getBook_name() {return book_name;}public void setBook_name(String book_name) {this.book_name = book_name;}public String getBook_num() {return book_num;}public void setBook_num(String book_num) {this.book_num = book_num;}public double getBook_price() {return book_price;}public void setBook_price(double book_price) {this.book_price = book_price;}public String getBook_publishTime() {return book_publishTime;}public void setBook_publishTime(String book_publishTime) { this.book_publishTime = book_publishTime;}public String getBook_synopsis() {return book_synopsis;}public void setBook_synopsis(String book_synopsis) { this.book_synopsis = book_synopsis;}}5.编写分页查询类:package com.book.pagin;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import mons.GetConnection;import com.book.entity.Book;public class BookPaginQuery extends GetConnection {private final int PAGEROW = 8;//每页显示的行数private int countRow;//总行数private int countPage;//总页数private int currentlyPage;//当前第几页/***得到总页数*@return*/public int getCountPage() {return countPage;}/***设置总页数*@param countPage*/public void setCountPage() {//通过总行数设置总页数if (this.countRow % this.PAGEROW == 0) {//如果总行数除以每页显示的行数余数为零时,总页数等于它们的商this.countPage = this.countRow / this.PAGEROW;} else {//否则,总页数等于它们的商加1this.countPage = this.countRow / this.PAGEROW + 1;}}/***得到总行数*@return*/public int getCountRow() {return countRow;}/***设置总行数*@param countRow*/public void setCountRow() {//通过聚合函数查询 TBL_BOOK 表中一共有多少条数据,并把值存储到 countRow 中String sql = "SELECT COUNT(*) FROM TBL_BOOK";try {PreparedStatement ps =super.getConn().prepareStatement(sql);ResultSet rs = ps.executeQuery();if (rs.next()) {this.countRow = rs.getInt(1);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/***得到当前页数*@return*/public int getCurrentlyPage() {return currentlyPage;}/***设置当前页数*@param currentlyPage*/public void setCurrentlyPage(int currentlyPage) {this.currentlyPage = currentlyPage;/***分页查询*@param page当前页数*@return*/public List<Book> myBookPaginQuery(int page){List<Book> bookList = new ArrayList<Book>();int num = (page-1) * this.PAGEROW; //要被排除的行数String sql = "SELECT top("+this.PAGEROW+") * FROM TBL_BOOK WHERE book_id NOT IN (SELECT TOP("+num+") book_id FROM TBL_BOOK)";try {PreparedStatement ps =super.getConn().prepareStatement(sql);//预编译 SQL 指令并把预编译好的 SQL 存储在 PreparedStatement 对象中ResultSet rs = ps.executeQuery(); //执行预编译好的 SQL 指令,并把获得的查询结果集存储在 ResultSet 对象中while(rs.next()) {//通过 while 循环迭代出结果集中的所有数据,并把它们存储在 List<Book> 集合中Book book = new Book();book.setBook_id(rs.getInt("book_id"));book.setBook_name(rs.getString("book_name"));book.setBook_num(rs.getString("book_num"));book.setBook_author(rs.getString("book_author"));book.setBook_price(rs.getDouble("book_price"));book.setBook_synopsis(rs.getString("book_synopsis"));book.setBook_publishTime(rs.getString("book_publishTime"));bookList.add(book);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return bookList;}}6.编写JSP 页面,完成分页操作:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><jsp:directive.page import="com.book.pagin.BookPaginQuery"/><jsp:directive.page import="com.book.entity.Book"/><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>图书信息</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%request.setCharacterEncoding("UTF-8"); //设置编码集String strPageNum = request.getParameter("pageNum"); //获得当前页数的字符串int pageNum = 1;//把当前页数的字符串转化为数字,如果转化失败,则设置当前页数为 1 ,即首页try{pageNum = Integer.parseInt(strPageNum);} catch (Exception e){pageNum = 1;}BookPaginQuery bookPaginQuery = new BookPaginQuery();//实例化BookPaginQuery 类,得到 bookPaginQuery 对象bookPaginQuery.setCountRow(); //设置总行数bookPaginQuery.setCountPage(); //设置总页数int countPage = bookPaginQuery.getCountPage(); //获得总页数//如果当前页数小于 0 或大于总页数,则把当前页重新设为 1 ,即首页if (pageNum<=0 || pageNum>countPage){pageNum = 1;}bookPaginQuery.setCurrentlyPage(pageNum); //设置当前页int currentlyPage = bookPaginQuery.getCurrentlyPage(); //获得当前页List<Book> bookList = bookPaginQuery.myBookPaginQuery(pageNum); //分页查询if(bookList!=null && bookList.size()>0) {%><table border="1" align="center"><tr><th align="center">图书名称</th><th align="center">图书编号</th><th align="center">作者</th><th align="center">价格</th><th align="center">图书简介</th><th align="center">出版日期</th></tr><%for (int i=0; i<bookList.size(); i++) {Book book = bookList.get(i);%><tr><td width="200"><%=book.getBook_name() %></td><td width="100"><%=book.getBook_num() %></td><td width="50"><%=book.getBook_author() %></td><td width="50"><%=book.getBook_price() %></td><td width="300"><%=book.getBook_synopsis() %></td><tdwidth="100"><%=book.getBook_publishTime().substring(0,10) %></td> </tr><%}%><tr><td colspan="6" align="center"><%if(currentlyPage==1){%>共<%=countPage %>页 当前第<%=currentlyPage %>页 首页 上一页 <a href="index.jsp?pageNum=<%=currentlyPage+1 %>">下一页</a> <a href="index.jsp?pageNum=<%=countPage %>">尾页</a> <%}else if(currentlyPage==countPage){%>共<%=countPage %>页 当前第<%=currentlyPage %>页 <a href="index.jsp?pageNum=1">首页</a> <a href="index.jsp?pageNum=<%=currentlyPage-1 %>">上一页</a> 下一页 尾页 <%}else{%>共<%=countPage %>页 当前第<%=currentlyPage %>页 <a href="index.jsp?pageNum=1">首页</a> <a href="index.jsp?pageNum=<%=currentlyPage-1 %>">上一页</a> <a href="index.jsp?pageNum=<%=currentlyPage+1 %>">下一页</a> <a href="index.jsp?pageNum=<%=countPage %>">尾页</a> <%}%></td></tr></table><%}else{%><h2 align="center">对不起,没有相应的信息……</h2><%}%></body></html>到此为止,分页查询已经完成了。