共计 8524 个字符,预计需要花费 22 分钟才能阅读完成。
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);
}
}
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() {$("#pageId").load("doPageUI",function(){doGetObjects();
});
});
/* 定义异步申请处理函数,*/
function doGetObjects(){
//1. 定义 url 和参数
var url = "doFindPageObjects";
var params={"pageCurrent":1};
//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>~~~~
正文完