转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
利用Struts结合Jbuilder7、MySql建立Web站点(2)--分页显示         ★★★★

利用Struts结合Jbuilder7、MySql建立Web站点(2)--分页显示

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2380 更新时间:2009/4/22 20:48:46
利用Struts结合Jbuilder7、MySql建立Web站点(2)--分页显示


作者:Sailing(蓝色虾)

iamcyh@263.net

本程序全部源代码:vod.zip

介绍:

本篇接着第一篇的内容,继续进行VOD网站的制作(第一篇《利用Struts结合Jbuilder7、MySql建立Web站点(1)--连接数据库》),

当需要将数据库中的大量内容供用户浏览的时候,我们一般采用两种方法,第一种很简单,一次性将数据库中的内容读出,接着全部

显示在网页上,这种方法在数据量较小的时候一般采用;还有一种方法就是分页显示,也是现在各大网站普遍采用的方式,关于分页

的方法多种多样,我这里采用的是普遍使用的采取移动数据库指针的方法。

建立PageInfo Bean

这个Bean的任务就是储存关于分页需要的所有信息,包括总共含有的页数,含有的纪录总数,当前的页数,上一页的页数,下一页的

页数,将这五条信息包含在同一个bean中将会给以后在jsp页面中的编程带来很大的方便,因为目前有许多网站将目前的页数,上一页

的页数和下一页的页数不放在bean中,而是在jsp页面通过当前的页数分别加上1和减去1得到,虽然这样很方便,但是这样做将会在Jsp

页面中产生逻辑的运算,破坏了MVC的规则,以上将5个变量放入一个bean的编程方法只是我的个人习惯,如果大家觉得有不妥的地方请

多多指教。 PageInfo的代码如下:

package vod.model;

import java.util.Vector;

public class PageInfo {
private int totalPage;//总共有多少页
private int resultCount;//总共有多少条纪录
private int page;//目前的页数
private int previousPage;//上一页
private int nextpage;//下一页

public void setTotalPage(int totalPage){
this.totalPage=totalPage;
}
public int getTotalPage(){
return totalPage;
}
//-------------------------------------------
public void setResultCount(int count){
this.resultCount=count;
}
public int getResultCount(){
return resultCount;
}
//-------------------------------------------
public void setPage(int page){
this.page=page;
}
public int getpage(){
return page;
}
//-------------------------------------------
public void setPreviousPage(int page){
this.previousPage=page;
}
public int getPreviousPage(){
return (this.page-1);
}
//-------------------------------------------
public void setNextPage(int page){
this.nextpage=page;
}
public int getNextPage(){
return (this.page+1);
}

//-------------------------------------------
/**
* 根据传来的数组生成一个PageInfo对象
* 我们约定数组中的index为0的为总页数
* index为1的纪录总数
* @param info
* @return
*/
public static PageInfo load(int[] info){
PageInfo pageinfo =new PageInfo();
int intValue=0;

intValue=info[0];
if(intValue > 0)
pageinfo.setTotalPage(intValue);

intValue=info[1];
if(intValue > 0)
pageinfo.setResultCount(intValue);

return pageinfo;
}
}


注意这里的load()方法中的int数组,我们约定数组中的第一个元素为总页数,第二个元素为纪录总数。这里的getPreviousPage()

方法没有直接返回previousPage,而是根据page的值减去1得到previousPage是为了以后调用的方便。

数据库的分页

我们在进行分页的读取之前我们首先要做的事情就是确定所要操作的数据库中的内容按照我们需要的每页显示多少数据量

可以分为几页,总共有多少数据。下面我们来看看这个分页代码(EvaluateDateBase.java)的实现:

package vod.model;

import java.sql.Connection;
import org.gjt.mm.mysql.jdbc2.ResultSet;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.SQLException;

public class EvaluateDateBase {
/**
*根据方法中的数据表的名称,连接,每页出现的纪录数方法返回一个PageInfo的实例
*/
public static PageInfo getPageInfo(String datebase,Connection conn,int pageSize) throws SQLException{
int totalPage=0;
int resultCount=0;
int[] info=new int[2];
String sql="";
if(conn==null)
throw new SQLException("No Conn in EvaluateDateBase");

ResultSet rsCount=null;

PreparedStatement psmt=null;

sql="select count(*) from "+datebase;//根据数据库的名字得到相对应的SQL语句

try{
psmt=conn.prepareStatement(sql);
rsCount=(ResultSet)psmt.executeQuery();
rsCount.next();
resultCount=rsCount.getInt(1);
rsCount.close();
}catch(SQLException e){
e.printStackTrace();
}

totalPage = (resultCount+pageSize-1) / pageSize;//统计总页数
//还记得我们的约定吗?
// index为0的为总页数,index为1的为纪录总数
info[0]=totalPage;
info[1]=resultCount;
PageInfo pageinfo=PageInfo.load(info);
return pageinfo;
}
}


这里我们使用了sql="select count(*) from "+datebase; 来得到对应的SQL语句,根据这个SQL语句得到的结果集通过getInt(1)

将得到这个结果集含有多少条纪录。并且(resultCount+pageSize-1) / pageSize得到按照需要的每页显示的纪录数得到的总页

数,可能初学者会疑惑为什么不直接用结果总数除以每页需要的结果数得到总页数呢,这样是因为如果含有的记录数不能被整除

的话,那么统计得到的总页数将会少一页,按照上面的方法计算将会得到正确的数值,有兴趣的话大家可以算算,当然也可以通过

另外一种方法实现就是如果不能整除就加上1的方法实现。最后将得到的总页数和总纪录数放入一个PageInfo实例中以便以后调用。

取得所有关于足球的影片,并按照需要的范围取得合适的LinkedList

要取得分页所需要的数据库中的内容所需要的代码将在这儿出现,我们的分页原理很简单,举个例子:目前我们设定每一页只显示10

条纪录,那么假如用户要取得第2页的内容,那么就是第11-20条纪录,我们就先将数据库的游标移到第10条记录上,然后通过while

和next()结合的方法取得第11-20 条的数据。然后读取每一条纪录,通过Football的load()将纪录中的数据库的字段与Football Bean

中的值匹配并将其放入一个LinkedList中。

代码如下(MoreFootball.java):

package vod.model;

import java.sql.Connection;
import org.gjt.mm.mysql.jdbc2.ResultSet;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.SQLException;
import java.util.LinkedList;

public class MoreFootball {
Connection conn;
public void setConn(Connection conn){
this.conn=conn;
}

public LinkedList getFootballList(int page,int pageSize) throws SQLException{

LinkedList footballList;
if(conn==null)
throw new SQLException("No Connection in MoreFootball");
PreparedStatement pstmt = null;
ResultSet rs = null;
footballList=new LinkedList();

try{
pstmt = conn.prepareStatement("select * from football order by date desc");
rs = (ResultSet)pstmt.executeQuery();
//根据目前需要显示的页数和每一页要求显示的纪录条数移动数据库的指针
int i = (page-1) * pageSize;

//由于不能定位到0这个位置
if(i!=0)
rs.absolute(i);//如果i为10,那么数据库的指针将会移动到第十条数据上
/*
for(int j=0;j<i;j++)
rs.next();
*/
int ii=0;
while(rs.next() && ii<pageSize){
footballList.add(Football.load(rs));
ii++;
}
}catch(SQLException e){
e.printStackTrace();
}
finally {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
}

return footballList;
}
}

注意这里被注释掉的代码:
/*
for(int j=0;j<i;j++)
rs.next();
*/
如果你的JDBC驱动程序不支持absolute()这个方法,那么这个for循环竟是一个很不错的替代品。

MoreFootballAction的编写,这里PageInfo将起到关键性的作用

这个action的工作流程为,首先从web.xml文件中取得关于每一页显示多少条纪录的信息,在web.xml中通过
<context-param>
<param-name>pageSize</param-name>
<param-value>10</param-value>
</context-param>
定义,定义每页显示纪录10条,这个数值可以通过Servelet中的context的getInitParameter()方法取得。接着得到用户

需要第几页的请求(这个请求的页数将会作为参数跟在jsp中的链接后面),并对用户请求的页数进行处理,保证其值在

合理的范围之内;然后通过EvaluateDateBas的静态方法getPageInfo()获得关于所要操作的数据表的含有总共有多少条纪录

和总共有多少页的信息的PageInfo实例,接着将刚刚得到的用户请求的页数信息与得到的这个实例中的总页数进行比较,如

果用户请求的页数大于总页数,那么将用户请求的页数等于总页数,如果用户请求的页数小于0的话,那么就将用户请求的页

数等于1;最后将调整过的当前用户请求的页数传入PageInfo的实例,以便于后面获得用户请求的页数的前一页和后一页的页

数,程序的最后根据用户请求的页数和每页显示多少条目传入getFootballList()得到包含有相应条目的LinkedList,并且将

其放入session,便于以后在页面中调用。

代码如下:

package vod.controller;

import vod.model.PageInfo;
import vod.model.MoreFootball;
import vod.model.EvaluateDateBase;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Locale;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.util.MessageResources;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;

public class MoreFootballAction extends Action {
Connection connection;
LinkedList footballList;

public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException{

ActionErrors errors = new ActionErrors();
HttpSession session = request.getSession();

int page=0;//目前需要的页数
int pageSize=0;//每页显示多少条数据
PageInfo footballPageInfo=null;//关于页数的相关信息
String tempPage;

//从web.xml文件中取得每页显示的条目数(我设置为10条)
pageSize=Integer.parseInt((String)servlet.getServletContext().getInitParameter("pageSize"));

//如果没有明确页数那么默认为第一页
tempPage=request.getParameter("page");
if(tempPage==null)
tempPage="1";
page=Integer.parseInt(tempPage);

try {
DataSource dataSource =servlet.findDataSource(null);
connection =dataSource.getConnection();
//检查session中是否已经存在了PageInfo,如果没有就执行查询,并且将footballPageInfo
//放入session之中
//如果已经存在的话直接从session中读取
if(session.getAttribute("footballPageInfo")==null){
//参数分别为数据表名称,连接,每一页显示多少条目
footballPageInfo=EvaluateDateBase.getPageInfo("football",connection,pageSize);
}else{
footballPageInfo=(PageInfo)session.getAttribute("footballPageInfo");
}

if(page > footballPageInfo.getTotalPage()){
page=footballPageInfo.getTotalPage();
}else if(page < 0){
page=1;
}
//设置footballPageInfo中的上一页和下一页的数值
footballPageInfo.setPage(page);
//将footballPageInfo放入session
session.setAttribute("footballPageInfo",footballPageInfo);

footballList=new LinkedList();
MoreFootball morefootball=new MoreFootball();
morefootball.setConn(connection);//设置数据的连接
//根据需要的页数和每页显示的页数条数得到LinkedList
footballList=morefootball.getFootballList(page,pageSize);
if (footballList==null) {
saveErrors(request, errors);
return (new ActionForward("No footballList in vod.controller.MoreFootallAction"));
}

session.setAttribute("footballList",footballList);//将取得的foot

[1] [2] [3]  下一页


[MySql]PHP存取 Mysql 数据乱码终极解决方案  [MySql]解决Table xxx is marked as crashed and should …
[MySql][MySQL]快速解决"is marked as crashed and shoul…  [MySql]MySQL DELETE语法用法详解
[MySql]mysql中时间日期格式化  [MySql]修改mysql导入文件大小限制
[其他]MySql常用命令大全  [Web开发]把ACCESS的数据导入到Mysql中的方法详解
[MySql]解决mysql 1040错误Too many connections的方法  [聊天工具]Gmail推出新功能:Web Clip__天极Yesky
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台