galfordkof2k 发表于 2013-1-29 11:33:22

ssh+ajax分页的demo

       今天闲来无事,写了个ssh+ajax分页的demo,还有很多不成熟的地方,大家凑合看吧。 这个demo的框架采用现在很流行的ssh,在分页功能上采用了ajax技术。
 
框架版本:
Struts:2.0.14
Hibernate:3.3.1
Spring:2.5.6
ajax分页用到了jQuery类库
数据库使用的是MySql 5.0
 
       相信大家对这些都是耳熟能详的了,我也就不在一一做介绍了,如果大家有不明白的地方,自己google一下了。废话不多说,动手干吧,不然就有人捡砖头了。哈哈!
      一、准备
      1. 项目所需的jar包(struts2,hibernate,spring),不多说了,从官网上都可以下载。截图如下:
   
http://dl.iteye.com/upload/attachment/379848/66e43138-0d1d-316e-a537-d33e4f933585.jpg
 
      2. 数据库,脚本如下: 
 
create database if not exists dbtest;use dbtest;/*数据表 `classify` 的表结构*/drop table if exists classify;create table classify (cid int(20)not null auto_increment,classname varchar(50) default null,primary key(cid)) ENGINE=InnoDB DEFAULT CHARSET=gb2312;/*写个存储过程来初始化数据表数据,很简单*/DELIMITER $$;DROP PROCEDURE IF EXISTS `dbtest`.`init`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `init`()BEGINdeclare v int;set v=0;while v<50 doinsert into classify(classname) values('Hi,This is a test');set v=v+1;end while;END$$DELIMITER ;$$/*调用存储过程*/call init();     3. 打开你的myeclipse,新建一个web项目,添加相应的jar包、配置文件(如applicationContext.xml、struts.xml、hibernate.cfg.xml等),当然还要修改web.xml文件了,这些文件的编写就不一一表述了,因为google一下多的是。
 












     二、编写
     1. 先看看整个项目的结构吧,也很简单,相信大家一看便知了。

http://dl.iteye.com/upload/attachment/379874/ce9b43c7-d689-3f9c-8654-357095ad7c7c.jpg
    
      很简单吧,从dao到action,相信大家都很熟悉了。大家别嫌我懒啊,一会儿会把整个项目的源文件上传,大家自己看源码吧,里面我也有写注释的。
      这里主要说说ajax分页吧,我这里用到的是一个我从网上找的基于jQuery的分页组件,然后跟据自己的需求,稍加改动。jQuery的.post方法还是挺好用的,我就是这个方法来实现ajax分页的。
var url = "pagelist.action?page=" + page;$.post(url,function(data){//alert(data);var items = data.selectNodes("//classify"); var result = "<table id='mytable' width='100%' border='1' cellpadding='0' cellspacing='0'>";for (var i = 0; i < items.length; i++) {var classify = items;result += "<tr>";result += "<td width='15%'>";result += "<input type='checkbox' name='toDelete' value='";result += classify.getElementsByTagName("cid").firstChild.nodeValue;result += "' />";result += "</td>";result += "<td width='20%'>" + classify.getElementsByTagName("cid").firstChild.nodeValue + "</td>";result += "<td>";result += "<a href='/SSHTEST/classify/edit.action?cid=";result += classify.getElementsByTagName("cid").firstChild.nodeValue;result += "'>";result += classify.getElementsByTagName("classname").firstChild.nodeValue;result += "</a>";result += "</td>";result += "</tr>";}result += "</table>";$("#mainlist").html("");$("#mainlist").html(result);});       这段js代码就是使用post方法来获得包含数据的xml文件,并解析这个xml文件,拼写成一段html代码,然后将这段html代码填充到名为“mainlist”的div中。
       而最基本的分页实际是采用的hibernate的分页,dao中的分页方法如下,同样也很简单
/*** 分页查询* @param hql 查询的条件* @param offset 开始记录* @param pageSize 一次查询几条记录* @return list集合*/public List<T> queryForPage(String hql, int offSet, int pageSize) {    Query query = getSession().createQuery(hql);query.setFirstResult(offSet);query.setMaxResults(pageSize);return query.list();}     这里还用到了一个保存分页信息的类PageBean,如下:
import java.util.List;public class PageBean {private List list; // 要返回的某一页的记录列表private int currentPage; // 当前页private int allRow; // 总记录数private int totalPage; // 总页数public List getList() {return list;}public void setList(List list) {this.list = list;}public int getCurrentPage() {return currentPage;}public void setCurrentPage(int currentPage) {this.currentPage = currentPage;}public int getAllRow() {return allRow;}public void setAllRow(int allRow) {this.allRow = allRow;}public int getTotalPage() {return totalPage;}public void setTotalPage(int totalPage) {this.totalPage = totalPage;}/** * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替 ** @param page *            传入的参数(可能为空,即0,则返回1) * @return 当前页 */public static int countCurrentPage(int page) {final int curPage = (page == 0 ? 1 : page);return curPage;}/** * 计算当前页开始记录 ** @param pageSize *            每页记录数 * @param currentPage *            当前第几页 * @return 当前页开始记录号 */public static int countOffset(int pageSize, int currentPage) {final int offset = pageSize * (currentPage - 1);return offset;}/** * 计算总页数,静态方法,供外部直接通过类名调用 ** @param pageSize *            每页记录数 * @param allRow *            总记录数 * @return 总页数 */public static int countTotalPage(int pageSize, int allRow) {int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow/ pageSize + 1;return totalPage;}}     此外还有一个用来处理分页操作并返回PageBean对象的工具类,如下:
import java.util.List;import com.sshtest.genericdao.IGenericDAO;public class PageCommand {public static PageBean queryForPage(IGenericDAO<?, ?> dao, String hql,int page, int pageSize) {int allRow = dao.getAllRowCount(hql); // 总记录数int totalPage = PageBean.countTotalPage(pageSize, allRow); // 总页数int currentPage = PageBean.countCurrentPage(page); // 计算当前页int offSet = PageBean.countOffset(pageSize, currentPage); // 当前页开始记录List list = dao.queryForPage(hql, offSet, pageSize); // "一页"的记录if (list.size() == 0) {// 如果是最后一页,显示上页内容if (currentPage > totalPage) {currentPage = totalPage;offSet = PageBean.countOffset(pageSize, currentPage);list = dao.queryForPage(hql, offSet, pageSize);}}// 把分页信息保存到Bean中PageBean pageBean = new PageBean();pageBean.setAllRow(allRow);pageBean.setCurrentPage(currentPage);pageBean.setList(list);return pageBean;}}     下面再来看看action吧,在action中处理分页的对应方法如下:
......// ajax分页public String doListClassify() throws Exception {PageBean pageBean = classifyBiz.queryForPage(getPage(), 10);String msg = parasToXML(pageBean.getList());System.out.println(msg);HttpServletResponse response = ServletActionContext.getResponse();response.setContentType("text/xml");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();out.print(msg);out.flush();out.close();return SUCCESS;}@SuppressWarnings("unchecked")private String parasToXML(List list) {StringBuffer bf = new StringBuffer();bf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");bf.append("<items>");for (Iterator it = list.iterator(); it.hasNext();) {Classify classify = (Classify) it.next();bf.append("<classify>");bf.append("<cid>" + classify.getCid() + "</cid>");bf.append("<classname>" + classify.getClassname() + "</classname>");bf.append("</classify>");}bf.append("</items>");return bf.toString();}......     至于struts.xml的编写,spring的配置等我就不一一详述了,因为附件里都有。
     三、测试
     终于到测试了,把项目部署到tomcat中,启动服务,打开浏览器,输入相应的地址,运行效果如下:

http://dl.iteye.com/upload/attachment/379882/360bb905-1fb8-3ecf-8dfa-a6d94e0051ea.jpg
 
      总结:当然由于篇幅限制,不可能全都说到,不过相信大家水平都很高,不难看懂的。而且本人水平有限,有不对的地方还希望大家能及时的指出,最后将项目代码上传,详细的大家可以看代码了。
页: [1]
查看完整版本: ssh+ajax分页的demo