SpringMVC-参数接收

SpringMVC-参数接收

在servlet的项目中,我们进行参数的接收使用的是HttpServletRequest对象中的String getParameter(String ParameterName)方法

接收Json也是十分麻烦,为此我们还编写了用以接收和发送参数的工具类:WebUtil

但在SpringMVC中,这一切都会被框架封装好,我们的操作就会变得很简单


Param参数接收

Param类型的参数接收方式有三种:

  • 直接接收

  • 注解指定

  • 特殊值

@RequestMapping("data")
@ResponseBody
public String data(String name) {
    return "name" + name;
}

Spring版本问题带来的Param参数接收的问题

在使用新版本的Spring FrameWork时,直接接收参数会报错

Ensure that the compiler uses the '-parameters' flag.

其中,官方文档时这么说明的:

Parameter Name Retention

LocalVariableTableParameterNameDiscoverer has been removed in 6.1. Consequently, code within the Spring Framework and Spring portfolio frameworks no longer attempts to deduce parameter names by parsing bytecode. If you experience issues with dependency injection, property binding, SpEL expressions, or other use cases that depend on the names of parameters, you should compile your Java sources with the common Java 8+ flag for parameter name retention (instead of relying on the compiler flag) in order to be compatible with .

Maven users need to configure the for Java source code:maven-compiler-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <parameters>true</parameters>
            </configuration>
        </plugin>
    </plugins>
</build>

简而言之,在6.1版本之后,如果你想继续使用这种方式来接收参数的话,需要在pom.xml中配置以上内容

它会影响以下几个问题:

  • 直接接收参数是否报错
  • 使用注解接收参数时,注解的value(name)的值是否可以省略
  • 无法使用实体对象接值

@RequestParam

使用@RequestParam注解进行参数的指定

  • value(name)属性:指定参数的名称,如果和参数名相同,则可以缺省
  • required属性:默认值为true,该属性配置是否允许不传递该参数
  • defaultValue属性:参数如果为空,则默认是为该属性的值
@RequestMapping("data2")
@ResponseBody
public String data2(@RequestParam(value = "name",required = false, defaultValue = "xiaobai") String name) {
    return "name:" + name;
}

一参多值

当传递的参数为一参数多个值的时候,则使用集合作为形参来接收参数

这种方式必须使用RequestParam注解

@RequestMapping("data3")
@ResponseBody
public String data3(@RequestParam("hbs") List<String> hbs) {

    System.out.println(hbs);
    return "ok";
}

使用实体对象接值*

首先我们要确保pojo包下的实体类User是存在getter/setter方法的

在接收参数时,无法对user中的属性指定接收形参,所以使用直接接收参数的方式即可

@RequestMapping("data4")
@ResponseBody
public String data4(User user) {
    System.out.println(user);
    return "ok";
}

Json参数接收

Java原生的api只支持路径参数和param参数,不支持json参数

如果想要使用SpringMVC处理Json参数,则需要导入Json处理的依赖

为handlerAdapter配置Json处理转换器(没错,这个工具仍然是jackson)

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
@EnableWebMvc*

在SpringMVC的配置类上配置@EnableWebMvc注解

其作用是为handlerAdapter配置了Json转换器

@EnableWebMvc
@Configuration
@ComponentScan("com.xiaobai.controller")
public class MVCConfig {
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        return new RequestMappingHandlerMapping();
    }
    @Bean
    public RequestMappingHandlerAdapter handlerAdapter() {
        return new RequestMappingHandlerAdapter();
    }
}

@RequestBody

使用此注解修饰形参,则代表此形参和请求体中的参数映射

@RequestMapping("json")
@ResponseBody
@Controller
public class JsonController {
    @RequestMapping("data")
    public String data (@RequestBody Person person) {
        System.out.println(person.toString());
        return person.toString();
    }
}

路径传参

路径传参我们在vue的路由传参中接触过

@PathVariable
  • value(name)属性:指定参数的名称,如果和参数名相同,则可以缺省
  • required属性:默认值为true,该属性配置是否允许不传递该参数
@Controller
@RequestMapping("path")
@ResponseBody
public class PathController {
    @RequestMapping("{username}/{password}")
    public String login(@PathVariable String username, @PathVariable String password){
        System.out.println("username = " + username + " password = " + password);
        return null;
    }
}

当URI为:/path/xiaobai/xiaobai,则传输username和password都为xiaobai

使用{username}/{password}做占位符,在形参使用PathVariable注解修饰形参

就可以完成路径参数的接收了


SpringMVC-接收请求头和Cookie

Cookie的获取

在Servlet的学习中,我们使用request的方法Cookie[] getCookies() 来获取所有的Cookie

在SpringMVC中,我们使用@CookieValue注解的方式获取Cookie的值

public class CookieController {
    public String data(@CookieValue("cookieName") String cookieValue){
        System.out.println("cookieValue = " + cookieValue);
        return "ok";
    }
}

请求头的获取

在Servlet的学习中,我们使用request的方法来获取请求头

API说明
String getHeader(String headerName)根据头名称获取请求头
Emumeration<String> getHeaderNames()获取所有请求头名字
String ContentType()获取content-type请求头

在SpringMVC中,我们使用@RequestHeader来获取请求头

public String data1(@RequestHeader("host") String host){
    System.out.println("host = " + host);
    return "ok";
}