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">返回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";
    }

 }

測試結果,我們出來的頁面效果是:

即說明打印日志成功了;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3、


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM