SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端
程序员文章站
2022-04-02 17:47:06
...
文章目录
RestFul
- RestFul就是资源定位一级资源操作的一种风格, 不是标准也不是协议,基于这个风格使软件设计更加简便,更有层次,更易于实现缓存等机制
- 功能
传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
接受数据
- 在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。
@Controller
public class RestFulController {
@RequestMapping(value = "/r1/{n1}/{n2}")
public String test1(@PathVariable int n1, @PathVariable int n2, Model model) {
int result = n1 + n2;
model.addAttribute("msg", "结果为:" + result);
return "test";
}
}
- 小结
- 使路径变得更加简洁;
- 获得参数更加方便,框架会自动进行类型转换。
-
通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/r1/1/a,则路径与方法不匹配,而不会是参数转换失败。
- 我们来修改下对应的参数类型,再次测试
@RequestMapping(value = "/r1/{n1}/{n2}")
public String test1(@PathVariable int n1, @PathVariable String n2, Model model) {
String result = n1 + n2;
model.addAttribute("msg", "结果为:" + result);
return "test";
}
使用method属性指定请求类型
- 用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
- 我们现在设置只能使用POST请求才能访问
@RequestMapping(value = "/r1/{n1}/{n2}", method = {RequestMethod.POST})
public String test1(@PathVariable int n1, @PathVariable String n2, Model model) {
String result = n1 + n2;
model.addAttribute("msg", "结果为:" + result);
return "test";
}
- 那么我们用浏览器默认的get请求就会找不多路径
- 小结:
Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。
所有的地址栏请求默认都会是 HTTP GET 类型的。
方法级别的注解变体有如下几个:组合注解, 平时使用的会比较多!
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
- 这个风格三大好处就是简便高效支持缓存还安全
SpringMVC接收数据
提交的域名称和处理方法的参数名一致
- url中的域名会和方法中的参数名进行一个匹配
- 比如我的url为http://localhost:8080/04_1_war_exploded/r2?name=listen
- 处理代码
@RequestMapping(value = "/r2")
public String test2(String name, Model model) {
model.addAttribute("msg", "结果为:" + name);
return "test";
}
提交的域名称和处理方法的参数名一致
- 使用@RequestParam(“username”) : username提交的域的名称 .进行一个关系的建立
@RequestMapping(value = "/r2")
public String test2(@RequestParam(value = "username") String name, Model model) {
model.addAttribute("msg", "结果为:" + name);
return "test";
}
提交的是一个对象
- 后端接收是对象的时候,直接按照对象接收就行
- 接收前端用户提交的参数, 判断参数名字,假设名字直接在方法上,可以直接使用
- 假设传递的是对象user,会匹配user的字段名,如果名字上有一致则ok,否则不匹配,所以传递对象的时候,前端传递的参数名和对象的属性名必须一致, 否则这个对象的属性名就为null
public class User {
private String name;
private int age;
private String hobby;
}
@RequestMapping(value = "/r3")
public String test3(User user, Model model) {
model.addAttribute("msg", "结果为:" + user.toString());
return "test";
}
- 结果可以看出, POJO对象的hobby与hhhbupip, 所以获得的user对象的对应属性就是null
数据显示到前端
第一种 : 通过ModelAndView
- 这是一种最原始的一种实现mvc流程的用法, 通过设置viewName和视图解析器来找对对应的前端显示对应数据
@RequestMapping(value = "/r5")
public ModelAndView test45(ModelAndView modelAndView) {
modelAndView.addObject("msg", "我是 ModelAndView");
modelAndView.setViewName("test");
return modelAndView;
}
第二种 : 通过ModelMap
- 这个和model类似, 但是功能更加强大, 其继承了LinkdeMap所以具有LinkedMap的所有功能
@RequestMapping(value = "/r4")
public String test4(ModelMap modelMap) {
modelMap.addAttribute("msg", "我是 modelMap");
return "test";
}
第三种 : 通过Model
- 这是最普通的,也是我们最常用的, 也是最简便的
@RequestMapping(value = "/r3")
public String test3(User user, Model model) {
model.addAttribute("msg", "结果为:" + user.toString());
return "test";
}
对比三个
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。