欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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";
    }
}

SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端

  • 小结
  1. 使路径变得更加简洁;
  2. 获得参数更加方便,框架会自动进行类型转换。
  3. 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/r1/1/a,则路径与方法不匹配,而不会是参数转换失败。
    SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端
  • 我们来修改下对应的参数类型,再次测试
    @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";
    }

SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端

使用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请求就会找不多路径
    SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端
  • 小结:

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";
    }

SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端

提交的域名称和处理方法的参数名一致

  • 使用@RequestParam(“username”) : username提交的域的名称 .进行一个关系的建立
    @RequestMapping(value = "/r2")
    public String test2(@RequestParam(value = "username") String name, Model model) {
        model.addAttribute("msg", "结果为:" + name);
        return "test";
    }

SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端

提交的是一个对象

  • 后端接收是对象的时候,直接按照对象接收就行
  1. 接收前端用户提交的参数, 判断参数名字,假设名字直接在方法上,可以直接使用
  2. 假设传递的是对象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";
    }

SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端

  • 结果可以看出, 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;
    }

SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端

第二种 : 通过ModelMap

  • 这个和model类似, 但是功能更加强大, 其继承了LinkdeMap所以具有LinkedMap的所有功能
    SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端
    @RequestMapping(value = "/r4")
    public String test4(ModelMap modelMap) {
        modelMap.addAttribute("msg", "我是 modelMap");
        return "test";
    }

SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端

第三种 : 通过Model

  • 这是最普通的,也是我们最常用的, 也是最简便的
    @RequestMapping(value = "/r3")
    public String test3(User user, Model model) {
        model.addAttribute("msg", "结果为:" + user.toString());
        return "test";
    }

对比三个

Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。