本博客介绍基于Spring Data这款orm框架加上Jquery.pagination插件实现的分页功能。
介绍一下Spring Data框架
spring Data : Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。
下面给出SpringData 项目所支持 NoSQL 存储:
- MongoDB (文档数据库)
- Neo4j(图形数据库)
- Redis(键/值存储)
- Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术:
- JDBC
- JPA
JPA Spring Data : 致力于减少数据访问层 (DAO) 的开发量。开发者只要写好持久层接口就好,然后其它的框架会帮程序员实现。
开发步骤:
【Spring Data实现数据获取】
本项目是采用maven的,所以可以参考一下我的maven配置:
muses
org.muses
1.0-SNAPSHOT
4.0.0
jeeplatform-admin
war
jeeplatform-admin Maven Webapp
http://maven.apache.org
4.1.5.RELEASE
1.4.2.RELEASE
1.6.2.RELEASE
4.3.8.Final
1.2.3
4.7.2
1.0.9
3.7
org.muses
jeeplatform-core
${jeeplatform.core.version}
org.muses
jeeplatform-common
1.0-SNAPSHOT
org.muses
jeeplatform-oss
${jeeplatform.oss.version}
org.muses
jeeplatform-upms
1.0-SNAPSHOT
javax.servlet
servlet-api
2.5
provided
jstl
jstl
1.2
taglibs
standard
1.1.2
log4j
log4j
${log4j.version}
commons-beanutils
commons-beanutils
1.8.3
commons-collections
commons-collections
3.2.1
net.sf.ezmorph
ezmorph
1.0.6
commons-lang
commons-lang
2.5
commons-logging
commons-logging
1.2
net.sf.json-lib
json-lib
2.4
jar
jdk15
compile
mysql
mysql-connector-java
${mysql.version}
commons-io
commons-io
2.0.1
commons-fileupload
commons-fileupload
1.2.2
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-test
${spring.version}
test
org.springframework
spring-web
${spring.version}
org.springframework
spring-aop
${spring.version}
org.aspectj
aspectjweaver
1.6.10
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework.data
spring-data-jpa
${spring-data-jpa.version}
org.springframework.data
spring-data-commons
${spring-data-commons.version}
org.hibernate.javax.persistence
hibernate-jpa-2.1-api
1.0.0.Final
org.hibernate
hibernate-core
${hibernate.version}
org.hibernate
hibernate-entitymanager
${hibernate.version}
org.slf4j
slf4j-api
1.6.1
net.sf.ehcache
ehcache-core
2.5.0
org.hibernate
hibernate-ehcache
${hibernate.version}
com.alibaba
druid
${druid.version}
org.apache.shiro
shiro-all
${shiro.version}
org.apache.velocity
velocity
1.6
org.apache.velocity
velocity-tools
2.0
org.apache.lucene
lucene-core
${lucene.version}
org.apache.lucene
lucene-analyzers-common
${lucene.version}
org.apache.lucene
lucene-queryparser
${lucene.version}
org.apache.lucene
lucene-memory
${lucene.version}
org.apache.lucene
lucene-highlighter
${lucene.version}
org.wltea.analyzer
IKAnalyzer
2012FF_u1
system
${basedir}/src/main/webapp/WEB-INF/lib/IKAnalyzer2012FF_u1.jar
log4j
log4j
${log4j.version}
commons-beanutils
commons-beanutils
1.8.3
commons-collections
commons-collections
3.2.1
net.sf.ezmorph
ezmorph
1.0.6
commons-lang
commons-lang
2.5
commons-logging
commons-logging
1.2
net.sf.json-lib
json-lib
2.4
jar
jdk15
compile
org.apache.poi
poi
${poi.version}
com.sun.mail
javax.mail
1.5.6
jeeplatform-admin
设计好数据库,编写一个实体类:
package org.muses.jeeplatform.model.entity;
import java.util.Date;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* 用户信息的实体类
* @author Nicky
*/
@Entity
@Table(name="sys_user")
public class User {
/** 用户Id**/
private int id;
/** 用户名**/
private String username;
/** 用户密码**/
private String password;
/** 手机号**/
private int phone;
/** 性别**/
private String sex;
/** 邮件**/
private String email;
/** 备注**/
private String mark;
/** 用户级别**/
private String rank;
/** 最后一次时间**/
private Date lastLogin;
/** 登录ip**/
private String loginIp;
/** 图片路径**/
private String imageUrl;
/** 注册时间**/
private Date regTime;
/** 账号是否被锁定**/
private Boolean locked = Boolean.FALSE;
private Set roles;
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(unique=true,length=100,nullable=false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(length=100,nullable=false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getPhone() {
return phone;
}
public void setPhone(int phone) {
this.phone = phone;
}
@Column(length=6)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(length=100)
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(length=30)
public String getMark() {
return mark;
}
public void setMark(String mark) {
this.mark = mark;
}
@Column(length=10)
public String getRank() {
return rank;
}
public void setRank(String rank) {
this.rank = rank;
}
@Temporal(TemporalType.DATE)
public Date getLastLogin() {
return lastLogin;
}
public void setLastLogin(Date lastLogin) {
this.lastLogin = lastLogin;
}
@Column(length=100)
public String getLoginIp() {
return loginIp;
}
public void setLoginIp(String loginIp) {
this.loginIp = loginIp;
}
@Column(length=100)
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
@Temporal(TemporalType.DATE)
@Column(nullable=false)
public Date getRegTime() {
return regTime;
}
public void setRegTime(Date regTime) {
this.regTime = regTime;
}
public Boolean getLocked() {
return locked;
}
public void setLocked(Boolean locked) {
this.locked = locked;
}
}
编写接口实现Spring Data框架的PagingAndSortingRepository接口
package org.muses.jeeplatform.repository;
import org.muses.jeeplatform.model.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import java.util.Date;
public interface UserRepository extends PagingAndSortingRepository {
/*User findByUsername(String username);
@Query("from User u where u.username=:username and u.password=:password")
User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
@Query("from User u where u.id=:id")
User findById(@Param("id") int id);
@Query("from User u where date_format(u.lastLogin,'yyyy-MM-dd') between date_format((:startDate),'yyyy-MM-dd') and date_format((:endDate),'yyyy-MM-dd')")
Page searchU(@Param("startDate")Date startDate,@Param("endDate")Date endDate, Pageable pageable);
*/
}
业务类实现:
package org.muses.jeeplatform.service;
import java.util.*;
import org.muses.jeeplatform.model.entity.User;
import org.muses.jeeplatform.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
/**
* @description 用户信息管理的业务类
* @author Nicky
* @date 2017年3月6日
*/
@Service
public class UserService {
@Autowired
UserRepository userRepository;
/**
* 构建PageRequest对象
* @param num
* @param size
* @param asc
* @param string
* @return
*/
private PageRequest buildPageRequest(int num, int size, Sort.Direction asc,
String string) {
return new PageRequest(num-1, size,null,string);
}
/**
* 获取所有的菜单信息并分页显示
* @param pageNo
* 当前页面数
* @param pageSize
* 每一页面的页数
* @return
*/
@Transactional
public Page findAll(int pageNo, int pageSize, Sort.Direction dir, String str){
PageRequest request = buildPageRequest(pageNo, pageSize, dir, str);
Page users = userRepository.findAll(request);
return users;
}
}
控制类,采用SpringMVC框架,先编写一个baseController,实现一些通用功能的封装:
package org.muses.jeeplatform.web.controller;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;
public class BaseController {
Logger log = null;
/**
* 获取日志对象
* @return
*/
public Logger getInstance(){
if(log == null){
log = LoggerFactory.getLogger(BaseController.class);
}
return log;
}
/**
* 得到request对象
*/
public HttpServletRequest getRequest() {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
return request;
}
/**
* 得到ModelAndView
*/
public ModelAndView getModelAndView(){
return new ModelAndView();
}
}
控制类实现:
package org.muses.jeeplatform.web.controller;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.apache.commons.collections.map.HashedMap;
import org.muses.jeeplatform.core.Constants;
import org.muses.jeeplatform.core.ExcelViewWrite;
import org.muses.jeeplatform.core.JavaEmailSender;
import org.muses.jeeplatform.model.entity.User;
import org.muses.jeeplatform.service.UserService;
import org.muses.jeeplatform.utils.DateJsonValueProcessor;
import org.muses.jeeplatform.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.*;
/**
* Created by Nicky on 2017/7/29.
*/
@RequestMapping("/user")
@Controller
public class UserController extends BaseController{
@Autowired
UserService userService;
/**
* 查询所有管理员信息并分页显示
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value = "/queryAll",produces = "application/json;charset=UTF-8")
@ResponseBody
public ModelAndView findAll(HttpServletRequest request, HttpServletResponse response, Model model){
//当前页
String pageIndexStr = request.getParameter("pageIndex");
//每一页的页数
int pageSize = Constants.PAGE_SIZE;
ModelAndView mv = this.getModelAndView();
Page userPage;
if(pageIndexStr==null||"".equals(pageIndexStr)){
pageIndexStr = "0";
}
int pageIndex = Integer.parseInt(pageIndexStr);
userPage = userService.findAll(pageIndex+1, pageSize, Sort.Direction.ASC,"id");
mv.addObject("totalCount",userPage.getTotalElements());
mv.addObject("pageIndex",pageIndex);
// JsonConfig cfg = new JsonConfig();
// cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
JsonConfig jcg = new JsonConfig();
jcg.registerJsonValueProcessor(Date.class,
new DateJsonValueProcessor("yyyy-mm-dd"));
JSONArray jsonArray = JSONArray.fromObject(userPage.getContent(),jcg);
//System.out.println(jsonArray.toString());
mv.addObject("users",jsonArray.toString());
mv.setViewName("admin/user/sys_user_list");
return mv;
}
}
【前端页面实现】
页面View实现,引用 jquery.pagination.js (分页js),跟pagination.css(分页样式css)。
可以去这里下载
http://www.cnblogs.com/knowledgesea/archive/2013/01/03/2841554.html
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
Insert title here
序号
用户名
描述
手机
邮箱
最近登录
上次登录IP
操作
前端页面展示:
ok,本博客是基于一款正在开发中的github开源项目的,项目代码地址:https://github.com/u014427391/jeeplatform
欢迎star(收藏)或者可以下载去学习,不过还在开发...