Java SSM 项目实战 day09 SSMAOP日志
Java SSM 项目实战 day02 功能介绍,SSM整合,数据库和IDEA的maven工程搭建,产品信息查询和添加 | |
Java SSM 项目实战 day03 功能介绍,订单的操作,订单的增删改查 | |
Java SSM 项目实战 day04 功能介绍,订单的操作,订单的增删改查,实现登录功能 | |
Java SSM 项目实战 day05 用户操作 | |
Java SSM 项目实战 day06 角色操作,资源权限操作 | |
Java SSM 项目实战 day07 SpringSecurity源码分析 | |
Java SSM 项目实战 day07用户角色关联操作,添加角色,以及添加权限 | |
Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制 | |
Java SSM 项目实战 day09 SSMAOP日志 |
一、数据库与表结构
1、日志表信息描述sysLog
2、sql语句
CREATE TABLE sysLog(id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,visitTime timestamp,username VARCHAR2(50),ip VARCHAR2(30),url VARCHAR2(50),executionTime int,method VARCHAR2(200)
)
3、创建对应的实体类
package com.itzheng.ssm.domain;
import java.util.Date;
public class SysLog {private String id;private Date visitTime;private String visitTimeStr;private String username;private String ip;private String url;private Long executionTime;private String method;public SysLog() {}public SysLog(String id, Date visitTime, String visitTimeStr, String username, String ip, String url, Long executionTime, String method) {this.id = id;this.visitTime = visitTime;this.visitTimeStr = visitTimeStr;this.username = username;this.ip = ip;this.url = url;this.executionTime = executionTime;this.method = method;}public String getId() {return id;}public void setId(String id) {this.id = id;}public Date getVisitTime() {return visitTime;}public void setVisitTime(Date visitTime) {this.visitTime = visitTime;}public String getVisitTimeStr() {return visitTimeStr;}public void setVisitTimeStr(String visitTimeStr) {this.visitTimeStr = visitTimeStr;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Long getExecutionTime() {return executionTime;}public void setExecutionTime(Long executionTime) {this.executionTime = executionTime;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}@Overridepublic String toString() {return "SysLog{" +"id='" + id + '\'' +", visitTime=" + visitTime +", visitTimeStr='" + visitTimeStr + '\'' +", username='" + username + '\'' +", ip='" + ip + '\'' +", url='" + url + '\'' +", executionTime=" + executionTime +", method='" + method + '\'' +'}';}
}
二、基于AOP日志处理(记录日志信息)
1、在控制层创建LogAop类
修改web.xml,添加一下内容
<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
LogAop类
package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Date;@Component
@Aspect
public class LogAop {@Autowiredprivate HttpServletRequest requset;private Date visitTime;//开始的时间private Class clazz;//访问的类private Method method;//访问的方法//前置通知 主要是获取我们的开始的时间,执行类的哪一个,执行的是哪一个方法@Before("execution(* com.itzheng.ssm.controller.*.*(..))")//拦截controller类当中的所有的方法public void doBefore(JoinPoint jp) throws NoSuchMethodException {visitTime = new Date();//当前时间就是开始访问的时间clazz = jp.getTarget().getClass();//获取当前具体要访问的类String methodName = jp.getSignature().getName();//获取当前访问具体方法的名称Object[] args = jp.getArgs();//获取访问方法的参数//以下代码获取到了具体执行的方法的method对象if(args == null || args.length == 0){method = clazz.getMethod(methodName);//只能获取无参数的方法}else {Class[] classArgs = new Class[args.length];for (int i = 0; i < args.length;i++){classArgs[i] = args[i].getClass();//获取每一个方法参数,放到classArgs数组当中}method = clazz.getMethod(methodName,classArgs);//只能获取无参数的方法}}//后置通知@After("execution(* com.itzheng.ssm.controller.*.*(..))")//拦截controller类当中的所有的方法public void doAfter(JoinPoint jp){long time = new Date().getTime()-visitTime.getTime();//获取了访问的时长String url = "";//获取urlif( clazz != null && method != null && clazz != LogAop.class){//1.获取类上的这个注解@RequestMapping("/orders")的值RequestMapping classAnnotation = (RequestMapping)clazz.getAnnotation(RequestMapping.class);if(classAnnotation != null){String[] classValue = classAnnotation.value();//获取到了/orders//2、获取方法上的@RequestMapping(xxx)RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);if(methodAnnotation != null){String [] methodValue = methodAnnotation.value();url = classValue[0] + methodValue[0];}}}//获取访问的IP地址String ip = requset.getRemoteAddr();//如何获取当前操作的用户SecurityContext context = SecurityContextHolder.getContext();//从上下文当中获取当前登录的用户User user = (User)context.getAuthentication().getPrincipal();String username = user.getUsername();//将日志相关信息分装到SysLog对象当中SysLog sysLog = new SysLog();sysLog.setExecutionTime(time);//执行时长sysLog.setIp(ip);sysLog.setMethod("[类名] "+clazz.getName()+"[方法名] " + method.getName());sysLog.setUrl(url);sysLog.setUsername(username);sysLog.setVisitTime(visitTime);//调用Service完成数据库的插入操作(即日志的记录操作)}}
2、创建对应的Service接口和对应的实现类
(1)ISysLogService接口
package com.itzheng.ssm.service;import com.itzheng.ssm.domain.SysLog;public interface ISysLogService {public void save(SysLog sysLog) throws Exception;}
(2)SysLogServiceImpl
package com.itzheng.ssm.service.impl;import com.itzheng.ssm.domain.SysLog;
import com.itzheng.ssm.service.ISysLogService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class SysLogServiceImpl implements ISysLogService {@Overridepublic void save(SysLog sysLog) throws Exception {}
}
3、创建对应的DAO
package com.itzheng.ssm.dao;import com.itzheng.ssm.domain.SysLog;
import org.apache.ibatis.annotations.Insert;public interface ISysLogDao {@Insert("")public void save(SysLog sysLog) throws Exception ;}
4、完善上述所有的业务以及dao
(1)SysLogServiceImpl
package com.itzheng.ssm.service.impl;import com.itzheng.ssm.dao.ISysLogDao;
import com.itzheng.ssm.domain.SysLog;
import com.itzheng.ssm.service.ISysLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class SysLogServiceImpl implements ISysLogService {@Autowiredprivate ISysLogDao sysLogDao;@Overridepublic void save(SysLog sysLog) throws Exception {sysLogDao.save(sysLog);}
}
(2)LogAop
@Autowiredprivate ISysLogService sysLogService;
//调用Service完成数据库的插入操作(即日志的记录操作)sysLogService.save(sysLog);
(3)ISysLogDao
package com.itzheng.ssm.dao;import com.itzheng.ssm.domain.SysLog;
import org.apache.ibatis.annotations.Insert;public interface ISysLogDao {@Insert("insert into syslog(visitTime,username,ip,url,executionTime,method) values(#{visitTime},#{username},#{ip},#{url},#{executionTime},#{method})")public void save(SysLog sysLog) throws Exception ;}
(4)完善LogAop类
package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;
import com.itzheng.ssm.service.ISysLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Date;@Component
@Aspect
public class LogAop {@Autowiredprivate HttpServletRequest request;@Autowiredprivate ISysLogService sysLogService;private Date visitTime; //开始时间private Class clazz; //访问的类private Method method;//访问的方法//前置通知 主要是获取开始时间,执行的类是哪一个,执行的是哪一个方法@Before("execution(* com.itzheng.ssm.controller.*.*(..))")public void doBefore(JoinPoint jp) throws NoSuchMethodException {visitTime = new Date();//当前时间就是开始访问的时间clazz = jp.getTarget().getClass(); //具体要访问的类String methodName = jp.getSignature().getName(); //获取访问的方法的名称Object[] args = jp.getArgs();//获取访问的方法的参数//获取具体执行的方法的Method对象if (args == null || args.length == 0) {method = clazz.getMethod(methodName); //只能获取无参数的方法} else {Class[] classArgs = new Class[args.length];for (int i = 0; i < args.length; i++) {classArgs[i] = args[i].getClass();}clazz.getMethod(methodName, classArgs);}}//后置通知@After("execution(* com.itzheng.ssm.controller.*.*(..))")public void doAfter(JoinPoint jp) throws Exception {long time = new Date().getTime() - visitTime.getTime(); //获取访问的时长String url = "";//获取urlif (clazz != null && method != null && clazz != LogAop.class) {//1.获取类上的@RequestMapping("/orders")RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);if (classAnnotation != null) {String[] classValue = classAnnotation.value();//2.获取方法上的@RequestMapping(xxx)RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);if (methodAnnotation != null) {String[] methodValue = methodAnnotation.value();url = classValue[0] + methodValue[0];//获取访问的ipString ip = request.getRemoteAddr();//String ip = "192.168.153.2012";//获取当前操作的用户SecurityContext context = SecurityContextHolder.getContext();//从上下文中获了当前登录的用户User user = (User) context.getAuthentication().getPrincipal();String username = user.getUsername();//将日志相关信息封装到SysLog对象SysLog sysLog = new SysLog();sysLog.setExecutionTime(time); //执行时长sysLog.setIp(ip);sysLog.setMethod("[类名] " + clazz.getName() + "[方法名] " + method.getName());sysLog.setUrl(url);sysLog.setUsername(username);sysLog.setVisitTime(visitTime);//调用Service完成操作sysLogService.save(sysLog);}}}}
}
(5)修改OrdersController当中findAll方法参数
@RequestMapping("/findAll.do")@Secured("ROLE_ADMIN")public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") Integer page,@RequestParam(name = "size", required = true, defaultValue = "4") Integer size) throws Exception {
(6)运行测试
三、基于AOP日志的查询
(1)创建syslog-list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 页面meta -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"><title>数据 - AdminLTE2定制版</title>
<meta name="description" content="AdminLTE2定制版">
<meta name="keywords" content="AdminLTE2定制版"><!-- Tell the browser to be responsive to screen width -->
<metacontent="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"name="viewport"><link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/morris/morris.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/datepicker/datepicker3.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.theme.default.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/select2/select2.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/bootstrap-markdown/css/bootstrap-markdown.min.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/adminLTE/css/skins/_all-skins.min.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/css/style.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.skinNice.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/bootstrap-slider/slider.css">
<link rel="stylesheet"href="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.css">
</head><body class="hold-transition skin-blue sidebar-mini"><div class="wrapper"><!-- 页面头部 --><jsp:include page="header.jsp"></jsp:include><!-- 页面头部 /--><!-- 导航侧栏 --><jsp:include page="aside.jsp"></jsp:include><!-- 导航侧栏 /--><!-- 内容区域 --><div class="content-wrapper"><!-- 内容头部 --><section class="content-header"><h1>日志管理 <small>全部日志</small></h1><ol class="breadcrumb"><li><a href="${pageContext.request.contextPath}/index.jsp"><iclass="fa fa-dashboard"></i> 首页</a></li><li><ahref="${pageContext.request.contextPath}/sysLog/findAll.do">日志管理</a></li><li class="active">全部日志</li></ol></section><!-- 内容头部 /--><!-- 正文区域 --><section class="content"> <!-- .box-body --><div class="box box-primary"><div class="box-header with-border"><h3 class="box-title">列表</h3></div><div class="box-body"><!-- 数据表格 --><div class="table-box"><!--工具栏--><div class="pull-left"><div class="form-group form-inline"><div class="btn-group"><button type="button" class="btn btn-default" title="刷新"onclick="window.location.reload();"><i class="fa fa-refresh"></i> 刷新</button></div></div></div><div class="box-tools pull-right"><div class="has-feedback"><input type="text" class="form-control input-sm"placeholder="搜索"> <spanclass="glyphicon glyphicon-search form-control-feedback"></span></div></div><!--工具栏/--><!--数据列表--><table id="dataList"class="table table-bordered table-striped table-hover dataTable"><thead><tr><th class="" style="padding-right: 0px"><input id="selall"type="checkbox" class="icheckbox_square-blue"></th><th class="sorting_asc">ID</th><th class="sorting">访问时间</th><th class="sorting">访问用户</th><th class="sorting">访问IP</th><th class="sorting">资源URL</th><th class="sorting">执行时间</th><th class="sorting">访问方法</th></tr></thead><tbody><c:forEach items="${sysLogs}" var="syslog"><tr><td><input name="ids" type="checkbox"></td><td>${syslog.id}</td><td>${syslog.visitTimeStr }</td><td>${syslog.username }</td><td>${syslog.ip }</td><td>${syslog.url}</td><td>${syslog.executionTime}毫秒</td><td>${syslog.method}</td> </tr></c:forEach></tbody></table><!--数据列表/--><!--工具栏--><div class="pull-left"><div class="form-group form-inline"><div class="btn-group"><button type="button" class="btn btn-default" title="刷新"onclick="window.location.reload();"><i class="fa fa-refresh"></i> 刷新</button></div></div></div><div class="box-tools pull-right"><div class="has-feedback"><input type="text" class="form-control input-sm"placeholder="搜索"> <spanclass="glyphicon glyphicon-search form-control-feedback"></span></div></div><!--工具栏/--></div><!-- 数据表格 /--></div><!-- /.box-body --><!-- .box-footer--><div class="box-footer"><div class="pull-left"><div class="form-group form-inline">总共2 页,共14 条数据。 每页 <select class="form-control"><option>10</option><option>15</option><option>20</option><option>50</option><option>80</option></select> 条</div></div><div class="box-tools pull-right"><ul class="pagination"><li><a href="#" aria-label="Previous">首页</a></li><li><a href="#">上一页</a></li><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li><li><a href="#">下一页</a></li><li><a href="#" aria-label="Next">尾页</a></li></ul></div></div><!-- /.box-footer--></div></section><!-- 正文区域 /--></div><!-- 内容区域 /--><!-- 底部导航 --><footer class="main-footer"><div class="pull-right hidden-xs"><b>Version</b> 1.0.8</div><strong>Copyright © 2014-2017 <ahref="http://www.itcast.cn">研究院研发部</a>.</strong> All rights reserved. </footer><!-- 底部导航 /--></div><scriptsrc="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/jQueryUI/jquery-ui.min.js"></script><script>$.widget.bridge('uibutton', $.ui.button);</script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/raphael/raphael-min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/morris/morris.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/sparkline/jquery.sparkline.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/knob/jquery.knob.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/daterangepicker/moment.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.zh-CN.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/datepicker/bootstrap-datepicker.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/slimScroll/jquery.slimscroll.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/fastclick/fastclick.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/adminLTE/js/app.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/select2/select2.full.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap-wysihtml5.zh-CN.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/bootstrap-markdown.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-markdown/locale/bootstrap-markdown.zh.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/markdown.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/to-markdown.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/ckeditor/ckeditor.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.date.extensions.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.extensions.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/datatables/jquery.dataTables.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/chartjs/Chart.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/flot/jquery.flot.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/flot/jquery.flot.resize.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/flot/jquery.flot.pie.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/flot/jquery.flot.categories.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.min.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-slider/bootstrap-slider.js"></script><scriptsrc="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js"></script><script>$(document).ready(function() {// 选择框$(".select2").select2();// WYSIHTML5编辑器$(".textarea").wysihtml5({locale : 'zh-CN'});});// 设置激活菜单function setSidebarActive(tagUri) {var liObj = $("#" + tagUri);if (liObj.length > 0) {liObj.parent().parent().addClass("active");liObj.addClass("active");}}$(document).ready(function() {// 激活导航位置setSidebarActive("order-manage");// 列表按钮 $("#dataList td input[type='checkbox']").iCheck({checkboxClass : 'icheckbox_square-blue',increaseArea : '20%'});// 全选操作 $("#selall").click(function() {var clicks = $(this).is(':checked');if (!clicks) {$("#dataList td input[type='checkbox']").iCheck("uncheck");} else {$("#dataList td input[type='checkbox']").iCheck("check");}$(this).data("clicks", !clicks);});});</script>
</body></html>
(2)创建SysLogController
package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;
import com.itzheng.ssm.service.ISysLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import java.util.List;@Controller
@RequestMapping("/sysLog")
public class SysLogController {@Autowiredprivate ISysLogService sysLogService;@RequestMapping("/findAll.do")public ModelAndView findAll() throws Exception{ModelAndView mv = new ModelAndView();List<SysLog> sysLogList = sysLogService.findAll();return mv;}
}
(3)ISysLogService以及SysLogServiceImpl当中
List<SysLog> findAll()throws Exception;
@Overridepublic List<SysLog> findAll() throws Exception {return sysLogDao.findAll();}
(4)ISysLogDao当中
@Select("select * from sysLog")List<SysLog> findAll() throws Exception ;
(5)完善SysLogController
package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;
import com.itzheng.ssm.service.ISysLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import java.util.List;@Controller
@RequestMapping("/sysLog")
public class SysLogController {@Autowiredprivate ISysLogService sysLogService;@RequestMapping("/findAll.do")public ModelAndView findAll() throws Exception{ModelAndView mv = new ModelAndView();List<SysLog> sysLogList = sysLogService.findAll();mv.addObject("sysLogs",sysLogList);mv.setViewName("syslog-list");return mv;}
}
(6)运行测试项目
Java SSM 项目实战 day02 功能介绍,SSM整合,数据库和IDEA的maven工程搭建,产品信息查询和添加 | |
Java SSM 项目实战 day03 功能介绍,订单的操作,订单的增删改查 | |
Java SSM 项目实战 day04 功能介绍,订单的操作,订单的增删改查,实现登录功能 | |
Java SSM 项目实战 day05 用户操作 | |
Java SSM 项目实战 day06 角色操作,资源权限操作 | |
Java SSM 项目实战 day07 SpringSecurity源码分析 | |
Java SSM 项目实战 day07用户角色关联操作,添加角色,以及添加权限 | |
Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制 | |
Java SSM 项目实战 day09 SSMAOP日志 |
Java SSM 项目实战 day09 SSMAOP日志相关推荐
- ssm 项目记录用户操作日志和异常日志
ssm 项目记录用户操作日志和异常日志 参考文章: (1)ssm 项目记录用户操作日志和异常日志 (2)https://www.cnblogs.com/mei-m/p/10231792.html (3 ...
- Java Web项目实战案例一
Java Web项目实战案例一 一.主要开发工具如下: 1.物理机:windows 10 2.apache-maven-3.5.3 3.jdk1.8.0_161 4.Intellij 二.构建过程 项 ...
- JAVA框架项目实战:系统公告设计及实现
项目实战:系统公告设计及实现 本期涉及内容:JDBC.点击即可跳转复习JDBC 1.需求及业务设计 项目(公告系统) 1.需求(为行政人员发布公告,通知提供遍历) 2.原型设计(系统做完以后是什么样子 ...
- SSM项目实战:酒店管理系统
使用的技术栈:Spring+SpringMVC+mybatis+Mysql+layui+Maven Maven 项目结构.项目配置项为: 服务器:apache-tomcat-9.0.0.M26 (必须 ...
- java ssm项目经验描述_第一个SSM完整项目开发心得
博主因为打算要考研,所以为了给自己留一手后路.学习了SSM框架.这学期就做了一个完整的SSM项目.(如果考研失败就去外包做一波CRUD boy) 所以边考研边利用业余时间做了一学期,接着期末一周的We ...
- vue+elementui学生宿舍管理系统(报修,来访登记,水电费)java ssm项目介绍
宿舍,是大学生在高校校园里一个重要的学习.生活.交往的空间环境,大学生大约有2/3的时间是在宿舍环境里渡过的.作为计算机应用的一部分,使用计算机对宿舍信息进行管理,具有着手工管理所无法比拟的优点.例如 ...
- java调查问卷系统-投票系统-SSM项目实战
课程基于Layui+Spring+SpringMVC+MyBatis开发小而完整的调查问卷系统实战 源码地址 链接:https://pan.baidu.com/s/1PCr0FUYevO9VsKIwd ...
- SSM项目实战【从 0 到 1】:个人博客
文章目录 前言 一.项目简介 二.项目技术栈 三.准备工作 1.Spring Boot 项目创建 2.mybatis 配置 3.数据库创建 四.基本框架搭建 1.实体层(model) 2.控制器层(c ...
- java ssm项目_JAVA项目:逝去的SSM
SSM(Spring+SpringMVC+MyBatis) SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作 ...
- Hadoop项目实战---黑马论坛日志分析
1.项目描述 通过对黑马技术论坛的apache common日志进行分析, 计算论坛关键指标,供运营者决策. 2.数据情况 每行记录有5部分组成: 1.访问ip 2.访问时间 3.访问资源[跟着两个访 ...
最新文章
- CentOS 6.2 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
- 工业控制软件测试评价体系,工业控制信息安全产品测试评价的体系.doc
- c++ 在哪里找文档来看_FPX双C十四连败引热议!Doinb:我再也不跟LWX双排了
- VS SPEC FLOW接口自动化之环境搭建及一个简单项目(一)
- 吴恩达机器学习笔记:(五)区别于微积分的正规方程求解最优解
- python httplib2的安装
- mysql查询注意_mysql中sql查询使用注意
- foxmail占cpu 100%解决办法
- 002-Go通过ioutil 读写文件
- 性能测试知多少---性能需求分析
- 转 java中static{}语句块详解
- nsis出错_NSIS错误(NSIS Error)的原因和解决方法总结
- sqlite3 表创建后设置主外键 联合主键 外键设置
- 《计算机工程》从投稿到录用之一手经验
- 涉及数字的英语表示——几点钟、年月日、世纪、年代、年龄
- 史上最全软件测试工程师常见的面试题总结(九)【多测师】
- Cocos Creator 调试入门
- 组合数学——牡牛和牝牛
- Ubuntu18.04设置主题后,切换用户或锁定就自动休眠(待解决)
- 错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: int __thiscall osg::Referenced::ref(void)const “