Spring MVC入门必读:注解、参数传递、返回值和页面跳转(上)

简介: Spring MVC入门必读:注解、参数传递、返回值和页面跳转(上)

一、常用注解


1.1.@RequestMapping

作用:用于映射请求路径与处理请求的方法之间的关系,可以用在类或方法上 。

  • 标注在方法上

用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法

@Controller
public class HelloController {
    @RequestMapping("/requestTest")
    public String requestTest(){
        return "success";
    }
}


此时请求映射的请求路径为:

http://localhost:8080/springmvc01/requestTest

springmvc01表示项目名

标注在类和方法上

用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。


注意:当你在类上添加RequestMapping注解后,如果要请求映射,就意味着请求要先映射到标注类的位置,然后再映射到该类的方法上

@Controller
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping("/requestTest")
    public String requestTest(){
        return "success";
    }
}


此时请求映射的请求路径为:

http://localhost:8080/springmvc01/hello/requestTest

springmvc01表示项目名

参数  

value  

@RequestMapping 的 value 属性必须设值; @RequestMapping 的 value 属性是通过当前请求的请求地址来匹配请求; 从源码中可以看到value属性是一个字符串类型的数组,因此说明可以将多个请求映射到一个方法上,只需要给 value 来指定一个包含多个路径的数组。


method

  @RequestMapping的method属性是通过当前请求的请求方式来匹配请求; 浏览器向服务器发送请求,请求方式有很多GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。可以使用 method 属性来约束请求方式。


headers  

@RequestMapping的headers属性是通过当前请求的请求头信息来匹配请求; @RequestMapping的headers属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系 例如: “header”:要求请求映射的请求必须为包含 header的请求头信息 “!header”:要求请求映射的请求必须为不包含 header的请求头信息 “header=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须为value “header!=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须不是value


params

  @RequestMapping的params属性是通过当前请求的请求参数来匹配请求; @RequestMapping的params属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系 例如: “param”:要求请求映射的请求必须为包含 param的请求参数 “!param”:要求请求映射的请求是不能包含param的请求参数 “param=value”:要求请求映射的请求必须包含 param 的请求参数,且 param 参数的值必须为 value “param!=value”: 要求请求映射的请求是必须包含 param 的请求参数,其值不能为 value。


示例一:@RequestMapping的params属性

@RequestMapping(value = "/test",params = "username")
public String test(){
    return "success";
}


注意:我们设置了params属性,就意味着该请求映射的请求必须包含username才能够请求成功。

示例二:@RequestMapping的headers属性

@RequestMapping(value = "/test",headers = "Host = localhost:8081")
public String test(){
    return "success";
}


注意:如果当前请求不满足headers属性,此时页面就会显示404错误,即资源未找

  • @GetMapping:处理get方式请求的映射
  • @PostMapping:处理post方式请求的映射
  • @PutMapping:处理put方式请求的映射
  • @DeleteMapping:处理delete方式请求的映射
  • @GetMapping就相当于@RequestMapping(method=RequestMethod.GET),它会将get映射到特定的方法上。


1.2.@RequestParam

作用:用于获取请求参数的值,并将其绑定到方法的参数上。

参数    说明

  • value  

请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。

  • required

 该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。

  • defaultValue  

参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}"

@RequestMapping("/queryBooks")
public List<Book> queryBooks(
    @RequestParam(required = false,defaultValue = "0",value="page") int page,
    @RequestParam(required = false,defaultValue = "10",value = "rows") int rows){
        return bookService.queryBooks(page,rows);
}

1.3.@RequestBody

作用:用于将请求体中的JSON数据绑定到方法的参数上。

GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

总结来说就是

  • 一个请求:只有一个@RequestBody;
  • 一个请求:可以有多个@RequestParam。
@RequestMapping("/hello")
public String toHello1(@RequestBody Book book){
    log.info(">>>> 使用@RequestBody传递JSON格式的参数:{}", JSON.toJSONString(book));
    return "index";
}


@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。


1.4.@RequestHeader

作用:用于获取请求头中指定的参数值。

如果想要获取所有的请求头信息,可以使用 Map<String,String>、MultiValueMap<String,String>、HttpHeaders 这三个 Map 中的任何一个封装所有请求头的 name 和 value。

参数

  • name  

name 和 value 互为别名,当只有一个参数时,可以省略 value,直接("xxx") 就可以了

  • value  

name 和 value 互为别名,当只有一个参数时,可以省略 value,直接("xxx") 就可以了

  • required  

默认情况下,如果请求头中缺少了指定的 name,那么将会报错。 如果没有添加required = false,当请求头中没有这个zking请求头时就会报错。

  • defaultValue

如果请求头中缺少了指定的 name ,那么会报错,可以使用 defaultValue 这个属性指定默认值,就可以避免报错 ;如果请求头缺少指定 name ,该属性设置的值将会作为默认值,如果该属性不设置值,它有自己的默认值 DEFAULT_NONE

@GetMapping("/headParams")
public Map userInfo(
    @RequestHeader(value = "zking",defaultValue = "hello zking") String username,
    // 将请求头中 name=Accept-Encoding 赋值给形参 encoding
    @RequestHeader("Accept-Encoding") String encoding,
    // 将请求头中 name=Host 赋值给形参 host
    @RequestHeader("Host") String host,
    // 将所有请求头的 name 和 value 封装到 Map 集合 headsMap 中
    @RequestHeader Map<String,String> headsMap) {
        Map map = new HashMap<String, Object>();
        map.put("username",username);
        map.put("Accept-Encoding",encoding);
        map.put("Host",host);
        map.put("headsMap",headsMap);
        return map;
}

由于请求头中不存在 name=zking 这个信息,所以如果只用 value=zking 会抛出异常。


解决方案:

1、required 的默认值为 true ,也就是请求头中没有 name=zking 会报错,将其值改为 false,即没有该头信息也不报错

@RequestHeader(value = "zking",required = "false") String username


2、不修改 required=true 这个默认值,当头信息中不包含 name=zking ,给它一个默认值 hello zking

@RequestHeader(value = "zking",defaultValue = "hello zking") String username


1.5.@PathVariable

作用:用于获取URL路径中的参数值,并将其绑定到方法的参数上。

即当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

//@PathVariable可以用来映射URL中的占位符到目标方法的参数中
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id)
{
    System.out.println("testPathVariable:"+id);
    return SUCCESS;
}


二、参数传递


SLF4J是一个简单的日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。

SLF4J的作用是提供了一种抽象层,使得开发人员可以使用任何他们喜欢的日志框架,而不必关心它们之间的差异。这样可以使开发人员更专注于编写代码,而不是处理日志记录的细节。  

在实际运用中,SLF4J通常用于将日志记录从应用程序代码中分离出来,并将其委托给专门的日志记录器。这样可以使得应用程序更易于维护和扩展,并且可以提高性能和可靠性。  


pom.xml

<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

Controller编写:

@Slf4j
@Controller
@RequestMapping("/csdn")
public class IndexController {
    @RequestMapping("/list")
    public String list(String name,Integer age){
        log.info("基础类型+String➡name:{},age:{}",name,age);
        return "hello";
    }
}


此时请求映射的请求路径为:

http://localhost:8080/Spring_MyBatis/csdn/list?name=李文昊&age=18


2.2.复杂类型

Controller编写:

@Slf4j
@Controller
@RequestMapping("/csdn")
public class IndexController {
    @RequestMapping("/list01")
    public String list01(Book book, HttpServletRequest req){
        log.info("复杂类型:bid:{},bname:{}",
                req.getParameter("bid"),
                req.getParameter("bname"));
        log.info("book:{}",book.toString());
        return "hello";
    }
}


此时请求映射的请求路径为:

http://localhost:8080/Spring_MyBatis/csdn/list01?bid=01&bname=圣墟


2.3.@RequestParam

Controller编写:

@Slf4j
@Controller
@RequestMapping("/csdn")
public class IndexController {
    @RequestMapping("/list02")
    public String list02(
            @RequestParam(required = false) String name,
            @RequestParam Integer age) {
        log.info("@RequestParam注解传递参数name:{},age:{}",name,age);
        return "hello";
    }
}


此时请求映射的请求路径为:

http://localhost:8080/Spring_MyBatis/csdn/list02?name=李文昊&age=18

如果我们少传递一个age结果会是怎么样的呢 ?

http://localhost:8080/Spring_MyBatis/csdn/list02?name=李文昊

就会提示我们少了一个参数

因为被@RequestParam注解的参数required默认为true表示请求中一定要传入对应的参数,否则会报404错误如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
12月前
|
JSON 前端开发 Java
【SpringMVC】基础入门实战(3)
SpringMVC获取Header,返回静态页面,返回数据(Controller),返回数据@ResponseBody,返回HTML代码片段,返回JSON,设置状态码,设置Header
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
1272 2
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
357 2
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
915 0
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
199 0
|
3月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
202 0
探索Spring Boot的@Conditional注解的上下文配置
|
10月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
736 26
|
12月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
570 73
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
180 0
|
XML Java 数据格式
spring ioc中的一些常用annotation注解配置
spring ioc中的一些常用annotation注解配置

热门文章

最新文章