Java Web 开发中如何进行分页

*分页:

????摘要:所用框架为:Hibernate+Spring+Struts2,以分页显示后台用户列表为例

????1.设计实体:页面类PageBean

????????1.1 分析:

????????????当前页:currentPage(请求数据)

????????????总记录数:recordCount(查数据库:count(*))

????????????页面大小:pageSize(配置文件设置值)

????????????本页的数据列表:recordList(查询数据库:select *)

?

????????????总页数:pageCount(计算)=(recordCount+pageSize-1)/pageSize;

????????????开始索引:beginPageIndex(计算)

????????????结束索引:endPageIndex(计算)

????????1.2 代码,这里以显示10个页码索引为例:

????????????public class PageBean{

?

????????????????private int currentPage;

????????????????private int recordCount;

????????????????private int pageSize;

????????????????private List recordList;

?

????????????????private int pageCount;

????????????????private int beginPageIndex;

????????????????private int endPageIndex;

?

????????????????public PageBean(int currentPage,int recordCount,int pageSize,int recordList){

????????????????????//当前页

????????????????????this.currentPage=currentPage;

????????????????????//总记录数

????????????????????this.recordCount=recordCount;

????????????????????//页面大小

????????????????????this.pageSize=pageSize;

????????????????????//当前页的总记录列表

????????????????????this.recordList=recordList;

?

????????????????????//计算pageCount:总记录数

????????????????????//这里可以用逻辑判断,如:

????????????????????/*

????????????????????*if(recordCount%pageSize==0){

????????????????????*????pageCount=recordCount/pageSize;????

????????????????????*}else{

????????????????????*????pageCount=recordCount/pageSize+1;

????????????????????*}

????????????????????*/

????????????????????//或则用算法,自己琢磨

????????????????????pageCount=(recordCount+pageSize-1)/pageSize;

????????????????????

????????????????????//这里以显示十个页码索引为例,设置开始页码索引和结束页码索引

????????????????????//当页面总数小于10个时

????????????????????if(pageCount<=10){

????????????????????????beginPageIndex=1;

????????????????????????endPageIndex=pageCount;

????????????????????}else{

????????????????????????//当页面总素大于10个时

????????????????????????beginPageIndex=currentPage-4;

????????????????????????endPageIndex=currentPage+5;

?

????????????????????????if(beginPageIndex<1){

????????????????????????????beginPageIndex=1;

????????????????????????????endPageIndex=10;

????????????????????????}

????????????????????????else if(endPageIndex>pageCount){

????????????????????????????beginPageIndex=pageCount-9;

????????????????????????????endPageIndex=pageCount;

????????????????????????}

????????????????????}

????????????????}

????????????????

????????????????//Setter和Getter

????????????????set...

????????????????get...

????????????}

????2.设置实体工具类:HqlHelper

????????2.1 分析

????????2.2 代码

????????????public class HqlHelper{

????????????????//from子句

????????????????private String fromClause;

????????????????//where子句

????????????????private String whereClause;

????????????????//排序子句

????????????????private String orderClause;

????????????????

????????????????//参数集合,Hql语句中where子句中用到的参数对象

????????????????private List<Object> parameters=new ArrayList<Object>();

????????????????

????????????????//构造函数设置fromClause,默认别名为"o"

????????????????public HqlHelper(Class clazz){

????????????????????this.fromClause="FROM "+clazz.getSimpleName+" o";

????????????????}

????????????????//自定义别名

????????????????public HqlHelper(Class clazz,String alias){

????????????????????this.fromClause="FROM "+clazz.getSimpleName+alias;

????????????????}

????????????????

????????????????//设置where子句的,以及用到的参数对象,这就是查询条件

????????????????public HqlHelper addCondition(String condition,Object... params){

????????????????????if(whereClause.length()==0){

????????????????????????whereClause=" WHERE "+condition;

????????????????????}else{

????????????????????????where+=" AND "+condition;

????????????????????}

????????????????????

????????????????????if(params!=null && params.length>0){

????????????????????????for(Object o:params){

????????????????????????????parameters.add(0);

????????????????????????}

????????????????????}

????????????????????return this;

????????????????}

????????????????//设置是否追加,这个接口留给用户,到时方便用户开发

????????????????public HqlHelper addCondition(boolean append,String condition,Object... params){

????????????????????if(append){

????????????????????????addCondition(condition,params);

????????????????????}

????????????????????return this;

????????????????????

????????????????}

????????????????

????????????????//设置排序条件子句

????????????????public HqlHelper addOrder(String propertityName,boolean isAsc){

????????????????????if(orderClause!=null && orderClause.length()>0){

????????????????????????orderClause=" ORDER BY "+propertityName+(isAsc?" ASC":" DESC");

????????????????????}else{

????????????????????????orderClause+=", "+popertityName+(isAsc?" ASC":" DESC");

????????????????????}

????????????????????

????????????????????return this;

????????????????}

????????????????//这个增加了是否追加排序条件子句

????????????????public HqlHelper addOrder(boolean append ,String propertityName,boolean isAsc){

????????????????????if(append){

????????????????????????addOrder(propertityName,isAsc);

????????????????????}

????????????????????return this;

????????????????}

????????????????

????????????????//得到查询子句hql

????????????????public String getQueryListHql(){

????????????????????return fromClause+whereClause+orderClause;

????????????????}

?

????????????????//计数hql

????????????????public String getCountHql(){

????????????????????return "SELECT COUNT(*) "+fromClause+whereClause;

????????????????}

????????????????

????????????????//参数集合get接口,供外部访问

????????????????public List<Object> getParameters(){

????????????????????return parameters;

????????????????}

????????????????

//这里只要两个参数,跳转的页面,和继承了BaseDao(自己抽取的接口,//很有用的)的service

????????????????public HqlHelper buildPageBeanForStruts2(int pageNum,BaseDao<?> service){

????????????????????

????????????????????PageBean pageBean=service.getBean(pageNum,this);

????????????????????ActionContext.getContext.getValueStack.push(pageBean);

????????????????????return this;

????????????????}

????????????}

????3.设计service,这里把方法放到BaseDao中,service继承即可:

????????3.1 代码

????????????//事物注解(许在Spring中配置,TransactionManager)

[email protected]

????????????public class BaseDaoImpl<T> implements BaseDao<T>{

????????????????//这里需要配置SessionFactory在Spring容器中,自己配不难

????????????????//这个是注解,相当于Setter

[email protected]

????????????????private SessionFactory sessionFactory;

????????????????//实体类型

????????????????protected Class<T> clazz;

?

????????????????//在构造函数中进行初始化clazz

????????????????public BaseDaoImpl(){

????????????????????ParameterirzedType pt=(ParameterizedType)this.getClass().getGenericSuperclass();

????????????????????this.clazz=(Class)pt.getActualTypeArguments()[0];

????????????????}

????????????????

????????????????//获取Session,方便操作数据库

????????????????protected Session getSession(){

????????????????????return sessionFactory.getCurrentSession();

????????????????}

?

????????????????public PageBean getBean(int pageNum,HqlHelper hqlHelper){

????????????????????

????????????????????//参数集合

????????????????????private List<Object> parameters=hqlHelper.getParameters();

????????????????????//配置的页面大小

????????????????????private int pageSize=Configuration.getPageSize();

????????????????????

????????????????????//recordCount,总记录数

????????????????????Query countQuery=getSession().createQuery(HqlHelper.getCountHql());

????????????????????if(parameters!=null && parameters.size()>0){

????????????????????????for(int i=0;i<parameters.size();i++){

????????????????????????????countQuery.setParameter(i,parameters.get(i));

????????????????????????}????

????????????????????}????????????????????

????????????????????Long recordCount=(Long)countQuery.uniqueResult();

?

????????????????????//recordList,当前页的记录列表

????????????????????Query listQuery=getSession().createQuery(HqlHelper.getQueryListHql());

????????????????????//设置查询参数

????????????????????if(parameters!=null && parameters.size()>0){

????????????????????????for(int i=0;i<parameters.size;i++){

????????????????????????????listQuery.setParameter(i,parameters.get(i));

????????????????????????}

????????????????????}

????????????????????//获取当前页的记录

????????????????????listQuery.setFirstResutl(pageSize*(pageNum-1));

????????????????????listQuery.setMaxResults(pageSize);

????????????????????List recordList=listQuery.list();

????????????????????

????????????????????return new PageBean(pageNum,recordCount.intValue(),pageSize,recordList);

????????????????}

????????????}

?

????4.设计Action:以UserAction为例

????????4.1 代码:

????????????//顺带把配置加上,交给Spring容器管理

[email protected]

[email protected]("prototype")

????????????public class UserAction extends ActionSupport{

????????????????

????????????????private int pageNum;

????????????????get... set...;

?

[email protected]

????????????????private UserService userService;

?

????????????????//用户数据列表,分页显示

????????????????public String list(){

????????????????????new HqlHelper(User.class,"u")//

????????????????????.buildPageBeanForStruts2(pageNum,userService);

????????????????}

????????????}

?

????5.页面:设计一个公共页面 pageView.jspf,通用的


%@
page
language="java"
import="java.util.*"
pageEncoding="UTF-8"%>

<%@
taglib
prefix="s"
uri="/struts-tags"%>

?

<div
id=PageSelectorBar>

????<div
id=PageSelectorMemo>

????????页次:${currentPage}/${pageCount}页
&nbsp;
每页显示:${pageSize}条
&nbsp;
总记录数:${recordCount}条

????</div>

????<div
id=PageSelectorSelectorArea>

????????

????????<a
href="javascript:gotoPage(1)"
title="首页"
style="cursor: hand;">
<img
src="${pageContext.request.contextPath}/style/blue/images/pageSelector/firstPage.png"
/>
</a>

?

????????<s:iterator
begin="%{beginPageIndex}"
end="%{endPageIndex}"
var="num">

????????????<s:if
test="currentPage==#num">

????????????????<%--当前页 --%>

????????????????<span
class="PageSelectorNum PageSelectorSelected">${num}</span>

????????????</s:if>

????????????<s:else>

????????????????<%--非当前页 --%>

????????????????<span
class="PageSelectorNum"
style="cursor: hand;"
onClick="gotoPage(${num});">${num}</span>

????????????</s:else>

????????</s:iterator>

????????<a
href="javascript:gotoPage(${pageCount})"
title="尾页"
style="cursor: hand;">
<img

????????????????src="${pageContext.request.contextPath}/style/blue/images/pageSelector/lastPage.png"
/>
</a>
转到:

????????<select
id="pn"
onchange="gotoPage(this.value)">

????????????<s:iterator
begin="1"
end="%{pageCount}"
var="num">

????????????????<option
value="${num}">

????????????????????${num}

????????????????</option>

????????????</s:iterator>

????????</select>

????????<script
type="text/javascript">

????????????//回显页码

????????????$("#pn").val(${currentPage});

????????</script>

????</div>

</div>

?

?

<script
type="text/javascript">

????function gotoPage(pageNum){

????????????//window.location.href="topicAction_show.action?id=${id}&pageNum="+pageNum;

????????????$(document.forms[0]).append("<input type=‘hidden‘ name=‘pageNum‘ value=‘"+pageNum+"‘/>");

????????????document.forms[0].submit();//提交表单????

????????}

</script>

?

时间: 2024-08-10 17:09:07

Java Web 开发中如何进行分页的相关文章

Java Web 开发中路径相关问题小结

Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http://localhost:8080/ 2. web应用程序的的根目录:http://localhost:8080/test/ 3.同级目录:http://localhost:8080/test/articles/article1.jsp和http://

日常 java web 开发中遇到的常见问题

view 层: 问题:jsp 页面double 值过大,会变成科学计数法 第一步:引入标签 <%@ taglib prefix= "fmt" uri ="/WEB-INF/tld/fmt.tld" %> 第二步: <fmt:formatNumber value= "${变量名} " pattern="#.00"/> 2.jsp和java后台交互,通过js 转码问题 js代码:       var tes

java web开发中的奇葩事web.xml中context-param中的注释

同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步删除同事提交的代码,进行还原. 奇葩事情出现了! <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/context_entry.xml

java web开发中,如何查看JSP和Servlet版本 (转)

原文出处:http://blog.163.com/qiu_yin_good/blog/static/16732934920123277481492/ 在看<struts2权威指南>的时候,书上很多处都提到环境要支持的JSP,Servlet版本.如果版本低,会出现异常.或者需要修改web.xml等. 现在记录下如何看自己java  web工程的JSP和servlet版本. 我的tomcat版本是7.0.26 方法:打开tomcat/lib,找到jsp-api.jar和servlet-api.ja

Java Web开发中MVC设计模式简介

一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里. Java是一门应用设计模式比较广泛的语言.目前主流提出的23种设计模式均可在Java语言编写的程序中所应用.目前

Java Web开发中路径问题小结

看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http://localhost:8080/ 2. web应用程序的的根目录:http://localhost:8080/test/ 3.同

Java web开发中主要用到的jar包

1.Java开发中主要用到的jar包介绍:(1)java JDK基础开发包:java包和javax包.书写方式:import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; 1.java.util包:集合类list/set/map等接口和实现类.calendar,date日期操作类.properties读取配置文件类.random随机数类.Timer计时器类.

Java web开发中页面跳转小技巧——跳转后新页面在新窗口打开

最近学习Java web,在学习过程中想实现一个需求,就是在jsp页面跳转的时候,希望跳转后的新页面在新窗口中打开, 而不是覆盖原来的页面,这个需求使我困惑了好长时间,后来通过大海捞针似的在网上寻找方法,最后终于得以解决, 现将此方法跟大家分享,如果有不足的地方,请多包涵,我的初衷是能帮助到有这方面需要的人. 之前我在网上也曾搜到过相对靠谱的方法,就是在jsp页面相应位置加入代码:target="_black",如 <a href="articleView?id=${a

Java Web开发中Spring+MyBatis框架的简单搭建

这里使用的eclipse,首先创建一个动态web项目. 1.导入Spring IOC.AOP.DAO.dbcp.dbdrive.mybatis.jar . mybatis-spring.jar  本人使用的jar包和版本如下: aopalliance.jaraspectjweaver.jarcommons-dbcp-1.4.jarcommons-logging.jarcommons-pool-1.5.6.jarmybatis-3.2.5.jarmybatis-spring-1.2.2.jarmy