【SpringBoot】二、Lombok、Devtools集成与接口开发常用注解

开发

LomBok简化JavaBean开发

引入依赖:

pom.xml:

    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
    dependency>

在file—>setting—>plugin中搜索lombok并安装

使用示例:

@Data   				//添加get、set方法
@NoArgsConstructor      //添加无参构造器
@AllArgsConstructor     //添加全参构造器
@ToString               //添加ToString
@EqualsAndHashCode      //添加Equals和HashCode方法
@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private Integer price;
    
}

LomBok的日志的注解访问

在Controller层中添加注解:

@Slf4j
public class HelloController {

之后就会允许在这个Controller类中进行日志的操作,例如:

log.info("输出信息")

就会在执行这个语句时在控制台中输出后面的String语句

devtools实现热部署

添加依赖:


        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <optional>trueoptional>
        dependency>

依赖添加完成后,使用Ctrl+F9进行刷新就可以在不需要重新部署的情况下刷新

若经费足够就使用付费的JRebel进行热部署以及热启动。

静态页面和Java代码都可以通过devtools进行热部署

使用Spring Initializr生成项目(项目初始化向导)

在创建项目时使用Spring Initializr进行项目生成,会帮助创建项目结构,添加依赖信息,完成配置。

真正开发

文件类型

SpringBoot支持的文件类型除了Properties还有yaml

yaml很适合进行以数据为中心的开发方式,其基本语法:

  • 键值对:key: value(中间有空格)
  • 大小写敏感
  • 使用缩进表示层级关系,不可以使用tab,只能使用空格空两格(空几格不重要,但必须对齐)进行配置层级关系
  • #表示注释
  • ''与"“表示字符串,但是只有”"中的转义字符被转义

在resources文件夹中使用yaml进行数据绑定,即向类的实例化对象中传值

使用yaml进行数据配置的示例:

Application.yml:

person:
  userName: Zhangsan
  boss: true
  birth: 2019/12/9
  age: 18
#  数组的写法
#  interests: [篮球,足球]
  interests:
    - 篮球
    - 足球
    - 18
  animal: [阿猫,阿狗]
#  Map的写法
#  score: {english:80,math:90}
  score:
    english: 80
    math: 90
  salarys:
    - 9999.98
    - 9999.99
#   传入对象的写法
  pet:
    name: 阿狗
    weight: 66.66
#   传入多个对象的写法:
  allPets:
    sick:
      - {name: 阿狗,weight: 99.99}
      - name: 阿猫
        weight: 66.66
      - name: 阿虫
        weight: 77.77
    health:
      - {name: 阿猪,weight: 899.99}
      - {name: 阿鼠,weight: 1.99}
      - {name: 阿鸟,weight: 19.99}

两个Bean示例:

Pet.java:

@ToString
@Data
public class Pet {
    private String name;
    private Double weight;
}

Person.java

@ConfigurationProperties(prefix = "person")
@Component
@ToString
@Data
public class Person {
    private String username;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private Pet pet;
    private String[] interests;
    private List<String> animal;
    private Map<String, Object> score;
    private Set<Double> salarys;
    private Map<String, List<Pet>> allPets;
}

但yml文件中有的时候会不提示,要提示的话就可以在pom.xml文件中添加依赖并重新打包(maven—>lifecycle—>package):


        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-configuration-processorartifactId>
            <optional>trueoptional>
        dependency>

创建新Web项目

在创建时勾选LomBok(快速创建JavaBean以及日志)、DevTools(热部署)、Configuration Processor(配置处理器、提示属性信息)、Web

其中生成的文件中:.mvn文件夹,.gitgnore,HELP.md,mvnw,mvnw.cmd文件都可以删除掉

其中在类路径下的META-INF、public、resources、static文件夹中用来存放静态资源,这些静态资源可以直接被访问。

注意,如果静态资源的名称与请求重名,会优先访问请求(先在controller层中尝试寻找请求,无法找到时再去静态资源中寻找资源)

所以在尝试寻找静态资源时,应该在配置文件中配置静态资源的固定前缀,例如在下面文件:

application.yml

spring:
  mvc:
    static-path-patetrn: /res/**

这样之后,静态资源就只能通过在前面加入/res/资源名 才可以进行访问了

其中,静态资源的路径也可以改变,添加下面的代码,静态资源就只能在以下文件夹下找到

spring:
  resources: 
    static-locations: classpath:/zheli

注意在访问默认页面index.html时不能添加静态资源访问前缀,但是通过controller访问

在静态资源下找到Favicon.ico文件,会将其作为网页图标

下面的add-mapping可以设置静态资源的访问,true代表允许访问静态资源。false代表不允许访问静态资源

spring:
  resources: 
    add-mapping: true

同时还有缓存控制,设置缓存时间。

Rest风格

普通风格使用 / getUser 获取用户 / deleteUser 删除用户 / editUser 修改用户 / saveUser 保存用户

Rest风格使用Http协议的不同请求方式来操作业务:所有的请求都是/user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户

使用HiddenHttpMethodFilter来实现Rest风格的代码编写

注意,SpringBoot在底层默认将开启RestFul风格编程的选项设置为了false,我们要使用RestFul风格编程的话就需要再配置文件中设置:

application.yml:

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

普通参数与基本注解

@PathVariable

@PathVariable注解加在形参之前,用来给形参赋值,将请求信息中的同名参数赋值给标注了这个注解的形参,另外,也可以将所有的参数赋值给一个Map对象,举例如下:

    @GetMapping("/car/{id}/owner/{username}")
    public Map<String, Object> getCar(@PathVariable("id") Integer id,
                                      @PathVariable("username") String name,
                                      @PathVariable Map<String, String> pv){
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("name", name);
        map.put("pv", pv);
        return map;
    }

调用:

<a href="/car/3/owner/lisi">测试@PathVariablea>

@RequestHeader

@RequestHeader注解用来获取请求头信息,可以获取单个的某个参数,也可以将所有的信息转换成一个map获取,同样是在形参的位置获取。

 @RequestHeader("User-Agent") String userAgent,
 @RequestHeader Map<String, String> header

@RequestParam

@RequestParam用来获取浏览器上?后面的参数,传给注解的value属性其键值就可以获取他的具体值,如果有很多个值,就使用一个List进行存储。

    @GetMapping("/car/{id}/owner/{username}")
    public Map<String, Object> getCar(@RequestParam("age") Integer age,
                                      @RequestParam("inters") List<String> inters,
                                      @RequestParam Map<String, String> params){
        Map<String, Object> map = new HashMap<>();
        map.put("age", age);
        map.put("inters", inters);
        map.put("Params", params);
        return map;
    }

传入的请求:

<a href="/car/3/owner/lisi?age=18&inters=basketball&inters=game">测试@PathVariablea>

@CookieValue

使用@CookieValue获取Cookie值

cookie.getName和cookie.getValue来获取名称和Value,但必须要在@CookieValue中添加Cookie名

    @GetMapping("/car/{id}/owner/{username}")
    public Map<String, Object> getCar(@CookieValue("Idea-cd4fc388") Cookie cookie){
        Map<String, Object> map = new HashMap<>();
        System.out.println("CookieName = " + cookie.getName() + "====>" + cookie.getValue());
        return map;
    }

@RequestBody

@RequestBody来获取请求体,注意只有Post请求才有请求体,其请求体中存储的一般是表单中的键值对,使用String获取,是由键值对组成的字符串。

@PostMapping("/save")
public Map<String, Object> getRequestBody(@RequestBody String requestBody){
    Map<String, Object> map = new HashMap<>();
    map.put("requestBody", requestBody);
    return map;
}

前台表单:

测试ResponseBody获取数据【POST】
<form action="/save" method="post">
    <input type="text" name="username" value="请输入用户名" /><br>
    <input type="text" name="email" value="请随意输入邮箱" /><br>
    <input type="submit" value="提交">
form>

@RequestAttribute

使用goToPage向request域中存储数据,再通过@RequestAttrbute注解获取数据,或者通过request直接拿(转发,同一个请求)

@Controller
public class RequestController {
    @GetMapping("/goto")
    public String goToPage(HttpServletRequest request){
        request.setAttribute("msg", "成功了");
        request.setAttribute("code", 200);
        return "forward:/success";      //转发到/success请求
    }

    @ResponseBody
    @GetMapping("/success")
    public Map success(@RequestAttribute("msg") String msg,
                       @RequestAttribute("code") Integer code,
                       HttpServletRequest request){
        Object msg1 = request.getAttribute("msg");
        Map<String, Object> map = new HashMap<>();
        map.put("annotation_msg", msg);
        map.put("request_msg", msg1);
        return map;
    }
}

矩阵变量

正常请求是这样的:/cars/{path}?xxx=xxx,这种叫做queryString 查询字符串

矩阵变量是这样的:/cars/{path;low=34;brand=byd,audi,yd}

一道经典的面试题:Cookie被禁用了怎么获取session中的数据

cookie被禁用之后,就没办法通过请求携带cookie的方式获取cookie的JsessionId从而获取session中的数据了,我们可以通过url重写的方式获取JSessionId从而获取Session中的数据(矩阵变量获取)例如:/abcdefg/jsessionid=xxxx(将cookie中的值通过矩阵变量进行传递)

注意,SpringBoot默认是禁用矩阵变量的

因为SpringBoot对于路径的处理都是通过UrlPathHelper进行解析的,而这个帮助器默认在解析时会把分号去掉(removeSemicolonContent)(移除分号内容)

进行手动开启,编写配置类:

@Configuration(proxyBeanMethods = false)
public class WebConfig {
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer(){
            //重写WebMvcConfigurer的路径解析方法
            @Override
            public void configurePathMatch(PathMatchConfigurer configurer){
                //创建一个新的关闭了分号移除的帮助器对象
                UrlPathHelper urlPathHelper = new UrlPathHelper();
                //关闭分号移除功能
                urlPathHelper.setRemoveSemicolonContent(false);
                //将新的帮助器返回给配置
                configurer.setUrlPathHelper(urlPathHelper);
            }
        };
    }
}

然后使用@MatrixVariable注解获取矩阵变量中的值

//    /car/sell;low=34;brand=audi,byd,yd
    @GetMapping("/car/{path}")
    public Map carsSell(@MatrixVariable("low") Integer low,
                        @MatrixVariable("brand") List<String> brands,
                        @PathVariable("path") String path){
        Map<String, Object> map = new HashMap<>();
        map.put("low", low);
        map.put("brands", brands);
        map.put("path", path);
        return map;
    }

当要传入多个对象的相同属性时,要添加如下参数,注意必须有{},矩阵变量才可以被解析:

    //测试相同键值时的矩阵传值
	@GetMapping("/boss/{bossId}/{empId}")
    public Map boss(@MatrixVariable(value = "age", pathVar = "bossId") Integer bossAge,
                    @MatrixVariable(value = "age", pathVar = "empId") Integer empAge) {
        Map<String, Object> map = new HashMap<>();
        map.put("bossAge", bossAge);
        map.put("empAge", empAge);
        return map;
    }

你可能感兴趣的:(SpringBoot,spring,boot,java,spring)