@requestbody和@requestparam的用法

  获取请求参数的方法

  get请求:

  1. 直接获取request    如: public String getHtml(HttpServletRequest request) {}
  2. 什么也不加,直接在方法中获取参数值   如: public String getHtml(String url, String token) {}
  3. 利用@RequestParam    如: public User getUserInfo(@RequestParam(value = "url",required = false) String url){}

  post请求:

  1. 直接获取request    如: public String getHtml(HttpServletRequest request) {}
  2. 使用@RequestBody 可接受的参数 String, Map,JSONObject,或者对应的JavaBean,如: public User getUserInfo(@RequestBody Map<String,String> map){}
  3. 直接获取request    如: public String getHtml(HttpServletRequest request) {}
  • @requestparam

  用来处理Content-Type为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)RequestParam可以接受简单类型的属性,也可以接受对象类型。实质是Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

  在Content-Type为application/x-www-form-urlencoded的请求中,get 方式中queryString的值和post方式中 body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到,除此之外delete类型的请求也可以使用@RequestParam注解。

  属性介绍:

  1. required:表示是否必须,默认为 true,必须
  2. defaultValue:可设置请求参数的默认值
  3. value:为接收url的参数名(相当于key值)
  • @requestbody

   处理HttpEntity传递过来的数据,也就是注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用来处理Content-Type不为application/x-www-form-urlencoded编码格式的数据。

  1.GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
  2.POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
  属性介绍:
  1. required:表示是否必须,默认为 true,必须
  • 区别
  1. 在GET请求中,不能使用@RequestBody。
  2. 在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。
  3. 使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。

  @RequestBody和@RequestParam的区别

  @RequestBody和@RequestParam的请求方式get和post关系

@ModelAttribute

  @ModelAttribute最主要的作用是将数据添加到模型对象中,用于视图页面展示时使用。@ModelAttribute等价于 model.addAttribute("attributeName", abc); 但是根据@ModelAttribute注释的位置不同,和其他注解组合使用,致使含义有所不同。

  @ModelAttribute和@RequestMapping分开修饰方法时,@ModelAttribute会优先于@RequestMapping执行,也就是会在Controller中每个方法执行前被执行,所以当一个Controller中有映射到多个Url时,需要谨慎使用;但是@ModelAttribute和@RequestMapping同事修饰一个方法时和他们单独修改方法时所代表的的意思是不同的,这一点要特别注意。

  属性介绍:

  1. value:类型是为String,代表绑定的属性名称

  使用方式:

  1. 方法返回值为void,@ModelAttribute注解没有指定任何属性,这样的话需要将Model或者map传入方法中,如下:key为user1,value为User对象,可以用 ${requestScope.user1.userName} 取出
  @ModelAttribute
//@ModelAttribute 没有指定值,且被修饰的方法返回值为void,则需要借助map或者model将数据模型放入request域
public void getUser(Map<String, Object> map) {
System.out.println("ModelAttribute1..");
map.put("user1", new User("kelin","123aaa"));
}

  2.方法返回值为普通的pojo,@ModelAttribute注解没有指定任何属性,这样的话,request域中存入的对象名字默认为类型首字母小写,如下:key为user(类型首字母小写),value为User对象,可以用 ${requestScope.user.userName} 取出

  注意:当@ModelAttrbute修改方法时,这里是将返回数据user1对象放到model模型中而不是将方法上的参数userName和age放到model模型中返回给页面中使用

  @ModelAttribute
//@ModelAttribute 没有指定值,且被修饰方法有pojo类型的返回值,则request域中 key为返回值类型第一个字母小写的字符串,value为返回值
public User getUser(@RequestParam("userName") String userName,@RequestParam("age") int age) {
    User user1=new User();
    user.setUserName(userName);
    user.setAge(age);
    return user1;
  }

  3.方法返回值为普通的pojo,@ModelAttribute注解指定了value属性,这样的话,request域中就放入了一个对象,如下:key为user2,value为User对象,可以用 ${requestScope.user2.userName} 取出

  @ModelAttribute("user2")
//@ModelAttribute 的值就是request域中的key,被该注解修饰的方法的返回值为对应的value
public User getUser() {
System.out.println("ModelAttribute3..");
return new User("kelin","123aaa");
}

  4.@ModelAttribute 修饰方法参数(最常用),参数直接封装到对象中,比如常用的 pageNo,pageSize..,

  注意:这里@ModelAttribute修饰的是方法上的参数,这里是直接将user参数放到了model模型中返回到页面中使用,而return的字符窜“modelAttribute”其实就是视图文件名

  /*
* @ModelAttribute用于修饰入参,前台传过来的值自动赋予入参对于的属性
*/
@RequestMapping("/testModelAttribute5")
public String testModelAttribute(@ModelAttribute User user) {
return "modelAttribute";
}

  5.两个注解同时修饰方法,看注释解释,有点不一样,返回的东西不是视图,而是request域中的值,返回的视图变成了 @RequestMapping中指定的value

  /*
* @ModelAttribute 和 @RequestMapping 同时修饰一个方法
*
* @ModelAttribute 中value为 request域中的key,被修饰的方法返回值为request域中的value
* @RequestMapping 中value为 返回的视图名,此例中相当于定向到xxx/testModelAttribute4.jsp
*/ @ModelAttribute(value="user")
@RequestMapping(value="/testModelAttribute4")
public User testModelAttribute() {
return new User("kelin","123aaa");
}

  6.@ModelAttribute注释一个方法的返回值,

  大家可以看到返回值类型是对象类型,而且通过 @ModelAttribute("user2") 注解,此时会添加返回值到模型数据( 名字为user2 ) 中供视图展示使用@ModelAttribute  注解的返回值会覆盖 @RequestMapping  注解方法中的 @ModelAttribute  注解的同名命令对象

 @Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
public @ModelAttribute("user2") User helloWorld(@ModelAttribute User user) {
return new User();
}
}

以上都是针对一个controller类中只有一个被@ModelAttribute修改的方法,如果一个controller中除了有@ModelAttribute修饰的方法还有被@RequestMapping修饰的方法有事如何工作的?

我们知道在一个controller中当我们调用任何一个被@RequestMapping修饰的方法时都会先执行被@ModelAttribute修饰的方法

1.

@Controller
public class ModelAttributeController{
@ModelAttribute("loginname")
public String userModelfirst(@ResquestParam("loginname") String loginname){
    //返回的参数赋值给value变量
return loginname;
}
@RequestMapping(vaule="/loginfirst")
public String loginfirst(){
    //返回到结果界面
return "resultfirst";
  }
}

  这里注解@ModelAttribute注解默认vaule值为“loginname”,指定model的属性名称,属性的值就是@ModelAttribute注解的方法的返回值。他把请求参数loginname的值通过@ResquestParam赋值给变量loginname,然后再设置一个名为loginname的属性到Model中,属性值就是userModelfirst方法的返回值。

  因为@ModelAttribute优先于@RequestMapping执行,所以当访问URL“/loginfirst”时会先执行@ModelAttribute注解的方法,在resultfirst.jsp中用EL表达式得到${resquestScope.loginname}获取。

上面的这种写法和下面这种写法是等价的

@Controller
public class ModelAttributeController{
@ModelAttribute
public void userModelsecond(@ResquestParam("loginname") String loginname,Model model){
model.addAttribute("loginname",loginname);
}
@RequestMapping(vaule="/loginsecond")
public String loginsecond(){
     //返回到结果界面
  return "resultsecond";
  }
}

2.

@Controller
@RequestMapping("/modelAttributeController")
public class ModelAttributeController{
@ModelAttribute("user")
public String userModelfourth(@ResquestParam("loginname") String loginname){
User user1 = new User();
user1.setLoginame(loginname);
return user1;
}
@RequestMapping(vaule="/loginfourth")
public String loginfourth( @ModelAttribute("user") User user){
//返回到结果界面
  user.setUsername("test");
  return "resultfourth";
  }
}

  当我们请求localhost:8080/modelAttributeController/loginfourth?loginname=lisi时,会先执行userModelfourth方法,同时会把lisi赋值给此方法的loginname参数,然后生成一个user对象,并且在model中会有一个key为user,value为user1的数据,然后才会执行loginfourth方法,同时将model中key为user的数据复制给loginfourth方法中user参数,然后在resultfourth.jsp的页面上可以通过${resquestScope.user.username}来获取相应的数据

 

springMvc之常用注解介绍的更多相关文章

  1. (三)SpringMVC之常用注解

    SpringMVC的常用注解 注解 说明 @Controller 用于说明这个类是一个控制器 @RequestMapping 用于注释一个控制器类或者控制器类的方法 @RequestParam 用于将 ...

  2. SpringBoot | 第六章:常用注解介绍及简单使用

    前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志配置等.这章节开始,开始总结一些关于springboot的综合开发的知识点.由于SpringBoot本身是基于Sprin ...

  3. Spring常用注解介绍【经典总结】

    Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式. Spring注解方式减少了配置文件内容 ...

  4. SpringMVC的常用注解

             在SpringMVC中常用的注解主要都是用于Controller上,所以下面的四大不同类型的注解都是根据它们处理的request的不同内容部分来区分的:         处理requ ...

  5. SG-UAP常用注解介绍

    注解基本介绍 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可 ...

  6. [刘阳Java]_Spring常用注解介绍_第6讲

    Spring的注解是在Spring2.5的版本中引入的,目的简化XML配置.在企业开发过程中使用注解的频率非常高,但是学习注解的前提是大家一定要对Spring基于XML配置要熟悉,这是我个人建议,因为 ...

  7. 【JSON 注解】JSON循环引用1-----Jackson常用注解介绍 eq:@JsonIgnore

    循环引用:实体A与实体B有关系,A中有B作为字段,B中有A作为一个字段.查询A对象后,将A对象转化为JSON格式数据时,会因为序列化过程中导致A中有B字段,B字段中又有A,这样就引起了循环引用的问题! ...

  8. SpringMVC相关常用注解

    @Controller: @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象 @RequestMapping: RequestMappin ...

  9. Spring和SpringMVC的常用注解

    Spring的部分: 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包). <context:component-scan base-package=" ...

随机推荐

  1. Uncaught ReferenceError: Invalid left-hand side in assignment

    Uncaught ReferenceError: Invalid left-hand side in assignment 今天在对个人资料页面增加当浏览别的页面之后第二次访问当前页面,之前填写的内容 ...

  2. Android中LayoutInflater()方法

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  3. deepin深度学习环境配置

    deepin是一个精致优美的系统.最近因为工作需要在deepin上配置深度学习环境,话不多说,接下来记录下整个的配置过程. ×××本篇文章适合对深度学习环境配置有一定了解且对deepin系统感兴趣的同 ...

  4. SpringBoot过滤XSS脚本攻击

    XSS攻击是什么 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安 ...

  5. 《精通CSS第3版》(5)漂亮的盒子

  6. 改进初学者的PID-正反作用

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  7. [LeetCode] 249. Group Shifted Strings 分组偏移字符串

    Given a string, we can "shift" each of its letter to its successive letter, for example: & ...

  8. [LeetCode] 567. Permutation in String 字符串中的全排列

    Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. I ...

  9. [LeetCode] 636. Exclusive Time of Functions 函数的独家时间

    Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...

  10. test String.split

    test "map.mergd" do s = :crypto.strong_rand_bytes() # <<, , , , , >> # = >& ...