掌握SpringMVC如何接收请求数据和响应结果

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了掌握SpringMVC如何接收请求数据和响应结果相关的知识,希望对你有一定的参考价值。

SpringMVC_day01

今日内容

  • 掌握SpringMVC如何接收请求、数据和响应结果

一、请求与响应

前面我们已经完成了入门案例相关的知识学习,接来了我们就需要针对SpringMVC相关的知识点进行系统的学习,之前我们提到过,SpringMVC是web层的框架,主要的作用是接收请求、接收数据、响应结果,所以这一章节是学习SpringMVC的重点内容,我们主要会讲解四部分内容:

  • 请求映射路径
  • 请求参数
  • 日期类型参数传递
  • 响应json数据

1.1 设置请求映射路径

1.1.1 环境准备

  • 创建一个Web的Maven项目

  • pom.xml添加Spring依赖

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.itheima</groupId>
      <artifactId>springmvc_03_request_mapping</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.10.RELEASE</version>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <port>80</port>
              <path>/</path>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    
    
  • 创建对应的配置类

    public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer 
    
        protected Class<?>[] getServletConfigClasses() 
            return new Class[]SpringMvcConfig.class;
        
        protected String[] getServletMappings() 
            return new String[]"/";
        
        protected Class<?>[] getRootConfigClasses() 
            return new Class[0];
        
    
    
    @Configuration
    @ComponentScan("com.itheima.controller")
    public class SpringMvcConfig 
    
    
    
  • 编写BookController和UserController

    @Controller
    public class UserController 
    
        @RequestMapping("/save")
        @ResponseBody
        public String save()
            System.out.println("user save ...");
            return "'module':'user save'";
        
        
        @RequestMapping("/delete")
        @ResponseBody
        public String save()
            System.out.println("user delete ...");
            return "'module':'user delete'";
        
    
    
    @Controller
    public class BookController 
    
        @RequestMapping("/save")
        @ResponseBody
        public String save()
            System.out.println("book save ...");
            return "'module':'book save'";
        
    
    

最终创建好的项目结构如下:

把环境准备好后,启动Tomcat服务器,后台会报错:

从错误信息可以看出:

  • UserController有一个save方法,访问路径为http://localhost/save
  • BookController也有一个save方法,访问路径为http://localhost/save
  • 当访问http://localhost/saved的时候,到底是访问UserController还是BookController?

1.1.2 问题分析

团队多人开发,每人设置不同的请求路径,冲突问题该如何解决?

解决思路:为不同模块设置模块名作为请求路径前置

对于Book模块的save,将其访问路径设置http://localhost/book/save

对于User模块的save,将其访问路径设置http://localhost/user/save

这样在同一个模块中出现命名冲突的情况就比较少了。

1.1.3 设置映射路径

步骤1:修改Controller
@Controller
public class UserController 

    @RequestMapping("/user/save")
    @ResponseBody
    public String save()
        System.out.println("user save ...");
        return "'module':'user save'";
    
    
    @RequestMapping("/user/delete")
    @ResponseBody
    public String save()
        System.out.println("user delete ...");
        return "'module':'user delete'";
    


@Controller
public class BookController 

    @RequestMapping("/book/save")
    @ResponseBody
    public String save()
        System.out.println("book save ...");
        return "'module':'book save'";
    

问题是解决了,但是每个方法前面都需要进行修改,写起来比较麻烦而且还有很多重复代码,如果/user后期发生变化,所有的方法都需要改,耦合度太高。

步骤2:优化路径配置

优化方案:

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

    @RequestMapping("/save")
    @ResponseBody
    public String save()
        System.out.println("user save ...");
        return "'module':'user save'";
    
    
    @RequestMapping("/delete")
    @ResponseBody
    public String save()
        System.out.println("user delete ...");
        return "'module':'user delete'";
    


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

    @RequestMapping("/save")
    @ResponseBody
    public String save()
        System.out.println("book save ...");
        return "'module':'book save'";
    

注意:

  • 当类上和方法上都添加了@RequestMapping注解,前端发送请求的时候,要和两个注解的value值相加匹配才能访问到。
  • @RequestMapping注解value属性前面加不加/都可以

扩展小知识:

对于PostMan如何觉得字小不好看,可以使用ctrl+=调大,ctrl+-调小。

1.2 请求参数

请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数?

关于请求参数的传递与接收是和请求方式有关系的,目前比较常见的两种请求方式为:

  • GET
  • POST

针对于不同的请求前端如何发送,后端如何接收?

1.2.1 环境准备

  • 创建一个Web的Maven项目

  • pom.xml添加Spring依赖

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.itheima</groupId>
      <artifactId>springmvc_03_request_mapping</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.10.RELEASE</version>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <port>80</port>
              <path>/</path>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    
    
  • 创建对应的配置类

    public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer 
    
        protected Class<?>[] getServletConfigClasses() 
            return new Class[]SpringMvcConfig.class;
        
        protected String[] getServletMappings() 
            return new String[]"/";
        
        protected Class<?>[] getRootConfigClasses() 
            return new Class[0];
        
    
    
    @Configuration
    @ComponentScan("com.itheima.controller")
    public class SpringMvcConfig 
    
    
    
  • 编写UserController

    @Controller
    public class UserController 
    
        @RequestMapping("/commonParam")
        @ResponseBody
        public String commonParam()
            return "'module':'commonParam'";
        
    
    
  • 编写模型类,User和Address

    public class Address 
        private String province;
        private String city;
        //setter...getter...略
    
    public class User 
        private String name;
        private int age;
        //setter...getter...略
    
    

最终创建好的项目结构如下:

1.2.2 参数传递

GET发送单个参数

发送请求与参数:

http://localhost/commonParam?name=itcast

接收参数:

@Controller
public class UserController 

    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name)
        System.out.println("普通参数传递 name ==> "+name);
        return "'module':'commonParam'";
    

GET发送多个参数

发送请求与参数:

http://localhost/commonParam?name=itcast&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=18

控制台:

出现乱码的原因相信大家都清楚,Tomcat8.5以后的版本已经处理了中文乱码的问题,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml来解决GET请求中文乱码问题

<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>
POST发送参数

发送请求与参数:

接收参数:

和GET一致,不用做任何修改

@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'";
    

POST请求中文乱码

发送请求与参数:

接收参数:

控制台打印,会发现有中文乱码问题。

解决方案:配置过滤器

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");
        return new Filter[]filter;
    

CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。

1.3 五种类型参数传递

前面我们已经能够使用GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,接下来在这个基础上,我们来研究一些比较复杂的参数传递,常见的参数种类有:

  • 普通参数
  • POJO类型参数
  • 嵌套POJO类型参数
  • 数组类型参数
  • 集合类型参数

这些参数如何发送,后台改如何接收?我们一个个来学习。

1.3.1 普通参数

  • 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。

如果形参与地址参数名不一致该如何解决?

发送请求与参数:

http://localhost/commonParamDifferentName?name=张三&age=18

后台接收参数:

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

因为前端给的是name,后台接收使用的是userName,两个名称对不上,导致接收数据失败:

解决方案:使用@RequestParam注解

@RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestPaam("name") String userName , int age)
        System.out.println("普通参数传递 userName ==> "+userName);
        System.out.printlnSpringMVC 数据绑定

SpringMVC 从入门到精通系列 04——响应数据和结果视图

JavaEE开发之SpringMVC框架整合1

ajax和springmvc的请求响应原理

springmvc工作流程是?

SpringMVC