Spring MVC-请求与响应

2022-04-23  本文已影响0人  石头耳东

前置文章:
一、Spring MVC-简单使用

零、本文纲要

一、请求

1、请求参数

http://localhost/commonParam?name=test

直接使用参数接收即可,如下:

@Controller
public class UserController {
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name){ // 直接使用参数接收即可
        System.out.println("普通参数传递 name ==> "+name);
        return "{'module':'commonParam'}";
    }
}
http://localhost/commonParam?name=test&age=15

直接使用多个参数接收,如下:

@Controller
public class UserController {
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){ // 直接使用参数接收,参数名需与传入参数一致
        System.out.println("普通参数传递 name ==> "+name);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'commonParam'}";
    }
}

补充:GET请求中文乱码问题

http://localhost/commonParam?name=测试&age=15

IDEA中的Tomcat插件目前只到Tomcat7,所以存在中文乱码现象。Tomcat8.5以后的版本已经处理了中文乱码的问题。

IDEA中,我们通过修改pom.xml来处理中文乱码问题,添加<uriEncoding>UTF-8</uriEncoding>,如下:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port><!--tomcat端口号-->
          <path>/</path> <!--虚拟目录-->
          <uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
        </configuration>
      </plugin>
    </plugins>
  </build>

类型信息格式设置:Content-Type对应application/x-www-form-urlencoded

与GET请求一致,可以直接使用参数接收。

补充:POST请求中文乱码问题

通过配置CharacterEncodingFilter处理,如下:

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8"); // 设置字符集为 UTF-8
        return new Filter[]{filter};
    }
}

org.springframework.web.filter.CharacterEncodingFilter在spring-web包中,因此我们需要添加此相关依赖。实际使用时spring-webmvc包中包含了spring-web包,如下:

spring-webmvc包含spring-web.png

2、不同类型参数传递

要求:参数名与形参变量名相同,具体案例上面已经呈现。

补充:参数名与形参变量名不同的情形,如下:

http://localhost/commonParamDifferentName?name=测试&age=18

通过@RequestParam注解处理,@RequestParam("name") String userName,如下:

@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName , int age){
    System.out.println("普通参数传递 userName ==> "+userName);
    System.out.println("普通参数传递 age ==> "+age);
    return "{'module':'common param different name'}";
}

写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能。

基础准备,构造User类,如下:

public class User {
    private String name;
    private int age;
    ... ...
}

请求参数与形参对象中的属性对应即可完成参数传递,如下:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
    System.out.println("pojo参数传递 user ==> "+user);
    return "{'module':'pojo param'}";
}

基础准备,构造User、Address类,如下:

public class Address {
    private String province;
    private String city;
    ... ...
}
public class User {
    private String name;
    private int age;
    private Address address;
    ... ...
}

请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数,如下:

请求参数设置好层级关系.png

接收参数的代码不变,此处省略。

请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数,如下:

参数key设置一致.png

接收代码如下:

//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
    System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
    return "{'module':'array param'}";
}

请求发送逻辑不变,与上方一致,此处省略。

接收代码使用集合作为形参,如下:

//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
    System.out.println("集合参数传递 likes ==> "+ likes);
    return "{'module':'list param'}";
}

参数接收是按照属性填充的,而集合类型的属性(如size、isEmpty等)并不适合接收参数。所以此处使用@RequestParam来完成内容映射。

补充:@RequestParam注解

该注解用于形参位置,用来绑定请求参数与处理器方法形参间的关系。

required:是否为必传参数(true/false);

defaultValue:参数默认值。

3、JSON数据参数

JSON普通数组:(["value1","value2","value3",...])

JSON对象:({key1:value1,key2:value2,...})

JSON对象数组:([{key1:value1,...},{key2:value2,...}])

Ⅰ 引入JSON转换所需依赖,如下:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>

Ⅱ 开启SpringMVC注解支持,使用@EnableWebMvc注解,如下:

@Configuration
@ComponentScan("com.stone.controller")
@EnableWebMvc //开启json数据类型自动转换
public class SpringMvcConfig {
}

Ⅰ JSON普通数组,如下:

//使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
    System.out.println("list common(json)参数传递 list ==> "+likes);
    return "{'module':'list common for json param'}";
}

Ⅱ JSON对象,如下:

@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
    System.out.println("pojo(json)参数传递 user ==> "+user);
    return "{'module':'pojo for json param'}";
}

Ⅲ JSON对象数组,如下:

@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
    System.out.println("list pojo(json)参数传递 list ==> "+list);
    return "{'module':'list pojo for json param'}";
}

补充:@EnableWebMvc注解

作用在配置类上,开启SpringMVC多项辅助功能,此处为JSON数据转换。

补充:@RequestBody注解

作用在形参位置,将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

补充:@RequestBody与@RequestParam区别

Ⅰ @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】;

Ⅱ @RequestBody用于接收JSON数据【application/json】。

Ⅰ 后期开发中,发送JSON格式数据为主,@RequestBody应用较广;

Ⅱ 如果发送非JSON格式数据,选用@RequestParam接收请求参数。

4、日期类型参数传递

2022/4/23、2022-4-23、2022.4.23等等

2022/4/23标准的日期形式,我们直接接收即可,如下:

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date)
    System.out.println("参数传递 date ==> "+date);
    return "{'module':'data param'}";
}

其他特殊的类型我们可以使用@DateTimeFormat注解,如下:

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(@DateTimeFormat(pattern="yyyy-MM-dd") Date date)
    System.out.println("参数传递 date ==> "+date);
    return "{'module':'data param'}";
}

如果日期带有详细时间,我们同样可以使用该注解,如下:

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date)
    System.out.println("参数传递 date ==> "+date);
    return "{'module':'data param'}";
}

补充:@DateTimeFormat注解

作用在形参位置,设定日期时间型数据格式。

5、类型转换实现原理

/**
*   <S> – the source type
*   <T> – the target type
*/
public interface Converter<S, T> {
    @Nullable
    //该方法就是将从页面上接收的数据(S)转换成我们想要的数据类型(T)返回
    T convert(S source);
}

为了各类Converter能够生效,我们需要在SpringMVC的配置类上使用该注解。

二、响应

1、基础准备

<html>
    <body>
        <h2>Hello Spring MVC!</h2>
    </body>
</html>

2、响应页面

不使用@ResponseBody注解,返回String类型,如下:

@Controller
public class UserController {
    @RequestMapping("/toJumpPage")
    //注意
    //1.此处不能添加@ResponseBody,如果加了该注入,会直接将page.jsp当字符串返回前端
    //2.方法需要返回String
    public String toJumpPage(){
        System.out.println("跳转页面");
        return "page.jsp";
    }
}

3、返回文本数据

使用@ResponseBody注解,如下:

@Controller
public class UserController {
    @RequestMapping("/toText")
    //注意此处该注解就不能省略,如果省略了,会把response text当前页面名称去查找,如果没有回报404错误
    @ResponseBody
    public String toText(){
        System.out.println("返回纯文本数据");
        return "response text";
    }
}

4、响应JSON数据

需要使用@ResponseBody注解,另外在配置类上开启@EnableWebMvc注解,如下:

@Controller
public class UserController {
    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public User toJsonPOJO(){
        System.out.println("返回json对象数据");
        User user = new User();
        user.setName("测试");
        user.setAge(15);
        return user;
    }
}
@Controller
public class UserController {
    @RequestMapping("/toJsonList")
    @ResponseBody
    public List<User> toJsonList(){
        System.out.println("返回json集合数据");
        User user1 = new User();
        user1.setName("测试1");
        user1.setAge(15);
        User user2 = new User();
        user2.setName("测试2");
        user2.setAge(12);
        List<User> userList = new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);
        return userList;
    }
}

补充:@ResponseBody注解

作用在方法/类上,设置当前控制器返回值作为响应体:

Ⅰ 方法的返回值为字符串,会将其作为文本内容直接响应给前端;

Ⅱ 方法的返回值为对象,会将对象转换成JSON响应给前端。

内部还是通过Converter接口的实现类完成的,对象转Json数据(POJO -> json),集合转Json数据(Collection -> json)。

三、结尾

以上即为Spring MVC-请求与响应的全部内容,感谢阅读。

上一篇 下一篇

猜你喜欢

热点阅读