ITKeyword,专注技术干货聚合推荐

注册 | 登录

如何做一个健全的分页功能(包括能够查询以后自动显示分页功能,基于MVC以及SSH框架)

qq_28483283 分享于 2016-03-28

2019阿里云双11返场狂欢继续,
地址https://www.aliyun.com/1111/2019/home

第一步写一个pageBean的类: package com.cjdx.domain;import java.util.List;public class PageBean {

// 指定的 或者是页面的参数

private int currentPage;// 当前页

private int pageSize;// 每页显示多少条

// 查询数据库得到

private int recordCount;// 总记录数

private List recordList;// 本页的数据列表

// 计算得到

private int pageCount;// 总页数

private int beginPageIndex;// 页码列表的开始

private int endPageIndex;// 页码列表的结束索引

public PageBean(int currentPage, int pageSize, int recordCount,

List recordList) {

this.currentPage = currentPage;

this.pageSize = pageSize;

this.recordCount = recordCount;

this.recordList = recordList;

// 计算总页码

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

//计算beginPageIndex和endPageIndex

//>>如果页数不大于10页 则全部显示

if(pageCount<=10){

beginPageIndex=1;

endPageIndex=pageCount;

}

//>>如果页数大于10页 则显示当前页附近10页面

else{

beginPageIndex=currentPage-4;

endPageIndex=currentPage+5;

//如果前面的页面不足4个时

if(beginPageIndex<1){

beginPageIndex=1;

endPageIndex=10;

}

//当后面的页码不足5个时

if(endPageIndex>pageCount){

endPageIndex=pageCount;

beginPageIndex=pageCount-9;

}

}

}

public int getCurrentPage() {

return currentPage;

}

public void setCurrentPage(int currentPage) {

this.currentPage = currentPage;

}

public int getPageSize() {

return pageSize;

}

public void setPageSize(int pageSize) {

this.pageSize = pageSize;

}

public int getRecordCount() {

return recordCount;

}

public void setRecordCount(int recordCount) {

this.recordCount = recordCount;

}

public List getRecordList() {

return recordList;

}

public void setRecordList(List recordList) {

this.recordList = recordList;

}

public int getPageCount() {

return pageCount;

}

public void setPageCount(int pageCount) {

this.pageCount = pageCount;

}

public int getBeginPageIndex() {

return beginPageIndex;

}

public void setBeginPageIndex(int beginPageIndex) {

this.beginPageIndex = beginPageIndex;

}

public int getEndPageIndex() {

return endPageIndex;

}

public void setEndPageIndex(int endPageIndex) {

this.endPageIndex = endPageIndex;

}} 然后在daoSupportImpl里面写一个方法: @Override

public PageBean getPageBean(int pageNum, int pageSize,

QueryHelper queryHelper) {

List<Object> parameters=queryHelper.getParameters();

// 查询本页的数据列表

Query listQuery = getSession().createQuery(queryHelper.getListQueryHql());

if (parameters != null) {// 设置参数

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

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

}

}

listQuery.setFirstResult((pageNum - 1) * pageSize);

listQuery.setMaxResults(pageSize);

List list = listQuery.list();

// 查询总记录数量

Query countQuery = getSession().createQuery(queryHelper.getCountQueryHql());

if (parameters != null) {

// 设置参数

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

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

}

}

Long count = (Long) countQuery.uniqueResult();

return new PageBean(pageNum, pageSize, count.intValue(), list);

}} 第三步:写一个pageView.jspf的公共文件 <%@ page language="java" contentType="text/html;charset=UTF-8"%> <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;font-size:14px"> 首页 </a> <s:iterator begin="%{beginPageIndex}" end="%{endPageIndex}" var="num"> <s:if test="#num==currentPage"><%--如果是当前页 --%> <span class="PageSelectorNum PageSelectorSelected" style="cursor: hand;font-size: 18px;">${num }</span> </s:if> <s:else><%--如果不是当前页 --%> <span class="PageSelectorNum" style="cursor: hand;font-size: 16px;" onClick="gotoPage(${num});">${num}</span> </s:else> </s:iterator> <a href="javascript:gotoPage(${pageCount })" title="尾页" style="cursor: hand;font-size: 14px;"> 尾页 </a> 转到: <select onchange="gotoPage(this.value)" id="_pn"> <s:iterator begin="1" end="%{pageCount}" var="num" > <option value="${num}">${num}</option> </s:iterator> </select> <script type="text/javascript"> $("#_pn").val("${currentPage}"); <%--document.getElementById("_pn").selected.value="${currentPage}";--%> </script> </div> </div> <script type="text/javascript"> function gotoPage( pageNum ){ // window.location.href = "forum_show.action?id=${id}&pageNum=" + pageNum; $(document.forms[0]).append("<input type='hidden' name='pageNum' value='" +pageNum+"'>"); document.forms[0].submit(); } </script> 第四步:在baseAction中写两个字段的属性:

//分页信息

protected int pageNum=1;//当前页数

protected int pageSize=8;//每页显示的数量

public int getPageNum() {

return pageNum;

}

public void setPageNum(int pageNum) {

this.pageNum = pageNum;

}

public int getPageSize() {

return pageSize;

}

public void setPageSize(int pageSize) {

this.pageSize = pageSize;

} 第五步:写一个帮助类QueryHelper package com.cjdx.utils;import java.util.ArrayList;import java.util.List;import com.cjdx.base.DaoSupport;import com.cjdx.domain.PageBean;import com.opensymphony.xwork2.ActionContext;public class QueryHelper {

private String fromClause;//from子句

private String whereClause="";//where子句

private String orderByClause="";//orderby子句

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

/** * 生成from子句 * @return */

public QueryHelper(Class clazz,String alias){

fromClause="FROM "+clazz.getSimpleName()+" "+alias;

}

/** * 拼接where子句 * @param condition 子句 * @param params 参数 * @return */

public QueryHelper addCondition(String condition,Object... params){

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

whereClause=" WHERE "+condition;

}else{

whereClause+=" AND "+condition;

}

//参数

if(params!=null){

for(Object p:params){

parameters.add(p);

}

}

return this;

}

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

if(append){

addCondition(condition, params);

}

return this;

}

public QueryHelper addCondition(String condition){

return this;

}

/** * 拼接orderBy子句 * @param propertyName 参与排序的属性名 * @param asc true表示升序 false表示降序 * @return */

public QueryHelper addOrderProperty(String propertyName,boolean asc){

if(orderByClause.length()==0){

orderByClause=" ORDER BY "+propertyName+(asc ? " ASC " : " DESC");

}else{

orderByClause+=", "+propertyName+(asc ? " ASC " : " DESC");

}

return this;

}

/** * 如果第一个参数为true 则拼接orderBy子句 * @param append 判断条件 * @param propertyName 属性的名字 * @param asc * @return */

public QueryHelper addOrderProperty(boolean append,String propertyName,boolean asc){

if(append){

addOrderProperty(propertyName, asc);

}

return this;

}

/** * 获取生成的用于查询数据列表的hql语句 * @return */

public String getListQueryHql(){

return fromClause+whereClause+orderByClause;

}

public void preparePageBean(DaoSupport<?> service,int pageNum,int pageSize){

PageBean pageBean = service.getPageBean(pageNum, pageSize,this);

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

}

/** * 获取生成的用于查询总记录数的hql语句 * @return */

public String getCountQueryHql(){

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

}

public List<Object> getParameters() {

return parameters;

}

public void setParameters(List<Object> parameters) {

this.parameters = parameters;

}

public String getFromClause() {

return fromClause;

}

public void setFromClause(String fromClause) {

this.fromClause = fromClause;

}

public String getWhereClause() {

return whereClause;

}

public void setWhereClause(String whereClause) {

this.whereClause = whereClause;

}

public String getOrderByClause() {

return orderByClause;

}

public void setOrderByClause(String orderByClause) {

this.orderByClause = orderByClause;

}} 上面就是公共的代码了 实现: 比如我想要实现用户列表的分页: 第一步:在userAction的list方法中

public String list() {

/** * 最初版 */

// List<User> userList = userService.findAll();

// ActionContext.getContext().put("userList", userList);

/** * 准备分页信息以后的版本 */

new QueryHelper(User.class, "u")//

.preparePageBean(userService, pageNum, pageSize);

return "list";

} 第二步:在jsp页面的list.jsp做一些更改 <s:iterator value="recordList">

<tr align="center" class="TableDetail1 template">

<td>${loginName}&nbsp;</td>

<td>${name}&nbsp;</td>

<td>

<s:a onClick="return delConfirm()" action="user_delete?id=%{id}">删除</s:a>

<s:a action="user_editUI?id=%{id}">修改</s:a>

</td>

</tr>

</s:iterator> 把原来的<s:iterator value="recordList">value的值改变一下, 最后一步就是导入写好的公共分页的文件 <%@ include file="/admin/jsp/public/pageView.jspf" %>

<s:form action="user_list"></s:form> 做完了: 第二个例子:在具有按条件查询的新闻列表做出分页: 第一步还是在action准备list,但是这里的list需要增加一些参数, 上面的的作用就是来获取这些参数的,因为在用户列表没有查询功能,所以s:form就不需要把表单放在s:form的中间了, 这是在articleAction中的代码: // 新闻列表

public String list() {

// 准备页面查询条件中的信息

List<ArticleType> articleTypeList = articleTypeService.findAll();

ActionContext.getContext().put("articleTypeList", articleTypeList);

/** * 分页以后的列表查询 */

int queryTitle = 0;

int queryContent = 0;// 如果内容和标题都是空,则不执行条件查询

if (model.getTitle() == null && model.getContent() == null) {

queryTitle = 0;

queryContent = 0;

} else {

queryTitle = 1;

queryContent = 1;

}

QueryHelper queryHelper = new QueryHelper(Article.class, "a");

// System.out.println(articleTypeId);

new QueryHelper(Article.class, "a")//

.addCondition((articleTypeId == 1), "a.articleType.id=?",

Article.TYPE_CENTER)//

.addCondition((articleTypeId == 2), "a.articleType.id=?",

Article.TYPE_EXCHANGE)//

.addCondition((articleTypeId == 3), "a.articleType.id=?",

Article.TYPE_INFORM)//

.addCondition((queryTitle == 1), "a.title like ?",

"%" + model.getTitle() + "%")//

.addCondition((queryContent == 1), "a.content like ?",

"%" + model.getContent() + "%")//

.addOrderProperty("a.postTime", false)//

.preparePageBean(articleService, pageNum, pageSize);

// System.out.println(queryHelper.getCountQueryHql());

// System.out.println(model.getTitle()+"123");

return "list";

} 第一个问题就是TYPE_EXCHANGE这样的属性是哪里来的,我是先在article的javaBean的类中声明的

/** 中心新闻 */

public static final long TYPE_COMMON = 0;

/** 中心新闻 */

public static final long TYPE_CENTER = 1;

/** 学术交流*/

public static final long TYPE_EXCHANGE = 2;

/**通知公告 */

public static final long TYPE_INFORM = 3; .addCondition((articleTypeId == 1), "a.articleType.id=?",

Article.TYPE_CENTER)// 可能大家对于上面这句代码不理解,这句代码是添加过滤的条件,articleTypeId == 1的结果是判断true或者是false的,如果是true就在hql语句添加上面的代码,如果是false就往下走,如果找到一个true,就在hql语句里面添加后面的语句,如果没有,就不添加,在没有任何按条件查询的情况下,就是没有上面的代码的 .addOrderProperty("a.postTime", false)// 这句代码是用来添加排序条件的,我是按照时间先后排序的,最近更新的放在上面 .preparePageBean(articleService, pageNum, pageSize); 这句是直接去准备页面,也就是把需要的值放在相应的位置,然后去jsp改一下 在jsp页面里面的更改: <s:form action="article_list" name="form1">

<table width="100%" style="border-top:1 solid #93B7E7; border-left: 1 solid #93B7E7; border-right: 1 solid #93B7E7;border-bottom: 1 solid #93B7E7;">

<tr style="color:#000099;font-size: 14px; ">

<td style="text-align: right">

新闻类型

</td>

<td width="22%">

<s:select list="#articleTypeList" listKey="id" headerKey="0" headerValue="请选择类型" listValue="name" name="articleTypeId" cssStyle="width:84%">

</s:select>

</td>

</tr>

<tr style="color:#000099;font-size: 14px; ">

<td width="22%" height="30" style="text-align: right;">

新闻标题

</td>

<td width="23%" style="text-align: left;">

<s:textfield name="title" />

</td>

<td width="11%" style="text-align: right;">

新闻内容

</td>

<td colspan="2" style="text-align: left;">

<s:textfield name="content" />

</td>

</tr>

<tr>

<div>

<td height="33" colspan="5" width="100%" align="center">

<s:submit name="query1" value="精确查找" class="button" />

&nbsp;&nbsp;&nbsp;&nbsp;

<s:submit name="query2" value="模糊查找" class="button" />

&nbsp;&nbsp;&nbsp;&nbsp;

<s:reset value="重置" class="button" />

</td>

</div>

</tr>

</table>

</s:form> 首先是s:from的位置变了,这里需要包含在查询条件里面,然后获取参数,传到action里面做相应的处理,然后把分好页的数据传到jsp页面, 最后一部就是 <!--下面是分页信息-->

<%@include file="/admin/jsp/public/pageView.jspf" %> 添加分页信息,到这里完成了,我用的是mvc三层架构,框架是ssh框架, 我的项目结构图是:

第一步写一个pageBean的类: package com.cjdx.domain;import java.util.List;public class PageBean { // 指定的 或者是页面的参数 private int currentPage;// 当前页 privat

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。