【SpringMVC】请求与响应

举报
向阳花花花花 发表于 2023/07/26 09:34:03 2023/07/26
【摘要】 本文主要讲解SpringMVC中的请求与响应。

一、设置请求映射路径

当两个控制器中有相同的请求映射名时,即@RequestMapping的值相同,会报错,这时可以在类上加这个注解,设置请求访问路径前缀。
(1)下面先看UserController类

@Controller
@RequestMapping("/user") // 设置访问路径前缀为/user
public class UserController {

    //    不可以有相同的@RequestMapping值
    @RequestMapping("/add")
    @ResponseBody
    public String add(String name) {
        System.out.println("user add ..." + name);
        return "name is "+name;
    }

    @RequestMapping("/select")
    @ResponseBody
    public String select() {
        System.out.println("user select ...");
        return "select";
    }
}

(2)启动tomcat7服务器,并使用Postman测试
使用前缀
测试结果:

响应数据
至此,使用@RequestMapping定义请求路径前缀成功。

二、请求发送数据

2.1 get请求

get请求就是在请求路径是加相关的参数,上面的设置请求路径中,就是使用的get请求发送数据name=1到后台。

2.2 post请求

测试
测试结果:
测试结果

三、请求乱码问题

3.1 get请求处理中文乱码

在pom.xml文件中配置tomcat服务器插件时,加入uriEncoding标签,就可以解决get请求中文乱码问题。

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
<!--                    解决get请求乱码问题-->
                    <uriEncoding>UTF-8</uriEncoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

3.2 post请求处理中文乱码

当使用Post请求发送中文时会乱码
使用中文
乱码
解决Post请求乱码问题,需要在ServletContainerInitConfig类中添加编码过滤器。


public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class}; // 告知Spring环境
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class}; // 告知SpringMVC环境
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"}; // 设置请求交由SpringMVC处理
    }

    // 处理Post请求乱码问题-get请求乱码-响应乱码

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

重启服务器,乱码问题解决!

乱码解决

四、6种请求参数传递

下面通过调用UserController类中的5个方法,方法名叫update()加数字,启动tomcat服务器,然后来演示前面5种参数传递。


@Controller
@RequestMapping("/user")
public class UserController {


    // (1)普通类型(参数名不同时,使用@RequestParam注解映射)
    @RequestMapping("/update1")
    @ResponseBody
    public String update1(@RequestParam("username") String name) {
        System.out.println("user update1 ..." + name);
        return "update1 user ";
    }


    // (2)引用类型
    @RequestMapping("/update2")
    @ResponseBody
    public String update2(User user) {
        System.out.println("user update2 ..." + user);
        return "update2 user";
    }

    // (3)嵌套引用类型
    @RequestMapping("/update3")
    @ResponseBody
    public String update3(User user) {
        System.out.println("user update3 ..." + user);
        return "update3 user";
    }

    // (4)数组类型(参数名要和形参名一致,不一致时使用@RequestParam注解)
    @RequestMapping("/update4")
    @ResponseBody
    public String update4(String[] values) {
        System.out.println("user update4 ...");
        for (String v : values) {
            System.out.println(v);
        }
        return "update4 user";
    }

    // (5) 集合类型
    @RequestMapping("/update5")
    @ResponseBody
    public String update5(@RequestParam List<String> list) {
        System.out.println("user update5 ..." + list);
        return "update5 user";
    }
}

4.1 普通参数

传递
控制台打印

4.2 实体类参数

首先准备好一个实体类User,成员变量Cup类在下一点


public class User {

    private String name;
    private Integer age;
    // 加入引用类型Cup
    private Cup cup;

    public Cup getCup() {
        return cup;
    }

    public void setCup(Cup cup) {
        this.cup = cup;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cup=" + cup +
                '}';
    }
}

引用类型参数
运行结果

4.3 嵌套实体类的实体类参数

上面的User类中,其实嵌套了Cup类,下面是Cup类的代码


public class Cup {

    private String cupName;
    private Integer weight;

    @Override
    public String toString() {
        return "Cup{" +
                "cupName='" + cupName + '\'' +
                ", weight=" + weight +
                '}';
    }

    public String getCupName() {
        return cupName;
    }

    public void setCupName(String cupName) {
        this.cupName = cupName;
    }

    public Integer getWeight() {
        return weight;
    }

    public void setWeight(Integer weight) {
        this.weight = weight;
    }
}

嵌套引用类型
测试结果

4.4 数组参数

数组
测试结果

4.5 集合参数

集合类型
测试结果

4.6 日期参数

下面通过调用BookController类中的3个date()加数字方法,使用@DateTimeFormat注解定义日期格式从而完成转换。


@Controller
@RequestMapping("/book")
public class BookController {

    //    (1)yyyy/mm/dd格式
    @RequestMapping("/date1")
    @ResponseBody
    public String date1(Date date1) {
        System.out.println("date1 ..." + date1);
        return "date1";
    }

    // (2)yyyy-mm--dd格式
    @RequestMapping("/date2")
    @ResponseBody
    public String date2(@DateTimeFormat(pattern = "yyyy-mm-dd") Date date2) {
        System.out.println("date2 ..." + date2);
        return "date2";
    }

    // (3)yyyy-mm-dd hh-mm-ss格式
    @RequestMapping("/date3")
    @ResponseBody
    public String date3(@DateTimeFormat(pattern = "yyyy/mm/dd hh/mm/ss") Date date3) {
        System.out.println("date3 ..." + date3);
        return "date3";
    }

}

(1)yyyy/mm/dd格式

测试

测试结果

(2)yyyy-mm–dd格式

第二种

测试

(3)yyyy-mm-dd hh-mm-ss格式

注意:hh-mm-ss是12小时计算的,小时不能超过12,否则报错;
如果要使用24小时计算的,需要使用yyyy-mm-dd HH-mm-ss格式。

测试

测试结果

第一种格式是Spring默认转化模式,第二、三种情况要使用@DateTimeFormat注解表名转化的格式pattern,具体看上面的代码。

五、json数据传递

步骤:
(1)在pom.xml文件中导入json数据转换依赖

<!--        json,如果是其他的json转换器可能不支持,建议使用这个jar包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>

(2)在SpringMVC配置类中开启自动转换支持

@Configuration
@ComponentScan("com.itxiaoguo.controller")
@EnableWebMvc // 根据类型匹配相应的转换器(如JSON转换器,日期转换器)

public class SpringMvcConfig {
}

(3)在Postman发送json数据

数据传递JSON
(4)使用BookController类,这里将测试日期转化的方法删除了,具体看下面代码,Send发送数据测试,分别由下面三种情况。


@Controller
@RequestMapping("/book")
public class BookController {

    // (1)json数组
    @RequestMapping("/json1")
    @ResponseBody
    public String json1(@RequestBody List<String> list) {
        System.out.println("json1 ..." + list);
        return "json 1";
    }

    // (2)json对象
    @RequestMapping("/json2")
    @ResponseBody
    public String json2(@RequestBody User user) {
        System.out.println("json2 ..." + user);
        return "json 2";
    }

    // (3)json对象集合
    @RequestMapping("/json3")
    @ResponseBody
    public String json3(@RequestBody List<User> user) {
        System.out.println("json3 ..." + user);
        return "json 3";
    }

}

5.1 json数组

JSON数组

测试结果

5.2 json对象

JSON对象

JSON对象

5.3 json对象数组

JSON对象数组

测试结果

注解类型 @RequestParam注解 @RequestBody注解
适用情况 Get/Post/URL请求传参 JSON传参

六、响应

下面通过CupController类来测试下面三种响应,在webapp下新建了一个page.jsp页面,打印helloworld!


@Controller
@RequestMapping("/cup")
public class CupController {

    // (1)响应页面(不用加@ResponseBody注解)
    @RequestMapping("/page")
    public String page() {
        System.out.println("page ...");
        return "../page.jsp";
    }

    // (2)响应字符串
    @RequestMapping("/str")
    @ResponseBody
    public String str() {
        System.out.println("str ...");
        return "hello";
    }

    // (3)响应JSON数据
    @RequestMapping("/json")
    @ResponseBody
    public User json() {
        System.out.println("json ...");
        User user = new User();
        user.setName("xiaoguo");
        user.setAge(18);
        return user;
    }
}

新建

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>响应页面</title>
</head>
<body>
hello world!
</body>
</html>

6.1 响应页面

页面

6.2 响应文本

文本

6.3 响应JSON数据

JSON
至此,@ResponseBody注解的作用是设置当前方法返回值作为响应体。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。