- Java Web程序开发范例宝典
- 王国辉 郭铁 李根福编著
- 930字
- 2020-06-27 11:01:04
4.6 分页显示数据
无论是Web程序还是应用程序,都会对数据表中的数据进行显示,如果数据很多,在应用程序中可以用滚动条实现记录的滚动,而在Web程序中只能通过分页显示技术来实现记录的滚动。
实例088 利用SQL语句实现分页
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\088
实例说明
在网页中如果显示的数据太多就会占据过多的页面,而且显示速度也会很慢。为了控制每次在页面上显示数据的数量,就可以利用分页来显示数据。程序运行结果如图4.46所示。
图4.46 利用SQL语句实现分页
技术要点
在SQL Server中要实现SQL分页,需要使用子查询来获取上一页的数据进行对比,进而获取最新的数据。使用子查询获取分页数据的语法格式如下:
"SELECT TOP [pageSize] * FROM [table] WHERE id NOT IN( SELECT TOP [preNum] id FROM [table] ORDER BY ID DESC) ORDER BY ID DESC";
● pageSize:数据分页的分页大小。
● preNum:上一页数据查询的起始范围。
● table:数据表名称。
例如要从数据库的第10条数据开始查询5条数据,编写的SQL查询语句如下:
"SELECT TOP 5 * FROM tb_SQLServerFenye WHERE id NOT IN( SELECT TOP 10 id FROM tb_SQLServerFenye ORDER BY ID DESC) ORDER BY ID DESC";
注意:本实例分页时需要传递一个当前页的参数,该参数的传递形式是在页的地址后面附加参数信息。如:index.jsp?Page=1。Page是参数名,1为参数值。
实现过程
(1)创建操作数据库类UserDao。通过构造方法UserDao()加载数据库驱动,定义Connection()方法创建与数据库的连接,定义selectStatic()方法执行查询操作,定义closeConnection()方法关闭数据库。关键代码如下:
public class UserDao { String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_database04"; //url,数据库 String username="sa"; //用户名 String password=""; //密码 private Connection con = null; private Statement stmt = null; private ResultSet rs = null; public UserDao(){ //通过构造方法加载数据库驱动 try { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); } catch (Exception ex) { System.out.println("数据库加载失败"); } } public boolean Connection(){ //创建数据库连接 try { con = DriverManager.getConnection(url, username, password); } catch (SQLException e) { System.out.println(e.getMessage()); System.out.println("creatConnectionError!"); } return true; } public ResultSet selectStatic(String sql)throws SQLException{ //对数据库的查询操作 ResultSet rs=null; if (con == null) { Connection(); } try { stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); rs = stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } public void closeConnection(){ //关闭数据库的操作 if (con != null && stmt != null && rs != null) { try { rs.close(); stmt.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); System.out.println("Failed to close connection!"); } finally { con = null; } } } }
(2)创建index.jsp页面。首先通过JavaBean标签调用数据可靠操作类UserDao,并定义在分页输出数据中使用的参数,代码如下:
<%@page contentType="text/html" pageEncoding="GBK" import="java.sql.*,java.util.*,java.lang.*"%> <jsp:useBean id="selectall" scope="page" class="com.pkh.dao.UserDao"></jsp:useBean> <%! int CountPage = 0; int CurrPage = 1; int PageSize = 5; int CountRow = 0; %>
然后,设置接收数据的参数,当第一次显示页面参数为空时,设为1。根据当前页面的参数获取到显示的数据集,代码如下:
<% String StrPage = request.getParameter("Page"); if(StrPage==null){ //判断当页面的值为空时 CurrPage=1; //赋值为1 } else { CurrPage=Integer.parseInt(StrPage); //如果不为空则获取该值 } String SQL="Select*From tb_ClassList"; //定义查询语句 ResultSet Rs=selectall.selectStatic(SQL); //执行查询语句 Rs.last(); //获取查询结果集 int i=0; //定义数字变量 CountRow=Rs.getRow(); //获取查询结果集的行数 CountPage=(CountRow/PageSize); //计算将数据分成几页 if(CountRow % PageSize>0) //判断如果页数大于0 CountPage++; //则增加该值 Integer n=(CurrPage-1)*5+1; //定义变量上一页的结束值 SQL = "select top 5 * from tb_ClassList where CID>=" + "(" +"Select Max(CID)From(Select top"+n.toString() +"*From tb_ClassList)as Class"+")"; Rs=selectall.selectStatic(SQL); //执行查询语句 while(Rs.next()){ //循环输出查询结果 %> <tr> <td nowrap><span class="style3"><%=Rs.getString("CID")%></span></td> <td nowrap><span class="style3"><%=Rs.getString("CName")%></span></td> <td nowrap><span class="style3"><%=Rs.getString("CStartDate")%></span></td> </tr> <% } selectall.closeConnection(); //关闭数据库 %>
设置下一页、上一页和最后一页超级链接,链接到index.jsp页面,指定Page作为栏目标识,将页数作为参数值,代码如下:
<tr> <td width="251"> [<%=CurrPage%>/<%=CountPage%>] 每页5条 共<%=CountRow%>条记录<%=(CurrPage-1)*5+1%> </td> <td width="260"><div align="right"> <% if(CurrPage>1){ %> <a href="index.jsp?Page=<%=CurrPage -1%>">上一页</a> <% } %> <% if(CurrPage<CountPage){ %> <a href="index.jsp?Page=<%=CurrPage + 1%>">下一页</a> <% } %> <a href="index.jsp?Page=<%=CountPage%>">最后一页</a></div> </td> </tr>
举一反三
根据本实例,读者可以:
编写带分页功能的故事程序;
客户信息分页查看功能。
实例089 利用结果集进行分页
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\089
实例说明
数据的分页显示是Web程序的基本技术。通过简单的超链接就可以实现数据在页面上的分页显示。本实例是通过在页面上输入课程类型,查询该类型的所有数据,然后再分页显示,如图4.47所示。
图4.47 利用结果集进行分页
技术要点
本实例是使用结果集ResultSet将数据表中的记录全部加载到结果集中,然后利用结果集的absolute()方法跳转到指定的记录,作为本页的首记录。通过在链接的地址中附加参数传递当前应显示的页码。
实现过程
(1)创建数据库操作类,定义构造方法UserDao()加载数据库驱动,定义Connection()方法创建与数据库的连接,定义selectStatic()方法执行查询操作,定义closeConnection()方法关闭数据库。详细代码请参考光盘中的内容,也可以查看实例088的实现过程。
(2)创建index.jsp页面。首先,通过JavaBean标签调用数据可靠操作类UserDao,并定义在分页输出数据中使用的参数。
<%@page contentType="text/html" pageEncoding="GBK" import="java.sql.*,java.util.*,java.lang.*"%> <jsp:useBean id="selectall" scope="page" class="com.pkh.dao.UserDao"></jsp:useBean> <%! int CountPage = 0; int CurrPage = 1; int PageSize = 5; int CountRow = 0; %>
然后,根据传递的参数获取当前显示的页码,执行查询结语句,获取到结果集并定位显示数据。
<% String StrPage=(String)request.getParameter("Page"); //获取当前页面 if (StrPage == null) { CurrPage = 1; } else{ CurrPage = Integer.parseInt(StrPage); } ResultSet Rs; //定义查询结果集变量 String SQL; //定义SQL语句变量 if (v != null && !v.equals("")) { SQL="Select*From tb_ClassList Where CType='"+v+"'"; //编写查询语句 } else { SQL = "Select * From tb_ClassList"; } Rs=selectall.selectStatic(SQL); //执行查询语句 Rs.last(); int i = 0; CountRow=Rs.getRow(); //获取查询结果集中字段数 CountPage=(CountRow/PageSize); //计算数据可以分成几页 if (CountRow % PageSize > 0) CountPage++; Rs.first(); //获取第一条数据 if (CountRow > 0) { Rs.absolute(CurrPage*PageSize-PageSize+1); //指定跳转页码 while(i<PageSize&&!Rs.isAfterLast()){ //循环输出数据 %> <tr> <td align="center"nowrap bgcolor="#FFFFFF"><span class="style3"><%=Rs.getString("CID")%></span></td> </tr> <% Rs.next(); //执行下一条 i++; } selectall.closeConnection(); //关闭数据库 } %>
最后,创建上一页、下一页和最后一页超级链接,链接到index.jsp页面,指定Page作为栏目标识,将页数作为参数值。关键代码如下:
<tr> <td width="251" height="30"> [<%=CurrPage%>/<%=CountPage%>] 每页5条 共<%=CountRow%>条记录 </td> <td width="260"><div align="right"> <% if (CurrPage > 1) { %> <a href="index.jsp?Page=<%=CurrPage -1%>&Values=<%=v%>">上一页</a> <% } %> <% if (CurrPage < CountPage) { %> <a href="index.jsp?Page=<%=CurrPage + 1%>&Values=<%=v%>">下一页</a> <% } %> <a href="index.jsp?Page=<%=CountPage%>&Values=<%=v%>">最后一页</a></div> </td> </tr>
举一反三
根据本实例,读者可以:
分页显示相应类别的商品信息;
分页显示公告信息。
实例090 转到指定页的分页
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\090
实例说明
对于数据分页较少的情况可以使用上一页或下一页进行数据翻页,如果数据过多,通过上一页或是下一页要想显示某一指定的页面就会很不方便。因此本实例实现一个具有跳转功能的分页显示。这样使用者就可以很方便地跳转到指定页面。运行程序,输入页次,单击GO按钮,即可跳转到指定页,如图4.48所示。
图4.48 转到指定页的分页
技术要点
本实例结合了两种页面间传递参数的方法:地址传递和表单传递,地址传递适用于简单的不包含中文的参数传递,而表单传递就可以传递多种类型的数据。在本实例中,使用两种方式传递的是同一个参数,该参数用来指定当前页码,这样不论是单击GO按钮还是单击“上一页”及“下一页”超级链接都可以翻页。
实现过程
(1)创建数据库操作类,定义构造方法UserDao()加载数据库驱动,定义Connection()方法创建与数据库的连接,定义selectStatic()方法执行查询操作,定义closeConnection()方法关闭数据库。详细代码参考实例088或者实例089的实现过程。
(2)创建index.jsp页面。首先,通过JavaBean标签调用数据可靠操作类UserDao,并定义在分页输出数据中使用的参数。
<%@ page language="java" import="java.sql.*,java.lang.*,java.util.*" contentType="text/html; charset=gb2312" pageEncoding="GBK"%> <jsp:useBean id="selectall" scope="page" class="com.pkh.dao.UserDao" /> <%! int CountPage = 0; int CurrPage = 1; int PageSize = 5; int CountRow = 0; %>
然后,根据传递的参数获取当前显示的页码,执行查询语句,获取到结果集并定位显示数据。
<% String StrPage=request.getParameter("Page"); //获取当前页 if (StrPage == null || StrPage == "") { CurrPage=1; //定义当前页为第1页 } else { CurrPage=Integer.parseInt(StrPage); //获取当前页的值 } ResultSet Rs; String SQL="Select*From tb_ClassList"; //定义SQL语句 Rs=selectall.selectStatic(SQL); //执行查询语句 Rs.last(); int i = 0; CountRow=Rs.getRow(); //获取查询结果集中的记录数 CountPage=(CountRow/PageSize); //计算总的页数 if (CountRow % PageSize > 0) CountPage++; Rs.first(); //获取第1条记录 if (CountRow > 0) { Rs.absolute(CurrPage*PageSize-PageSize+1); //指定跳转的页码 while(i<PageSize&&!Rs.isAfterLast()){ //循环输出数据 %> <tr> <td height="30" align="center" nowrap> <span class="style3"><%=Rs.getString("CID")%></span> </td> </tr> <% Rs.next(); i++; } selectall.closeConnection(); } %>
最后,创建上一页、下一页和最后一页超级链接,链接到index.jsp页面,指定Page作为栏目标识,将页数作为参数值。关键代码如下:
<tr><td height="30" nowrap> [<%=CurrPage%>/<%=CountPage%>] 每页5条 共<%=CountRow%>条记录 请输入页次 <input name="Page" type="text" size="4"> <input type="submit" name="Submit" value="GO"> <% if (CurrPage > 1) { %> <a href="index.jsp?Page=<%=CurrPage -1%>&Values=<%=v%>">上一页</a> <% } %> <% if (CurrPage < CountPage) { %> <a href="index.jsp?Page=<%=CurrPage + 1%>&Values=<%=v%>">下一页</a> <% } %> <a href="index.jsp?Page=<%=CountPage%>&Values=<%=v%>">最后一页</a> </td></tr>
举一反三
根据本实例,读者可以:
在图书管理系统中实现数据分页;
实现以转到指定页的形式浏览客户信息。
实例091 具有页码跳转功能的分页
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\091
实例说明
在设计网站程序时,会应用到大量的数据信息。有时反馈给用户的记录数是不确定的,当结果集中的数据较多时,就需要分页显示这些数据,避免给用户浏览数据带来不便。为了解决这个问题,设计了具有页码跳转功能的分页数据显示。程序运行结果如图4.49所示。
图4.49 具有页码跳转功能的分页
技术要点
本实例是将页码以超级链接的形式显示在表格的右下方,这样可以任意单击并跳转到指定的页面,在程序中使用For循环语句将所有页码显示在表格的右下方。
For循环语句的语法如下:
For (initialization;Boolean-expression;step) Statement
参数说明:
● initialization:循环变量的定义与初始值。
● Boolean-expression:布尔表达式,作为循环的终止条件。
● step:循环变量递增或递减的步长。
● Statement:循环语句体。
实现过程
(1)创建数据库操作类,定义构造方法UserDao()加载数据库驱动,定义Connection()方法创建与数据库的连接,定义selectStatic()方法执行查询操作,定义closeConnection()方法关闭数据库。详细代码参考实例088或者实例089的实现过程。
(2)创建index.jsp页面。首先,通过JavaBean标签调用数据可靠操作类UserDao,并定义在分页输出数据中使用的参数。
<%@ page language="java" import="java.sql.*,java.lang.*,java.util.*" contentType="text/html; charset=gb2312" pageEncoding="GBK"%> <jsp:useBean id="selectall" scope="page" class="com.pkh.dao.UserDao" /> <%! int CountPage = 0; int CurrPage = 1; int PageSize = 5; int CountRow = 0; %>
然后,根据传递的参数获取当前显示的页码,执行查询结语句,获取到结果集并定位显示数据。
<% String StrPage=request.getParameter("Page"); //获取当前页 if (StrPage == null || StrPage == "") { CurrPage=1; //定义当前页为第1页 } else { CurrPage=Integer.parseInt(StrPage); //获取当前页的值 } ResultSet Rs; String SQL="Select*From tb_ClassList"; //定义SQL语句 Rs=selectall.selectStatic(SQL); //执行查询语句 Rs.last(); int i = 0; CountRow=Rs.getRow(); //获取查询结果集中的记录数 CountPage=(CountRow/PageSize); //计算总的页数 if (CountRow % PageSize > 0) CountPage++; Rs.first(); //获取第1条记录 if (CountRow > 0) { Rs.absolute(CurrPage*PageSize-PageSize+1); //指定跳转的页码 while(i<PageSize&&!Rs.isAfterLast()){ //循环输出数据 %> <tr> <td height="30" align="center" nowrap> <span class="style3"><%=Rs.getString("CID")%></span> </td> </tr> <% Rs.next(); i++; } selectall.closeConnection(); } %>
最后,通过for循环语句输出页码,并设置页面跳转的超级链接。关键代码如下:
<tr> <td width="251">[<%=CurrPage%>/<%=CountPage%>] 每页5条 共<%=CountRow%>条记录</td> <td width="260"><div align="right"> <% for (int ii = 1; ii <= CountPage; ii++) { %> <a href="index.jsp?Page=<%=ii%>"><%=ii%></a> <% } %> </div></td> </tr>
举一反三
根据本实例,读者可以:
编写搜索程序;
在图书资源程序中实现分页功能;
在信息资源程序中实现分页功能。
实例092 分栏显示
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\092
实例说明
在设计信息资源类的网站时,可以有很多方法来显示资源信息。例如之前编写的分页显示可以用来显示资源信息,但是这种方式不能很好地体现出资源信息的分类,下面介绍一种分栏显示资源信息的方法用以显示不同类别的资源信息。实例运行结果如图4.50所示。
图4.50 分栏显示
技术要点
如图4.50所示,分栏具有很高的灵活性,因为本实例所实现的分栏并不是用表格分出来的,而是单纯的使用行和列输出信息。创建UserDao类实现对数据库的操作;创建Sort类,在该类中定义获取记录个数的方法GetCount(),定义返回结果集的方法GetRs()。最后通过双重For循环控制行、列的输出信息。
实现过程
(1)数据库操作类UserDao的创建方法与前面讲解的分页实例是相同的,这里不再赘述。
(2)创建Sort类,定义获取记录个数和返回结果集的方法。代码如下:
public class Sort { UserDao dao=new UserDao(); //实例化数据库操作类 public int GetCount(final String SQL) { try { ResultSet Rs=dao.selectStatic(SQL); //执行查询语句 Rs.last(); return Rs.getRow(); //获取结果集中的记录数 } catch (SQLException e) { System.out.println("组数量获取失败!"); return 0; } } public ResultSet GetRs(final String SQL) { try { ResultSet Rs=dao.selectStatic(SQL); //执行查询语句 return Rs; //返回结果集 } catch (SQLException e) { System.out.println("记录数量获取失败!"); return null; } } }
(3)创建index.jsp页面,首先通过JavaBean标签调用UserDao类和Sort类;然后编写SQL语句,执行查询操作;最后通过双重For循环实现查询结果的分栏输出。关键代码如下:
<%@ page language="java" import="java.sql.*,java.lang.*,java.util.*" contentType="text/html; charset=gbk" pageEncoding="GBK"%> <jsp:useBean id="selectall" scope="page" class="com.pkh.dao.UserDao" /> <jsp:useBean id="sort" scope="page" class="com.pkh.sort.Sort" /> <% int RowCount=sort.GetCount("Select*From tb_BookUnit"); //记录数 ResultSet Rs=sort.GetRs("Select*From tb_BookUnit"); //返回查询结果集 int HRow=RowCount/5; //行数 if (RowCount%5>0) HRow++; for(int i=0;i<HRow;i++){%> <p> <% for(int j=i*5+1;j<=(i+1)*5;j++){ Rs.absolute(j); if (Rs.isAfterLast()) break; %> <a href="index.jsp"><%=Rs.getString("BName")%></a> <% } %> </p> <% } %>
举一反三
根据本实例,读者可以:
编写销售排行;
分栏输出上市新品。
实例093 分类、分栏显示
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\093
实例说明
在进行网站程序设计时,图片通常会以分类、分栏的方式显示在页面中,让图片有序地显示出来,使整个页面整齐明了。运行结果如图4.51所示。
图4.51 分类、分栏显示
技术要点
为了使图片输出更为灵活,本实例采用了用一个图片模型通过循环输出分类、分栏的效果。最外层的循环为控制分类的循环,中间层的循环控制当前类中图片的行数,最里层的循环控制了每一行的列数。这样就可以完整地输出一个分类、分栏的图片页面。
实现过程
(1)创建数据库操作类的方法可以参考实例088的内容,这里不再赘述。
(2)创建index.jsp页面,分类、分栏输出图片资源。首先通过JavaBean标签调用UserDao类和Sort类,定义输出图片资源使用的变量和SQL语句。
<%@ page language="java" import="java.sql.*,java.lang.*,java.util.*" contentType="text/html; charset=gbk" pageEncoding="GBK"%> <jsp:useBean id="selectall" scope="page" class="com.pkh.dao.UserDao" /> <jsp:useBean id="sort" scope="page" class="com.pkh.sort.Sort" /> <%! int GroupCount = 0; int ImageCount = 0; int RowCount = 0; static String GroupSQL = "Select SType From tb_SortImage Group by SType"; static String RowSQL = "Select * From tb_SortImage Where SType = "; %>
然后,通过分类循环、行循环和列循环输出图片资源,关键代码如下:
<table width="757" height="398" border="0" align="center"> <% ResultSet GRs = sort.GetRs(GroupSQL); while(GRs.next()){ %> <tr><td align="center" valign="top"> <!-- 内表格 --> <table width="719" height="159" border="0" align="center" > <tr> <td height="24" colspan="3"><span class="style2"><%=GRs.getString("SType")%></span></td> </tr> <tr> <% ImageCount=sort.GetCount(RowSQL+"'"+GRs.getString("SType")+"'"); //当前组图片总数 RowCount = ImageCount/6;//当前组行数 if (ImageCount%6>0) RowCount++; ResultSet RRs=sort.GetRs(RowSQL+"'"+GRs.getString("SType")+"'"); //当前组记录集 for (int j =0;j<RowCount;j++){ %> <% for (int n = (j)*6;n<(j+1)*6;n++){ RRs.absolute(n+1); if (RRs.isAfterLast()) break; %> <td width="178" height="129"> <!-- 图片表格 --> <table width="94" height="127" border="0" > <tr> <td width="88" height="105"><div align="left"> <img src="<%=RRs.getString("SPath")%>" width="88" height="103"></div> </td> </tr> <tr><td height="15"><div align="center" class="style1"> <a href="index.jsp">[显示全图]</a></div></td> </tr> </table> <!-- 图片表格 --> </td> <% } %> </tr> <% } %> </table> <!-- 内表格 --> </td> <% } %> </tr> </table>
举一反三
根据本实例,读者可以:
编写图书分类程序;
编写药品分类程序。
实例094 对超长文本数据进行分页显示
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\094
实例说明
在网页中显示一些文本过长的信息,例如小说、简介等信息。如果将这样的信息全部显示在一个页面中会很不方便,这时就需要将这段超长文本分页显示在网页中的某个区域中。程序运行结果如图4.52所示。
图4.52 对超长文本数据进行分页显示
技术要点
本实例是将要显示的信息一次保存在String类型的对象中,并通过该对象的总长度和一次显示的长度计算总共有多少页,然后通过substring()方法获取当前页显示的内容。
String类型对象方法介绍如下。
● length()方法:返回字符串的长度。
● replace(char oldChar, char newChar)方法:返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar而生成的。
参数说明如下。
● oldChar:字符串中的字符,用来被新字符所替换。
● newChar:用来替换旧字符的新字符。
● substring(int beginIndex, int endIndex)方法:返回一个新字符串,它是此字符串的一个子字符串。
● beginIndex:获取子字符串在原字符串中的起始位置。
● EndIndex:获取子字符串在原字符串中的结束位置。
实现过程
(1)创建数据库操作类UserDao,读取数据库中的数据。
(2)在index.jsp页面中,首先通过JavaBean标签调用sort类,获取字符串的总长度和起始页的页码。代码如下:
<% ResultSet Rs=GetRs("Select*From Demo_Tab"); //读取数据库中的结果集 String Demo=""; //定义变量 while(Rs.next()) //循环输出结果 Demo += Rs.getString("Demo"); int Size=400; //定义每页输出400个字节 int Len=Demo.length(); //获取总字符的长度 int CountPage=Len/Size; //计算共有几页 if (Len % Size > 0) CountPage++; int left; if (request.getParameter("page1") == null) { left = 0; } else { left = Integer.parseInt(request.getParameter("page1").toString()); } %>
然后,输出当前页的信息。left为子字符串的起始位置,Size为获取字符串的长度。代码如下:
<% if (left + Size > Len) { %> <%=Demo.substring(left, left + Len - left)%> <% } else { %> <%=Demo.substring(left, left + Size)%> <% } %>
最后,设置翻页超级链接,通过参数传递子字符串的起始位置。代码如下:
<a href="index.jsp?page1=0">第一页</a> <% if(left>0){ %> <a href="index.jsp?page1=<%=left-Size%>">上一页</a> <% } %> <% if(left<Len-Size){ %> <a href="index.jsp?page1=<%=left+Size%>">下一页</a> <% } %> <a href="index.jsp?page1=<%=Len-(Len%Size)%>">最后一页</a>
举一反三
根据本实例,读者可以:
开发小说网站;
编写图书信息网站。
实例095 Hibernate分页
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\04\095
实例说明
在Web项目中,经常需要将数据库中的信息显示在页面当中,当数据库中的信息过多的时候就需要采取分页显示的方法,在不同的数据库中实现分页的方法也各不相同。hibernate提供了一个支持不同数据库的分页机制,这样一来,无论底层使用什么样的数据库,都可以利用统一的接口进行分页操作。程序运行结果如图4.53所示。
图4.53 hibernate分页
技术要点
本实例在实现hibernate分页的时候主要用hibernate中的Query对象,通过setFirstResult()方法设置起始记录的位置,通过setMaxResults()方法设置要查询记录的条数,最后再通过list()方法获取查询到的数据。
实现过程
(1)下载hibernate工具包,并将其导入到项目当中。hibernate工具包可以在其官方网站(http://www.hibernate.org)中下载。
(2)编写配置文件hibernate.cfg.xml与类文件HibernateSessionFactory.java。
(3)本实例使用的是MySQL数据库,数据库用户名是root,密码是111。数据库名称是db_database04,数据表是tb_employeeinfo。
(4)编写持久化类Employeeinfo.java和与其对应的映射文件Employeeinfo.hbm.xml。
(5)在hibernate.cfg.xml文件中配置映射文件,在<session-factory>元素中加入如下代码:
<mapping resource="com/jwy/dao/Employeeinfo.hbm.xml" />
(6)编写show.jsp文件,用于获取Query对象,对数据库进行查询操作,关键代码如下:
<table align="center"border="1"> <tr> <td>编号</td><td>姓名</td><td>姓别</td><td>年龄</td><td>电话</td><td>地址</td> </tr> <% int cPage =1; if(request.getParameter("cPage")!=null&&!"".equals(request.getParameter("cPage"))){ cPage=Integer.parseInt(request.getParameter("cPage")); //获取要查询的页数 } int sum = 3; //每页记录的条数 Session hSession=HibernateSessionFactory.getSession(); //创建session对象 Query q=hSession.createQuery("select count(*)from Employeeinfo"); //创建query对象 Object o=q.uniqueResult(); //获取唯一的结果 int count=(int)Math.ceil(Double.valueOf(o.toString())/(double)sum); //计算出总页数 q=hSession.createQuery("from Employeeinfo"); //创建查询对象 q.setFirstResult((cPage-1)*sum); //输入起始的记录数 q.setMaxResults(sum); List<Employeeinfo>list=q.list(); //执行查询,获取结果 hSession.close(); //关闭对象,释放资源 for (int i = 0; i < list.size(); i++) { Employeeinfo e = list.get(i); %> <tr> <td><%=e.getId()%></td> <td><%=e.getName()%></td> <td><%=e.getSex()%></td> <td><%=e.getAge()%></td> <td><%=e.getTel()%></td> <td><%=e.getAddr()%></td> </tr> <% } %> </table> <center> <%=cPage <= 1 ? "" : "<a href='show.jsp?cPage="+ (cPage -1) + "'>上一页</a>"%> 当前第<%=cPage%>页 <%=cPage >= count ? "" : "<a href='show.jsp?cPage="+ (cPage + 1) + "'>下一页</a>"%> 共<%=count%>页 </center>
举一反三
根据本实例,读者可以:
按照条件进行分页查询;
用户自定义每页的记录数。