SpringMVC常用注解介绍及参数传递说明

前言

上一篇文章介绍了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的参数传递

日志所需依赖

java 复制代码
<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以及八大数据类型

java 复制代码
 @RequestMapping("/demo01")
    public String index(String bname,Integer bid){
        log.info("基础传参:bname:{},bid:{}",bname,bid);
        return "index";
    }

2.2 复杂类型传参

java 复制代码
   @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注解传参

java 复制代码
@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注解传参

java 复制代码
@RequestMapping("/demo04/{bid}")
    public String demo04(@PathVariable Integer bid){
        log.info("@PathVariable传参:bid:{}",bid);
        return "index";
    }

2.5 @RequestBody注解传参

使用@RequestBody注解传参时,需要先导入pom依赖

java 复制代码
<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>
java 复制代码
@RequestMapping("/demo05")
    public String demo05(@RequestBody Map map){
        log.info("@RequestBody传参:map:{}",map);
        return "index";
    }

注意:要接收json数据,前提要导入Jackson依赖,没有导入Jackson依赖的话进不了这个方法

使用postman或者apipost/eolink等工具发送请求数据。

2.6 @RequestHeader注解传参

java 复制代码
 @RequestMapping("/demo06")
    public String demo06(@RequestHeader("jwt") String jwt){
        log.info("@RequestHeader传参:jwt:{}",jwt);
        return "index";
    }
java 复制代码
 @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为请求处理方法名,而非逻辑视图名。

  • 转发(地址栏不变)
java 复制代码
@RequestMapping("/helloPage1")
    public String toHelloPage1(){
        log.info("helloPage1");
        return "forward:demo02";
    }

它相当于"request.getRequestDispatcher("url").forward(request,response)"。使用转发,既可以转发到jsp, 也可以转发到其他的控制器方法。

  • 重定向(地址栏改变)
java 复制代码
@RequestMapping("/helloPage2")
    public String toHelloPage2(){
        log.info("helloPage2");
        return "redirect:demo02";
    }

它相当于"response.sendRedirect(url)"。需要注意的是,如果重定向到jsp页面,则jsp页面不能写在WEB-INF目录中,否则无法找到。

相关推荐
吾日三省吾码20 分钟前
JVM 性能调优
java
stm 学习ing25 分钟前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc1 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐1 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi772 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe2 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin2 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
少说多做3432 小时前
Android 不同情况下使用 runOnUiThread
android·java