大家好我叫小帅,今天我们来学习Spring Web开发的响应
文章目录
1. 响应
在我们前⾯的代码例⼦中,都已经设置了响应数据, Http响应结果可以是数据, 也可以是静态⻚⾯,也可以针对响应设置状态码, Header信息等。
1.1 返回静态⻚⾯
创建前端⻚⾯ index.html(注意路径)
现在我们学习的前端页面,先放在这里。
html代码如下:
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Index⻚⾯</title></head><body>
Hello,Spring MVC,我是Index⻚⾯.
</body></html>
后端代码:
@RestController@RequestMapping("/html")publicclassHtml{@RequestMapping("getHtml")publicStringgetHtml(){return"/index.html";}}
没有跳转
结果却发现, ⻚⾯未正确返回, http响应把 “/index.html” 当做了http响应正⽂的数据,
那Spring MVC如何才能识别出来 index.html 是⼀个静态⻚⾯, 并进⾏返回呢?
我们需要把 @RestController 改为 @Controller
解释:
代码:
@Controller@RequestMapping("/html")publicclassHtml{@RequestMapping("getHtml")publicStringgetHtml(){return"/index.html";}}
效果:
跳转成功!!
所以前⾯使⽤的 @RestController 其实是返回的数据.
- @RestController = @Controller + @ResponseBody
- @Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
- @ResponseBody : 定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息
1. 2 返回数据@ResponseBody
我们上面讲到@ResponseBody 表⽰返回数据.,我们就来试一试.
代码:
@Controller@ResponseBody@RequestMapping("/html")publicclassHtml{@RequestMapping("getHtml")publicStringgetHtml(){return"/index.html";}}
效果:
加上 @ResponseBody 注解, 该⽅法就会把 “/index.html” 当做⼀个数据返回给前端.
@ResponseBody 既是类注解, ⼜是⽅法注解
如果作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 如果作⽤在⽅法上, 表⽰该⽅法返回的是数据.
代码:
@Controller@RequestMapping("/html")publicclassHtml{@RequestMapping("getHtml")publicStringgetHtml(){return"/index.html";}@ResponseBody@RequestMapping("getData")publicStringgetData(){return"/data";}}
输出结果:
多个注解时, 没有先后顺序, 先写哪个都可以
如果去掉 @ResponseBody 注解, 程序会报404错误,程序会认为需要返回的是视图, 根据内容去查找⽂件, 但是查询不到, 路径不存在, 报404
1.3 返回HTML代码⽚段
后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析
代码:
@Controller@RequestMapping("/html")publicclassHtml{@ResponseBody@RequestMapping("/getHtml")publicStringgetHtml(){return"<p>返回一个html代码</p>";}}
效果:
的确,返回一个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")@ResponseBodypublicHashMap<String,String>getJson1(){HashMap<String,String> map =newHashMap<>();
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")@ResponseBodypublicStringgetJson2(){User user =newUser("zhangsan","123");return user.toString();}
第一个代码效果:
第二段代码效果:
1.6 设置状态码(Status)
代码:
@Controller@RequestMapping("/html")publicclassHtml{@ResponseBody@RequestMapping("/setStatus")publicStringsetStatus(HttpServletResponse response){//设置返回状态码
response.setStatus(410);return"状态码设置成功";}}
效果:
1.7 设置Header (了解)
Http响应报头也会向客⼾端传递⼀些附加信息, ⽐如服务程序的名称,请求的资源已移动到新地址等, 如:
Content-Type, Local等.
这些信息通过 @RequestMapping 注解的属性来实现
先来看 @RequestMapping 的源码:
@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Mappingpublic@interfaceRequestMapping{Stringname()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
代码:
publicclassHtml{@RequestMapping(value ="/returnJson",produces ="application/json")@ResponseBodypublicStringreturnJson2(){return"{\"success\":true}";}}
效果:
如果不设置produces , ⽅法返回结果为String时, Spring MVC默认返回类型, 是text/html.
设置返回类型时, 也可以同步设置响应编码
代码:
@RequestMapping(value ="/returnJson",produces ="application/json;charset=utf-8")@ResponseBodypublicStringreturnJson2(){return"{\"success\":true}";}
1.7.1 设置其他Header
设置其他Header的话, 需要使⽤Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
代码:
publicclassHtml{@RequestMapping(value ="/setHeader")@ResponseBodypublicStringsetHeader(HttpServletResponse response){
response.setHeader("MyHeader","MyHeaderValue");return"设置Header成功";}}
void setHeader(String name, String value) 设置⼀个带有给定的名称和值的 header. 如果 name
已经存在, 则覆盖旧的值
效果:
使用抓包工具看看:
1.8 lombok工具包
Lombok是⼀个Java⼯具库,通过添加注解的⽅式,简化Java的开发.
- 引⼊依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
- 使⽤ ombok通过⼀些注解的⽅式, 可以帮助我们消除⼀些冗⻓代码, 使代码看起来简洁⼀些 ⽐如之前的Person对象 就可以改为
@DatapublicclassPerson{privateint id;privateString name;privateString password;}
@Data 注解会帮助我们⾃动⼀些⽅法, 包含getter/setter, equals, toString等
- 原理解释 可以观察加了 @Data 注解之后, Idea反编译的class⽂件
这不是真正的字节码⽂件, ⽽是Idea根据字节码进⾏反编译后的⽂件反编译是将可执⾏的程序代码转换为某种形式的⾼级编程语⾔, 使其具有更易读的格式. 反编译是⼀种逆向⼯程,它的作⽤与编译器的作⽤相反。
可以看出来, lombok是⼀款在编译期⽣成代码的⼯具包.
Java 程序的运⾏原理:
Lombok 的作⽤如下图所⽰:
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
1.9 更快捷的引⼊依赖
- 安装插件EditStarter, 重启Idea
专业版自带
然后,字pom.xml文件下右击鼠标
这里就可以快速引入依赖。
不是所有依赖都可以在这⾥添加的, 这个界⾯和SpringBoot创建项⽬界⾯⼀样.依赖不在这⾥的, 还需要去Maven仓库查找坐标, 添加依赖.
2.总结(注解|会话|依赖引入)
学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解
- @RequestMapping: 路由映射
- @RequestParam: 后端参数重命名
- @RequestBody: 接收JSON类型的参数
- @PathVariable: 接收路径参数
- @RequestPart: 上传⽂件
- @ResponseBody: 返回数据
- @CookieValue: 从Cookie中获取值
- @SessionAttribute: 从Session中获取值
- @RequestHeader: 从Header中获取值
- @Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回 视图.
- @RestController: @ResponseBody + @Controller 返回数据
- Cookie 和Session都是会话机制, Cookie是客⼾端机制, Session是服务端机制. ⼆者通过SessionId 来关联. Spring MVC内置HttpServletRequest, HttpServletResponse两个对象. 需要使⽤时, 直接在⽅法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中来获取, 也可以直接使⽤HttpServletResponse设置Http响应状态码.
- Java EE学习阶段会涉及较多⼯具, 插件的学习, 来帮助我们提⾼开发效率. ⽐如Postman, lombok, EditStarter, 后⾯还会继续学习其他的⼯具或插件.
好了,今天讲到这里,感谢观看。
版权归原作者 再无B~U~G 所有, 如有侵权,请联系我们删除。