惊雷无声 发表于 2024-12-2 17:50:00

Spring Web 开发(相应)| lombok工具 | 快速引用依赖

大家好我叫小帅,今天我们来学习Spring Web开发的相应


1. 相应

在我们前⾯的代码例⼦中,都已经设置了相应数据, Http相应效果可以是数据, 也可以是静态⻚⾯,也可以针对相应设置状态码, Header信息等。
1.1 返回静态⻚⾯

创建前端⻚⾯ index.html(注意路径)
现在我们学习的前端页面,先放在这里。
https://i-blog.csdnimg.cn/direct/3deb8d71fcac462ea966a74dfd1e77eb.png
html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index⻚⾯</title>
</head>
<body>
    Hello,Spring MVC,我是Index⻚⾯.
</body>
</html>
后端代码:
@RestController
@RequestMapping("/html")
public class Html {
    @RequestMapping("getHtml")
    public String getHtml() {
      return "/index.html";
    }

}
没有跳转
https://i-blog.csdnimg.cn/direct/cdb36f8240e440c3a685b9bc2b081718.png
效果却发现, ⻚⾯未正确返回, http相应把 “/index.html” 当做了http相应正⽂的数据,
那Spring MVC怎样才能识别出来 index.html 是⼀个静态⻚⾯, 并进⾏返回呢?
我们须要把 @RestController 改为 @Controller
解释:
https://i-blog.csdnimg.cn/direct/0fab1534281d4d14a760b3d982182e10.png
代码:
@Controller
@RequestMapping("/html")
public class Html {
    @RequestMapping("getHtml")
    public String getHtml() {
      return "/index.html";
    }

}
效果:
https://i-blog.csdnimg.cn/direct/c5b6243687fb445fba6ed8e9533198f2.png
跳转成功!!
所以前⾯使⽤的 @RestController 其实是返回的数据.

[*]@RestController = @Controller + @ResponseBody
[*]@Controller : 界说⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
[*]@ResponseBody : 界说返回的数据格式为⾮视图, 返回⼀个 text/html 信息
1. 2 返回数据@ResponseBody

我们上面讲到@ResponseBody 表⽰返回数据.,我们就来试一试.
代码:
@Controller
@ResponseBody
@RequestMapping("/html")
public class Html {
    @RequestMapping("getHtml")
    public String getHtml() {
      return "/index.html";
    }

}
效果:
https://i-blog.csdnimg.cn/direct/1923896b22a84d4c80b9359ec72a2abf.png
加上 @ResponseBody 注解, 该⽅法就会把 “/index.html” 当做⼀个数据返回给前端.
@ResponseBody 既是类注解, ⼜是⽅法注解
假如作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 假如作⽤在⽅法上, 表⽰该⽅法返回的是数据.
代码:
@Controller
@RequestMapping("/html")
public class Html {

    @RequestMapping("getHtml")
    public String getHtml() {
      return "/index.html";
    }

    @ResponseBody
    @RequestMapping("getData")
    public String getData() {
      return "/data";
    }
}
输出效果:
https://i-blog.csdnimg.cn/direct/08ee3672df284627a1a182af20380632.png
   多个注解时, 没有先后顺序, 先写哪个都可以
假如去掉 @ResponseBody 注解, 步伐会报404错误,步伐会以为须要返回的是视图, 根据内容去查找⽂件, 但是查询不到, 路径不存在, 报404
1.3 返回HTML代码⽚段

后端返回数据时, 假如数据中有HTML代码, 也会被欣赏器解析
代码:
@Controller
@RequestMapping("/html")
public class Html {

    @ResponseBody
    @RequestMapping("/getHtml")
    public String getHtml() {
      return "<p>返回一个html代码</p>";
    }
}
效果:
https://i-blog.csdnimg.cn/direct/ba815e2d0f6546f19a6dfb3762168a30.png
https://i-blog.csdnimg.cn/direct/e379640de7f543928ed44e7e8e9834a5.png
简直,返回一个html代码。
1.4 相应中的 Content-Type 常⻅取值有以下⼏种:


[*]text/html : body 数据格式是 HTML
[*]text/css : body 数据格式是 CSS
[*]application/javascript : body 数据格式是 JavaScript
[*]application/json : body 数据格式是 JSON
[*]假如哀求的是js⽂件, Spring MVC会⾃动设置Content-Type为 application/javascript
[*]假如哀求的是css⽂件, Spring MVC会⾃动设置Content-Type为 text/css
1.5 返回JSON

Spring MVC 也可以返回JSON
代码:
    @RequestMapping("/getJson")
    @ResponseBody
    public HashMap<String, String> getJson1() {
      HashMap<String, String> map = new HashMap<>();
      map.put("Java", "Java Value");
      map.put("MySQL", "MySQL Value");
      map.put("Redis", "Redis Value");
      return map;
    }
    //直接告诉前端,我返回的是JSON,在@RequestMapping添加参数produces = "application/json"
    @RequestMapping(value = "/getJsonBean", produces = "application/json")
    @ResponseBody
    public String getJson2() {
      User user = new User("zhangsan", "123");
      return user.toString();
    }
第一个代码效果:
https://i-blog.csdnimg.cn/direct/e13aa3dd9cb04dbdba3c3c7c36593af3.png
第二段代码效果:
https://i-blog.csdnimg.cn/direct/51530b9533324029a6a47c1a350e1236.png
https://i-blog.csdnimg.cn/direct/582421cee702449398fa495cabe65a59.png
1.6 设置状态码(Status)

代码:
@Controller
@RequestMapping("/html")
public class Html {

    @ResponseBody
    @RequestMapping("/setStatus")
    public String setStatus(HttpServletResponse response) {
      //设置返回状态码
      response.setStatus(410);
      return "状态码设置成功";
    }

}
效果:
https://i-blog.csdnimg.cn/direct/6415844982e1497b8786a3fbf7697d02.png
https://i-blog.csdnimg.cn/direct/98ba76a7f0f54a1bac6843c9f2d09a46.png
1.7 设置Header (了解)

Http相应报头也会向客⼾端传递⼀些附加信息, ⽐如服务步伐的名称,哀求的资源已移动到新地址等, 如:
Content-Type, Local等.
这些信息通过 @RequestMapping 注解的属性来实现
先来看 @RequestMapping 的源码:
@Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Mapping
    public @interface RequestMapping {
      String name() default "";
      @AliasFor("path")
      String[] value() default {};
      @AliasFor("value")
      String[] path() default {};
      RequestMethod[] method() default {};
      String[] params() default {};
      String[] headers() default {};String[] consumes() default {};
      String[] produces() default {};
    }

[*]value: 指定映射的URL
[*]method: 指定哀求的method范例, 如GET, POST等
[*]consumes: 指定处置惩罚哀求(request)的提交内容范例(Content-Type),例如application/json,text/html;
[*]produces: 指定返回的内容范例,还可以同时设置返回值的字符编码
[*]Params: 指定request中必须包罗某些参数值时,才让该⽅法处置惩罚
[*]headers: 指定request中必须包罗某些指定的header值,才能让该⽅法处置惩罚哀求
1.7.1 设置Content-Type

我们通过设置 produces属性的值, 设置相应的报头Content-Type
代码:
public class Html {

    @RequestMapping(value = "/returnJson",produces = "application/json")
    @ResponseBody
    public String returnJson2() {
      return "{\"success\":true}";
    }
}
效果:
https://i-blog.csdnimg.cn/direct/9ef4a4e5f3f043fb960fde12b28e7408.png
https://i-blog.csdnimg.cn/direct/89d032d24df3404f887108ced609a83b.png
假如不设置produces , ⽅法返回效果为String时, Spring MVC默认返回范例, 是text/html.
设置返回范例时, 也可以同步设置相应编码
代码:
    @RequestMapping(value = "/returnJson",produces = "application/json;charset=utf-8")
    @ResponseBody
    public String returnJson2() {
      return "{\"success\":true}";
    }
https://i-blog.csdnimg.cn/direct/2e98ad0c3d7a4771b2fc0acc2f04fc82.png
1.7.1 设置其他Header

设置其他Header的话, 须要使⽤Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
代码:
public class Html {

    @RequestMapping(value = "/setHeader")
    @ResponseBody
    public String setHeader(HttpServletResponse response) {
      response.setHeader("MyHeader","MyHeaderValue");
      return "设置Header成功";
    }
}
   void setHeader(String name, String value) 设置⼀个带有给定的名称和值的 header. 假如 name
已经存在, 则覆盖旧的值
效果:
https://i-blog.csdnimg.cn/direct/986c0869c30b4f38a676e60dc6a69cd0.png
利用抓包工具看看:
https://i-blog.csdnimg.cn/direct/219f6f8b17cd4401847c11104452de7d.png
1.8 lombok工具包

Lombok是⼀个Java⼯具库,通过添加注解的⽅式,简化Java的开发.

[*]引⼊依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

[*]使⽤
ombok通过⼀些注解的⽅式, 可以资助我们消除⼀些冗⻓代码, 使代码看起来简洁⼀些
⽐如之前的Person对象 就可以改为
@Data
public class Person {
   private int id;
   private String name;
   private String password;
}
@Data 注解会资助我们⾃动⼀些⽅法, 包罗getter/setter, equals, toString等

[*]原理解释
可以观察加了 @Data 注解之后, Idea反编译的class⽂件
这不是真正的字节码⽂件, ⽽是Idea根据字节码进⾏反编译后的⽂件反编译是将可执⾏的步伐代码转换为某种形式的⾼级编程语⾔, 使其具有更易读的格式. 反编译是⼀种逆向⼯程,它的作⽤与编译器的作⽤相反。
https://i-blog.csdnimg.cn/direct/cc4232912f7a41618f0ca5032f4afb20.png
https://i-blog.csdnimg.cn/direct/9e5e0a2a2a684ebdbc69c0a25dfde369.png
可以看出来, lombok是⼀款在编译期⽣成代码的⼯具包.
Java 步伐的运⾏原理:
https://i-blog.csdnimg.cn/direct/919b438cd06a44adb7d72eecc2a7185d.png
Lombok 的作⽤如下图所⽰:
https://i-blog.csdnimg.cn/direct/fc8feb999b6b496687615fc261b570c3.png
4. 更多使⽤
假如觉得@Data⽐较粗暴(⽣成⽅法太多), lombok也提供了⼀些更风雅粒度的注解
注解作⽤@Getter⾃动添加 getter ⽅法@Setter⾃动添加 setter ⽅法@ToString⾃动添加 toString ⽅法@EqualsAndHashCode⾃动添加 equals 和 hashCode ⽅法@NoArgsConstructor⾃动添加⽆参构造⽅法@AllArgsConstructor⾃动添加全属性构造⽅法,顺序按照属性的界说顺序@NonNull属性不能为 null@RequiredArgsConstructor⾃动添加必需属性的构造⽅法,final + @NonNull 的属性为必需 @Data = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor+ @NoArgsConstructor
这里我们演示两个@Getter和@ToString
https://i-blog.csdnimg.cn/direct/8f479663ebf14ccd858f7e109d1cd4bd.png
1.9 更快捷的引⼊依赖


[*]安装插件EditStarter, 重启Idea
专业版自带
然后,字pom.xml文件下右击鼠标
https://i-blog.csdnimg.cn/direct/3d96588f85b14a99b54d55679be1778f.png
https://i-blog.csdnimg.cn/direct/b20116391084456ab8d6dfd31d9bf85b.png
https://i-blog.csdnimg.cn/direct/b81aa69438c14f8892c878b51d606c3c.png
https://i-blog.csdnimg.cn/direct/c5f244209253466bbcd562ae3559bd7d.png
这里就可以快速引入依赖。
不是所有依赖都可以在这⾥添加的, 这个界⾯和SpringBoot创建项⽬界⾯⼀样.依赖不在这⾥的, 还须要去Maven堆栈查找坐标, 添加依赖.
好了,今天讲到这里,感谢观看。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Spring Web 开发(相应)| lombok工具 | 快速引用依赖