SpringMVC-参数绑定

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SpringMVC-参数绑定

接收数据-参数绑定

Method Arguments概观

下表显示支持的控制器方法参数。 任何参数都不支持反应类型。特殊形式的参数使用注解为前提进行说明

Controller method   argumentDescription|------

以上是SpringMVC方法参数可以自动注入的对象类型:


比如:
@GetMapper("test)
public void test(HttpSession   session){
    session.setAttrubute("test",test");
}

-  Model/ModelMap/ModelAndView

ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据,如下


@RequestMapping("/itemEdit")
    public String itemEdit(Integer id, Model model) {
        Items items = itemService.getItemById(id);
        //向jsp传递数据
        model.addAttribute("item", items);
        //设置跳转的jsp页面
        return "editItem";
    }
    /*@RequestMapping("/itemEdit")
    public String editItem(HttpServletRequest request, 
            HttpServletResponse response, HttpSession session, Model model) {
        //从request中取参数
        String strId = request.getParameter("id");
        int id = new Integer(strId);
        //调用服务
        Items items = itemService.getItemById(id);
        //把结果传递给页面
        //ModelAndView modelAndView = new ModelAndView();
        //modelAndView.addObject("item", items);
        //设置逻辑视图
        //modelAndView.setViewName("editItem");
        //return modelAndView;
        //设置返回结果
        model.addAttribute("item", items);
        //返回逻辑视图
        return "editItem";
    }
    */

-  Any other argument原始参数

当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。从Request取参数的方法可以进一步简化。


  @RequestMapping("/itemEdit")
      public String itemEdit(Integer id, Model model) {
          Items items = itemService.getItemById(id);
          //向jsp传递数据
          model.addAttribute("item", items);
          //设置跳转的jsp页面
          return "editItem";
      }
  参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
  整形:Integer、int
  字符串:String
  单精度:Float、float
  双精度:Double、double
  布尔型:Boolean、boolean
  说明:对于布尔类型的参数,请求的参数值为truefalse。
  处理方法:
  public String editItem(Model model,Integer id,Boolean status) throws Exception
  请求url:
  http://localhost:8080/xxx.action?id=2&status=false
  处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。 

其它的自行查看上面的表,你们自己去例子演示吧

注解形式:

下面是具体使用说明,几乎都是下面这种格式:Public String (@RequestParam int id){..}

  • @RequestParam

    @RequestParam用来接收路径后面的参数 http:www.lifeibai.com?petId = 1. 一般用来处理接收的参数和形参的参数不一致的情况
    @RequestParam(value = "id",defaultValue = "10",required = false)
    defaultValue 表示设置默认值,
    required 铜过boolean设置是否是必须要传入的参数,
    value 值表示接受的传入的参数类型
    使用@RequestParam常用于处理简单类型的绑定。
    
    例子:
    @Controller
    @RequestMapping("/pets")
    public class EditPetForm {
      // ...
      @GetMapping
      public String setupForm(@RequestParam("petId") int Id, Model model) {
          Pet pet = this.clinic.loadPet(petId);
          model.addAttribute("pet", pet);
          return "petForm";
      }
      // ...
    }
    
  • @RequestHeader

    @RequestHeader用来接收指定参数的请求头信息
    @GetMapping("/demo")
    public void handle(
          @RequestHeader("Accept-Encoding") String encoding,
          @RequestHeader("Keep-Alive") long keepAlive) {
      //...
    }
    
  • @CookieValue

    用来接收指定名称的cookie的值
    public void handle(@CookieValue("JSESSIONID") String cookie) {
      //...
    }
    
  • @ModelAttribute

    ModelAttribute可以应用在方法参数上或方法上,他的作用主要是当注解在方法参数上时会将注解的参数对象添加到Model中; 当注解在请求处理方法Action上时会将该方法变成一个非请求处理的方法,但其它Action被调用时会首先调用该方法。 `被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,下面访问http:localhost:8080/test_project/test.action`
  • 例子:

    
    @Controller
    @RequestMapping("/pets")
    public class EditPetForm {
      // ...
      @GetMapping
      public String setupForm(@RequestParam("petId") int Id, Model model) {
          Pet pet = this.clinic.loadPet(petId);
          model.addAttribute("pet", pet);
          return "petForm";
      }
      // ...
    }
    

    @RequestHeader

    用来接收指定名称的cookie的值

    
    public void handle(@CookieValue("JSESSIONID") String cookie) {
      //...
    }
    

    @ModelAttribute

    当注解在请求处理方法Action上时会将该方法变成一个非请求处理的方法,但其它Action被调用时会首先调用该方法。

    
      @RestController
      @SessionAttributes("user")
      public class TestController {
          @ModelAttribute("age2")
          public String mdoeltest1(){
              System.out.println("This is ModelAttribute1 !");
              return "33";
          }
          @ModelAttribute("age1")
          public String mdoeltestrrr(){
              System.out.println("This is ModelAttributee1 !");
              return "22";
          }
          @RequestMapping("/test.action")
          public String test(User user , 
                             @ModelAttribute("age1") String age1 ,
                             @ModelAttribute("age2") String age2 ,
                             HttpSession session){
              Object user2 = session.getAttribute("user");
              System.out.println(user2);
              System.out.println(user);
              System.out.println("age1:"+age1);
              System.out.println("age2:"+age2);
              return "test";
          }
      }
      结果:
      This is ModelAttributee1 !
      This is ModelAttribute1 !
      User{name='李四', age=22}
      User{name='李四', age=22}
      age1:22
      age2:33
    
  • @SessionAttributes

    Value={“name”,“age”} 取出name或者value、或者把model中的name,age扔到session中
    Type=User。Class   将一个实体类扔到session中
    这个玩意加在 类上面,然后所有的方法的参数都可以在sesssion中找,找到了就赋值。
    @SessionAttributes需要清除时,使用SessionStatus.setComplete();来清除。
    
    **1、**  **将model中的值,扔到session中**
    @Controller
    @SessionAttributes(types = User.class)
    public class LoginController {
      @RequestMapping("/login")
      public String login(HttpServletRequest req,Model model,SessionStatus status){
          User user = new User();
          user.setName("李四");
          user.setAge(22);
          model.addAttribute("user" , user);
          return "forward:test.action";
      }
    }
    
    **2、**  **从session取出来**
    @RestController
    @SessionAttributes("user")
    public class TestController {
      @RequestMapping("/test.action")
      public String  test(User user, HttpSession session){
          Object user2 = session.getAttribute("user");
          System.out.println(user2);
          System.out.println(user);
          return "test";
      }
    }
    具体大家自行写案例演示。
    
  • @SessionAttribute 这玩意是加在方法上的参数的,将session中的数据赋值给参数 。但是4.3以后的版本才支持
    @RequestMapping("/")
    public String handle(@SessionAttribute User user) {
        // ...
    }
    
  • @RequestBody

    @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上
    List.action?id=1&name=zhangsan&age=12
    本例子应用:
    @RequestBody注解实现接收http请求的json数据,将json数据转换为java对象
    // 商品修改提交json信息,响应json信息
      @RequestMapping("/editItemSubmit_RequestJson")
      public @ResponseBody Items editItemSubmit_RequestJson(@RequestBody Items items) throws Exception {
          System.out.println(items);
          //itemService.saveItem(items);
          return items;
      }
    
  • @ResponseBody

    该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端 @ResponseBody注解实现将controller方法返回对象转换为json响应给客户端 **使用这个注解 ,sessionAttributes注解将会失效**
  • @PathVariable(RESTful)

    用法
          @RequestMapping(value="/users/{userId}/topics/{topicId}")
    public String test(
         @PathVariable(value="userId") int userId, 
         @PathVariable(value="topicId") int topicId) 
           如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。
    
  • 
    @Controller
    @SessionAttributes(types = User.class)
    public class LoginController {
      @RequestMapping("/login")
      public String login(HttpServletRequest req,Model model,SessionStatus status){
          User user = new User();
          user.setName("李四");
          user.setAge(22);
          model.addAttribute("user" , user);
          return "forward:test.action";
      }
    }
    

    2、  从session取出来

    这玩意是加在方法上的参数的,将session中的数据赋值给参数 。但是4.3以后的版本才支持

    
    @RequestMapping("/")
    public String handle(@SessionAttribute User user) {
        // ...
    }
    

    @RequestBody

    该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

    使用这个注解 ,sessionAttributes注解将会失效

    @PathVariable(RESTful)

    
    用法
          @RequestMapping(value="/users/{userId}/topics/{topicId}")
    public String test(
         @PathVariable(value="userId") int userId, 
         @PathVariable(value="topicId") int topicId) 
           如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456

    上面是初级的参数绑定,来看看高级的绑定:

  • 自定义参数绑定,类型转换
  • 如果你看了配置文件和注解部分的文章,没有的回去看一下,我这里不写具体步骤,因为已经写过了。

    类型转换分别:全局类型转换和@InitBinder-局部转换器

  • 对于数组和集合的做法是:把属性封装到一个实体类中。 就是把数组或者结合写到集合中。 private User[] users;
  • ok,关于SpirngMVC参数的接收讲到这里就结束了,下面是handler的返回值类型,返回值是配置数据传递,转发重定向的一个玩意。

    文章如有错误,请您一定指出,感谢之至!
    如果你有不同的见解,欢迎留言,或者加我QQ986320270
    图片可能来源于网络,如有侵权请告知。
    最后:关注一下呗

    如果你有不同的见解,欢迎留言,或者加我QQ986320270

    最后:关注一下呗

    长按二维码识别关注

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> SpringMVC-参数绑定


      转载请注明: 好好学java SpringMVC-参数绑定

     上一篇
    SpringMVC-Return Values返回值 SpringMVC-Return Values返回值
    Handler-Return Values返回值支持的返回值类型: Controller method   return valueDescription|------ 返回ModelAndView/Model controller方法
    2021-04-05
    下一篇 
    SpringMVC注解 SpringMVC注解
    SpringMVC注解注解概观来自知乎作者:一七三点八 Spring2.5引入注解式处理器 @Controller:用于标识是处理器类; @RequestMapping:请求到处理器功能方法的映射规则; @RequestParam:请求参数
    2021-04-05