3

图片展示
image.png
springBoot所有依赖和配置文件都写好的情况下
1、dao接口的实现方法

package com.cy.pj.sys.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.cy.pj.sys.pojo.SysLog;
@Mapper
public interface SysLogDao {
/**
 * 
 * @param username 查询条件(例如查询那个用户的日志信息)
 * @return  总记录数(基于这个结果可以计算总页数)
 */
    int getRowCount(@Param("username") String username);
    /**
     * 
     * @param username 查询条件(例如查询那个用户的日志信息)
     * @param startIndex 当前页的起始位置
     * @param paInteger 当前页的页面大小
     * @return 当前页的日志记录信息
     * 数据库中每条日志信息封装到一个SysLog对象中
     */
    List<SysLog> findPageObjects(
            @Param("username")String username,
            @Param("startIndex")Integer startIndex,
            @Param("pageSize")Integer pageSize
            );
}

2、写实现dao中Mapper的sql语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.pj.sys.dao.SysLogDao">
<!-- sql元素用于对于sql语句共性的提取,需要的位置用<include>引入 -->
    <sql id="queryWhereId">
        from sys_Logs
        <where>
            <if test="username!=null and username!=''">
                username like concat('%',#{username},'%')
                <!-- concat 字符串的连接 -->
            </if>
        </where>
    </sql>
    <!-- 按条件统计记录总数 -->
    <select id="getRowCount" resultType="int">
    select count(*)
    <include refid="queryWhereId"/>
    </select>
    <!-- 在映射文件中添加为id为 findPageObjects元素,,实现分页查询-->
    <select id="findPageObjects" resultType="com.cy.pj.sys.pojo.SysLog">
    select * 
    <include refid="queryWhereId"/>
    order by createdTime desc 
    limit #{startIndex},#{pageSize}
    </select>
</mapper>

3、写pojo类对数据进行封装,所显示的表字段的pojo类
3.1这里是SysLog

package com.cy.pj.sys.pojo;
import java.io.Serializable;
import java.util.Date;

import lombok.Data;
/**
 * 定义用于封装日志信息的一个pojo对象,这样的对象,在定义时要遵循一下规则
 * 1)属性尽量都用对象类型
 * 2)提供无参数构造函数
 * 3)提供set/get方法,boolean类型变量不能以is作为前缀
 * 4)实现序列化接口并手动添加序列化id(便于后续对此对象进行序列化):在java中建议所有用于存储数据 的对象都实现
 * FAQ?
 * 1)为什么要实现序列化接口
 * 2)什么是序列化?(将对象转化为字节)
 * 3)为什么要序列化?应用在什么场景?(将数据持久化,或将数据存储到缓存中)
 * 4)什么是反序列化?(将字节转换为对象
 * 5)如何序列化和反序列化
 * 5.1)设计类是要实现序列化接口
 * 5.2)构建IO对象(ObjectOutputStream/ObjectinputStream)
 * 5.3)通过I/O对象进行序列化和反序列化
 * @author Administrator
 *
 */
@Data
public class SysLog implements Serializable{

    private static final long serialVersionUID = -1592163223057343412L;
private Integer id;
//用户名
private String username;
//用户操作
private String operation;
//请求方法
private String method;
//请求参数
private String params;
//执行时长(毫秒)
private Long time;
//ip地址
private String ip;
//创建时间
private Date createdTime;
}

3.2对获取的信息进行封装(获取分页信息的页码值、页面大小(就是每页所显示的记录)、获取的表总共记录数、总页数 、当前记录)

package com.cy.pj.sys.pojo;

import java.util.List;

import lombok.Data;
/**
 * 
 * @author PageObject 为业务封装分业务相关数据的BO对象
 * @param <T>参数化的类型(泛型)
 */
@Data
public class PageObject<T> {//类名<泛型>:类泛型(这里的泛型用于约束类中的属性,方法参数,方法的返回值)
    /**当前页的页码值 */
    private Integer pageCurrent=1;
     /**页面大小*/
    private Integer pageSize=3;
      /**总行数(通过查询获得)*/

    private Integer rowCount=0;
    /**总页数(通过计算获得)*/

    private Integer pageCount=0;
    /**当前页记录*/
     private List<T> records;

}

3.3处理异常进行封装

package com.cy.pj.sys.pojo;

public class JsonResult {
    /**
     * 状态码
     */
private int state=1;
/**
 * 状态信息
 */
private String message="ok";
/**
 * 正确数据
 */
private Object data;
public JsonResult() {
}
public JsonResult(String message) {
    this.message = message;

}
public JsonResult(Object data) {
    this.data = data;
}
public JsonResult(Throwable t) {
    this.state=0;
    this.message=t.getMessage();

}
public int getState() {
    return state;
}
public void setState(int state) {
    this.state = state;
}
public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}
public Object getData() {
    return data;
}
public void setData(Object data) {
    this.data = data;
}

}

4、写service接口

package com.cy.pj.sys.service;

import com.cy.pj.sys.pojo.PageObject;
import com.cy.pj.sys.pojo.SysLog;

public interface SysLogService {
    PageObject<SysLog> findPageObject(String username,Integer pageCurrent);
}

5、写实现service接口的实现类

package com.cy.pj.sys.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.cy.pj.sys.dao.SysLogDao;
import com.cy.pj.sys.pojo.PageObject;
import com.cy.pj.sys.pojo.SysLog;
import com.cy.pj.sys.service.SysLogService;

import om.cy.pj.common.exception.ServiceException;
@Service
public class SysLogServiceImpl implements SysLogService {
    @Autowired
    private SysLogDao sysLogDao;

    @Override
    public PageObject<SysLog> findPageObject(String username, Integer pageCurrent) {
        // 1.验证参数的合法性
        // 1.1验证pageCurrent的合法性
        // 不合法抛出IllegalArgumentException异常
        if (pageCurrent == null || pageCurrent < 1)
            throw new IllegalArgumentException("当前也显示不正确");
        // 基于条件查询总记录数
        // 2.1执行查询
        int rowCount = sysLogDao.getRowCount(username);
        // 2.2验证查询结果,假如结果为0不在执行如下操作
        if (rowCount == 0)

            throw new ServiceException("系统登录没有查到对应的记录");
        // 3.基于条件查询当前页记录(pageSize定义为2)
        // 3.1)定义pageSize
        int pageSize = 2;
        //3.2计算startIndex
        int startIndex=(pageCurrent-1)*pageSize;
        //3.3执行当前数据的查询操作
        List<SysLog> records = sysLogDao.findPageObjects(username, startIndex, pageSize);
        //4.对分页信息以及当前页记录进行封装
        //4.1 构建PageObject对象
        PageObject<SysLog> pageObject = new PageObject<>();
        //4.2封装数据
         pageObject.setPageCurrent(pageCurrent);
          pageObject.setPageSize(pageSize);
          pageObject.setRowCount(rowCount);
          pageObject.setRecords(records);
          pageObject.setPageCount((rowCount-1)/pageSize+1);
          //5.返回封装结果
        return pageObject;
    }

}

5.自定义异常

package om.cy.pj.common.exception;

public class ServiceException extends RuntimeException {
public ServiceException() {
    super();
}

public ServiceException(String message) {
    super(message);
}
public ServiceException(Throwable cause) {
    super(cause);
}
}

/定义全局异常处理类,对控制层可能出现的异常,进行统一异常处理,/

package om.cy.pj.common.web;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cy.pj.sys.pojo.JsonResult;
/**
 * @ControllerAdvice 注解描述的类为Spring web(MVC)
 * 控制层的一个全局异常处理对象,当控制层出现异常以后,首先会检测控制层类中是否有异常处理方法
 * 假如的没有则会查找是否有@ControllerAdvice注解描述的类,然后检测全局异常处理类中是否
 * 有合适的异常处理方法,假如有则直接调用方法处理异常
 * @author Administrator
 */
/*定义全局异常处理类,对控制层可能出现的异常,进行统一异常处理,*/
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * @ExceptionHandlerzhege 这个注解描述的方法是异常处理方法,注解中定义的异常类型,
     * 为此方法的异常处理类型(当然也可以处理异常类型的子类类型)在异常处理方法中通常会定义一个异常参数,来接收异常对象
     * @return
     */
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public JsonResult doHandleRuntimeException(RuntimeException e) {
        e.printStackTrace();// 也可以写日志
        // 异常信息
        return new JsonResult(e);// 封装
    }

}

controller类

@Controller
public class PageController {
    @Autowired
    private SysLogService sysLogService;

    /*
     * 在Controller类中添加分页请求处理方法
     */    
    @RequestMapping("doFindPageObjects")
    @ResponseBody
    public JsonResult doFindPageObjects(String username,Integer pageCurrent) {
        PageObject<SysLog> findPageObject = sysLogService.findPageObject(username, pageCurrent);
        return new JsonResult(findPageObject);
    }    

html页面和js写的方法
数据显示页面的js编写方法

<div id="pageId" class="box-footer clearfix" dm="100"></div>
            <!-- /.box-body -->
        </div>
        <!-- /.box -->
    </div>
</div>
<script type="text/javascript">    
/* 分页页面加载完成,向服务端发起异步请求 */
    $(function() {
        $(".input-group-btn").on("click",".btn-search",doQueryObjects);     $("#pageId").load("doPageUI",function(){
            doGetObjects();
        });
    });
    /*根据姓名查找*/
function doQueryObjects(){
        $("#pageId").data("pageCurrent",1);
        doGetObject();
    }
    /* 定义异步请求处理函数, */
    function doGetObjects(){
    var pageCurrent=$("#pageId").data("pageCurrent");
        //1.定义url和参数
        var url = "doFindPageObjects";
        if(!pageCurrent)pageCurrent=1;
        var params={"pageCurrent":pageCurrent};
        var uname=$("#searchNameId").val();
    console.log("uname",uname);
    if(uname)params.username=uname;
        //2.发起异步请求
         //请问如下ajax请求的回调函数参数名可以是任意吗?//可以,必须符合标识符的规范
        $.getJSON(url,params,function(result){
            
            doHandleQueryResponseResult(result);
        });//特殊的ajax函数
    }
    function doHandleQueryResponseResult(result){
        if(result.state==1){//ok
            //更新table中tbody内部的数据
            doSetTableBodyRows(result.data.records);//将数据呈现在页面上
            /* 
            //更新页面page。html分页数据 
            */
            doSetPagination(result.data);    
        }else{
            alert(result.message);
        }
    }
    
    function doSetTableBodyRows(records){
        //1.获取tBody对象,并清除对象
        var tBody=$("#tbodyId");
        tBody.empty();
        //2.迭代records记录,并将其内容追加到tbody
        for(var i in records){
            //2.1构建tr对象
            var tr=$("<tr></tr>");
            //2.2构建tds对象
            var tds=doCreateTds(records[i]);
            //2.3将tds追加到tr中
            tr.append(tds);
            //2.4将tr追加tbody中
            tBody.append(tr);
        }
    }
    function doCreateTds(data){
        var tds="<td><input type='checkbox' class='cBox' name='cItem' value='"+data.id+"'></td>"
        +"<td>"+data.username+"</td>"
        +"<td>"+data.operation+"</td>"
        +"<td>"+data.method+"</td>"
        +"<td>"+data.params+"</td>"
        +"<td>"+data.ip+"</td>"
        +"<td>"+data.time+"</td>";
        return tds;
    }


</script>

创建上下页翻页的按钮HTML页 以及js的编写

<ul class="pagination pagination-sm no-margin pull-right">
    <li><a class="first">首页</a></li>
    <li><a class="pre">上一页</a></li>
    <li><a class="next">下一页</a></li>
    <li><a class="last">尾页</a></li>
    <li><a class="rowCount">总记录数(0)</a></li>
    <li><a class="pageCount">总页数(0)</a></li>
    <li><a class="pageCurrent">当前页(0)</a></li>
</ul>
<script type="text/javascript">
    function doSetPagination(page){
        console.log("page",page)
        //1.初始化数据
        $(".rowCount").html("总记录数("+page.rowCount+")");
        $(".pageCount").html("总页数("+page.pageCount+")");
        $(".pageCurrent").html("当前页("+page.pageCurrent+")");
    //2.绑定数据(为后续对此数据的使用提供服务)
    $("#pageId").data("pageCurrent",page.pageCurrent);
    $("#pageId").data("pageCount",page.pageCount);
    }
    $(function(){
        //事件注册
    $("#pageId").on("click",".first,.pre,.next,.last",doJumpToPage);
    })
    function doJumpToPage(){
        //1.获取点击对象的clss值
        var cls=$(this).prop("class");//Property
        //2.基于点击的对象执行pageCurrent值得修改
        //2.1获取pageCurrent, pageCount的当前值
         var pageCurrent=$("#pageId").data("pageCurrent");
            var pageCount=$("#pageId").data("pageCount");
            //2.2修改pageCurrent的值
            if(cls=="first"){//首页
                pageCurrent=1;
            }else if(cls=="pre"&&pageCurrent>1){//上一页
                pageCurrent--;
            }else if(cls=="next"&&pageCurrent<pageCount){//下一页
                pageCurrent++;
            }else if(cls=="last"){//最后一页
                pageCurrent=pageCount;
            }else{
             return;
    }
            //3.对pageCurrent值进行重新绑定
            $("#pageId").data("pageCurrent",pageCurrent);
            //4.基于新的pageCurrent的值进行当前页数据查询
            doGetObjects();
    }
     function doGetObjects(){
        //1.定义url和参数
        var url ="doFindPageObjects";
        //data是从指定元素上获取绑定的数据
        //数据会在何时进行绑定?(setPagination,doQueryObjects)
        var pageCurrent = $("#pageId").data("pageCurrent");
        //为什么要执行如下判断,然后初始化pageCurrent的值为1
        //pageCurrent参数在没有赋值的情况下,默认初始值应该为1.
        if(!pageCurrent)
            pageCurrent=1;
        var params={"pageCurrent":pageCurrent};
        //2.发起异步请求
        //请问如下ajax请求的回调函数参数名可以是任意的吗??可以,必须符合标识符的规范
        $.getJSON(url,params,function(result){
            //请问result是一个字符串还是json格式的js对象?  答:json格式对象
            doHandleQueryResponseResult(result);

        });
    }//特殊的ajax函数
    
</script>~~~~

Tony猿
25 声望4 粉丝