【ssm个人博客项目实战05】easy ui datagrid实现数据的分页显示

目录

【SpringBoot2.0文章汇总目录,java多线程教程文章汇总 长期更新系列

请多多支持

前面一节 我们已经实现博客类别的dao层的实现,其中特别讲解了博客类别的分页的实现,那么现在我们实现了后台的分页,那么前台分页怎么显示呢,这时候我们用到了easyui的datagrid了。
先上一下效果图

分页结果

1、数据格式准备工作

首先我们要知道datagrid解析的是什么样的数据。在我们jquery-easyui-1.3.5/demo/datagrid/datagrid_data1.json

datagrid_data1.json

从图中我们可以看出来
这是一个接送对象,其中
total:代表的是总记录数目
rows:每条记录的数组
这就意味着我们后台返回的数据是一个json对象
里面有两个字段分别是total跟rows
前面我们已经在dao分别定义了并实现了如下方法

  /**
     * 分页查询博客类别信息
     * @param start
     * @param end
     * @return
     */
    List<BlogType> listByPage(@Param("start") Integer start, @Param("end") Integer end);

    /**
     * 查询总记录数
     * @return
     */
    Long getTotal();

那么只要我们把这个两个方法查询的数据json序列化返回跟前台就可以了,到这里我们需要做一些业务处理,把一些业务逻辑方法service层里面。

2、业务层实现

由于分页处理我们使用的字段很多例如
currPage:当前页数
pageSize:每页显示数目
total:总记录数目
result:分页查询结果,
由于字段很多所以我们直接把它封装成类PageBan 由于不仅仅是博客类别需要分页 博客也要分页 所以我们把这个PageBean设置为泛型
PageBean<T>

package ssm.blog.entity;

import java.util.List;

/**
 * Created by xp on 2017/4/14.
 */
public class PageBean<T> {

    private int currPage;   //当前页数
    private int pageSize;   //每页显示的个数
    private long total;      //总记录数
    private int start;
    private int end;
    private List<T> result; //分页查询的结果

    PageBean(){

    }

    public PageBean(int currPage, int pageSize) {
        this.currPage = currPage;
        this.pageSize = pageSize;
        this.start = (currPage-1)*pageSize;
        this.end = currPage*pageSize;
    }

    public int getCurrPage() {
        return currPage;
    }

    public void setCurrPage(int currPage) {
        this.currPage = currPage;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        this.total = total;
    }

    public List<T> getResult() {
        return result;
    }

    public void setResult(List<T> result) {
        this.result = result;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getEnd() {
        return end;
    }

    public void setEnd(int end) {
        this.end = end;
    }

    @Override
    public String toString() {
        return "PageBean{" +
                "currPage=" + currPage +
                ", pageSize=" + pageSize +
                ", total=" + total +
                ", start=" + start +
                ", end=" + end +
                ", result=" + result +
                '}';
    }
}

其中我们在构造方法public PageBean(int currPage, int pageSize)
中初始化了start 与end这样我们下次直接get就可以了

新建接口 BlogTypeService

package ssm.blog.service;

import org.springframework.stereotype.Service;
import ssm.blog.entity.BlogType;
import ssm.blog.entity.PageBean;

/**
 * Created by xp on 2017/4/14.
 * @author xp
 * @Description 博客类别service接口
 */
public interface BlogTypeService {

    //分页查询
    PageBean<BlogType> listByPage(PageBean<BlogType> pageBean);

    
}

写出对应的实现类

package ssm.blog.service.impl;

import org.springframework.stereotype.Service;
import ssm.blog.dao.BlogTypeDao;
import ssm.blog.entity.BlogType;
import ssm.blog.entity.PageBean;
import ssm.blog.service.BlogTypeService;

import javax.annotation.Resource;

/**
 * Created by xp on 2017/4/14.
 * @author xp
 * @Description 博客类别service接口实现类
 */
@Service
public class BlogTypeServiceImpl implements BlogTypeService{

    @Resource
    private BlogTypeDao blogTypeDao;

    public PageBean<BlogType> listByPage(PageBean<BlogType> pageBean) {
        //查询分页结果
        pageBean.setResult(blogTypeDao.listByPage(pageBean.getStart(),pageBean.getEnd()));
        //查询记录总数
        pageBean.setTotal(blogTypeDao.getTotal());
        return pageBean;
    }
}

3、控制层实现

由于我们使用的datagrid 当前我们点击下一页看看请求的参数

Paste_Image.png

从图中可以看出来请求的有两个参数
page:当前页数
rows:每页显示的数目

所以我们的控制器就要接受请求的参数
这样我们就可以使用@RequestParam注解来接受前台的传来的参数
因为datagrid需要的是json数据 所以这里我们需要将 对象序列化
这里我使用的是阿里巴巴的fastjson
在pom添加相关依赖

 <!-- 阿里巴巴json序列化工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.7</version>
        </dependency>

在ssm.blog.controller.admin包下新建BlogTypeController
具体的代码如下

 package ssm.blog.controller.admin;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import ssm.blog.entity.BlogType;
import ssm.blog.entity.PageBean;
import ssm.blog.service.BlogService;
import ssm.blog.service.BlogTypeService;
import ssm.blog.util.ResponseUtil;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

/**
* Created by xp on 2017/4/14.
* @author xp
* @Description 博客分类控制器
*/
@Controller
@RequestMapping(value = "/admin/blogType")
public class BlogTypeController {

   @Resource
   private BlogTypeService blogTypeService;

   // 分页查询博客类别
   @RequestMapping("/list")
   public String listBlogType(
           @RequestParam(value = "page", required = false) String page,
           @RequestParam(value = "rows", required = false) String rows,
           HttpServletResponse response) throws Exception {
       //定义分页bean
       PageBean<BlogType> pageBean = new PageBean<BlogType>(Integer.parseInt(page)
               ,Integer.parseInt(rows));
       //拿到分页结果已经记录总数的pageBean
       pageBean = blogTypeService.listByPage(pageBean);
       //使用阿里巴巴的fastJson创建JSONObject
       JSONObject result = new JSONObject();
       //通过fastJson序列化list为jsonArray
       String jsonArray = JSON.toJSONString(pageBean.getResult());
       JSONArray array = JSONArray.parseArray(jsonArray);
       //将序列化结果放入json对象中
       result.put("rows", array);
       result.put("total", pageBean.getTotal());

       //使用自定义工具类向response中写入数据
       ResponseUtil.write(response, result);
       return null;
   }
}

部分注解解释

其中@Controller代表这是一个控制器bean
@RequestMapping(value = "/admin/blogType") 类级别的请求路径 我们使用admin代表这是后台管理blogType代表管理博客类别
@RequestMapping("/list")就是请求这个分页方法的路径

fastjson序列化

第一步 创建 JSONObject result = new JSONObject();
第二步 使用 JSON.toJSONString方法将List对象序列化成json字符串
第三步 将json字符串转成JSONArray对象
第四步 将数据put进result中
第五步 将result方法

如何将json返回

第一步获取response对象
在SpringMVC中我们可以直接在方法形参中添加HttpServletResponse response即可
第二步拿到response的文本输出流对象 既
PrintWriter pw = response.getWriter();
第三步将我们需要返回的json对象写入response中
pw.println(obj.toString());
第四部关闭刷新输出流并且关闭
pw.flush();
pw.close();
因为我们可能在其他的方法也需要返回json对象 所以我们将这个流程封装成一个静态方法放在工具类中

在ssm.blog.util包中新建ResponseUtil类
代码如下

package ssm.blog.util;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

/**
 * Created by xp on 2017/4/14.
 */
public class ResponseUtil {
    /**
     * 向response对象写入数据
     * @param response
     * @param obj
     * @throws Exception
     */
    public static void write(HttpServletResponse response, Object obj)throws Exception{
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println(obj.toString());
        out.flush();
        out.close();
    }
}

接下来我们可以测试后台返回数据格式是否满足我们的要求
在这里我们使用Postman测试 url

http://localhost:8080/admin/blogType/list.do?page=1&rows=5

结果如图

请求结果

结果与前面datagrid_data1.json格式一致满足我们的要求

4、前端视图处理

在webapp目录下面的admin目录下面新建blogTypeManage.jsp

打开easyUI API手册 搜索datagrid

datagrid

从图中可以看出来datagrid本质就是table
有两种方法可以创建datagrid 在这里我们先使用js动态创建datagrid
先贴上代码

<%--
  Created by IntelliJ IDEA.
  User: xp
  Date: 2017/4/14
  Time: 08:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html>
<html lang="en">
<head>
    <title>博客类别管理</title>
    <%@include file="../common/head.jspf" %>
</head>
<script>
    $(function () {
        //datagrid初始化
        $('#dg').datagrid({
            //请求数据的url
            url: '${blog}/admin/blogType/list.do',
            //载入提示信息
            loadMsg: 'loading...',
            //水平自动展开,如果设置此属性,则不会有水平滚动条,演示冻结列时,该参数不要设置
            fitColumns: true,
            //数据多的时候不换行
            nowrap: true,
            //设置分页
            pagination: true,
            //设置每页显示的记录数,默认是10个
            pageSize: 5,
            //每页显示记录数项目
            pageList: [5, 10, 15, 20],
            //指定id为标识字段,在删除,更新的时候有用,如果配置此字段,在翻页时,换页不会影响选中的项
            idField: 'id',
            //上方工具条 添加 修改 删除 刷新按钮
            toolbar:[{
                iconCls: 'icon-add',    //图标
                text: '添加',            //名称
                handler: function () {  //回调函数
                    alert("添加");
                }
            },'-',{
                iconCls: 'icon-edit',
                text: '修改',
                handler: function () {
                      alert("添加");
                    }
            },'-',{
                iconCls: 'icon-edit',
                text: '删除',
                handler: function () {
                      alert("删除");
                }
            },'-',{
                iconCls: 'icon-reload',
                text: '刷新',
                handler: function () {
                     alert("刷新");
                }
            }],
            //同列属性,但是这些列将会冻结在左侧,z大小不会改变,当宽度大于250时,会显示滚动条,但是冻结的列不在滚动条内
            frozenColumns:[[
                {field:'checkbox',checkbox:true},    //复选框
                {field:'id',title:'编号',width:200}    //id字段
            ]],
            columns:[[
                {field:'typeName',title:'博客分类名称',width:300},   //typeName 字段
                {field:'orderNum',title:'博客类别排序',width:300},   //orderNum 字段
            ]],
        });
    });
</script>
<body>
<table id="dg"></table>
</body>
</html>

从面上面代码看出来我们只需声明一个table接下我只需要通过js就能动态创建datagrid 代码中的注解比较详细我就不在多说了
接下来只需把我们的blogTypeManage.jsp与我们main.jsp关联就可以

Paste_Image.png

这样我们重启tomcat 进入主界面 在左侧点击博客类别管理
结果如图


分页结果

最后大家关注一下我的个人公众号把。关注我公众号即可获取源码


公众号
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • 两盏淡酒敬前尘,怀旧人,祭往恨。无人邀杯,唯有对孤灯。早岁无知却轻狂,竟道是,莫无闻。酒罢微醺望星辰,半月沉,静夜...
    Trumcy阅读 515评论 0 3
  • 从小我就比较喜欢玩儿,而且是在别人看来特别会玩儿的那种。记得小时候特别喜欢做一些手工制作什么的,现在想起来对那...
    樊昀阅读 569评论 0 1