在Spring MVC1中,我们知道了MVC的定义,同时也知道了@RequestMapping和@RestController这个注解的作用。
本篇文章,我们将学习使用Spring MVC获取请求参数和返回不同的响应等等
请求
传递单个参数
如图所示,创建RequestController类:
在类中实现传递单个参数:
@RestController
public class RequestController {
@RequestMapping("/r1")
public String r1(String name){
return "获取参数"+name;
}
}
我们可以使用Postman对代码进行测试 :
传int和Integer对比(传错误类型和不传参数):
传递Integer:
@RequestMapping("/r2")
public String r2(Integer num){
return "获取参数"+num;
}
传递int:
@RequestMapping("/r3")
public String r3(int num){
return "获取参数"+num;
}
可以看到在不传参时int直接报了个500(500属于客户端的问题,是要我们后端开发人员负责的),因此在实际开发中建议多使用包装类型。
传递多个参数
@RequestMapping("/r4")
public String r4(String name,Integer age){
return "获取参数:"+name+" age:"+age;
}
Postman测试:
传递对象
当我们需要传递两个以上的参数时,就可以使用对象来进行传递,使代码更加简洁。
先在目录下创建一个学生类:
public class Student {
private String name;
private Integer age;
private Integer id;
}
我们可以使用Lombok的@Data注解来减少Getter和Setter方法的书写:
首先,我们需要在pom.xml中添加Lombok的依赖,这里建议使用插件进行添加: 在pom.xml文件中右键-生成:
选中我们刚才安装的插件:
继续按图示点击,然后OK即可: 回到刚才的Student代码处,添加上@Data注解。
@Data
public class Student {
private String name;
private Integer age;
private Integer id;
}
这是Lombok中所包含的一些其他注解:
@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsContryctor
@RequestMapping("/r5")
public String r5(Student student){
return student.toString();
}
}
测试:
后端参数映射(后端参数重命名)
后端参数映射需要使用@RequestParam这个注解:
@RequestMapping("/r6")
public String r6(@RequestParam("name")String userName){
return "获取参数"+userName;
}
测试:
传递数组
@RequestMapping("/r7")
public String r7(int[] arr){
return Arrays.toString(arr);
}
测试:
方式1: 
方式2:
传递集合
@RequestMapping("/r8")
public String r8(@RequestParam List<String> list){
return list.toString();
}
测试:
方式1:
方式2:
传递Json对象
传递Json对象需要使用@RequestBody这个注解
@RequestMapping("/r10")
public String r10(@RequestBody Student student){
return student.toString();
}
测试:
Json字符串转对象和对象转字符串
代码:
public class TestJson {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//json字符串转对象
String jsonstr = "{\"name\":\"张三\",\"age\":15,\"id\":5}";
Student student = mapper.readValue(jsonstr,Student.class);
System.out.println(student);
//json对象转字符串
String s = mapper.writeValueAsString(student);
System.out.println(s);
}
}
运行结果:
传递URL中的对象
注意这里的参数一个都不能少,Spring是无法识别出缺失的参数的。
@RequestMapping("r9/{name}/{age}")
public String r9(@PathVariable("name")String userName,@PathVariable Integer age){
return "获取参数:"+userName+" age:"+age;
}
测试:
传递文件
这里的注解@RequestPart可加也可不加。
@RequestMapping("/r11")
public String r11(MultipartFile file){
return file.getOriginalFilename();
}
测试:
获取Cookie
Spring中内置了HttpSeverletRequest和HttpSeverletResponse两个对象(这两个对象包含了Http请求/响应中的所有属性)。因为Cookie一般是在请求中的,所以我们可以通过HttpSeverletRequest来获取到Cookie。
方式1:
@RequestMapping("/getC1")
public String getCookie1(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies != null){
Arrays.stream(cookies).forEach((ck)->{
System.out.println(ck.getName()+":"+ck.getValue());
});
}
return "获取cookie成功";
}
点击这里创建一个Cookie: 输入127.0.0.1后Add Domain即可:
点击这里创建Cookie:
测试:
方式2:
@RequestMapping("/getC2")
public String getCookie2(@CookieValue("xmy") String xmy){
return xmy;
}
测试:
设置Session
方式1:
@RequestMapping("/setSess")
public String setSess(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("name","zhangsan");
return "设置session成功";
}
方式2:
@RequestMapping("/setSess1")
public String setSess1(HttpSession session) {
session.setAttribute("name","zhangsan");
return "设置session成功";
}
获取Session
方式1:
@RequestMapping("/getSess1")
public String getSess1(HttpServletRequest request){
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
return name;
}
测试:
方式2:
@RequestMapping("/getSess2")
public String getSess2(HttpSession session){
String name = (String) session.getAttribute("name");
return name;
}
测试:
方式3:
@RequestMapping("/getSess3")
public String getSess3(@SessionAttribute("name")String name){
return name;
}
获取Header中的元素
这里我们获取的是Header中的User-Agent元素。
方式1:
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String header = request.getHeader("User-Agent");
return header;
}
测试:
方式2:
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent")String header){
return header;
}
测试:
响应
返回静态页面
先在static目录下创建一个HTML文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>我是一个标题</h1>
</body>
</html>
这里我们需要把类上面的@RestController变成@Controller,@Controller是定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理(返回的是视图),而@RestController = @ResponseBody(返回数据)+@Controller,因此RestController返回的是数据。
@Controller
public class ResponseController {
@RequestMapping("/index")
public String index(){
return "/index.html";
}
测试:
注意:因为在这里使用的是@Controller,所以我们后面需要返回数据的内容都要加上@ResponseBody 。
返回数据
@RequestMapping("/index2")
@ResponseBody
public String index2(){
return "返回数据";
}
测试:
返回HTML代码片段
//返回html
@RequestMapping("/index3")
@ResponseBody
public String index3(){
return "<h1>hello springmvc<h1>";
}
测试:
返回Json
//返回json
@RequestMapping("/index4")
@ResponseBody
public HashMap<String,String> index4(){
HashMap<String,String> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
map.put("k4","v4");
return map;
}
测试:
设置状态码
设置状态码需要使用HttpSeverletResponse对象
//设置状态码
@ResponseBody
@RequestMapping("/index5")
public String setStatus(HttpServletResponse response){
response.setStatus(418);
return "设置状态码";
}
测试:
设置返回类型
//设置返回类型
@RequestMapping(value = "return",produces = "applicatin/json")
@ResponseBody
public String returnJson(){
return "{\"success\":true}";
}
测试: