管理列表数据呈现
1.1定义实体对象(POJO)封装从数据库查询的数据实现ORM映射
//构建与数据库表对应的实体类型
/*
类名 SysLog (实现序列化接口,并定义序列化id)
属性 与表(sys_Logs)中字段有对应关系
方法 set/get/toString
*/
public class SysLog implements Serializable{
private static final long serialVersionUID = -6585641359032857459L;
private Integer id;//用户名
private String username;//用户操作
...
通过此对象除了可以封装从数据库查询的数据,还可以封装客户端请求数据,实现层与层之间数据的传递
1.2定义Dao接口实现,并创建接口并定义相关方法
@Mapper //告诉mybatis 框架 此接口实现类有底层实现
public interface SysLogDao {
/**
* @param username 查询条件(例如查询哪个用户的日志信息)
* @param startIndex 当前页的起始位置
* @param pageSize 当前页的页面大小
* @return 当前页的日志记录信息
*/
//数据库中每条日志信息封装到一个SysLog对象中
List<SysLog> findPageObjects(
@Param("username") String username,
@Param("startIndex")Integer startIndex,
@Param("pageSize") Integer pageSize);
/**
* @param username 查询条件(例如查询哪个用户的日志信息)
* @return 总记录数(基于这个结果可以计算总页数)
* 说明:假如如下方法没有使用注解修饰,在基于名字进行查询
* 时候会出现There is no getter for property named
* 'username' in 'class java.lang.String'
*/
int getRowCount(@Param("username") String username);
}
- 当DAO中方法参数多余一个时尽量使用@Param注解进行修饰并指定名字,然后再Mapper文件中便可以通过类似#{username}方式进行获取,否则只能通过#{arg0},#{arg1}或者#{param1},#{param2}等方式进行获取。
- 当DAO方法中的参数应用在动态SQL中时无论多少个参数,尽量使用@Param注解进行修饰并定义。
1.3Mapper.xml映射文件编写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">
<select id="findPageObjects"
resultType="com.cy.pj.sys.entity.SysLog">
select *
from sys_Logs
<include refid="queryWhereId"/>
order by createdTime desc
limit #{startIndex},#{pageSize}
</select>
<select id="getRowCount"
resultType="int">
select count(*)
from sys_Logs
<include refid="queryWhereId"/>
</select>
<!-- 借助此元素对共性数据进行提取 -->
<sql id="queryWhereId">
<where>
<if test="username!=null and username!=''">
username like concat("%",#{username},"%")
</if>
</where>
</sql>
</mapper>
2.1Service接口以及实现类类
Service接口:
public interface SysLogService {
PageObject<SysLog> findPageObjects(
String username,
Integer pageCurrent);
}
PageObject 封装查询后的数据
package com.cy.pj.common.vo;
...
//类泛型
public class PageObject<T> implements Serializable {
private static final long serialVersionUID = 7013456843599537805L;
private Integer rowCount; /**总行数(通过查询获得)*/
private Integer pageCurrent;/**当前页的页码值*/
private Integer pageSize=3;/**页面大小*/
private Integer pageCount; /**总页数(通过计算获得)*/
private List<T> records; /**当前页记录*/
......get/set toString 构造方法
}
}
Service接口的实现类
package com.cy.pj.sys.service.impl;
...
@Service
public class SysLogServiceImpl implements SysLogService {
//SysLogDao 接口 数据层的查询
@Autowired
private SysLogDao sysLogDao;//DI注入
@Override
public PageObject<SysLog> findPageObjects(
String username,
Integer pageCurrent) {
//1.验证参数合法性
//1.1验证pageCurrent的合法性
if (pageCurrent ==null || pageCurrent<1) {
throw new IllegalArgumentException("当前页码不正确");
}
//2.基于条件查询总记录数
//接口里面两个查询数据的抽象方法
//findPageObjects getRowCount
int rowCount = sysLogDao.getRowCount(username);
if (rowCount == 0) {
throw new ServiceException("系统没有查到对应记录");
}
//3.基于条件查询当前页记录(pageSize定义为2)
int pageSize = 3;
int startIndex = (pageSize -1)*pageSize;
List<SysLog> records = sysLogDao.findPageObjects(username, startIndex, pageSize);
//4.对分页信息以及当前页记录进行封装
// PageObject<Object> pageObject = new PageObject<>();
// //4.2)封装数据
// pageObject.setPageCurrent(pageCurrent);
// pageObject.setPageSize(pageSize);
// pageObject.setRowCount(rowCount);
// pageObject.setRecords(records);
// pageObject.setPageCount((rowCount-1)/pageSize+1);
PageObject<SysLog> po =
new PageObject<>(pageCurrent, pageSize, rowCount, (rowCount-1)/pageSize+1, records);
return po;
}
}
Controller
package com.cy.pj.common.vo;
import java.io.Serializable;
/**
* VO 借助此对象封装服务端的影响数据
*
* 1)响应状态码
* 2)响应消息
* 3)响应数据
*
* @author Administrator
*
*/
public class JsonResult implements Serializable{
private static final long serialVersionUID = -7744020406749967230L;
//状态码
private int state = 1;
//状态码对应的信息
private String message = "ok";
private Object data;
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();
}
......get/set toString 构造方法 无参 全参
}
处理异常 ServiceException 类
package com.cy.pj.common.exception;
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 5843835376260549700L;
public ServiceException() {
super();
}
public ServiceException(String message) {
super(message);
}
public ServiceException(Throwable cause) {
super(cause);
}
}
GlobalExceptionHandler 自己创建异常类
package com.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.common.vo.JsonResult;
@ControllerAdvice //全局异常处理类
public class GlobalExceptionHandler {
/**
* @ExceptionHandler()描述的方法
* @param e
* @return
*/
//JDK中的自带的日志API
@ExceptionHandler(RuntimeException.class) // 处理RuntimeException或者它的子类
@ResponseBody
public JsonResult doHandleRuntimeException(
RuntimeException e){
e.printStackTrace();//也可以写日志
return new JsonResult(e);//封装异常信息
}
}
Controller 类以及类的实现
package com.cy.pj.sys.controller;
...
@Controller
@RequestMapping("/log/")
public class SysLogController {
@Autowired
private SysLogService sysLogService;
@RequestMapping("doFindPageObjects")
@ResponseBody
public JsonResult doFindPageObjects(String username, Integer pageCurrent) {
PageObject<SysLog> pageObject = sysLogService.findPageObjects
(username, pageCurrent);
return new JsonResult(pageObject);
}
}
客户端实现 日志分页信息 列表出现
log_list.html
<div class="row">
<div class="col-xs-12">
<div class="box">
<div class="box-header">
<h3 class="box-title">日志管理</h3>
<div class="box-tools">
<div class="input-group input-group-sm" style="width: 350px;">
<input type="text" name="table_search" id="searchNameId"
class="form-control pull-right" placeholder="用户名">
<div class="input-group-btn">
<button type="button" class="btn btn-default btn-search">
<i class="fa fa-search"></i>
</button>
<button type="button" class="btn btn-default btn-delete">删除</button>
</div>
</div>
</div>
</div>
<!-- /.box-header -->
<div class="box-body table-responsive no-padding">
<table class="table table-hover">
<thead>
<tr>
<th><input type="checkbox" id="checkAll">全选</th>
<th>用户名</th>
<th>操作</th>
<th>请求方法</th>
<th>请求参数</th>
<th>IP</th>
<th>执行时长</th>
</tr>
</thead>
<tbody id="tbodyId">
<tr>
<td colspan="7">数据正在加载中...</td>
</tr>
</tbody>
</table>
</div>
<div id="pageId" class="box-footer clearfix"></div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
</div>
<script type="text/javascript">
$(function() {
//当页面加载(异步加载 《多线程》)完成执行后执行此函数
//并将资源添加到pageId对应的位置
//function(){}会在异步加载结束后调用
$("#pageId").load("doPageUI", function() {
//加载数据 并呈现数据
doGetObjects();
});
})
function doGetObjects() {
//1定义请求参数
var params ="pageCurrent=1";
//2定义请求url
var url = "log/doFindPageObjects";
//发送异步请求加载日志数据
//1)getJSON为JQuery框架中的函数
//2)getJSON用于向服务器发送GET请求
//3)getJSON会将服务器端返回的json串直接转换为JSON格式
//4)function(){}会在服务器端数据响应到客户端
$.getJSON(url,params,function(result){
//console.log(result)//在js控制台输出打印
doHandleResponseResult(result);
});
}
function doHandleResponseResult(result){
if(result.state==1){
//console.log(result.data.records);
//此方法写到page.html中
//doSetPagination(result.data);
doSetTableBodyRows(result.data.records);
}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>