编辑
阿华代码,不是逆风,就是我疯
你们的点赞收藏是我前进最大的动力!!
希望本文内容能够帮助到你!!
目录
(3)@RestController 和 @Controller关联
一:实践
1:获取header
(1)普通方法
使⽤HttpServletRequest 提供的getHeader⽅法来获取, 参数对应HTTP请求报头的"Key"
@RequestMapping("/param1") public String param1(HttpServletRequest request , HttpServletResponse response){ String userAgent = request.getHeader("User-Agent"); return "userAgent "+ ":" + userAgent; }
(2)简洁方法获取 Header
@RequestMapping("/param2") public String para2(@RequestHeader("User-Agent") String userAgent){ return "userAgent "+ ":" + userAgent; }
运行结果
编辑
fiddler抓包验证
编辑
2:返回静态页面
(1)返回静态页面失败
编辑
前端代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Index页面</title> </head> <body> Hello,Spring MVC,我是index页面 </body> </html>
后端代码
@RestController public class IndexController { @RequestMapping("/index") public Object index(){ //返回index.html return "/index.html"; } }
运行结果
编辑
结果却发现, ⻚⾯未正确返回, http响应把 "/index.html" 当做了http响应正⽂的数据
(2)Controller
我们需要把 @RestController 改为 @Controller
@Controller public class IndexController { @RequestMapping("/index") public Object index(){ return "/index.html"; } }
编辑
(3)@RestController 和 @Controller关联
@RestController = @Controller + @ResponseBody
@Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
@ResponseBody : 定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息
如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了, 也就是 @Controller
3:返回数据@ResponseBody
加上 @ResponseBody 注解, 该⽅法就会把 "/index.html" 当做⼀个数据返回给前端
@Controller @ResponseBody public class IndexController { @RequestMapping("/index") public Object index(){ return "/index.html"; } }
编辑
①@ResponseBody 既是类注解, ⼜是⽅法注解
如果作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 如果作⽤在⽅法上, 表⽰该⽅法返回的是数据
②如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注
解, 也就是当前类下所有的⽅法返回值做为响应数据
③如果⼀个类的⽅法⾥, 既有返回数据的, ⼜有返回⻚⾯的, 就把 @ResponseBody 注解添加到对应的⽅法上即可
4:返回HTML代码片段
后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析
@RequestMapping("/returnHtml") @ResponseBody public String returnHtml(){ return "<h1>Hello,HTML~</h1>"; }
编辑
通过Fiddler观察响应结果, Content-Type 为 text/html
编辑
(1) 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
5:返回JSON
@RequestMapping("/returnJson") @ResponseBody public HashMap<String,String> returnJson(){ HashMap<String,String> hashmap = new HashMap<>(); hashmap.put("张三","畏罪潜逃"); hashmap.put("李四","知法犯法"); hashmap.put("王五","不知悔改"); return hashmap; }
编辑通过Fiddler观察响应结果, Content-Type 为 application/json
编辑
6:设置状态码
Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
状态码不影响⻚⾯的展⽰
@RequestMapping(value = "/setStatus") @ResponseBody public String setStatus(HttpServletResponse response){ response.setStatus(401); return "设置状态码成功"; }
编辑
编辑
7:设置Header
Http响应报头也会向客⼾端传递⼀些附加信息, ⽐如服务程序的名称,请求的资源已移动到新地址等, 如:
Content-Type, Local等.
这些信息通过 @RequestMapping 注解的属性来实现
先来看 @RequestMapping 的源码
编辑
1. value: 指定映射的URL
2. method: 指定请求的method类型, 如GET, POST等
3. consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,
text/html;
4. produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
5. Params: 指定request中必须包含某些参数值时,才让该⽅法处理
6. headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求
(1)设置Content-Type
我们通过设置 produces属性的值, 设置响应的报头Content-Type
@RequestMapping(value = "/returnJson2" , produces = "application/json") @ResponseBody public String returnJson2(){ return "{\"success\":true}";//转义字符 }
浏览器响应结果
编辑
postman测试
编辑
fiddler抓包
编辑
(2)设置响应编码
设置返回类型时, 也可以同步设置响应编码
@RequestMapping(value = "/returnJson3" , produces = "application/json;charset = utf-8") @ResponseBody public String returnJson3(){ return "{\"你大爷\":true}";//转义字符 }
编辑
(3)设置其它Header
设置其他Header的话, 需要使⽤Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
void setHeader(String name, String value) 设置⼀个带有给定的名称和值的 header. 如果 name
已经存在, 则覆盖旧的值
@RequestMapping("/setHeader") @ResponseBody public String setHeader(HttpServletResponse response){ response.setHeader("柳贯一","boss"); return "设置header成功"; }
编辑
编辑