`
galfordkof2k
  • 浏览: 2653 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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),不多说了,从官网上都可以下载。截图如下:

   

 

      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`()
BEGIN
declare v int;
set v=0;
while v<50 do
insert 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. 先看看整个项目的结构吧,也很简单,相信大家一看便知了。



    

      很简单吧,从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[i];
result += "<tr>";
result += "<td width='15%'>";
result += "<input type='checkbox' name='toDelete' value='";
result += classify.getElementsByTagName("cid")[0].firstChild.nodeValue;
result += "' />";
result += "</td>";
result += "<td width='20%'>" + classify.getElementsByTagName("cid")[0].firstChild.nodeValue + "</td>";
result += "<td>";
result += "<a href='/SSHTEST/classify/edit.action?cid=";
result += classify.getElementsByTagName("cid")[0].firstChild.nodeValue;
result += "'>";
result += classify.getElementsByTagName("classname")[0].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中,启动服务,打开浏览器,输入相应的地址,运行效果如下:



 

      总结:当然由于篇幅限制,不可能全都说到,不过相信大家水平都很高,不难看懂的。而且本人水平有限,有不对的地方还希望大家能及时的指出,最后将项目代码上传,详细的大家可以看代码了。

  • 大小: 206.5 KB
  • 大小: 100.1 KB
  • 大小: 123.6 KB
分享到:
评论
1 楼 jianai115 2012-07-16  
缺了好多包啊,亲,导进去后,还是发布不了,怎么办

相关推荐

    SSH + Ajax + 分页 小项目(层次分明,代码易懂)

    SSH + Ajax + 分页 小项目是一个典型的Web应用程序开发实例,它结合了Spring、Struts2和Hibernate这三大主流Java企业级开发框架,并利用Ajax技术实现了页面无刷新的分页功能。下面将详细介绍这个项目中的关键技术和...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--dic

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    ssh+oracle分页

    在“ssh+oracle分页”这个主题中,我们将深入探讨如何利用这三个框架与Oracle数据库进行集成,并实现数据的分页显示。 1. **Struts框架**:Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--news.part2

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH+ajax(DWR)增删改查+分页

    采用SSH+ajax(DWR)实现增删改查+分页的功能!!含有数据库!可以直接运行!

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part1

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--news.part1

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH+JSP+SQL+Ajax试题与答案

    SSH+JSP+SQL+Ajax 是一套常见的Web开发技术组合,它们在构建动态、交互性强的Web应用程序中发挥着重要作用。下面将详细解释这些技术及其相互间的应用。 **SSH(Struts + Spring + Hibernate)** 1. **Struts**:这...

    SSH+ORACLE好用分页

    在这个场景下,"SSH+ORACLE好用分页"意味着我们将SSH框架与Oracle数据库结合,实现了高效的数据分页功能。 数据分页是Web应用中常见的需求,特别是在处理大量数据时,分页可以提高用户体验,避免一次性加载过多数据...

    SSH+ExtJs分页小例子

    在这个"SSH+ExtJs分页小例子"中,我们将探讨如何将这两种技术结合实现数据分页显示。 首先,我们来看NewsDAO.java文件。这个文件包含了两个关键方法:`findPageAll`和`totalRecord`。`findPageAll`方法实现了分页...

    SSH+ajax(DWR)增删改查+分页SSHTest(导入即用).rar

    这个是一个ssh+ajax的增删改查实例,很适合刚入门的程序员,在项目中发展肯定要比你整天坐着看书好,希望会对大家有用

    SSH+jQuery+json 实现的Ajax操作,绝对精华,代码简练清晰,绝对能看明白

    这个压缩包中的资源,"SSH+jQuery+json 实现的Ajax操作,绝对精华,代码简练清晰,绝对能看明白",显然提供了一个使用这些技术实现Ajax级联操作的实例。下面将详细介绍这些技术及其在Ajax操作中的应用。 **SSH ...

    SSH+ORACLE通用分页

    总的来说,"SSH+Oracle通用分页"是Java Web开发中常见的需求,它涉及到SSH框架的集成使用和Oracle数据库的高效查询策略。理解并熟练掌握这些知识,对于开发高性能、用户体验良好的Web应用至关重要。在实际项目中,还...

    ssh+ajax的二级下拉菜单

    这个项目"ssh+ajax的二级下拉菜单"结合了SSH框架与Ajax技术,实现了动态的、交互式的用户界面,特别是二级下拉菜单的功能。这个功能在网页中常见于地区选择、类别导航等场景,能够提供更流畅的用户体验。 首先,...

    SSH+Mysql无刷新分页实例

    在这个"SSH+Mysql无刷新分页实例"中,我们将探讨如何利用SSH框架与MySQL数据库实现网页的无刷新分页功能,从而提高用户体验。 首先,SSH框架中的Spring负责控制层,它提供依赖注入(Dependency Injection,DI)和...

    SSH+ajax+jquery面试实例

    SSH+Ajax+jQuery是Web开发中的核心技术组合,广泛应用于构建动态、交互性强的Web应用程序。SSH代表Spring、Struts和Hibernate三个开源框架,它们分别负责应用的依赖注入、MVC设计模式以及对象关系映射。Ajax...

    用SSH+ajax实现的上传进度条,仿qq邮箱的大文件上传窗体

    ### 使用SSH+Ajax实现上传进度条的技术解析 #### 一、技术背景介绍 在Web开发领域,用户上传大文件时的体验优化一直是重要的研究方向之一。传统的文件上传方式往往缺乏实时反馈机制,使得用户在上传过程中无法获知...

    SSH+Ajax+JSON省市级联效果Spring+Struts+Hibernate+Jquery

    SSH+Ajax+JSON在Web开发中的应用主要集中在构建动态、响应迅速的用户界面,这里我们主要探讨Spring、Struts、Hibernate这三大框架如何与Ajax和JSON技术结合,以实现省市级联选择的效果。 首先,Spring是Java企业级...

Global site tag (gtag.js) - Google Analytics