8/31 Spring学习博客
请求(续)
获取Header
1.传统方式
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String userAgent = request.getHeader("User-Agent");
return "userAgent:"+userAgent;
}
2.注解
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){
return "userAgent:"+userAgent;
}
结果均为:

响应
1.返回静态页面

@Controller
@RequestMapping("/return")
public class ReturnController {
@RequestMapping("/r1")
public String r1(){
return "/index.html";
}
}

@RestController和@Controller之间的关系
@RestController 可以理解成:
@Controller + @ResponseBody 的组合。
也就是说,最大的区别在于:返回值默认是“页面”还是“数据”。
举个例子
@Controller
public class UserController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
这里 return "hello",Spring 默认会把 "hello" 当成一个视图名称,比如去找: hello.html
如果想让它直接返回字符串 "hello" 给前端,就要加:@ResponseBody
@Controller
public class UserController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "hello";
}
}
而使用 @RestController:
@RestController
public class UserController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
效果就等价于刚才的:
@Controller
@ResponseBody
来看看RestController的源码

这三个则是元注解(可以注解到其他注解的注解)

@Target:表示注解的使用范围
@Retention:表示注解的生命周期
@Documented 表示“这个注解的信息要被包含到 Javadoc 文档里”。
2.返回数据
通过 @ResponseBody
既可以修饰类也可以修饰方法
修饰类:表示该类所有的方法,返回的都是数据
修饰方法:表示该方法,返回的是数据
@RequestMapping("/r2")
@ResponseBody
public String r2(){
return "hello,i am Spring";
}

@Controller默认返回的是页面

3.返回HTML片段
@ResponseBody
@RequestMapping("/r3")
public String r3(){
return "<h1>hello,i am Spring</h1>" ;
}


4.返回JSON
@RequestMapping("/r4")
@ResponseBody
public UserInfo r4(){
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setName("zhangsan");
userInfo.setAge(18);
return userInfo;
}

!!!Spring会根据我们返回的结果 动态的设置 Content-Type
@RequestMapping("/r5")
@ResponseBody
public Map<String,String> r5(){
HashMap map = new HashMap();
map.put("k1","v1");
map.put("k2","v2");
return map;
}

@RequestMapping("/r6")
public String r6(){
return "/a.js";
}

@RequestMapping("/r7")
public String r7(){
return "/b.css";
}

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


状态码设置不影响页面显示
6.设置Header(了解)
(1)设置Content-Type
默认是text/html
通过produces设置
@RequestMapping(value = "/r9",produces = "application/json")
@ResponseBody
public String r9(){
return "123456";
}

(2)自定义Header
我们后面进行校验就可以通过自定义header来实现
@RequestMapping("/r10")
@ResponseBody
public String r10(HttpServletResponse response){
response.setHeader("myHeader","myValue");
return "设置Header成功";
}

到这SpringMVC基本学完
SpringMVC综合练习
接口定义:两个原则
1.看我需要什么(请求参数)
2.看对方需要什么(响应结果)
后端报错,如果肉眼一眼看不出来问题
- Debug
2.把参数打印出来
简易计算器
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="calc/sum" method="post">
<h1>计算器</h1>
数字1:<input name="num1" type="text"><br>
数字2:<input name="num2" type="text"><br>
<input type="submit" value=" 点击相加 ">
</form>
</body>
</html>
后端
package com.bite.spring;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/calc")
public class CalController {
@RequestMapping("/sum")
public String sum(Integer num1,Integer num2){
int sum = num1+num2;
return "sum="+sum;
}
}

浙公网安备 33010602011771号