zoukankan      html  css  js  c++  java
  • SpringBoot

      软件152 尹以操

    一、SpringBoot使用起来比起SpringMVC更便捷,在注解上的小变化,我记录了下面几个:

    @Controller + @ResponseBody   =  SpringMVC中用@RestController来代替前面两个注解,通过这个注解,可以将所有的前端http请求放入SpringBoot的Controller容器中,并返回json格式的数据给前端
    @RequestMapping(value={"/hello","/hi"},method=RequestMethod.GET)    =   @GetMapping(value={"/hello","/hi"}),在请求的注解上也有变化,例如例子的用Get请求方式可以直接变成@GetMapping(value={"/hello","/hi"}),当然Post请求就可以是@PostMapping等等。
    @...Mapping(value="personDelete/{id}") ----->@PathVariable("id") Integer id 在请求的方法名的参数前写@PathVariable可以获取到请求链接中的参数,如请求http://localhost:8080/personDelete/1024,可以获取到id的值为1024
    @...Mapping(value="findByName") ------> @RequestParam(value="name",required=false) String name 同样,可以通过@RequestParam来获取请求发过来的参数,value值就是要获取的参数的name

    二、SpringBoot可以直接对操作数据库中的值进行验证,如:

    表单验证
    @Min(value=18,message="未成年")    加在实体Entity类的属性上,表示获取的值最小为18
    
    @Valid Person person,BindingResult bindingResult     Controller的 某一个方法上(作为参数),验证结果保存在BindingResult里可通过下面的方法来获取
    if(bindingResult.hasErrors()){
                System.out.println(bindingResult.getFieldError().getDefaultMessage());//获取到错误信息 ,当然,也可以返回给前端去,这里获取的值就是“未成年”
                return null;
            }

    三、SpringBoot的AOP也是挺好用的,通过我对Spring的了解,似乎SpringBoot和Spring的AOP差不多,到底还是一家人儿。

    package com.yyc.aspect;
    
    import javax.servlet.http.HttpServletRequest;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    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;
    
    @Aspect
    @Component
    public class HttpAspect {
    
        private final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
        
        @Pointcut("execution(public * com.yyc.controller.PersonController.*(..))")
        public void log(){
        }
        
        @Before("log()")
        public void doBefore(JoinPoint joinPoint){ //可以获取到前端发送请求时的一些参数
    //        logger.info("1111111111");
            
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request=attributes.getRequest();
            //url
            logger.info("url={}",request.getRequestURI());
            //method
            logger.info("method={}",request.getMethod());
            //ip
            logger.info("ip={}",request.getRemoteAddr());
            //类方法
            logger.info("classMethod={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
            
            //参数
            logger.info("args={}",joinPoint.getArgs());
            
        }
        
        @After("log()")
        public void doAfter(){
            logger.info("2222222222");
        }
        
        @AfterReturning(returning="object",pointcut="log()")
        public void doAfterReturning(Object object){//也可以获取到前端请求后,SpringBoot返回给客户端的一些数据
            logger.info("response={}",object.toString());
        }
    }

    四、在SpringBoot中同样可以对异常信息进行统一处理,比如,我们有一些方法执行后要给客户端返回一些必要的信息,但是呢,这些信息不统一,很分散,可能对不同的结果返回不同的值,这时候统一异常处理就派上用场了,这样类处理就比较方便了。比如这个方法:

        public void getAge(Integer id) throws Exception{
            Person person = personRepository.findOne(id);
            Integer age=person.getAge();
            if(age < 10 ){
                //返回  你还在上小学吧
                throw new PersonException(ResultEnum.PRIMARY_SCHOOL);//这里用了一个自定义异常,用到枚举来对返回的东西进行封装
            }else if(age >= 10&& age<=16){
                //返回 你可能还在上初中
                throw new PersonException(ResultEnum.MIDDLE_SCHOOL);
            }
        }
        

    自定义异常类来捕获异常,注意要继承RuntimeException :

    package com.yyc.exception;
    
    import com.yyc.enums.ResultEnum;
    
    public class PersonException extends RuntimeException {
        
        private static final long serialVersionUID = 1L;
        private Integer code;
        
        public PersonException(ResultEnum resultEnum) {
            super(resultEnum.getMsg());
            this.code=resultEnum.getCode();
        }
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
        
    }

    异常的统一管理(照我的理解,就是可以通过这个类来对异常进行统一管理,当产生异常可以返回给客户端json数据):

    package com.yyc.handle;
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.yyc.entity.Result;
    import com.yyc.exception.PersonException;
    import com.yyc.utils.ResultUtil;
    
    @ControllerAdvice
    public class ExceptionHandle {
    
        private final static Logger logger= LoggerFactory.getLogger(ExceptionHandle.class);
        
        @ExceptionHandler(value=Exception.class)
        @ResponseBody
        public Result<?> handle(Exception e){
            if(e instanceof PersonException){
                return ResultUtil.error(((PersonException) e).getCode(), e.getMessage());
            }else{
                logger.error("【系统异常】{}",e);
                return ResultUtil.error(-1, "内置错误");
            }
        }
    }

    五、我们知道,客户端请求,希望的是要我们服务端返回一个固定的json格式,方便解析,一个Result类可以对返回的数据的数据格式定义:

    package com.yyc.entity;
    
    public class Result<T> {
    
        private Integer code;//错误码
        private String msg;//提示信息
        
        private T data;//具体的内容
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }  
    }

    前面有调用的ResultUtil类,这个类对上面的Result类进行使用和封装,以便其它地方调用:

    package com.yyc.utils;
    
    import com.yyc.entity.Result;
    
    public class ResultUtil {
    
        public static Result success(Object obj){
            Result result=new Result();
            result.setCode(1);
            result.setMsg("成功");
            result.setData(obj);
            return result;
        }
        
        public static Result success(){
            return success(null);
        }
        
        public static Result error(Integer code,String msg){
            Result result=new Result();
            result.setCode(0);
            result.setMsg(msg);
            result.setData(null);
            return result;
        }
    }

    六、SpringBoot中没有xml来配置,默认用properties文件来配置,但是建议用yml文件配置:

    application.yml:

    spring:
      profiles:
        active: dev   就像html中的include一样,可以通过spring profiles active来激活或导入另一个yml文件,如:application-dev.yml
     
    //对数据库的一些配置 datasource: username: root password: 123 driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springboot jpa: database-platform: org.hibernate.dialect.MySQL5Dialect hibernate: ddl-auto: update show-sql: true

    七、maven的pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.yyc</groupId>
        <artifactId>springboot_1</artifactId>
        <version>1.0</version>
        <packaging>jar</packaging>
    
        <name>springboot_1</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.2.RELEASE</version>
            <relativePath /> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
    
    
        <dependency><!--springBoot的热部署插件,devtools,加入这个可以不用每次修改代码重启服务-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>

    好了,这就是这两天看springboot的一些收获了吧。就小记一下。

  • 相关阅读:
    《PHP
    2018/06/11 数据库设计规范
    RequireJs 与 SeaJs的相同之处与区别
    null 与 undefinded
    page 分页
    fullPage的使用
    touch事件(寻找触摸点 e.changedTouches)
    t添加最佳视口
    随鼠标动的炫彩小球
    随机小球
  • 原文地址:https://www.cnblogs.com/hyyq/p/6746516.html
Copyright © 2011-2022 走看看