SSM框架把日志信息保存到数据库过程详解

1)在service层和mapper层中写一个插入方法和查询方法;

我们先写一个日志类;定义属性;并且要在数据库中建好表;

package entity;

public class Log {
  private Integer id;
  private Integer logtype;
  private String description;
  private String param;

  public Log(){

  }
  public Log(Integer id, Integer logtype, String description, String param) {
    this.id = id;
    this.logtype = logtype;
    this.description = description;
    this.param = param;
  }

  @Override
  public String toString() {
    return "Log{" +
        "id=" + id +
        ", logtype=" + logtype +
        ", description='" + description + '\'' +
        ", param='" + param + '\'' +
        '}';
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public Integer getLogtype() {
    return logtype;
  }

  public void setLogtype(Integer logtype) {
    this.logtype = logtype;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public String getParam() {
    return param;
  }

  public void setParam(String param) {
    this.param = param;
  }
}

该写方法了

1、logService.java页面;

public interface LogService {
  int insert(Log log);
  List<Log> findAll();
}

2、logServiceImpl.java页面;

@Service
public class LogServiceImpl implements LogService {
  @Autowired
  private LogMapper logMapper;
  @Override
  public int insert(Log log) {
    int i=logMapper.insert(log);
    return i;
  }
  @Override
  public List<Log> findAll() {
    List<Log> logs=logMapper.findAll();
    return logs;
  }
}

3、logMapper.java页面:

public interface LogMapper {
  int insert(Log log);
  List<Log> findAll();
}

4、logMapper.xml页面;

<?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="mapper.LogMapper">
  <insert id="insert">
    <selectKey keyProperty="id" resultType="integer" order="BEFORE">
      select seq_logaspect.nextval from dual
    </selectKey>
    insert into logaspect(id,logtype,description,param) values (#{id},#{logtype},#{description},#{param})
  </insert>
  <select id="findAll" resultType="entity.Log">
    select * from logaspect
  </select>
</mapper>

5、由于我们打印日志是通过切面,所以我们写一个切面类;

package aop;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import entity.Log;
import entity.Student;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import service.LogService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Map;

@Component//对象由spring管理
@Aspect//切面注解
public class LogAspect {
  @Autowired
  private LogService logService;
  private static final Logger LOGGER = LogManager.getLogger(LogAspect.class);

  //定义切入点,切入到添加了LogData注解的方法上
  @Pointcut("@annotation(aop.LogData)")
  public void pointCut(){

  }

  /**
   * 记录日志的切面方法
   * 在该方法中定义统一的日志记录逻辑
   * @param joinPoint
   */
  @Before("pointCut()")
  public void log(JoinPoint joinPoint){
    System.out.println("进入日志Aspect");
    //获取到方法签名
    MethodSignature signature= (MethodSignature) joinPoint.getSignature();
    //获取到连接点方法对象
    Method method=signature.getMethod();
    //获取方法上面特定的注解
    LogData annotation=method.getAnnotation(LogData.class);
    LogType logType=annotation.logType();
    String description=annotation.description();
    LOGGER.info("获取到注解内容:logType="+logType.getType()
        +",description:"+description);
    //aop中获取request
    ServletRequestAttributes requestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request=requestAttributes.getRequest();
    HttpSession session=request.getSession();
    //获取操作人
    Student student= (Student) session.getAttribute("student");
    //获取请求数据
    Map<String,String[]> parameterMap=request.getParameterMap();
    //将对象转换成json字符串==>存储到请求数据字段中
    //jackSon json字符串操作
    ObjectMapper objectMapper=new ObjectMapper();
    try {
      String s=objectMapper.writeValueAsString(parameterMap);
      LOGGER.info("请求数据:"+s);
      Log log = new Log();
      log.setLogtype(logType.getType());
      log.setDescription(description);
      log.setParam(s);
      logService.insert(log);
    } catch (JsonProcessingException e) {
      e.printStackTrace();
    }

    //todo 将日志信息保存到数据库 LogController service mapper jsp
  }
}

6、写一个loglist.jsp页面来展示信息;

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
  <title>用户列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/selAll">
  <input type="submit" value="查询">
</form>
<table border="1px">
  <thead>
  <tr>
    <td>ID</td>
    <td>LOGTYPE</td>
    <td>DESCRIPTION</td>
    <td>PARAM</td>
  </tr>
  </thead>
  <tbody>
  <c:forEach var="log" items="${logs}">
    <tr>
      <td>${log.id}</td>
      <td>${log.logtype}</td>
      <td>${log.description}</td>
      <td>${log.param}</td>
    </tr>
  </c:forEach>
  </tbody>
</table>
<a href="${pageContext.request.contextPath}/user/list" rel="external nofollow" >返回list页面</a>
</body>
</html>

7、最后,我们写一个控制层的方法;

package controller;

import aop.LogData;
import aop.LogType;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import entity.Log;
import entity.Student;
import mapper.StudentsMapper;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import service.LogService;
import service.StudentService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;

/**
 * 控制层调service,service调dao层
 */
@Controller
@RequestMapping("/user")
public class UserController {

  //定义日志对象
  //private static final Logger logger= LogManager.getLogger(UserController.class);
  @Autowired
  private StudentService studentService;
  @Autowired
  private LogService logService;
  @RequestMapping("/list") //@ModelAttribute(name = "params") :向request域中存值
  public String list(ModelMap modelMap,@RequestParam HashMap<String,Object> map){
    //定义debug级别的日志
    //logger.debug("前台传递的查询条件:"+map);
    //logger.info("info级别日志:"+map);
    System.out.println("前台传递的查询条件:"+map);
    //List<Student> students = studentService.findAll();
//    List<Student> students = studentService.findByMap(map);
//    modelMap.put("students",students);
    PageInfo<Student> page = studentService.findByPage(map);
    //记录error级别日志
    //logger.error("查询到分页数据:"+page);
    System.out.println("查询到分页数据:"+page);
    modelMap.put("page",page);
    modelMap.put("params",map);//将查询条件回传到页面,用于回显查询条件
    return "list.jsp";
  }

  @LogData(logType = LogType.DELETE,description = "学生信息删除")
  @RequestMapping("/delete")
  public String delete(Integer id){
    studentService.delete(id);
    return "redirect:list";
  }
  @LogData(logType = LogType.UPDATE,description = "学生信息修改")
  @RequestMapping("/update2")
  public String update2(Integer id,ModelMap modelMap){
    Student student = studentService.selectById(id);
    modelMap.put("student",student);
    return "update.jsp";
  }

  //根据是否存在id值,来判断是执行新增还是修改操作
  @RequestMapping("/update")
  public String update(Student student){
    studentService.update(student);
    return "redirect:list";
  }
  @LogData(logType = LogType.INSERT,description = "学生信息新增")
  @RequestMapping("/insert")
  public String insert(Student student){
    studentService.insert(student);
    return "redirect:list";
  }

  @Autowired
  private StudentsMapper studentsMapper;
  @RequestMapping("list2")
  public String list2(ModelMap modelMap){
    PageHelper.startPage(1,5);
    List<Student> students=studentsMapper.selectAll();
    modelMap.put("students",students);
    PageInfo<Student> pageInfo=new PageInfo<>(students);
    System.out.println(pageInfo);
    return "list.jsp";
  }

  @RequestMapping("/selAll")
  public String findAll(ModelMap modelMap){
    List<Log> logs = logService.findAll();
    modelMap.put("logs",logs);
    return "loglist.jsp";
  }

 }

测试结果,我们出来的页面效果是:

即说明打印日志成功了;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SSM整合中的Log4j日志的配置详情

    在网上搜索了很多的log的配置方法,当然结果很多,但是没有一个是我想要的.没办法只能自己去试了.只说如何在项目中引入log4j来显示日志的输出.当然配置文件是少不了的. 配置 log4j.properties 在SSM整合的项目中会有文件夹src/main/resources 所有的资源型文件都要放在这个resource下面(个人习惯,也可以放在其让地方) ### Log4j配置 ### ### 与Spring结合需要在web.xml中指定此文件位置,并添加监听器 ### #定义log4j的输出

  • SSM项目中配置LOG4J日志的方法

    本文介绍了SSM项目中配置LOG4J日志的方法,分享给大家,具体如下: 在pom文件中添加依赖 . <!--Log4j2配置--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.1</version> </dependency> <

  • SQL Server免费版的安装以及使用SQL Server Management Studio(SSMS)连接数据库的图文方法

    一.SQL Server 和SSMS的安装 1. SQL的安装 下载地址:SQL Server. 进入下载地址选择Developer或者Express都可以. SQL Server 2019 Developer 是一个全功能免费版本,许可在非生产环境下用作开发和测试数据库. SQL Server 2019 Express 是 SQL Server 的一个免费版本,非常适合用于桌面.Web 和小型服务器应用程序的开发和生产. 默认使用基本安装. 选择安装路径,SQL比较大,所以最好别放C盘.之后就

  • SSM实现mysql数据库账号密码密文登录功能

    引言 咱们公司从事的是信息安全涉密应用的一些项目研发一共有分为三步,相比较于一般公司和一般的项目,对于信息安全要求更加严格,领导要求数据量和用户的用户名及密码信息都必需是要密文配置和存储的,这就涉及到jdbc.properties文件中的数据库的用户名和密码也是一样的,需要配置问密文,在连接的时候再加载解密为明文进行数据库的连接操作,以下就是实现过程,一共有分为三步. 一.创建DESUtil类 提供自定义密钥,加密解密的方法. package com.hzdy.DCAD.common.util;

  • 详解SSM框架下结合log4j、slf4j打印日志

    本文主要介绍了详解SSM框架下结合log4j.slf4j打印日志,分享给大家,具体如下: 首先加入log4j和slf4j的jar包 <!-- 日志处理 <!-- slf4j日志包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dep

  • ssm框架上传图片保存到本地和数据库示例

    本文介绍了ssm框架上传图片保存到本地和数据库示例,主要使用了Spring+SpringMVC+MyBatis框架,实现了ssm框架上传图片的实例,具体如下: 1.前台部分 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head&g

  • SQL Server Management Studio(SSMS)复制数据库的方法

    利用SQL Server Management Studio(SSMS)复制数据库,供大家参考,具体内容如下 前言 今天由于客户购买的软件版本确认了,而之前进行开发的本地数据库版本较低,打算复制一份开发数据库,升级为客户软件版本的数据库再进行后续开发.以前做这种事情一般都是在不同的数据库实例上进行,一直都是使用备份--恢复的方法,今天这次是在同一个实例上,我就在想强大的SSMS有没有向导式的复制数据库方法呢? 看似美好的开始 找到复制数据库的过程很简单,在SSMS上右击数据库就能在任务里找到复制

  • SSM框架把日志信息保存到数据库过程详解

    1)在service层和mapper层中写一个插入方法和查询方法: 我们先写一个日志类:定义属性:并且要在数据库中建好表: package entity; public class Log { private Integer id; private Integer logtype; private String description; private String param; public Log(){ } public Log(Integer id, Integer logtype, St

  • 微信小程序云函数使用mysql数据库过程详解

    前言 小程序云开发的功能是越来越强大了,现在小程序云开发可以直接借助云函数来链接mysql数据,操作mysql数据库了,今天就来给大家讲一讲如何使用小程序云开发的云函数来操作mysql数据库. 首先要明确一点,就是小程序云开发的云函数是基于node.js的,所以我们使用node.js的mysql2模块可以直接来链接并操作mysql数据库,所以我们现在要做的就是怎么样在云函数里使用mysql2模块,并且借助这个模块类库来实现mysql数据库的链接. 老规矩,先看效果图 我们这里要做的就是在云函数里

  • 使用python将excel数据导入数据库过程详解

    因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. import xlrd import pymysql # import importlib # importlib.reload(sys) #出现呢reload错误使用 def open_excel(): try: book = xlrd.open_workbook("XX.xlsx")

  • Deepin使用docker安装mysql数据库过程详解

    先查询MySQL源 docker search mysql 也可以去官网查看镜像tag,选择自己需要的版本,否则会下载最新版本:https://hub.docker.com/_/mysql/ 然后报错了!!! root@deepin-PC:/etc/apt# docker pull mysql:8.0.11 Error response from daemon: Get https://registry-1.docker.io/v2/library/mysql/manifests/8.0.11:

  • 在SSM框架中将图片上传到数据库中的实现代码

    今天我们来看看SSM中如何将图片转换成二进制,最后传入到自己的数据库中,好了,废话不多说,我们开始今天的学习,我这里用的编辑器是IDEA 1.导入图片上传需要的jar依赖包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <

  • Spring框架实现AOP添加日志记录功能过程详解

    这篇文章主要介绍了Spring框架实现AOP添加日志记录功能过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求,在调用业务方法的时候,在被调用的业务方法的前面和后面添加上日志记录功能 整体架构: 日志处理类: package aop; import java.util.Arrays; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; //日志处理类 增

  • Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程

    摘要: 这段时间搭建ssm环境,并测试几个下载的项目demo 安装相关文件: MyEclipse界面: 测试项目简单增删改: ssm+mysql+easyui项目: SSM+MYSQL+EXTJS项目 总结 以上所述是小编给大家介绍的Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • TinkerPop框架查询Gremlin图实现过程详解

    目录 前言 肇始于 TinkerPop 文档 Structure 接口结构与实现思路 Graph 接口 Element 接口 Vertex 接口 Edge 接口 Property 接口 VertexProperty 接口 实现自己的 Structure 更进一步 前言 本文记录了笔者摸索图数据库过程中遇到的问题.一些思考(闲谈)与实现思路. 做此记录的目的是沉淀经验.完善巩固知识体系,同时以此为始,培养撰写文本.输出内容的能力与习惯. 本文内容源自笔者自身见识,仅为一家之言,不足之处望诸位批评指

  • django基础之数据库操作方法(详解)

    Django 自称是"最适合开发有限期的完美WEB框架".本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触Django ,本文会让你在感性上对Django有个认识,完成本文操作后会让你有兴趣阅读的相关书籍和文档. 本文客操作的环境,如无特别说明,后续都以下面的环境为基础: =================== Windows 7/10 python 3.5 Django 1.10 ======

  • DBA_Oracle Startup / Shutdown启动和关闭过程详解(概念)(对数据库进行各种维护操作)

    一.摘要 Oracle数据库的完整启动过程是分步骤完成的,包含以下3个步骤: 启动实例-->加载数据库-->打开数据库 因为Oracle数据库启动过程中不同的阶段可以对数据库进行不同的维护操作,对应我们不同的需求,所以就需不同的模式启动数据库. 1. Oracle启动需要经历四个状态:SHUTDOWN .NOMOUNT .MOUNT .OPEN 2. Oracle关闭的四种方式:Normal, Immediate, Transactional, Abort 3. 启动和关闭过程详解   二.数

随机推荐