热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了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 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 findAll() {
    List logs=logMapper.findAll();
    return logs;
  }
}

3、logMapper.java页面:

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

4、logMapper.xml页面;

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


  
    
      select seq_logaspect.nextval from dual
    
    insert into logaspect(id,logtype,description,param) values (#{id},#{logtype},#{description},#{param})
  
  

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 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" %>


  



  


    
ID LOGTYPE DESCRIPTION PARAM
${log.id} ${log.logtype} ${log.description} ${log.param}
返回list页面

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 map){
    //定义debug级别的日志
    //logger.debug("前台传递的查询条件:"+map);
    //logger.info("info级别日志:"+map);
    System.out.println("前台传递的查询条件:"+map);
    //List students = studentService.findAll();
//    List students = studentService.findByMap(map);
//    modelMap.put("students",students);
    PageInfo 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 students=studentsMapper.selectAll();
    modelMap.put("students",students);
    PageInfo pageInfo=new PageInfo<>(students);
    System.out.println(pageInfo);
    return "list.jsp";
  }

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

 }

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

即说明打印日志成功了;

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


推荐阅读
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
author-avatar
ivanjjHelen
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有