Ajax分页 Spring MVC + Hibernate
效果图:
1. 添加公共类、方法、代码
1. 分页类:Page.java
package cn.com.aperfect.sso.base.dao;
import java.util.ArrayList;
import java.util.List;
public class Page<T> {
// 当前页数
private int currentPage;
// 记录偏移量
private int offset;
// 总页数
private int totalsPage;
// 每页显示记录条数
private int pageSize;
// 总记录条数
private int totalsCount;
// 查询返回结果
private List<T> result = new ArrayList<T>();
// 分页链接
private String uri;
public Page(){}
public Page(int currentPage, int pageSize) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.offset = (currentPage-1)*pageSize;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) throws Exception {
if (currentPage < 0) {
currentPage = 0;
}
this.currentPage = currentPage;
}
public int getTotalsPage() {
try {
if (totalsCount % pageSize == 0) {
totalsPage = totalsCount / pageSize;
} else {
totalsPage = (totalsCount / pageSize) + 1;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return totalsPage;
}
public void setTotalsPage(int totalsPage) {
if (totalsPage < 0) {
totalsPage = 0;
}
this.totalsPage = totalsPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
if (pageSize <= 0) {
pageSize = 20;
}
this.pageSize = pageSize;
}
public int getTotalsCount() {
return totalsCount;
}
public void setTotalsCount(int totalsCount) {
if (totalsCount < 0) {
totalsCount = 0;
}
this.totalsCount = totalsCount;
}
public List<T> getResult() {
return result;
}
public void setResult(List<T> result) {
this.result = result;
}
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
}
2. 公共的DAO / DAOImpl
DAO
/** * <b>function:</b> 传入查询语句和查询参数名key对应value,page指定currentPage和pageSize * @param queryHql 查询语句 * @param paramMap 参数 * @param page 当前页和每页几条数据 * @throws Exception */ public Page<T> showPage(String queryHql,String countHql, Map<String, Object> paramMap,int currentPage, int pageSize) throws Exception;
IMPL
public Page<T> showPage(String queryHql, String countHql, Map<String, Object> paramMap, int currentPage, int pageSize) throws Exception {
Page<T> page = new Page<T>(currentPage, pageSize);
try {
int dataCount = queryForInt(countHql, paramMap);
page.setResult(queryForList(queryHql, paramMap, page.getOffset(),pageSize));
page.setTotalsCount(dataCount);
} catch (Exception e) {
throw new RuntimeException(e);
}
return page;
}
private final int queryForInt(String queryIntHQL,Map<String, Object> paramMap){
Query query = this.getSession().createQuery(queryIntHQL);
setQueryParameterValues(paramMap, query);
int result = Integer.parseInt(query.uniqueResult().toString());
return result;
}
private final List<T> queryForList(String queryHql,Map<String, Object> paramMap, int offset,int pageSize){
Query query = this.getSession().createQuery(queryHql);
setQueryParameterValues(paramMap, query);
if (offset>=0) {
query.setFirstResult(offset);
}
if (pageSize>0) {
query.setMaxResults(pageSize);
}
return query.list();
}
private final void setQueryParameterValues(Map<String, Object> paramMap,Query query){
if (CollectionUtil.isEmpty(paramMap)) return ;
for (Entry<String, Object> entry : paramMap.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
}
2. 代码(Controller)
Controller分别有两个请求的方法,请求的地址是不一样的。
一个用于初始化页面时候请求,另外一个是分页时候Ajax用的请求。
(第一个请求返回的是整个页面,ajax请求返回的只是一个抽取出来的*table.jsp,所以要两个请求,只是返回的jsp不一样。只是使用了js将原来页面的table替换掉新的而已)
方法主体是一样的。
@Controller
@RequestMapping("/srmUser")
public class SrmUserController {
@Resource
private ISrmUserService srmUserService;
private void doSearch(HttpServletRequest request, HttpServletResponse response) throws Exception{
int currentPage = ServletRequestUtils.getIntParameter(request, "currentPage", 1);
int pageSize = ServletRequestUtils.getIntParameter(request, "pageSize", 10);
//前台数据传到后台查询
String enterpriseName = ServletRequestUtils.getStringParameter(request, "enterpriseName");
String vendorName = ServletRequestUtils.getStringParameter(request, "vendorName");
String userName = ServletRequestUtils.getStringParameter(request, "userName");
String status = ServletRequestUtils.getStringParameter(request, "status");
String fromCreateDate = ServletRequestUtils.getStringParameter(request, "fromCreateDate");
String toCreateDate = ServletRequestUtils.getStringParameter(request, "toCreateDate");
Page<SrmUser> page = srmUserService.searchUserList(enterpriseName,vendorName,userName,status,fromCreateDate,toCreateDate, currentPage, pageSize);
//数据返回前台
request.setAttribute("enterpriseName", enterpriseName);
request.setAttribute("vendorName", vendorName);
request.setAttribute("userName", userName);
request.setAttribute("status", status);
request.setAttribute("fromCreateDate", fromCreateDate);
request.setAttribute("toCreateDate", toCreateDate);
request.setAttribute("toCreateDate", toCreateDate);
request.setAttribute("userListDto", page.getResult());
request.setAttribute("pageEntity", page);
}
@RequestMapping("/searchUser")
public String searchUser(HttpServletRequest request, HttpServletResponse response) throws Exception {
doSearch(request, response);
return "/srm_management/srmUser_manage";
}
@RequestMapping("/ajaxSearchUser")
public String ajaxSearchUser(HttpServletRequest request, HttpServletResponse response) throws Exception {
doSearch(request, response);
return "/srm_management/inc/srmUser_table";
}
}
具体查询代码
@Override
public Page<SrmUser> getUserList(String enterpriseName, String vendorName,
String userName, String status, String fromCreateDate,
String toCreateDate, int currentPage, int pageSize) throws Exception {
Page<SrmUser> page = null;
StringBuffer sbHQL = new StringBuffer();
StringBuffer countHQL = new StringBuffer();
Map<String, Object> paramMap = new HashMap<String, Object>();
try {
sbHQL.append("from SrmUser u where 1=1 ");
countHQL.append("select count(*) from SrmUser u where 1=1 ");
if (!StringUtil.isEmpty(enterpriseName)) {
sbHQL.append(" and u.enterprise.enterpriseName like :enterpriseName ");
countHQL.append(" and u.enterprise.enterpriseName like :enterpriseName ");
paramMap.put("enterpriseName", "%"+enterpriseName+"%");
}
if (!StringUtil.isEmpty(vendorName)) {
sbHQL.append(" and u.userId in (");
sbHQL.append("select userId from SrmUserVendor s where s.vendorId in (");
sbHQL.append("select vendorId from SrmVendor v where v.vendorName like :vendorName)) ");
countHQL.append(" and u.userId in (");
countHQL.append("select userId from SrmUserVendor s where s.vendorId in (");
countHQL.append("select vendorId from SrmVendor v where v.vendorName like :vendorName)) ");
paramMap.put("vendorName", "%"+vendorName+"%");
}
if (!StringUtil.isEmpty(userName)) {
sbHQL.append(" and u.userName like :userName ");
countHQL.append(" and u.userName like :userName ");
paramMap.put("userName", "%"+userName+"%");
}
if (!StringUtil.isEmpty(status)) {
sbHQL.append(" and u.status = :status ");
countHQL.append(" and u.status = :status ");
paramMap.put("status", Integer.parseInt(status));
}
if (!StringUtil.isEmpty(fromCreateDate)) {
sbHQL.append(" and u.createDate >= :fromCreateDate ");
countHQL.append(" and u.createDate >= :fromCreateDate ");
paramMap.put("fromCreateDate", fromCreateDate);
}
if (!StringUtil.isEmpty(toCreateDate)) {
sbHQL.append(" and u.createDate < :toCreateDate ");
countHQL.append(" and u.createDate < :toCreateDate ");
//toCreateDate 要加上一天
java.util.Date date = new SimpleDateFormat("yyyy-MM-dd").parse(toCreateDate);
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(Calendar.DATE,1);
date= calendar.getTime();
paramMap.put("toCreateDate", date);
}
sbHQL.append(" order by u.userId asc ");
page = showPage(sbHQL.toString(), countHQL.toString(), paramMap, currentPage, pageSize);
3. 前台JSP等
Jsp要分成两部分,一部分是整体的第一次请求的时候的整体页面。
另一部分是*_table.jsp 就是要分页的那个table。
只要在整体里面抽出*_table.jsp页面就可以,然后整体页面里面引用*_table.jsp页面。
将要ajax请求的table替换成下面,这个<span>是用于后面Ajax请求成功的时候要替换的标识
<span id="resourceSpan"> <jsp:include page="inc/srmUser_table.jsp" /> </span>
后台将整个*_table.jsp 页面返回到前台的<span>里面。
*.table.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<table class="details">
<tr class="noticClsSrm">
<td>企业</td>
<td>用户名</td>
<td>创建者</td>
<td>创建时间</td>
<!-- <td>最后编辑者</td>
<td>最后更新时间</td> -->
<td>状态</td>
</tr>
<c:forEach var="userDto" items="${requestScope.userListDto}">
<tr>
<td>${userDto.enterprise.enterpriseName }</td>
<td>${userDto.userName }</td>
<td>${userDto.creatorName }</td>
<td>
<fmt:formatDate value="${userDto.createDate }" pattern="yyyy-MM-dd"/>
</td>
<%-- <td>${userDto.editorName }</td>
<td>
<fmt:formatDate value="${userDto.updateDate }" pattern="yyyy-MM-dd"/>
</td> --%>
<td>
<c:if test="${userDto.status==0 }">启动</c:if>
<c:if test="${userDto.status==1 }">冻结</c:if>
<c:if test="${userDto.status==2 }">删除</c:if>
</td>
</tr>
</c:forEach>
</table>
<jsp:include page="../../commons/page_ajax.jsp"/>
<script type="text/javascript">
//分页跳转
var totalsPage = '${pageEntity.totalsPage}';
if (totalsPage == '') totalsPage = 1;
function ajaxGotoPage(currentPage) {
if (currentPage == null || currentPage == "") return;
if (isNaN(currentPage)) return;
if (currentPage < 1) currentPage = 1;
else if ((currentPage > totalsPage) || (currentPage==${pageEntity.currentPage})) return;
var resourceSpan = $("#resourceSpan");
resourceSpan.html("<br/><img src='${pageContext.request.contextPath }/commons/images/blue-loading.gif'/>");
$.ajax({
url:'${pageContext.request.contextPath }/v/srmUser/ajaxSearchUser',
type:'post',
data:{
currentPage:currentPage,
enterpriseName:$("#enterpriseName").val(),
vendorName:$("#vendorName").val(),
userName:$("#userName").val(),
status:$("#status").val(),
fromCreateDate:$("#fromCreateDate").val(),
toCreateDate:$("#toCreateDate").val()
},
dataType:'text',
timeout:60000,
error: function(e) {
alert(e);
},
success: function(result){
resourceSpan.html(result);
}
});
}
function gotoPageByInput(){
var currentPage=document.getElementById('goInput').value;
ajaxGotoPage(parseInt(currentPage));
}
</script>
page_ajax.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<style>
<span style="white-space:pre"> </span>.goSearchButton{background:url(<c:url value='/resources/images/ok.gif' />);border:0 none;height:19px;margin:0 0 0 5px;text-indent:-999px;width:37px;}
<span style="white-space:pre"> </span>div.yk-pager {text-align: right;padding:3px 0px;margin: 3px 0px;color:#666666;}
<span style="white-space:pre"> </span>div.yk-pager a{color: #036CB4;margin-right: 2px;padding:2px 5px;text-decoration: none;border:1px solid #929196;}
<span style="white-space:pre"> </span>div.yk-pager a:hover {padding:2px 5px;margin-right: 2px;background-color:#ccdaf3;border: #a0a0a0 1px solid;}
<span style="white-space:pre"> </span>div.yk-pager a:active {padding:2px 5px;margin-right: 2px;background-color:#ccdaf3;border: #a0a0a0 1px solid;}
<span style="white-space:pre"> </span>div.yk-pager span.current {font-weight: bold;color: #FFFFFF;padding:2px 5px;margin-right: 2px;background-color:#6390cb;border:1px solid #3d68a0}
<span style="white-space:pre"> </span>div.yk-pager span.disabled {color: #ccc;margin-right: 2px;border:1px solid #f3f3f3;padding:2px 5px;}
<span style="white-space:pre"> </span>div.yk-pager .goInput{border:1px solid #99bbe8;color:#000000;font-family:Tahoma,SimSun,Arial;height:18px;margin:0 5px;text-align:center;vertical-align:top;width:30px;}
<span style="white-space:pre"> </span>div.yk-pager .goButton{background:url(skin/ok.gif);border:0 none;height:19px;margin:0 0 0 5px;text-indent:-999px;width:37px;}
</style>
<div class="yk-pager">
<a href="javascript:ajaxGotoPage(1);">首页</a>
<a href="javascript:ajaxGotoPage(${pageEntity.currentPage-1});"> ◄上一页</a>
<a href="javascript:ajaxGotoPage(${pageEntity.currentPage+1});"> 下一页► </a>
<a href="javascript:ajaxGotoPage(${pageEntity.totalsPage });"> 末页</a>
总${pageEntity.totalsCount }条,第${pageEntity.currentPage}/${pageEntity.totalsPage }页,到第<input size=2 id="goInput" value=''/>页,
<input type="button" class="goButton" onclick="gotoPageByInput();"/>
</div>
ok.gif
Ajax分页 Spring MVC + Hibernate的更多相关文章
- IntelliJ IDEA:Getting Started with Spring MVC, Hibernate and JSON实践
原文:IntelliJ IDEA:Getting Started with Spring MVC, Hibernate and JSON实践 最近把编辑器换成IntelliJ IDEA,主要是Ecli ...
- Spring + Spring MVC + Hibernate
Spring + Spring MVC + Hibernate项目开发集成(注解) Posted on 2015-05-09 11:58 沐浴未来的我和你 阅读(307) 评论(0) 编辑 收藏 在自 ...
- IntelliJIDEA Getting+Started+with+Spring+MVC,+Hibernate+and+JSON
https://confluence.jetbrains.com/display/IntelliJIDEA/Getting+Started+with+Spring+MVC,+Hibernate+and ...
- Spring + Spring MVC + Hibernate项目开发集成(注解)
在自己从事的项目中都是使用xml配置的方式来进行的,随着项目的越来越大,会发现配置文件会相当的庞大,这个不利于项目的进行和后期的维护.于是考虑使用注解的方式来进行项目的开发,前些日子就抽空学习了一下. ...
- Java 本地开发环境搭建(框架采用 Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6)
项目搭建采用技术栈为:Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6 搭建环境文档目录结构说明: 使用Intellj Idea 搭建项目过 ...
- spring mvc: Hibernate验证器(字段不能为空,在1-150自己)
spring mvc: Hibernate验证器(字段不能为空,在1-150自己) 准备: 下载Hibernate Validator库 - Hibernate Validator.解压缩hibern ...
- Spring MVC第一课:用IDEA构建一个基于Spring MVC, Hibernate, My SQL的Maven项目
作为一个Spring MVC新手最基本的功夫就是学会如何使用开发工具创建一个完整的Spring MVC项目,本文站在一个新手的角度讲述如何一步一步创建一个基于Spring MVC, Hibernate ...
- Spring MVC Hibernate MySQL Integration(集成) CRUD Example Tutorial【摘】
Spring MVC Hibernate MySQL Integration(集成) CRUD Example Tutorial We learned how to integrate Spring ...
- Spring mvc+hibernate+freemarker(实战)
Spring mvc+hibernate+freemarker(实战) 博客分类: Spring Spring mvchibernatefreemarkerwebjava 今天我为大家做了一个 sp ...
随机推荐
- 判断是否是IE9浏览器的最短语句 var ie=!-[1,]
没错,上面这个语句就可以判断浏览器是不是IE9以下的.why?1.[1,]在现代浏览器(ie包括ie9及以上)会被转换成[1], 而ie9以下就会转换成[1,undefined].2.分别对[1],和 ...
- 关于spring定时任务被多次调用的问题
在项目开发中,难免会用到定时任务,如果你的项目中用了spring这个框架,那么恭喜你,你的定时任务的创建将变得无比简单. 代码中只需要一个 @Scheduled标签,然后配置对应的执行频率即可 pas ...
- Node.js NPM 使用介绍
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...
- MongoDB 自动增长
MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识. 但在某些情况下,我们可能需要实现 ObjectId 自动增长功能. 由于 Mon ...
- JavaScript中的事件模型
JS中的事件 1.鼠标事件 onclick ondbclick onmouseover onmouseout 2.HTML事件 onload onunload onsubmit ...
- C++用LuaIntf调用Lua代码示例
C++用LuaIntf调用Lua代码示例 (金庆的专栏 2016.12) void LuaTest::OnResponse(uint32_t uLuaRpcId, const std::string& ...
- Java集合框架总结
java集合框架主要分为实现了Collection接口的List和Set.映射接口Map. |-- List 有序,元素都有索引,可重复. |-- Set 无序,不可以存储重复的元素. |-- Map ...
- Linux下文件的mtime/atime/ctime研究
概述 在Linux下,对于某一个文件或文件夹时间的描述有三种:文件修改时间mtime,文件访问时间atime,文件状态改变时间ctime.在Linux下无法获取到文件的创建时间,因为根本就没有保存这个 ...
- 【SSH系列】一步步深入springmvc+商品列表查询demo
在前面的博文中,小编主要简单的介绍springmvc的体系结构.mvc模式的优缺点以及mvc框架,今天我们来继续学习springmvc的相关知识,在这篇博文中,小编讲解过springmvc的体系结构, ...
- 在Windows cmd中计算行数
本文主体来自这篇外文文章的翻译.原文中有一个副标题:"如何简单地用Windows自带的FIND在CMD.exe中计算行数" 当我们在命令行环境中工作时,能计算其它工具输出内容的行数 ...