今天闲来无事,写了个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
分享到:
相关推荐
这个“ssh+extjs全注解的上传、分页、验证码的demo”提供了如何在SSH后端框架基础上,结合EXTJS实现文件上传、分页显示数据以及验证码功能的示例。 首先,Struts2作为MVC(模型-视图-控制器)框架,负责处理HTTP...
本项目是一个基于Spring SSH的房屋租赁网站Demo,它展示了如何将这三个框架整合起来,实现一个完整的Web应用,同时结合MySQL数据库来存储和检索数据。 1. **Spring框架**:Spring是Java企业级应用的核心框架,提供...
本篇文章将详细解释如何在SSH框架下实现分页功能。 首先,`PageUtil.java`通常包含用于分页操作的工具类。在Hibernate中,我们可以利用Criteria或HQL进行分页查询。PageUtil会封装这些查询方法,例如设置查询条件、...
- `user` Action:成功后返回`/WEB-INF/demo/user_list.jsp`页面,通常这个页面会包含展示数据的表格。 - `getUsers` Action:通过`UserAction`类的`getUserList`方法获取用户列表,结果类型设置为`json`,这意味着...
- **Demo源代码**:提供了一个完整的SSH开发范例,可以帮助初学者快速理解框架的使用方法。 - **使用说明文档**:详细介绍如何安装配置以及如何使用框架提供的各种功能。 - **示例项目**:包含了一系列实际应用场景...
- 创建`demo`文件夹,用于存放测试代码。 - 在`webRoot`目录下创建`jsp`、`js`和`resource`文件夹,分别用于存放JSP页面、JavaScript文件和其他静态资源。 4. **加入框架(SSH框架):** - **加入Struts框架:**...
另一个文件“demossh”可能是一个包含S2SH项目的源代码文件,其中包括控制器、服务层和持久层的实现,特别是与分页相关的代码。 【S2SH框架详解】 1. **Struts2**:作为MVC框架的一部分,负责处理HTTP请求,定义...
在项目【demo_ssh2】中,开发者可能已经完成了以下步骤: 1. **配置环境**:安装并配置好MyEclipse2014,导入相关的jar包,设置项目的类路径和web.xml配置。 2. **创建数据库模型**:使用Hibernate的注解或XML配置...