Displaytag实现分页

来源:互联网 发布:网络好歌推荐100首 编辑:程序博客网 时间:2024/05/18 01:21

分页有两种实现方式:一种是前台分页;另一种是后台分页,即使用分页查询语句来实现。


本文主要使用Displaytag实现前台分页

必要的jar包:displaytag-1.1.1.jar

必要的模板:

Pagination.java(此为接口)

import java.util.List;import com.neusoft.mapping.EntityMapping;public interface Pagination {//判断当前所分的页是否为第一页public boolean isFirst();//判断当前所分的页是否为最后一页public boolean isLast();//判断是否还有下一页public boolean hasNext();//判断是否还有上一页public boolean hasPrevious();//返回当前要分页的总记录数public int getMaxElements();//返回总页数public int getMaxPages();//获得下一页的页码public int getNext();//返回上一页的页码public int getPrevious();//返回分页的大小,每页有多少条记录public int getPageSize();//返回当前页的页码public int getPageNumber();//返回当前页所包含的记录public List<Object> getList(EntityMapping mapping);//设定分页大小public void setPageSize(int pageSize);//设定当前要显示页面的页码public void setPageNumber(int pageNumber);}

OraclePagination.java


package com.neusoft.util;import java.sql.Connection;import java.util.List;import java.util.regex.Pattern;import com.neusoft.db.DBManager;import com.neusoft.db.JdbcTemplate;import com.neusoft.mapping.EntityMapping;import com.neusoft.mapping.MappingFactory;public class OraclePagination implements Pagination {// 分页大小private int pageSize = 5;// 当前要显示的页码private int pageNumber = 1;// 最大页码private int maxPages;// 最大记录数private int maxElements;private String sql;private DBManager db;private JdbcTemplate jtm;private Connection conn;//private EntityMapping mapping;public OraclePagination(String sql) {this.sql = sql;init();}public OraclePagination(String sql, int pageSize, int pageNumber) {this.sql = sql;this.pageSize = pageSize;this.pageNumber = pageNumber;init();this.setPageNumber(pageNumber);}private void init() {db = DBManager.getInstance();conn = db.getConnection();jtm = JdbcTemplate.getInstance();jtm.setConnection(conn);setMaxElements();setMaxPages();}// 获得最大的记录数private void setMaxElements() {// select * from xxx order by desc// select count(1) from xxx order by descString regex = "select((.)+)from";Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);String[] s = p.split(this.sql);String newSql = "select count(1) as total from " + s[1];this.maxElements = jtm.query(newSql);}// 总页数,不足2页也算2页// 最大记录数/分页大小private void setMaxPages() {if (maxElements != 0 && (maxElements % pageSize == 0)) {maxPages = maxElements / pageSize;} else {maxPages = maxElements / pageSize + 1;}}/** * 在原有的sql基础上利用rownum通过子查询返回一个区间内的结果集 source 原有的sql begin 结果集开始点 end 结果集结束点 */private String sqlModify(String source, int begin, int end) {StringBuffer target = new StringBuffer(200);target.append("select * from (select a.*,rownum r from (");target.append(sql);target.append(") a where rownum <=");target.append(end);target.append(") where r>=");target.append(begin);return target.toString();}// ***********根据页码查找片断记录的起始索引***************startprivate int getEndElement() {int endElement = pageNumber * pageSize;if (endElement >= maxElements) {return maxElements;} else {return endElement;}}private int getBeginElement() {// 如果传进来5页那么起始就应该是4页整return (pageNumber - 1) * pageSize + 1;}// ***********根据页码查找片断记录的起始索引***************endpublic List<Object> getList(EntityMapping mapping) {//计算list的起始索引String newSql = this.sqlModify(this.sql, this.getBeginElement(), this.getEndElement());return (List) jtm.query(newSql, mapping);}//public List<Object> getList(EntityMapping mapping) {////mapping = MappingFactory.getInstance().getMapping(MappingFactory.ADMIN_MAPPING);//// 计算list的起始索引//String newSql = this.sqlModify(this.sql, this.getBeginElement(), this//.getEndElement());//return (List) jtm.query(newSql, mapping); //}public int getMaxElements() {// TODO Auto-generated method stubreturn maxElements;}public int getMaxPages() {return maxPages;}// 返回下一页,如果当页就是最后一页,返回这页的数字public int getNext() {if (pageNumber + 1 >= this.getMaxPages()) {return getMaxPages();}return pageNumber + 1;}public int getPageNumber() {return pageNumber;}public int getPageSize() {return pageSize;}public int getPrevious() {if (pageNumber - 1 <= 1) {return 1;} else {return pageNumber - 1;}}public boolean hasNext() {return pageNumber < this.getMaxPages();}public boolean hasPrevious() {return pageNumber > 1;}public boolean isFirst() {return pageNumber == 1;}public boolean isLast() {return pageNumber >= this.getMaxPages();}public void setPageNumber(int pageNumber) {if (pageNumber > maxPages) {this.pageNumber = maxPages;} else if (pageNumber < 1) {this.pageNumber = 1;} else {this.pageNumber = pageNumber;}}public void setPageSize(int pageSize) {this.pageSize = pageSize;}/* * select * from (select rownum rid,user_id,user_name,user_salary from * (select info.user_name,salary.* *  * from info, salary *  * where info.user_id=salary.user_id *  * order by info.user_id )Where Rownum<=10 *  ) where rid >=5 */public static void main(String[] args) {Pagination page = new OraclePagination("select * from admin",3,1);List list = page.getList(MappingFactory.getInstance().getMapping(MappingFactory.ADMIN_MAPPING));System.out.println();}}



步骤:

第一步:

把上面两个模板拷贝到工程的某个package下(例如:com.zjw.util)

在dao层和service写出分页方法:

示例:public Pagination getAdminByPage(int pageSize,int pageNumber);

        

daoImpl 具体实现如下:

示例:

public Pagination getAdminByPage(int pageSize, int pageNumber) {Pagination p = new OraclePagination("Select ul.ulid,ul.uname,ul.department_id,ul.role_id,ui.nickname,ui.sex,ui.emailaddress,ui.address "+ "From userlogin ul,userinfo ui Where ul.ulid=ui.ulid",pageSize, pageNumber);return p;}

如果使用J2EE而不是框架的话,那么在web.xml下配置pageSize(默认)

<context-param><param-name>pageSize</param-name><param-value>10</param-value></context-param>


接下来在Servlet中的init方法中要获得web.xml这个pageSize:

public void init(ServletConfig config) throws ServletException {// TODO Auto-generated method stubsuper.init(config);try {this.pageSize = Integer.parseInt(config.getServletContext().getInitParameter("pageSize"));} catch (Exception e) {// TODO: handle exceptionthis.pageSize = 13;}}

Servlet中分页查询方法详细:
int pageSize = 5;//自定义每页显示的记录数    @Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {AdminService service = new AdminServiceImpl();int pageNumber;//获取当前页码String param = new ParamEncoder("gb").encodeParameterName(TableTagParameters.PARAMETER_PAGE);try {pageNumber = Integer.parseInt(request.getParameter(param));//获得当前页} catch (Exception e) {pageNumber = 1;}Pagination page = service.getAdminByPage(pageSize, pageNumber);//调用分页查询方法//此处用到了工厂模式,看不懂的请忽略。。。主要是把你分页查询的数据存到request里,传递到jsp页面里request.setAttribute("list", page.getList(MappingFactory.getInstance().getMapping(MappingFactory.ADMIN_MAPPING)));request.setAttribute("total", page.getMaxElements());request.getRequestDispatcher("/MyOffice.files/EmployeeMgr.jsp").forward(request, response);}

Jsp页面引入Displaytag标签库:

<%@ taglib uri="http://displaytag.sf.net" prefix="display"%>


<DIV><display:table name="${requestScope['list']}"<!-- 接受servlet request中存放的list-->partialList="true" size="${requestScope['total']}"export="true" id="gb" pagesize="${initParam.pageSize}"requestURI="/servlet/getMessage"><!--交互的uri--><display:column property="id" sortable="true" title="编号" /><display:column property="username" sortable="true" title="名字" /><display:column property="password" title="主题" /><display:column title="操作"><a href="">编辑</a><a href="">删除</a></display:column></display:table></DIV>

OK,结束,哪不会的自己一定要仔细琢磨,自己懂了才会印象深刻!


关于具体的Displaytag详细介绍,请点击:http://blog.sina.com.cn/s/blog_6b184a840100lavn.html


























0 0
原创粉丝点击