SpringMVC总结

目录

SpringMVC执行流程

SpringMVC参数获取

封装为简单数据类型

封装为对象类型

封装为关联对象

封装为简单数据类型集合

封装为对象类型集合

封装为map集合

使用Servlet原生对象

编码过滤器

SpringMVC处理响应

配置视图解析器

通过控制器方法的返回设置跳转的视图

        方法返回值为void类型

        方法返回值为String类型

        方法返回值为ModelAndView类型

request域设置数据

session域设置数据

context域设置数据

传统请求转发

传统重定向相应

SpringMVC提供的请求转发

SpringMVC提供的重定向响应

SpringMVC注解

@Controller

@RequestMapping

@RequestParam

@RequestHeader

@CookieValue

@SessionAttribute

@ModelAttribute

RESTful风格

PostMan的使用

@PathVariable

@PostMapping、@GetMapping、@DeleteMapping、@PutMapping

HiddenHttpMethodFilter

@RequestBody

@ResponseBody

静态资源映射

SpringMVC上传

SpringMVC提供的上传

上传多文件

异步上传


部分图片来自百战程序员 

SpringMVC执行流程

SpringMVC的组件

  • DispatcherServlet:前端控制器,接受所有请求,调用其他组件。
  • HandlerMapping:处理器映射器,根据配置找到方法的执行链。
  • HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器。
  • ViewResolver:视图解析器,找到指定视图。

组件的工作流程:

  1. 客户端将请求发送给前端控制器
  2. 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控制器
  3. 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器
  4. 处理器执行方法,并将返回值返回给前端控制器
  5. 前端控制器将返回值发送给视图解析器,视图解析器找到视图文件位置
  6. 视图渲染数据并将结果显示到客户端

SpringMVC参数获取

在测试参数获取前,我们首先需要添加依赖、SpringMVC核心配置文件、web.xml中添加前端控制器

  <!-- 依赖 -->
<dependencies>
  <!-- Spring核心模块 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.12.RELEASE</version>
  </dependency>
  <!-- SpringWeb模块 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.12.RELEASE</version>
  </dependency>
  <!-- SpringMVC模块 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.12.RELEASE</version>
  </dependency>
  <!-- Servlet -->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
  <!-- JSP -->
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>


<build>
  <plugins>
    <!-- tomcat插件 -->
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <port>8080</port>
        <path>/</path>
        <uriEncoding>UTF-8</uriEncoding>
        <server>tomcat7</server>
        <systemProperties>
          <java.util.logging.SimpleFormatter.format>%1$tH:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n
          </java.util.logging.SimpleFormatter.format>
        </systemProperties>
      </configuration>
    </plugin>
  </plugins>
</build>
<!-- SpringMVC核心配置文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">


    <!--  扫描包  -->
    <!--  开启Spring注解支持  -->
    <context:component-scan base-package="com.itbaizhan"></context:component-scan>

    <!--  开启SpringMVC注解支持  -->
    <mvc:annotation-driven></mvc:annotation-driven>

</beans>

<!-- web.xml -->
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!-- 前端控制器  -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

封装为简单数据类型

在Servlet中我们通过request.getParameter(name)获取请求参数。该方式存在两个问题:

  • 请求参数较多时会出现代码冗余。
  • 与容器紧耦合。

而SpringMVC支持参数注入的方式用于获取请求数据,即将请求参数自动封装到方法的参数当中。用法如下: 

@Controller
@RequestMapping("/c1")
public class myController1 {

    //该方法的访问路径为"/c1/simpleParam"
    @RequestMapping("/simpleParam")
    public void simpleParam(int id){
        System.out.println(id);
    }
}

然后开启tomcat,访问该路径并通过get请求方式提交id=1 

 根据控制台的输出可以看到我们是接收到了id的值

封装为对象类型

首先我们创建一个Student对象

package com.itbaizhan.pojo;

public class Student {
    private String name;
    private String sex;
    private int age;


    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

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

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

然后通过控制器当我们请求该路径时自动封装为一个Student类型 

@RequestMapping("/objParam")
    public void objParam(Student student){
        System.out.println(student);
    }

然后通过访问该路径并传递数据,SpringMVC会自动将数据封装为一个Student对象

这里需要注意的是,请求路径中传递的参数的key需要与对象的属性名相同,否则无法自动封装

封装为关联对象

当对象中参数为对象时,此时就需要封装为关联对象,使用参数对象名.属性自动封装

首先我们在Student类中添加Address对象并创建该对象

public class Student {
    private String name;
    private String sex;
    private int age;
    private Address address;

//以下省略getter、setter、toString方法
}
public class Address {
    private String info;//地址信息
    private String postCode;//邮戳

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getPostCode() {
        return postCode;
    }

    public void setPostCode(String postCode) {
        this.postCode = postCode;
    }

    @Override
    public String toString() {
        return "Address{" +
                "info='" + info + '\'' +
                ", postCode='" + postCode + '\'' +
                '}';
    }
}

编写控制器

@RequestMapping("/relationParam")
    public void relationParam(Student student){
        System.out.println(student);
    }

 然后启动tomcat,通过对应的路径传递数据

 注意:

给关联对象封装数据在访问路径时需要这么写:关联对象.属性名=值

封装为简单数据类型集合

 SpringMVC支持将参数封装为List或Map集合,请求参数为集合的参数名

@RequestMapping("/simpleParam1")
    // 绑定简单数据类型List参数,参数前必须添加@RequestParam注解
    public void simpleCollectionParam(@RequestParam List<String> str){
        System.out.println(str);
    }

启动tomcat,访问对应的url,请求参数为集合的参数名 

 

封装为对象类型集合

SpringMVC不支持将参数封装为对象类型的List集合

可以封装到有List属性的对象中。相当于曲线救国了

(请求参数写法:List属性名[第几个].对象的属性名=值)

首先我们更改一下Student类,使其拥有List对象类型集合

public class Student {
    private String name;
    private String sex;
    private int age;
    private List<Address> address;
    //省略getter、setter、toString
}

请求的参数写法
http://localhost:8080/c1/param6?id=1&name=bz&sex=female&address[0].info=bj&address[0].postcode=100010&address[1].info=sh&address[1].postcode=100011

 启动tomcat,访问对应路径,SpringMVC自动封装为Student类型,控制台输出

封装为map集合

SpringMVC不支持将参数封装为Map集合

SpringMVC要封装Map集合,需要封装到有Map属性的对象中

(请求参数的写法为:map集合属性名["key"].对象属性名=值)

 首先需要在Student类中添加map属性

public class Student {
    private String name;
    private String sex;
    private int age;
    private List<Address> address;
    private Map<String,Address> addressMap;
    //以下忽略setter、getter、toString
}

还是使用上面的控制器,但是访问路径需要改变

请求的参数写法
http://localhost:8080/c1/param7?id=1&name=bz&sex=female&address[‘one’].info=bj&address[‘one’].postcode=100010&address[‘two’].info=sh&address[‘two’].postcode=100011

启动tomcat,访问对应路径 ,控制台输出

使用Servlet原生对象

 SpringMVC也支持使用Servlet原生对象,在方法参数中定义HttpServletRequestHttpServletResponseHttpSession等类型的参数即可直接在方法中使用。

 编写控制器

@RequestMapping("/param2")
    public void param2(HttpServletRequest request, HttpServletResponse response,HttpSession session){
        System.out.println(request.getParameter("name"));
        System.out.println(response.getCharacterEncoding());
        System.out.println(session.getId());
    }

启动tomcat,访问对应路径 ,控制台输出

编码过滤器

在传递参数时,tomcat8以上能处理get请求的中文乱码,但不能处理post请求的中文乱码

我们可以测试一下,编写一个提交post请求的baizhan.jsp表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>编码过滤器</title>
  </head>
  <body>
    <form action="/cn/code" method="post">
       姓名:<input name="username">
      <input type="submit">
    </form>
  </body>
</html>

编写控制器

@RequestMapping("/param3")
    public void param3(String username){
        System.out.println(username);
    }

启动tomcat,访问对应路径, 控制台输出乱码

 

SpringMVC提供了处理中文乱码的过滤器,在web.xml中配置该过滤器即可解决中文乱码问题

<!--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方-->

<filter>
  <filter-name>encFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>encFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

SpringMVC处理响应

配置视图解析器

通过控制器方法的返回设置跳转的视图

        方法返回值为void类型

        方法返回值为String类型

        方法返回值为ModelAndView类型

request域设置数据

session域设置数据

context域设置数据

传统请求转发

传统重定向相应

SpringMVC提供的请求转发

SpringMVC提供的重定向响应

SpringMVC注解

@Controller

@RequestMapping

@RequestParam

@RequestHeader

@CookieValue

@SessionAttribute

@ModelAttribute

RESTful风格

PostMan的使用

@PathVariable

@PostMapping、@GetMapping、@DeleteMapping、@PutMapping

HiddenHttpMethodFilter

@RequestBody

@ResponseBody

静态资源映射

SpringMVC上传

SpringMVC提供的上传

上传多文件

异步上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值