JAVA WEB 分页

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA WEB 分页相关的知识,希望对你有一定的参考价值。

JAVA WEB分页总是让人心烦,
分要多少给多少
谁有这方面的一些心得请提出宝贵的意见,我想制定一组类提供接口实现分页效果
条件分3点:
1,SQL的执行性能要最好
2,不能破坏MVC模式
3,通用.
哎,大家把题目看清楚。。。
我不是问怎么分页的。分页早就会用了。
而是
模式+性能+通用,
就好像hibernater里面有分页的功能,不过不适合非常复杂的SQL
比如我这几天写的SQL都是几千个字符以上。。

这是我自己写的,不知道对lz有没有用
分页包括3个类Page.java,PageService.java,PageSizeConfig.java
一个接口:PageDAO
一个配置文件:page.xml
下面是源码:(比较懒,没有写注释)
Page.java
public class Page
public int pageSize; //页面大小
private int rowSize;//数据总数
private int pageConut;//页数
private int page;//当前页数

public Page(int rowSize,int page,int pageSize)

this.rowSize=rowSize;
this.pageSize=pageSize;
pageConut=(rowSize-1)/pageSize+1;
this.page=page;


public int getRowSize()
return rowSize;

public void setRowSize(int rowSize)
this.rowSize = rowSize;
pageConut=(rowSize-1)/pageSize+1;

public int getPageConut()
return pageConut;

public void setPageConut(int pageConut)
this.pageConut = pageConut;

public int getPage()
return page;

public void setPage(int page)
this.page = page;


//首页
public void first()

page=1;

//末页
public void last()

page=pageConut;

//下一页
public void next()

page++;
if(page>pageConut)

page=pageConut;


//上一页
public void previous()

page--;
if(page<1)

page=1;


//转到第currentPage页
public void go(int currentPage)

page=currentPage;
if(page<1)

page=1;

if(page>pageConut)

page=pageConut;


/**
* 获取"下一页"的可用状态
* 返回空表示不可用,相反则可用
* @return
*/
public String getNext()

if(page<pageConut)

return "next";

return "";

/**
* 获取"上一页"的可用状态
* 返回空表示不可用,相反则可用
* @return
*/
public String getPrevious()

if(page>1)

return "previous";

return "";


public int getPageSize()
return pageSize;



PageServise.java
public class PageService
public static void service(HttpServletRequest request,PageDAO dao,String session)

int pageSize=PageSizeConfig.pageSize(dao.getClass().getName());
String pageAction=request.getParameter("pageAction");
Page p=(Page)request.getSession().getAttribute(session);
if(p==null)

p=new Page(dao.getRowCount(),1,pageSize);
System.out.println("count="+dao.getRowCount());

else

p.setRowSize(dao.getRowCount());


if(pageAction==null)

return;

if("first".equals(pageAction))

p.first();

else if ("last".equals(pageAction))

p.last();

else if("next".equals(pageAction))

p.next();

else if("previous".equals(pageAction))

p.previous();

else if("go".equals(pageAction))

int currentPage=Integer.parseInt(request.getParameter("currentPage"));
p.go(currentPage);


request.getSession().setAttribute(session, p);

int start=(p.getPage()-1)*pageSize;
List list=dao.getDataList(start, pageSize);
request.setAttribute("list", list);

List<Integer> pageList=new ArrayList<Integer>();
for(int i=1;i<=p.getPageConut();i++)

pageList.add(new Integer(i));


request.setAttribute("pageList", pageList);



PageSizeConfig.java
public class PageSizeConfig
public static final int DEFAULT_PAGE_SIZE=5;
private static Map<String,Integer> map;

static

load();

private static void load()

map=new HashMap<String,Integer>();
try
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/shop/page/page.xml");

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder bulider=factory.newDocumentBuilder();
Document doc=bulider.parse(is);

NodeList nl=doc.getElementsByTagName("size");
for(int i=0;i<nl.getLength();i++)

Node node=nl.item(i);
String type=node.getAttributes().item(0).getFirstChild().getNodeValue();
int size=Integer.parseInt(node.getTextContent());
map.put(type, new Integer(size));

catch (Exception e)
e.printStackTrace();



public static int pageSize(String className)

if(map.containsKey(className))

return map.get(className);

return DEFAULT_PAGE_SIZE;



PageDAO.java
package com.shop.page;

import java.util.List;

public interface PageDAO<T>
int getRowCount();
List<T> getDataList(int start,int pageSize);

page.xml
<?xml version="1.0" encoding="UTF-8"?>
<page-config>
<size type="com.shop.page.impl.SearchGoodPageImpl">20</size>
</page-config>

我觉得有点不好的就是每个需要分页的地方都要创建一个session
如果lz觉得有用,email我:icewater506@yahoo.com.cn
参考技术A 1,先说MVC的模式。web层面只负责查看数据结果,同时向控制层传输当前请求页面数,数据逻辑层负责根据参数请求获取相应的数据。比如当前页面在看第三页,然后点击下一页,就传递参数4到控制层,控制层向数据逻辑层请求第四页的数据,数据层通过检索数据库获取结果反馈给页面显示。

2.在具体的实现上,主要的逻辑是在数据检索这块,这个你可以百度一把,网上有很多实现方式,但是绝大部分都是用一个bean来记录分页相关参数设置,比如每页显示多少条数据,记录当前页数,当前游标位置等。以及总数据条数,总页数。有了这些常量以及当前用户请求页数就可以很明确的进行数据请求操作。

3.说道数据库的性能上,其实这个里面有很多可以优化的地方。这个要看需求而定。比如你数据量本来就没多少那就不用启动多线程来查询。如果数据量庞大那就要用多线程,一个线程只请求第一页数据。在客人看第一页数据结果的时候启动令一个线程去请求后面的数据。这样当客人点击下一页的及其后面数据的时候是很快的。
对了。分页一定要用到游标这个概念。如果不实时查库那就要通过内存来实现数据缓存。这个也要看数据量的多少以及实际需求了。

呵呵,写好了分享一份。
参考技术B 分页的话,应该是很简单的吧,只要用 页数 = (总数+PAGE_SIZE-1)/PAGE_SIZE...然后讨论分页的情况。

如果总页数==1&&当前页==1;
或者如果总页数!=1&&当前页==1;
或者如果总页数!=1&&当前页==总页数(就是最后一页)。
或者:大部分这种。。。

至于,SQL的话,你既然是JavaWeb,相信几大部分都用mysql吧,MYSQL提供了limit功能,比如
select * from user limit (p-1)*PAGE_SIZE,10 就能得到了。

如果有什么疑问,可以消息我,我随时愿意为您服务。本回答被提问者采纳
参考技术C 使hibernate框架
里面有封装好了的分页的方法

setFirstResult();从哪一条记录开始
setMaxResult(); 每页显示的记录数

如当前是第一页
传page=1//页数请求
setFirstResult(5*(page-1));
setMaxResult(5);
从0开始拿5条数据
随page的请求而改变
参考技术D 先得到总共多少条记录,保存到一个变量中all,定义每页显示的记录条数ipage,就可以通过公式 页数=(all+ipage-1)/ipage。然后定义ResultSet时在后边加上可以使指针任意移动的参,第一页显示的时候让指针指向0,第二页让指针指向ipage,第三页让指针指向ipage*2,。。。。。指针的指向就是ipage(当前页码-1),这样就可以控制每页显示的内容。

以上是关于JAVA WEB 分页的主要内容,如果未能解决你的问题,请参考以下文章

单页分页问题中的多个角度材料表

梦内容页分页标题提取

一个视图中的 CI 多页分页,

以多页分页打印所有数据

CakePHP 2中带有分页分页类的大小为f数组的问题

当我在基于类的视图中应用过滤器时,如何在 django 中使用分页分页。网址总是不断变化我如何跟踪网址