栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot个人博客项目(1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot个人博客项目(1)

基于SpringBoot开发的个人博客项目 – 项目背景–

项目原型为李仁密老师的小而美的个人博客作品,视频中所采用的持久层ORM框架为JPA,这里我将其改成了mybatis
项目原型地址.

– 技术选型 –

项目总体为前后端整合型开发
前端: JQuery、semanticUI、thymeleaf 等
后端: SSM、SpringBoot 、MySQL 等

– 项目搭建 – 【前端部分】

前端部分就跟着李仁密老师的B站视频 P1 - P19 从头至尾敲了下来,框架选用了semanticUI,其中集成了很多插件。如:markdown编辑器、代码高亮、二维码生成、滚动侦测、平滑滚动、生成目录、中文排版、animate过渡动画等,由于本人专注于后端,前端部分就不多做赘述了。

【后端部分】
  • 框架搭建
开发工具及依赖版本
JDK1.8
IDEIntelliJ IDEA 2020.3.2
SpringBoot2.6.4
MySQL驱动8.0+
  • 创建一个SpringBoot项目
    删除多余文件夹及文件,等待项目加载完毕。
    添加相关依赖 pom.xml
    
    
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.2.2
        

        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
        
            mysql
            mysql-connector-java
            runtime
        
        
        
            org.projectlombok
            lombok
            true
        
         
        
            org.aspectj
            aspectjweaver
            1.8.13
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    
  • 添加配置文件
    总配置文件、开发环境、生产环境
    • 总配置文件
    spring:
    	thymeleaf:
    		cache: false
    		mode: HTML
    	profiles:
    		active: dev
    
    • 开发环境配置文件
    server:
    	 port: 8080
    spring:
    	datasource:
       		username: root
    		password: root
    		url: https://jdbc:mysql://localhost:3306/blog?&useSSL=false&serverTimezone=UTC
    		driver-class-name: com.mysql.cj.jdbc.Driver
    
    mybatis:
    	type-aliases-package: com.yy.blog.pojo
    	mapper-locations: classpath:mybatis/mapper
            if(AnnotationUtils.findAnnotation(e.getClass(),ResponseStatus.class) != null){
                throw e;
            }
            ModelAndView mv = new ModelAndView();
            mv.addObject("url",request.getRequestURL());
            mv.addObject("exception",e);
            mv.setViewName("error/error");
            return mv;
        }
    }
    
    

    在这个异常处理类中,当在请求controller时发生异常时,会自动调用exceptionHandler方法对异常做处理,处理方式为:创建一个ModelAndView ,携带获取请求的URL和Exception,设置视图名称跳转到error页面并返回。

    其中对自定义的异常作了单独处理,当抛出的异常为这个自定义异常时,不会做此异常处理,而是正常抛出,让SpringBoot来处理。

    if(AnnotationUtils.findAnnotation(e.getClass(),ResponseStatus.class) != null){
         throw e;
    }
    
    • error页面
    
    
    
        
        错误
    
    
        

    错误

    >'" th:remove="tag">

    error页面会使用thymeleaf ,获取到异常处理后传过来的请求URL以及Exception并显示在浏览器源代码里

    • 自定义异常NotFoundException
      一定要用@ResponseStatus(HttpStatus.NOT_FOUND)注解标识该异常,才能被上面异常处理扫描到。
    package com.yy.blog.exception;
    
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.ResponseStatus;
    
    //所有抛出该异常都状态标识为 NOT_FOUND
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public class NotFoundException extends RuntimeException{
    
        public NotFoundException() {
        }
        public NotFoundException(String message) {
            super(message);
        }
    
        public NotFoundException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    
    • 异常测试
      异常处理到这就完成了,写一个controller来测试一下,当出现异常时,是否会根据上面做的异常处理来操作。

    【当正常抛出异常时】

    @Controller
    public class IndexController {
    
        @GetMapping("/")
        public String index(){
            int i = 1 / 0;
            return "index";
        }
    }
    



    测试结果:携带URL和Exception跳转到error页面,并将错误信息输出在浏览器源代码中

    【当抛出自定义异常时】

    @Controller
    public class IndexController {
    
        @GetMapping("/")
        public String index(){
            String blog = null;
            //如果查询出来的博客为空,则抛出自定义异常!
            if (blog == null){
                throw new NotFoundException("博客不存在!");
            }
            return "index";
        }
    }
    


    测试结果:当抛出自定义异常时,正常抛出,不做异常处理,跳转到 404

    • 日志处理
      在我们发出一次请求时,我们想记录一下请求者的ip地址、请求的URL、请求的哪个方法、请求的参数是什么,这时候该如何做呢?
      这里采用了 Spring aop 的方式,以controller包里所有的类的所有方法作为切面,当请求经过每个controller时,都会将上述内容记录下来并生成日志。
      具体实现:
      • 引入 aspectjweaver 织入包
      
          
              org.aspectj
              aspectjweaver
              1.8.13
          
      
      • 编写日志切面类
      package com.yy.blog.aspect;
      
      import org.aspectj.lang.JoinPoint;
      import org.aspectj.lang.annotation.*;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.stereotype.Component;
      import org.springframework.web.context.request.RequestContextHolder;
      import org.springframework.web.context.request.ServletRequestAttributes;
      import javax.servlet.http.HttpServletRequest;
      import java.util.Arrays;
      
      @Aspect
      @Component
      public class LogAspect {
      
          private final Logger logger  = LoggerFactory.getLogger(this.getClass());
      
          //定义切面,log()可以理解为切面的名称
          @Pointcut("execution(* com.yy.blog.controller.*.*(..))")
          public void log(){}
      
          @Before("log()")
          public void doBefore(JoinPoint joinPoint){
              //获取请求的URL
              ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
              HttpServletRequest request = attributes.getRequest();
              String url = request.getRequestURL().toString();
              //获取请求的ip地址
              String ip = request.getRemoteAddr();
              //获取请求的方法
              String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
              //获取请求的参数列表
              Object[] args = joinPoint.getArgs();
              RequestLog requestLog = new RequestLog(url,ip,classMethod,args);
              logger.info("Request ; {}",requestLog);
          }
      
          @After("log()")
          public void doAfter(){
      //        logger.info("---------------doAfter()-----------------");
          }
      
          @AfterReturning(returning = "result",pointcut = "log()")
          public void doAfterReturn(Object result){
              logger.info("Result : {}", result);
          }
      
          private class RequestLog{
              private String url;
              private String ip;
              private String classMethod;
              private Object[] args;
      
              public RequestLog(String url, String ip, String classMethod, Object[] args) {
                  this.url = url;
                  this.ip = ip;
                  this.classMethod = classMethod;
                  this.args = args;
              }
      
              @Override
              public String toString() {
                  return  "n请求的URL = '" + url + ''' + 'n' +
                          "请求者的ip地址 = '" + ip + ''' + 'n' +
                          "请求的方法 = '" + classMethod + ''' + 'n' +
                          "请求的参数 = '" + Arrays.toString(args);
              }
          }
      }
      
      • 测试请求
    内 容 太 长 了 ! C S D N 的 M a r k D o w n 编 辑 器 好 卡 ! color{#FF0000}{内容太长了!CSDN的MarkDown编辑器好卡!} 内容太长了!CSDN的MarkDown编辑器好卡! 下 一 章 见 ! color{#FF0000}{下一章见!} 下一章见!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847035.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号