springmvc+jpa实现分页的两种方式

1.工具类

public final class QueryTool {public static PageRequest buildPageRequest(int pageNumber, int pageSize, String sortType){Sort sort = null;if("auto".equals(sortType)) {sort = new Sort(Direction.DESC, "ctime");} else {sort = new Sort(Direction.DESC, "ctime");}return new PageRequest(pageNumber, pageSize, sort);}public static <T> Specification<T> buildSpecification(Map<String, Object> searchParams, Class<T> domainClass){Map<String, SearchFilter> filters = SearchFilter.parse(searchParams);Specification<T> spec = DynamicSpecifications.bySearchFilter(filters.values(), domainClass);return spec;}
}

2.Service类(只给出CommentService)

@Service
public class CommentService {@Autowiredprivate CommentDao commentDao;@Transactionalpublic void addComment(Comment comment) {if(comment == null) return;commentDao.save(comment);}@Transactionalpublic Page<Comment> findAllComments(String problemId, PageRequest pageable){Page<Comment> page = commentDao.findAllCommentsByProblemId(problemId, pageable);return page;}
}

3.repository类(problem 和 comment 属于 一对多 的关系)

@Repository
public interface CommentDao extends JpaSpecificationExecutor<Comment>,PagingAndSortingRepository<Comment, String> {@Query("select c from Comment c where c.problem.problemid = ?1")public Page<Comment> findAllCommentsByProblemId(String problemId, Pageable pageable);
}

 4.Controller类

  第一种方式

@Controller
public class ProblemController {@Autowiredprivate ProblemService problemService;@Autowiredprivate CommentService commentService;@RequestMapping(value="getCurProblemComments")@ResponseBodypublic String getCurProblemComments(String problemName, @RequestParam(value = "pn", defaultValue = "1") int pageNumber,@RequestParam(value = "ps", defaultValue = "4") int pageSize,@RequestParam(value = "sortType", defaultValue = "auto") String sortType){JSONObject jsono = new JSONObject();try {Problem problem = problemService.getProblemByName(problemName);if(problem == null){problem = problemService.addProblem(problemName);}PageRequest pageRequest = QueryTool.buildPageRequest(pageNumber, pageSize, sortType);//根据题目的id获取所有的评论Page<Comment> page = commentService.findAllComments(problem.getProblemid(), pageRequest);//对 Comment 这个类中的一些字段进行过滤SimplePropertyPreFilter spp = new SimplePropertyPreFilter();spp.getExcludes().addAll(Comment.getExcludeString());jsono.put("success", true);jsono.put("message", JSON.toJSONString(page, spp));} catch(Exception e){e.printStackTrace();jsono.put("success", false);jsono.put("message", "inner error.");}return jsono.toString();}
}

  

  第二种方式,(懒了,有些内容是放在servic中的。)

  通过JpaSpecificationExecutor<T> 的Page<T> findAll(Specification<T> spec, Pageable pageable); 方法(按照指定的规格条件)实现分页查询。

public String getCurProblemComments(@RequestParam(value = "pn", defaultValue = "1") int pageNumber,@RequestParam(value = "ps", defaultValue = "2") int pageSize,@RequestParam(value = "sortType", defaultValue = "auto") String sortType, ServletRequest request) {Map<String, Object> searchParams = new HashMap<String, Object>();searchParams = Servlets.getParametersStartingWith(request, "search_");System.out.println(EncodeUtils.toUTF8((String)searchParams.get("LIKE_name")));PageRequest pageRequest = QueryTool.buildPageRequest(pageNumber, pageSize, sortType);searchParams.put(Operator.EQ + "_dr", "0");//逻辑删除中,字段dr=0表示这条数据没有删除Specification<Comment> spec = QueryTool.buildSpecification(searchParams, Comment.class);Page<Comment> page = commentDao.findAll(spec, pageRequest);return JSON.toJSONString(page);
}

  其中,Specification中的一些比较操作org.springside.modules.persistence.SearchFilter.Operator这个类中找到,如下:

public static enum Operator {EQ, LIKE, GT, LT, GTE, LTE;
}

  前台传递过来的参数名称中可以包含 Operator 中的一些操作, 比如参数名称是: search_LIKE_name (search表示要查询时比较, LIKE是比较的操作, name是表的字段名)

5.java简单实现分页

 

分页面板类(MyPagePanel.java)

public class MyPagePanel extends JPanel{private final int PAGE_BTN_NUM = 6;//按钮的数目的最大值, 一定为偶数private JButton[] pageBtns = new JButton[PAGE_BTN_NUM];private JButton preBtn = new JButton("<<");//前一页private JButton nextBtn = new JButton(">>");//后一页private JButton jumpBtn = new JButton("跳转");private JTextField jumpText = new JTextField(5);//输入页号private JLabel totPageLabel = new JLabel("共0页");//提示一共多少页public static final int PAGE_SIZE = 2;private CommunicationPanel parentPanel;private ChatPanel chatPanel;//刷新某页public void refreshPage(){if(curPage == -1){JOptionPane.showMessageDialog(null, "请选择题目,然后再刷新!", "温馨提示",JOptionPane.WARNING_MESSAGE);} else {requestPage(curPage);}}//请求某页public void requestPage(int pageNumber){//当前页按钮设为 trueif(curBtnPos >= 0)pageBtns[curBtnPos].setEnabled(true);JSONObject jsono = new JSONObject();jsono.put("problemName", JavaRequest.problemName);jsono.put("pageSize", String.valueOf(PAGE_SIZE));jsono.put("pageNumber", String.valueOf(pageNumber));String data = JavaRequest.sendPost("getCurProblemComments", jsono);//获取当前题目的 评论记录JSONObject result = JSONObject.fromObject(data);if((Boolean) result.get("success")){//分页显示JSONObject message = JSONObject.fromObject(result.get("message"));Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();classMap.put("content", MyMessage.class);MyPage myPage = (MyPage) JSONObject.toBean(message, MyPage.class, classMap);this.updatePage(myPage);} else {JOptionPane.showMessageDialog(null, result.getString("message"), "温馨提示",JOptionPane.WARNING_MESSAGE);if(result.get("returnLogin") != null && (Boolean)result.get("returnLogin")){//如果用户登录超时返回用户登陆界面
                parentPanel.switchPanel(CommunicationPanel.LOGIN_PANEL);}}}//跳转都页面private void jumpPage(int pageNumber) throws Exception{if(pageNumber < 0 || pageNumber >= totalPages)throw new Exception("不存在该页号!");requestPage(pageNumber);}public MyPagePanel(CommunicationPanel parentPanelx, ChatPanel chatPanelx){this.parentPanel = parentPanelx;this.chatPanel = chatPanelx;preBtn.setEnabled(false);this.add(preBtn);preBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {requestPage(curPage-1);}});for(int i=0; i<pageBtns.length; ++i) {pageBtns[i] = new JButton();this.add(pageBtns[i]);pageBtns[i].setVisible(false);pageBtns[i].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//JButton text 表示的是页号String text = ((JButton)e.getSource()).getText();int pageNumber = Integer.valueOf(text);requestPage(pageNumber);}});}nextBtn.setEnabled(false);this.add(nextBtn);nextBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {requestPage(curPage+1);}});jumpBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try{if(jumpText.getText().isEmpty()) throw new Exception("页数不能为空!");int pageNumber = Integer.valueOf(jumpText.getText());jumpPage(pageNumber);} catch (Exception ex){ex.printStackTrace();JOptionPane.showMessageDialog(null, "请确定页号是否正确!", "温馨提示",JOptionPane.WARNING_MESSAGE);}}});this.add(totPageLabel);this.add(jumpText);this.add(jumpBtn);}private int curPage = -1, totalPages, curBtnPos = -1;public void updatePage(MyPage myPage){//清除当页面的信息chatPanel.getJpChat().setText("");//处理接受到的 评论消息for(MyMessage message : myPage.getContent()){chatPanel.addRecMsg(message.getCcontent(), StyleConstants.ALIGN_LEFT);}curPage = myPage.getNumber();totalPages = myPage.getTotalPages();totPageLabel.setText("共" + totalPages + "页");if(curPage == 0) preBtn.setEnabled(false);else preBtn.setEnabled(true);if(curPage == totalPages-1 || totalPages == 0) nextBtn.setEnabled(false);else nextBtn.setEnabled(true);List<Integer> pageNum = new LinkedList<Integer>();if(totalPages > 0) {int step = PAGE_BTN_NUM/2-1;for(int i=step; i>=1; --i) {if(curPage-i>=0)pageNum.add(curPage-i);}pageNum.add(curPage);for(int i=1; i<=step+1 && curPage+i<totalPages; ++i)pageNum.add(curPage+i);if(pageNum.size() < PAGE_BTN_NUM){while(pageNum.size() < PAGE_BTN_NUM && pageNum.get(0)-1 >= 0)pageNum.add(0, pageNum.get(0)-1);while(pageNum.size() < PAGE_BTN_NUM && pageNum.get(pageNum.size()-1)+1 < totalPages)pageNum.add(pageNum.get(pageNum.size()-1)+1);}}int bi = 0;for(int pi=0; pi < pageNum.size(); ++pi, ++bi){pageBtns[bi].setText(String.valueOf(pageNum.get(pi)));if(pageNum.get(pi) == curPage){curBtnPos = bi;//记录这个按钮的页号值 和 当前页号值相等
            }}//重新显示按钮for(int i=0; i<bi; ++i)pageBtns[i].setVisible(true);//后面这些按钮都是没有 用上的for(int i=bi; i < pageBtns.length; ++i){pageBtns[i].setVisible(false);}if(totalPages > 0)pageBtns[curBtnPos].setEnabled(false);}
}
View Code

MyMessage.class

public class MyMessage{private String ccontent;private String commentid;public String getCcontent() {return ccontent;}public void setCcontent(String ccontent) {this.ccontent = ccontent;}public String getCommentid() {return commentid;}public void setCommentid(String commentid) {this.commentid = commentid;}
}
View Code

MyPage.class

public class MyPage{private List<MyMessage> content;private boolean first;private boolean last;private int number;private int numberOfElements;private int size;private String totalElements;private String sort;public String getSort() {return sort;}public void setSort(String sort) {this.sort = sort;}public List<MyMessage> getContent() {return content;}public void setContent(List<MyMessage> content) {this.content = content;}public boolean isFirst() {return first;}public void setFirst(boolean first) {this.first = first;}public boolean isLast() {return last;}public void setLast(boolean last) {this.last = last;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public int getNumberOfElements() {return numberOfElements;}public void setNumberOfElements(int numberOfElements) {this.numberOfElements = numberOfElements;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public String getTotalElements() {return totalElements;}public void setTotalElements(String totalElements) {this.totalElements = totalElements;}public int getTotalPages() {return totalPages;}public void setTotalPages(int totalPages) {this.totalPages = totalPages;}private int totalPages;
}
View Code

  实现思路:

1. 首先看一下后台的json数据的格式(其中message的值是spring Data JPA分页查询结果的json)

{"success":true,"message":{"content":[{"ccontent":"hjz 2016-38-11 15:38:21*****宋体|12|0-0-0| *****0$$$$$70#####","commentid":"8ae45d92549da2a801549ec092ce001f"},{"ccontent":"hjz 2016-38-11 15:38:10*****宋体|12|0-0-0|哇哇 *****2$$$$$55#####","commentid":"8ae45d92549da2a801549ec068c7001e"}],"first":true,"last":false,"number":0,"numberOfElements":2,"size":2,"sort":{},"totalElements":8,"totalPages":4}}

 

2. 将“message”对应的值转换成MyPage对象,因为MyPage中有一个List<MyMessage>,如果属性中含有复杂的类型,当其中属性有类似List , Map ,ArrayList、自定义的类型,如List<MyMessage> content, 普通的转换会报错:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX,在JSONObject.toBean的时候如果转换的类中有集合,可以先定义Map<String, Class> classMap = new HashMap<String, Class>();在classMap中put你要转换的类中的集合名 。本例中需要将“content”对应的值转换成 MyMessage对象。

//data为后台的json串
JSONObject result = JSONObject.fromObject(data);
if((Boolean) result.get("success")){//分页显示JSONObject message = JSONObject.fromObject(result.get("message"));Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();classMap.put("content", MyMessage.class);MyPage myPage = (MyPage) JSONObject.toBean(message, MyPage.class, classMap);this.updatePage(myPage);
}

3.然后通过分页的信息,简单的实现分页按钮,详情看MyPagePanel.java

 

转载于:https://www.cnblogs.com/hujunzheng/p/5477523.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不使用session,借助redis实现验证码

1.首先看一下基本的流程 2.看一下代码 注&#xff1a;其中用到的一些工具类&#xff0c;可以到我的github上去下载 https://github.com/hjzgg/usually_util/tree/master/utils windows 下的 redis下载 https://github.com/hjzgg/redis 获取验证码的tooken RequestMapping(value…

PS批处理的使用

一、 前言 做开发的时候&#xff0c;最多的时候就是图片的使用了。有时候图片的处理都按照同样的步骤&#xff0c;比如说统一将图片的大小调整为固定大小&#xff0c;或者统一在所有的图片的的某个位置上加入文字或者小图片等等&#xff0c;这时候PS的批处理可以帮你完成这些重…

exe4j的使用

下载&#xff1a;http://download.cnet.com/exe4j/3000-2070_4-144405.html 参考&#xff1a;http://blog.chinaunix.net/uid-25749806-id-4380850.html 注&#xff1a;打包成jar包的一般就是src目录&#xff0c;其他目录放到目标文件夹中&#xff0c;目录结构如下 如何解决exe…

android表白app

一、前言 马上就要520和521了&#xff0c;是不是还有像我一样的单身狗啊。我就知道有&#xff0c;所以这两天简单写了这个小程序&#xff08;其实是替别人写的&#xff09;&#xff0c;虽然我并不会用去骗女孩子&#xff08;因为最近太忙了&#xff0c;实习完之后要搞毕设&…

webpack+react+es6开发模式

一、前言 实习了两个月&#xff0c;把在公司用到的前端开发模式做个简单的整理。公司里前端开发模式webpackreactreduxes6&#xff0c;这里去掉了redux。 webpack, react, redux等学习网址&#xff1a;http://www.cnblogs.com/hujunzheng/p/5405780.html 二、简单的步骤条组件 …

git命令分类图

转载于:https://www.cnblogs.com/hujunzheng/p/5560826.html

数据结构算法模拟系统

一、前言 学习数据结构已经有很长时间了&#xff0c;加上之前搞过一段时间的ACM&#xff0c;虽然搞得并不怎么样吧&#xff0c;但是喜欢的东西不能放弃&#xff0c;一直打算写一个算法模拟系统&#xff0c;对常用的一些算法进行简单的模拟&#xff0c;于是我的毕业设计就这样诞…

推荐几款jquery图片切换插件

一、前言 毕业季到了&#xff0c;大家都在匆匆忙忙的记录大学里最美好的时光&#xff0c;照片中各种花式、各种姿势都涌现出来了。这么多的照片怎么展示出来给自己的好友看呢&#xff1f;有人选择做成视频&#xff0c;有人选择ps之后做成图片集&#xff0c;而我选择利用静态网页…

c语言表白

马上就要520了&#xff0c;不少小伙伴们一定开始想尽各种办法进行表白了…那么身为奔跑在程序员道路上的我们也一定要有独特的表白方法&#xff01; 下面是一段表白代码&#xff0c;请直接搬去用吧&#xff01;&#xff01;&#xff01; #include <stdio.h> void change…

python表白

马上就要520了&#xff0c;不少小伙伴们一定开始想尽各种办法进行表白了…那么身为奔跑在程序员道路上的我们也一定要有独特的表白方法&#xff01; 下面是一段表白代码&#xff0c;请直接搬去用吧&#xff01;&#xff01;&#xff01; import turtle import timedef hart_ar…

git revert和reset区别

1.在github上建立测试项目并克隆到本地 2.本地中新建两个文本文件 3.将a.txt commit并push到远程仓库 执行 git add a.txt, git commit -m "a.txt", git push 4.将b.txt提交到本地仓库&#xff0c;不执行push 通过gitk命令查看提交历史如下&#xff1a; 情景&#xf…

sorl6.0+jetty+mysql搭建solr服务

1.下载solr 官网&#xff1a;http://lucene.apache.org/solr/ 2.目录结构如下 3.启动solr&#xff08;默认使用jetty部署&#xff09; 在path路径下将 bin文件夹对应的目录加入&#xff0c;然后输入 solr start&#xff08;或者 solr start -p port&#xff0c;指定端口启动&am…

Maven中安装本地Jar包到仓库中或将本地jar包上传

摘要 maven install 本地jar命令格式 mvn install:install-file -DgroupId<group_name> -DartifactId<artifact_name> -Dversion<version_no> -Dfile<path_of_the_local_jar> -Dpackagingjar -DgeneratePomtrue 示例 mvn install:install-file -Dgroup…

二维码登录原理及生成与解析

一、前言 这几天在研究二维码的扫码登录。初来乍到&#xff0c;还有好多东西不懂。在网上看到有人写了一些通过QRCode或者Zxing实现二维码的生成和解码。一时兴起&#xff0c;决定自己亲手试一试。本人是通过QRCode实现的&#xff0c;下面具体的说一下。 二、二维码原理 基础知…

knockout+echarts实现图表展示

一、需要学习的知识 knockout, require, director, echarts, jquery。简单的入一下门&#xff0c;网上的资料很多&#xff0c;最直接就是进官网校习。 二、效果展示 三、require的配置 require.config.js中可以配置我们的自定义模块的加载。 require.config({baseUrl: ".&…

React中使用Ant Table组件

一、Ant Design of React http://ant.design/docs/react/introduce 二、建立webpack工程 webpackreact demo下载 项目的启动&#xff0c;参考 三、简单配置 1.工程下载下来之后&#xff0c;在src目录下新建目录“table”&#xff0c;新建app.js&#xff0c;内容如下。 import R…

解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误

一、问题描述 1.错误截图如下。 2.设计的问题 在Eclipse中新建了一个Maven工程, 然后更改JDK版本为1.6, 结果每次使用Maven > Update project的时候JDK版本都恢复成1.5。 二、原因分析 Maven官方文档有如下描述&#xff1a; 编译器插件用来编译项目的源文件.从3.0版本开始, …

解决cookie跨域访问

一、前言 随着项目模块越来越多&#xff0c;很多模块现在都是独立部署。模块之间的交流有时可能会通过cookie来完成。比如说门户和应用&#xff0c;分别部署在不同的机器或者web容器中&#xff0c;假如用户登陆之后会在浏览器客户端写入cookie&#xff08;记录着用户上下文信息…

React使用antd Table生成层级多选组件

一、需求 用户对不同的应用需要有不同的权限&#xff0c;用户一般和角色关联在一起&#xff0c;新建角色的时候会选择该角色对应的应用&#xff0c;然后对应用分配权限。于是写了一种实现的方式。首先应用是一个二级树&#xff0c;一级表示的是应用分组&#xff0c;二级表示的是…

junit4进行单元测试

一、前言 提供服务的时候&#xff0c;为了保证服务的正确性&#xff0c;有时候需要编写测试类验证其正确性和可用性。以前的做法都是自己简单写一个控制层&#xff0c;然后在控制层里调用服务并测试&#xff0c;这样做虽然能够达到测试的目的&#xff0c;但是太不专业了。还是老…