前言
上一篇文章介绍了SpringMVC是什么以及它的工作流程和核心组件,介绍入门示例时,提到了@RequestMapping注解,那么这篇文章就来介绍SpringMVC中更多的常用的注解,以及它的参数传递。
一. SpringMVC常用注解
1.1 @RequestParam
@RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上,可以指定参数名、是否必需、默认值等属性。
参数 | 说明 |
value | 请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。 |
required | 该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。 |
defaultValue | 参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}" |
1.2 @RequestBody
@RequestBody主要用来接收前端传递给后端的json字符串中的数据 (即请求体中的数据)。
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
1.3 @PathVariable
用于将URL中的占位符参数绑定到方法的参数上。
1.4 @RequestHeader
使用 @RequestHeader 注解可以获取指定的请求头信息。
二. SpringMVC的参数传递
日志所需依赖
<log4j2.version>2.9.1</log4j2.version> <log4j2.disruptor.version>3.2.0</log4j2.disruptor.version> <slf4j.version>1.7.13</slf4j.version> <!--4.log日志相关依赖--> <!-- log4j2日志相关依赖 --> <!-- log配置:Log4j2 + Slf4j --> <!-- slf4j核心包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> <scope>runtime</scope> </dependency> <!--核心log4j2jar包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <!--用于与slf4j保持桥接--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j2.version}</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>${log4j2.version}</version> <scope>runtime</scope> </dependency> <!--需要使用log4j2的AsyncLogger需要包含disruptor--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>${log4j2.disruptor.version}</version> </dependency>
2.1 基础类型传参,可以接收String以及八大数据类型
@RequestMapping("/demo01") public String index(String bname,Integer bid){ log.info("基础传参:bname:{},bid:{}",bname,bid); return "index"; }
2.2 复杂类型传参
@RequestMapping("/demo02") public String demo02(Book book, HttpServletRequest request){ // servlet原生参数获取方式 log.info("复杂类型传参:bname:{},bid:{}", request.getParameter("bname"), request.getParameter("bid")); // 复杂类型传参 log.info("复杂类型传参:book:{}", book.toString()); return "index"; }
2.3 @RequestParam注解传参
@RequestMapping("/demo03") public String demo03(@RequestParam String bname, @RequestParam(required = false) Integer bid){ log.info("@RequestParam传参:bname:{},bid:{}",bname,bid); return "index"; }
注意:这里bname的注解没有设置required值,则默认为true,是必填项,否则会报404错误。
2.4 @PathVariable注解传参
@RequestMapping("/demo04/{bid}") public String demo04(@PathVariable Integer bid){ log.info("@PathVariable传参:bid:{}",bid); return "index"; }
2.5 @RequestBody注解传参
使用@RequestBody注解传参时,需要先导入pom依赖
<jackson.version>2.9.3</jackson.version> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency>
@RequestMapping("/demo05") public String demo05(@RequestBody Map map){ log.info("@RequestBody传参:map:{}",map); return "index"; }
注意:要接收json数据,前提要导入Jackson依赖,没有导入Jackson依赖的话进不了这个方法
使用postman或者apipost/eolink等工具发送请求数据。
2.6 @RequestHeader注解传参
@RequestMapping("/demo06") public String demo06(@RequestHeader("jwt") String jwt){ log.info("@RequestHeader传参:jwt:{}",jwt); return "index"; }
@RequestMapping("/demo07") public String demo07(Book book, @RequestBody Map map, @RequestHeader("jwt") String jwt){ log.info("book:book:{}",book.toString()); log.info("@RequestBody:map:{}",map); log.info("@RequestHeader传参:jwt:{}",jwt); return "index"; }
三. 页面跳转
转发(forward:path)和重定向(redirect:path)这两种跳转方式将会绕开视图解析器的前缀和后缀;还有就是如果是在同一controller中,则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。
path为请求处理方法名,而非逻辑视图名。
- 转发(地址栏不变)
@RequestMapping("/helloPage1") public String toHelloPage1(){ log.info("helloPage1"); return "forward:demo02"; }
它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用转发,既可以转发到jsp, 也可以转发到其他的控制器方法。
- 重定向(地址栏改变)
@RequestMapping("/helloPage2") public String toHelloPage2(){ log.info("helloPage2"); return "redirect:demo02"; }
它相当于“response.sendRedirect(url)”。需要注意的是,如果重定向到jsp页面,则jsp页面不能写在WEB-INF目录中,否则无法找到。