springMvc之常用注解介绍
@requestbody和@requestparam的用法
获取请求参数的方法
get请求:
- 直接获取request 如: public String getHtml(HttpServletRequest request) {}
- 什么也不加,直接在方法中获取参数值 如: public String getHtml(String url, String token) {}
- 利用@RequestParam 如: public User getUserInfo(@RequestParam(value = "url",required = false) String url){}
post请求:
- 直接获取request 如: public String getHtml(HttpServletRequest request) {}
- 使用@RequestBody 可接受的参数 String, Map,JSONObject,或者对应的JavaBean,如: public User getUserInfo(@RequestBody Map<String,String> map){}
- 直接获取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注解。
属性介绍:
- required:表示是否必须,默认为
true,必须 - defaultValue:可设置请求参数的默认值
- 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上。
属性介绍:
- required:表示是否必须,默认为
true,必须
- 区别
- 在GET请求中,不能使用@RequestBody。
- 在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。
- 使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。
@RequestBody和@RequestParam的请求方式get和post关系
@ModelAttribute
@ModelAttribute最主要的作用是将数据添加到模型对象中,用于视图页面展示时使用。@ModelAttribute等价于 model.addAttribute("attributeName", abc); 但是根据@ModelAttribute注释的位置不同,和其他注解组合使用,致使含义有所不同。
@ModelAttribute和@RequestMapping分开修饰方法时,@ModelAttribute会优先于@RequestMapping执行,也就是会在Controller中每个方法执行前被执行,所以当一个Controller中有映射到多个Url时,需要谨慎使用;但是@ModelAttribute和@RequestMapping同事修饰一个方法时和他们单独修改方法时所代表的的意思是不同的,这一点要特别注意。
属性介绍:
- value:类型是为String,代表绑定的属性名称
使用方式:
- 方法返回值为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之常用注解介绍的更多相关文章
- (三)SpringMVC之常用注解
SpringMVC的常用注解 注解 说明 @Controller 用于说明这个类是一个控制器 @RequestMapping 用于注释一个控制器类或者控制器类的方法 @RequestParam 用于将 ...
- SpringBoot | 第六章:常用注解介绍及简单使用
前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志配置等.这章节开始,开始总结一些关于springboot的综合开发的知识点.由于SpringBoot本身是基于Sprin ...
- Spring常用注解介绍【经典总结】
Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式. Spring注解方式减少了配置文件内容 ...
- SpringMVC的常用注解
在SpringMVC中常用的注解主要都是用于Controller上,所以下面的四大不同类型的注解都是根据它们处理的request的不同内容部分来区分的: 处理requ ...
- SG-UAP常用注解介绍
注解基本介绍 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可 ...
- [刘阳Java]_Spring常用注解介绍_第6讲
Spring的注解是在Spring2.5的版本中引入的,目的简化XML配置.在企业开发过程中使用注解的频率非常高,但是学习注解的前提是大家一定要对Spring基于XML配置要熟悉,这是我个人建议,因为 ...
- 【JSON 注解】JSON循环引用1-----Jackson常用注解介绍 eq:@JsonIgnore
循环引用:实体A与实体B有关系,A中有B作为字段,B中有A作为一个字段.查询A对象后,将A对象转化为JSON格式数据时,会因为序列化过程中导致A中有B字段,B字段中又有A,这样就引起了循环引用的问题! ...
- SpringMVC相关常用注解
@Controller: @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象 @RequestMapping: RequestMappin ...
- Spring和SpringMVC的常用注解
Spring的部分: 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包). <context:component-scan base-package=" ...
随机推荐
- git:GitLab代码回滚到特定版本
在当前branch上多次commit代码并且push后,发现不符合要求,需要回滚到特定的版本.步骤如下: 1.查找commitId (1)用命令行打开git项目路径,输入git log命令查看comm ...
- Jmeter(四十二)_控制器下遍历一组参数
概述 在接口自动化的过程中,经常遇到需要遍历的参数组.jmeter在中,foreach控制器可以实现遍历参数,但是只能有一个入参.一旦遇到数组,foreach控制器表示我也无能为力... 为了解决这个 ...
- [C++] namespace命名空间和using用法
命名空间namespace:指标识符的各种可见范围. C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因. 很 ...
- TCP Keepalive笔记
TCP是无感知的虚拟连接,中间断开两端不会立刻得到通知.一般在使用长连接的环境下,需要心跳保活机制可以勉强感知其存活.业务层面有心跳机制,TCP协议也提供了心跳保活机制. 长连接的环境下,人们一般使用 ...
- vue+websocket demo 实例
vue+websocket demo: <!-- vue + websocket连接demo --> <template> <div class="" ...
- 如何在真实串口驱动还未加载的情况下调试uboot?
1. 先找出真实串口是什么型号 1.1 怎么找?笔者提供两种方案: 方案一: 若当前的板子支持dm,从uboot的dts找串口节点对应的compatible属性 方案二: 从linux内核的dts找串 ...
- Nginx 配置 stream SSL 第四层 代理
场景:服务器F针对访问终端需要添加白名单操作,由到终端数量较多,所以用了一台代理服务器 P,在服务F中添加 服务器P IP地址的白名单,所有终端访问服务器P 由于我已经安装过 Nginx 所以只需要添 ...
- 服务器推送(Server push)技术总结
1. 短轮询 ajax按一定间隔去请求 2. 长轮询(long Polling) Long Polling的实现很简单,可分为四个过程: 发起Polling发起Polling很简单,只需向服务器发起请 ...
- [IR] Inverted Index & Boolean retrieval
教材:<信息检索导论> 倒排索引 How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictiona ...
- oracle 应用程序调用存储函数
package com.founder.ec.common.lucene; import java.sql.CallableStatement; import java.sql.Connection; ...