@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. Android中如何动态添加碎片

    Android中的开发需要兼容手机和平板,两个方面.这就引入了碎片的概念.(注意:这里用的Fragment强烈建议使用support-v4库中的Fragment) 碎片:是一种可以嵌入在活动当中的UI ...

  2. Spring Boot YML 掀翻 Properties!!

    .properties 配置文件大家应该都很熟悉,键值对嘛,.yml 配置文件栈长也是从 Spring Boot 开始了解到的. 那么,这两种格式的配置文件到底有哪些区别呢?哪个更好?能不能替换代替? ...

  3. Java使用Jsoup之爬取博客数据应用实例

    导入Maven依赖 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <g ...

  4. @Conditional 和 @ConditionalOnProperty

    @ConditionalOnProperty https://blog.csdn.net/dalangzhonghangxing/article/details/78420057 @Condition ...

  5. PhpStorm 头部注释、类注释和函数注释的设置(稍微完善点)

    首先,PhpStorm中文件.类.函数等注释的设置在:setting->Editor->FIle and Code Template->Includes下设置即可,其中方法的默认是这 ...

  6. PHP系列 | Session 存储在Redis

    默认是文件存储 修改php.ini的设置 session.save_handler = redis session.save_path = “tcp://127.0.0.1:6379″ 如果Redis ...

  7. spring boot jar包替换报错之Unable to open nested entry 'BOOT-INF/lib/cache-api-0.4.jar'.

    spring boot用layout ZIP打出来的包能够支持外部classpath,但是当用rar/7zip替换其中的jar后,报下列错误: Unable to open nested entry ...

  8. jq select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性

    select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性 $("#IsRecommend").change(function ...

  9. iostat vmstat

    iostat https://linux.die.net/man/1/iostat https://www.geeksforgeeks.org/iostat-command-in-linux-with ...

  10. 011-数据结构-树形结构-B+树[mysql应用]、B*树

    一.B+树概述 B+树是B树的变种,有着比B树更高的查询效率. 一棵 B+ 树需要满足以下条件: 节点的子树数和关键字数相同(B 树是关键字数比子树数少一) 节点的关键字表示的是子树中的最大数,在子树 ...