zoukankan      html  css  js  c++  java
  • @RequestParam,@PathVariable,@ResponseBody,@RequestBody,@ModelAttribute学习

    1、@RequestParam使用于参数上,用于将请求参数映射到指定参数变量上

    例如:

    1 @RequestMapping(value="/hello",method=RequestMethod.GET)
    2 
    3 public String testPara(@RequestParam String str){
    4 
    5 System.out.println(str);
    6 
    7 return "hello";
    8 
    9 }

    当我们访问 http://localhost:8080/springMVC/hello?str=xx 的时候,会将xx注入到testParam方法中的str中,你会看到输出xx

    当然此时你在浏览器的参数名称必须跟testPara中的参数一样即必须都为str,假如你想使用不同的参数名称,就必须在@RequestParam(" anothername") str 指定

    参数名,这样当你访问 http://localhost:8080/springMVC/hello?anothername=xx ,就会将xx注入到str中了。springMVC中默认就是开启 @RequestParam功能的,

    你直接访问http://localhost:8080/springMVC/hello?str=xx在程序中不写@RequestParam,还是会注入到str参数中。当然我们最好还是写一下,有助于理解和利于

    代码的阅读 

    2、@PathVariable与@RequestParam类似,但是它是用于rest风格 访问时候获取参数的方式,使用这个注解前提是在@RequestMapping中必须指定模板,不然

    访问可能出现400,服务器不懂你要干嘛。例如下面的例子:

     1 public String testPath(@PathVariable String para)
     2 
     3 @RequestMapping(value="/hello/{para}",method=RequestMethod.GET) //在reqestMapping指定了模板{para}
     4 
     5 public String testPath(@PathVariable String para){  //参数名字一定要跟模板的名字一样,如果不想跟模板一样,可以写成这样@PathVariable("para")String other
     6 
     7 System.out.println(para);
     8 
     9 return "hello";
    10 
    11 }

    访问:http://localhost:8080/springMv/spring/hello/anty    控制台输出参数anty 

    3、 @responsebody表示该方法的返回结果直接写入HTTP response body中
    一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中响应给客户端。比如异步获取json数据,加上@responsebody后,会直接返回json数据。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

    例如以下代码:

    服务器端:

     1 @RequestMapping(value="/ajaxRequest")
     2 
     3 @ResponseBody
     4 
     5 public String ajax(String str){
     6 
     7 str="sb";
     8 
     9 return str;
    10 
    11 }

     客户端代码:

             $.ajax({

               type:"POST",

                async : false,

                url:"spring/ajaxRequest",

                success:function(data){

                alert(data);               

                } 

    });

    点击页面按钮访问服务器,弹出sb 

    4、@RequestBody

    作用: 

          i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

          ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

    使用时机:

    A) GET、POST方式提时, 根据request header Content-Type的值来判断:

    ·     application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);

    ·     multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);

    ·     其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

    B) PUT方式提交时, 根据request header Content-Type的值来判断:

    ·     application/x-www-form-urlencoded, 必须;

    ·     multipart/form-data, 不能处理;

    ·     其他格式, 必须;

    说明:request的body部分的数据编码格式由header部分的Content-Type指定;m 

    requestbody可以直接将客户端发来的ajax请求的json对象注入到服务端的对象中,但是json对象的字段必须跟后台对象的字段对应,

    例如 var user{"username":"tom"} 后台的User对象必须要有username 这个字段。既然是使用异步,那么requestBody很多时候是跟responseBody搭配着一起使用!!例如下列代码:

    //@RequestMapping(value="/ajaxRequest")

    //@ResponseBody

    //public String ajax(@RequestBody User user){

    //System.out.println(user.getUsername());

    //return user.getUsername();

    //}

    客户端代码:

      var m = { 

                    "username":'fuckyou'

                };

            $.ajax({

                type:"POST",

                async : false,

                url:"spring/ajaxRequest",

                dataType:"json",

                contentType:"application/json; charset=utf-8",//一定要加这一句发送内容为json

                data:JSON.stringify(m),//requestbody接收的是json字符串,所以得将json对象进行转换否则报415错误类型无法识别

                success:function(data){

                    alert("return map success!");               

                }

    });

    在客户端发起请求,服务器控制台输出fuckyou,表示username字段注入到user对象 

    5、@ModelAttribute    一种是放在方法上面,一种是放在参数上面(比较常用的是放在参数前面)

    放在方法上面:

     1     @ModelAttribute
     2     public User User(User userd){
     3         userd.setUsername("fuckg");
     4         return userd;
     5         
     6     }    
     7     @RequestMapping(value="/hello",method=RequestMethod.GET)
     8     public String testPara(User u){
     9         System.out.println(u.getUsername());
    10         return "hello";
    11     }

    在到达所有requestMapping之前 会被modelAttribute拦截,在客户端提交表单 会将对应 的属性 注入到Userd 对象中,然后springMVC默认会将usrerd对象 放入视图中,以便访问, 我们可以在hello页面 使用{user.username} 访问,

    这里要注意的是 不管参数是写成userd还是写成users,都只能通过user.username访问到,spring是按照该对象类型 的小写来访问,User类对象,所以在页面就通过user访问属性。 

    第二种是将注解放到参数前:

    1 @RequestMapping("/modd") //默认使用modelAttribute,如果去掉效果还是一样
    2     public String testModelAttr(@ModelAttribute User userqqq){
    3         System.out.println(userqqq.getUsername());
    4         return "md";
    5         
    6     }
     

    这里也是表单提交过来的参数 会注入到user 对象的对应属性上(这里表单提交过来的数据,不能使用@RequestBody替换ModelAttribute,requestBody常用在异步提交json数据,在这换成requestBody的话会报415错误),然后spring 也会把该对象放入视图中,在md.jsp页面,就可以通过${user.username}访问,当然这里也是一样 

    不管参数写成什么样,还是按照该类型的小写字母来访问,所以不是按userqqq来访问,直接按照User-->小写user访问。

    尝试了一下去除ModelAttribute的效果,发现还是可用,说明,是spring 默认开启了参数前 的ModelAttribute注解,不过要用的时候还是写出来 利于代码阅读 

    @requestBody 和@ModelAttribute 都可以用来绑定请求数据到参数上,在我的理解范围内:requestBody主要是将异步请求ajax,json字符串绑定到对象上,requestBody

    只接受json字符串,所以记得使用JSON.stringif方法将json对象转成字符串,  而ModelAttribute主要接收来自表单或者url?para参数,将参数绑定到对象上。

    转自:https://blog.csdn.net/zz210891470/article/details/59719251

  • 相关阅读:
    spring AOP概述和简单应用
    log4j输出指定功能的log配置方式区别
    java项目配置常见问题
    android 浮动按钮的伸缩效果
    Android之探究viewGroup自定义子属性参数的获取流程
    javaWeb之maven多数据库环境的配置信息
    mybatis generator配置生成代码的问题
    java之初识服务器跨域获取数据
    java之Maven配置和springMvc的简单应用
    UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5
  • 原文地址:https://www.cnblogs.com/yixiu868/p/8724882.html
Copyright © 2011-2022 走看看