Struts2 实现翻页组件


翻页组件的需求是:

1.首页,上一页,下一页,末页

2.总是显示当前页面的前两页和后两页的页码

如图:


以下是代码:

PageModel<T>

import java.util.List;

/** * 分页组件 * @param <T> 实体对象 */
public class PageModel<T> {
	private int totalRecords;// 总记录数
	private List<T> list;// 结果集
	// 当前页
	private Integer pageNo;
	// 每页显示多少条
	private Integer pageSize;

	/**
	 * 取得上一页
	 * 
	 * @return 上一页
	 */
	public int getPreviousPageNo() {
		if (pageNo <= 1) {
			return 1;
		}
		return pageNo - 1;
	}

	/**
	 * 取得下一页
	 * 
	 * @return 下一页
	 */
	public int getNextPageNo() {
		if (pageNo >= getTotalPages()) {
			return getTotalPages() == 0 ? 1 : getTotalPages();
		}
		return pageNo + 1;
	}

	/**
	 * 取得最后一页
	 * 
	 * @return 最后一页
	 **/
	public int getBottomPageNo() {
		return getTotalPages() == 0 ? 1 : getTotalPages();
	}

	/**
	 * 取得总页数
	 * 
	 * @return
	 **/
	public int getTotalPages() {
		if (totalRecords % pageSize == 0) {
			return totalRecords / pageSize;
		} else {
			return totalRecords / pageSize + 1;
		}
	}

	public int getTotalRecords() {
		return totalRecords;
	}

	public void setTotalRecords(int totalRecords) {
		this.totalRecords = totalRecords;
	}

	public List<T> getList() {
		return list;
	}

	public void setList(List<T> list) {
		this.list = list;
	}

	public Integer getPageSize() {
		return pageSize;
	}

	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}

	public Integer getPageNo() {
		return pageNo;
	}

	public void setPageNo(Integer pageNo) {
		this.pageNo = pageNo;
	}
}


 

DaoSupport.java

package com.test.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.test.model.PageModel;
import com.test.util.GenericsUtils;
/**
 * Dao支持类
 * @param <T>
 */
@Transactional
@SuppressWarnings("unchecked")
public class DaoSupport<T> implements BaseDao<T>{
    // 泛型的类型
    protected Class<T> entityClass = GenericsUtils.getGenericType(this.getClass());

    @Override
    public void delete(Serializable ... ids) {
        for (Serializable id : ids) {
            T t = (T) getSession().load(this.entityClass, id);
            getSession().delete(t);
        }
    }
    /**
     * 利用get()方法加载对象,获取对象的详细信息
     */
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public T get(Serializable entityId) {
        return (T) getSession().get(this.entityClass, entityId);
    }
    /**
     * 利用load()方法加载对象,获取对象的详细信息
     */
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public T load(Serializable entityId) {
        return (T) getSession().load(this.entityClass, entityId);
    }
    /**
     * 利用hql语句查找单条信息
     */
    @Override
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public Object uniqueResult(final String hql,final Object[] queryParams) {
        Query query=getSession().createQuery(hql);
        setQueryParams(query, queryParams);//设置查询参数
        return query.uniqueResult();
    }
    /**
     * 获取指定对象的信息条数
     */
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public long getCount() {
        String hql = "select count(*) from " + GenericsUtils.getGenericName(this.entityClass);
        return (Long)uniqueResult(hql,null);
    }
    /**
     * 利用save()方法保存对象的详细信息
     */
    @Override
    public void save(Object obj) {
        getSession().save(obj);
    }
    @Override
    public void saveOrUpdate(Object obj) {
        getSession().saveOrUpdate(obj);
    }
    /**
     * 利用update()方法修改对象的详细信息
     */
    @Override
    public void update(Object obj) {
        getSession().update(obj);
    }
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel<T> find(final Integer pageNo, Integer maxResult) {
        return find(null, null, null, pageNo, maxResult);
    }
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel<T> find(Integer pageNo, Integer maxResult,
            Map<String, String> orderby) {
        return find(null, null, orderby, pageNo, maxResult);
    }
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel<T> find(Integer pageNo, Integer maxResult, String where,
            Object[] queryParams) {
        return find(where, queryParams, null, pageNo, maxResult);
    }
    /**
     * 分页查询
     * @param where 查询条件
     * @param queryParams hql参数值
     * @param orderby 排序
     * @param pageNo 第几页
     * @param maxResult 返回记录数量
     * return PageModel
     */
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    public PageModel<T> find(final String where, final Object[] queryParams,
            final Map<String, String> orderby, final Integer pageNo,
            final Integer maxResult) {
        final PageModel<T> pageModel = new PageModel<T>();//实例化分页对象
        pageModel.setPageNo(pageNo);//设置当前页数
        pageModel.setPageSize(maxResult);//设置每页显示记录数

        String hql = new StringBuffer().append("from ")//添加form字段
        .append(GenericsUtils.getGenericName(entityClass))//添加对象类型
        .append(" ")//添加空格
        .append(where == null ? "" : where)//如果where为null就添加空格,反之添加where
        .append(createOrderBy(orderby))//添加排序条件参数
        .toString();//转化为字符串
        Query query = getSession().createQuery(hql);//执行查询
        setQueryParams(query,queryParams);//为参数赋值
        List<T> list = null;//定义List对象
        // 如果maxResult<0,则查询所有
        if(maxResult < 0 && pageNo < 0){
        list = query.list();//将查询结果转化为List对象
        }else{
        list = query.setFirstResult(getFirstResult(pageNo, maxResult))//设置分页起始位置
                .setMaxResults(maxResult)//设置每页显示的记录数
                .list();//将查询结果转化为List对象
        //定义查询总记录数的hql语句
        hql = new StringBuffer().append("select count(*) from ")//添加hql语句
                    .append(GenericsUtils.getGenericName(entityClass))//添加对象类型
                    .append(" ")//添加空格
                    .append(where == null ? "" : where)//如果where为null就添加空格,反之添加where
                    .toString();//转化为字符串
        query = getSession().createQuery(hql);//执行查询
        setQueryParams(query,queryParams);//设置hql参数
        int totalRecords = ((Long) query.uniqueResult()).intValue();//类型转换
        pageModel.setTotalRecords(totalRecords);//设置总记录数
        }
        pageModel.setList(list);//将查询的list对象放入实体对象中
//return null;
        
        return pageModel;//返回分页的实体对象
    }
    /**
     * 获取分页查询中结果集的起始位置
     * @param pageNo 第几页
     * @param maxResult 页面显示的记录数
     * @return 起始位置
     */
    protected int getFirstResult(int pageNo,int maxResult){
        int firstResult = (pageNo-1) * maxResult;
        return firstResult < 0 ? 0 : firstResult;
    }
    /**
     * 对query中的参数赋值
     * @param query
     * @param queryParams
     */
    protected void setQueryParams(Query query, Object[] queryParams){
        if(queryParams!=null && queryParams.length>0){
            for(int i=0; i<queryParams.length; i++){
                query.setParameter(i, queryParams[i]);
            }
        }
    }
    /**
     * 创建排序hql语句
     * @param orderby
     * @return 排序字符串
     */
    protected String createOrderBy(Map<String, String> orderby){
        StringBuffer sb = new StringBuffer("");
        if(orderby != null && orderby.size() > 0){
            sb.append(" order by ");
            for(String key : orderby.keySet()){
                sb.append(key).append(" ").append(orderby.get(key)).append(",");
            }
            sb.deleteCharAt(sb.length() - 1);
        }
        return sb.toString();
    }
    /**
     * 获取Session对象
     * @return
     */
    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;
    protected Session getSession(){\
        return sessionFactory.getCurrentSession();
    }
}

GenericsUtils.java

package com.test.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
 * 泛型工具类
 */
public class GenericsUtils {
	/**
	 * 获取泛型的类型
	 * @param clazz
	 * @return Class
	 */
	@SuppressWarnings("unchecked")
	public static Class getGenericType(Class clazz){
		Type genType = clazz.getGenericSuperclass();//得到泛型父类  
		Type[] types = ((ParameterizedType) genType).getActualTypeArguments();
		if (!(types[0] instanceof Class)) {
            return Object.class;   
        } 
		return (Class) types[0];
	}
	/**
	 * 获取对象的类名称
	 * @param clazz
	 * @return 类名称
	 */
	@SuppressWarnings("unchecked")
	public static String getGenericName(Class clazz){
		return clazz.getSimpleName();
	}
}

NoticeDao.java

package com.test.dao.notice;

import com.test.dao.BaseDao;
import com.test.model.notice.Notice;

public class NoticeDao extends BaseDao<Notice> {

}

BaseAction.java

package com.test.action;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.beans.factory.annotation.Autowired;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 基本Action对象,其它Action的父类
 */
public class BaseAction extends ActionSupport implements RequestAware,
		SessionAware, ApplicationAware {

	private static final long serialVersionUID = 1L;
	protected Integer id;
	protected Integer[] ids;
	protected Integer pageNo = 1;
	protected Integer pageSize = 5;
	
	public static final String LIST = "list";
	
	// 注入Dao
	@Autowired
	protected NoticeDao NoticeDao;
	
	// Map类型的request
	protected Map<String, Object> request;
	// Map类型的session
	protected Map<String, Object> session;
	// Map类型的application
	protected Map<String, Object> application;
	
	@Override
	public void setRequest(Map<String, Object> request) {
		// 获取Map类型的request赋值
		this.request = request;
	}
	@Override
	public void setApplication(Map<String, Object> application) {
		// 获取Map类型的application赋值
		this.application = application;
	}
	@Override
	public void setSession(Map<String, Object> session) {
		// 获取Map类型的session赋值
		this.session = session;
	}
	
	// 处理方法
	public String execute() throws Exception {
		return SUCCESS;
	}

	// getter和settter方法
	public Integer[] getIds() {
		return ids;
	}
	public void setIds(Integer[] ids) {
		this.ids = ids;
	}
	public int getPageNo() {
		return pageNo;
	}
	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
}

Notice.java

Notice.hbm.xml(省略)

package com.test.model.notice;

import java.io.Serializable;
import java.util.Date;

/**
 */
public class Notice implements Serializable{
	private static final long serialVersionUID = 1L;
	private Integer id;// 通知ID
	private String name;// 通知名称
	private String content;// 通知内容
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}

}


NoticeAction.java

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
import com.test.action.BaseAction;

import com.test.model.notice.Notice;

/** * 通知Action */
@Scope("prototype")
@Controller("NoticeAction")
public class NoticeAction extends BaseAction implements ModelDriven<Notice> {

	private static final long serialVersionUID = 1L;

	// 查询所有通知
	public String find() throws Exception {
		pageModel = noticeDao.find(pageNo, pageSize);// 执行查询方法
		return LIST;// 返回通知列表页面
	}

	private Notice notice = new Notice();
	private PageModel<Notice> pageModel;// 分页组件

	public Notice getNotice() {
		return notice;
	}

	public void setNotice(Notice notice) {
		this.notice = notice;
	}

	public PageModel<Notice> getPageModel() {
		return pageModel;
	}

	public void setPageModel(PageModel<Notice> pageModel) {
		this.pageModel = pageModel;
	}
}



 

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="notice" namespace="/notice">
              <action name="notice_*" method="{1}" class="noticeAction">
            <result name="list">/WEB-INF/pages/test/notice_list.jsp</result>
            <interceptor-ref name="adminDefaultStack"/>
        </action>
        </package> 
</struts> 

 

查看通知列表:

<s:a action="notice_find" namespace="/notice">查看所有通知</s:a>

notice_list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>通知查看</title>
</head>
<body>
	<table>
		<thead>
			<tr>
				<th>ID</th>
				<th>通知名称</th>
				<th>通知内容</th>
			</tr>
		</thead>
		<s:iterator value="pageModel.list">
			<tr>
				<td><s:property value="id" /></td>
				<td><s:property value="name" /></td>
				<td><s:property value="content" /></td>
			</tr>
		</s:iterator>
	</table>
        <ul class="pagination">
        <s:if test="pageModel.pageNo > 1">
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="1"></s:param><<</s:a></li>
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.pageNo-1"></s:param><
                </s:a></li>
        </s:if>
        <s:else>
            <li class="disabled"><a><<</a></li>
            <li class="disabled"><a><</a></li>
        </s:else>
        <s:if test="pageModel.pageNo > 2">
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.pageNo-2"></s:param>
                    <s:property value="pageModel.pageNo-2" />
                </s:a></li>
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.pageNo-1"></s:param>
                    <s:property value="pageModel.pageNo-1" />
                </s:a></li>
        </s:if>
        <s:if test="pageModel.pageNo == 2">
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="1"></s:param>1</s:a></li>
        </s:if>
        <li class="active"><a><s:property value="pageModel.pageNo" /></a></li>
        <s:if test="pageModel.bottomPageNo - pageModel.pageNo > 1">
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.pageNo+1"></s:param>
                    <s:property value="pageModel.pageNo+1" />
                </s:a></li>
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.pageNo+2"></s:param>
                    <s:property value="pageModel.pageNo+2" />
                </s:a></li>
        </s:if>
        <s:if test="pageModel.bottomPageNo - pageModel.pageNo == 1">
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.pageNo+1"></s:param>
                    <s:property value="pageModel.bottomPageNo" />
                </s:a></li>
        </s:if>
        <s:if test="pageModel.pageNo < pageModel.bottomPageNo">
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.pageNo+1"></s:param>>
                </s:a></li>
            <li><s:a action="notice_find" namespace="notice">
                    <s:param name="pageNo" value="pageModel.bottomPageNo"></s:param>>>
                </s:a></li>
        </s:if>
        <s:else>
            <li class="disabled"><a>></a></li>
            <li class="disabled"><a>>></a></li>
        </s:else>
    </ul>
</body>
</html>

 
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值