一、基本定义

它是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。 SpringMVC是表现层框架。

二、配置文件

1、springmvc.xml

配置名可以是任意的,但习惯上写springmvc.xml。放于resource文件夹下。

(1)约束头

<?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">
</beans>

(2)具体

<?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">
	
    <!--基础三步-->
    <!-- ①开启注解扫描 -->
    <context:component-scan base-package="cn.itcast"/>

    <!-- ②视图解析器对象 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--写前缀-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <!--写后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

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

</beans>

2、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>

  <!--配置前端控制器,核心控制器DispatcherServlet-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--指定springmvc.xml配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
      <!--设置一启动服务器就加载DispatcherServlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!--访问任何路径要先经过DispatcherServlet-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--配置解决中文乱码的过滤器,主要解决post请求所传来的中文参数问题,相当于request.setCharacterEncoding-->
  <filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

三、使用

1、步骤

(1)所需Jar包

<properties>        
    <spring.version>5.0.2.RELEASE</spring.version>    
</properties>
<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

 </dependencies>

(2)配置核心控制器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOpRIi5W-1596719294214)(img\image-20200427155322173.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtmBo0xl-1596719294216)(img\image-20200427155250503.png)]

(3)创建 spring mvc 的配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUa7iiDZ-1596719294219)(img\image-20200427155322173.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSCcBEkg-1596719294223)(img\image-20200427155351164.png)]

(4)编写控制器并使用注解配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iafaQcgK-1596719294227)(img\image-20200427155953780.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GoF53pe-1596719294229)(img\image-20200427155714618.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-16NC0F6E-1596719294231)(img\image-20200427155748700.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aoMmSfEt-1596719294232)(img\image-20200427155804280.png)]

(5)结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZWAbmZp-1596719294234)(img\image-20200427160015651.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lky7vJ4w-1596719294236)(img\image-20200427160042637.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0bjpstp6-1596719294239)(img\image-20200427160028398.png)]

2、以上案例执行流程

1.当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象, 就会加载springmvc.xml配置文件
    
    2. 开启了注解扫描,那么HelloController对象就会被创建
    
    3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解 找到执行的具体方法
    
    4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
    
    5. Tomcat服务器渲染页面,做出响应

四、组件介绍

1、 DispatcherServlet:前端控制器

用户一旦发送请求就必先到达前端控制器,它就相当于 mvc 模式中的c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。

2、HandlerMapping:处理器映射器

HandlerMapping 负责根据用户请求找到 Handler(处理器/Controller)。

3、HandlAdapter:处理器适配器

通过 HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理 器进行执行。 简单来说,就是执行处理器的。

4、Handler:处理器

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由 Handler 对具体的用户请求进行处理。 (Controller即Handler,即需要我们自己编写)

5、View Resolver:视图解析器

View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名 即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

6、View:视图

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等。我们最常用的视图就是 jsp。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。简单来说就是把页面展示给用户看。

7、mvc:annotation-driven/

用了此标签,就会自动加载RequestMappingHandlerMapping (处理映射器)和 RequestMappingHandlerAdapter ( 处 理 适 配 器 ),所以它可以替代springMVC.xml配置文件的注解处理器和适配器的配置.

五、执行过程及原理分析

springMvc执行过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t4GTgo65-1596719294241)(img\v2-6f83454164ed953470be16c7fe40c4ae_r.jpg)]

六、注解

1、 RequestMapping

(1)作用

用于建立请求 URL 和处理请求方法之间的对应关系。此注解可以写于类或方法上。

(2)属性

①	value:用于指定请求的 URL。它和 path 属性的作用是一样的。  


②	method:用于指定请求的方式。使用RequestMethod.xxx,设置指定的请求方式。如果设置为post,则要post请求方式请求的才可以访问。


③	params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和 配置的一模一样。    
		  例如: params = {"accountName"},表示请求参数必须有 accountName     
		  		params = {"moeny!100"},表示请求参数中 money 不能是 100。  

④	headers:用于指定限制请求消息头的条件。

	注意:以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。

(3)使用

①params属性使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVhVlBz2-1596719294243)(img\image-20200427171232973.png)]

②method属性[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQbw5cVz-1596719294245)(img\image-20200427171447362.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04QmA4N9-1596719294248)(img\image-20200427171604481.png)]

2、RequestParam

(1)作用

用于将指定的请求参数赋值给控制器中方法的形参.即此注解的value属性指定的名称若和请求参数的键名相同,则将请求参数的值赋值给有此注解的方法参数。

(2)属性

value:请求参数中的名称。
	name:和value属性一样。
	required:默认值为true.表示请求参数必须要提供value属性里写的名称(即键名),不然会报错。
	defaultValue:用于设置默认的参数值,如果设置了该值,且requeired=true,如果客户端发来的请求没有对应的键名(跟value的值一样的),则不会报错,会将默认的defaultValue属性里的值赋给对应的方法参数.

(3)使用

①前端执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKPkXQ3p-1596719294250)(img\image-20200429131347969.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgfcoYfc-1596719294252)(img\image-20200429131425495.png)]

②经过后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tH4xulTW-1596719294255)(img\image-20200429131257172.png)]

③执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3AIOpaAV-1596719294256)(img\image-20200429131440670.png)]

3、RequestBody

(1)作用

用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。 get 请求方式不适用。

(2)属性

required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。

(3)使用

①前端执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3XMTpTBx-1596719294258)(img\image-20200429135114329.png)]

I、提交中文

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KA81T4Eb-1596719294260)(img\image-20200429135433888.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yWcWFw5g-1596719294262)(img\image-20200429135514844.png)]

II、提交英文

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OiB3NQCv-1596719294264)(img\image-20200429135929756.png)]

②经过后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KorNYlf3-1596719294266)(img\image-20200429135136925.png)]

③执行结果

I、中文的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTDukB4E-1596719294267)(img\image-20200429135546330.png)]

II、英文的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnuZezkq-1596719294269)(img\image-20200429135952065.png)]

4、PathVaribale

(1)作用

用于获取restful风格中的数据

(2)属性

value:用于指定 url 中占位符名称。  
	required:是否必须提供占位符。
    url占位符在requestMapping中写明

(3)使用

①前端执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ykqYh6T-1596719294271)(img\image-20200429143254047.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MC4b7X9A-1596719294272)(img\image-20200429143338900.png)]

②经过后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bO0V4MkW-1596719294273)(img\image-20200429143319106.png)]

③执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b793VEC7-1596719294275)(img\image-20200429143356394.png)]

(4)restful 风格

restful风格 的示例:  
		restful风格:/account/1 
        原先的风格:/account?id=1

5、RequestHeader

(1)作用

用于获取请求消息头。

(2)属性

value:提供消息头名称  
	required:是否必须有此消息头

(3)使用

①前端执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eR0E74mT-1596719294276)(img\image-20200429140419039.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pq6PSDOi-1596719294278)(img\image-20200429140439053.png)]

②经过后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYGRQ0wv-1596719294279)(img\image-20200429140344940.png)]

③执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IlABOSM2-1596719294280)(img\image-20200429140523749.png)]

6、CookieValue

(1)作用

用于把指定 cookie 名称的值传入控制器方法参数。

(2)属性

value:指定 cookie 的名称。  
	required:是否必须有此 cookie。

(3)使用

①前端执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeCx6gMH-1596719294282)(img\image-20200429140649379.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6xncCm3-1596719294283)(img\image-20200429140725978.png)]

②经过后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rMHqSZOq-1596719294284)(img\image-20200429140811764.png)]

③执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-coPxLkZD-1596719294287)(img\image-20200429140822752.png)]

7、ModelAttribute

(1)作用

主要作用就是可以比控制器方法先执行,且可以从中获取值。
	出现在方法上,表示当前方法比被访问的控制器方法先执行,且被修饰方法可以获取请求参数。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。  
	出现在参数上,获取指定的数据给参数赋值。

(2)属性

value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。

(3)使用

①被此注解修饰无返回值情况
I、前端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aaZ8Abrp-1596719294292)(img\image-20200429145119214.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VS3BZBqm-1596719294295)(img\image-20200429145207225.png)]

II、后端
被ModleAttribute注解修饰的方法,可以获取请求的参数。并且在参数上定义一个Map集合,存储其他数据,这些数据可以让被访问的控制器方法获取到。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wyxt5CTf-1596719294297)(img\image-20200429144712854.png)]

III、结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52iagJyZ-1596719294299)(img\image-20200429145317472.png)]

②有返回值的方法
那此方法比被访问的控制器方法先执行,然后返回值,这个返回值赋值给控制器方法参数的相同类型。不管方法有多少个相同类型的参数,都把返回值赋给定义在方法参数上的多个相同类型。
I、前端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SMPyB304-1596719294302)(img\image-20200429145119214.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dG9yWtVo-1596719294303)(img\image-20200429145207225.png)]

II、后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2P8pVl94-1596719294305)(img\image-20200429145900748.png)]

III、执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10P5Dkvd-1596719294306)(img\image-20200429145317472.png)]

8、SessionAttribute(以下内容可能有误)

(1)作用

用于在多个请求之间传递参数,相当于session,只能作用于类上。

(2)属性

value:用于指定存入的属性名称  
	type:用于指定存入的数据类型。

(3)使用

注意:在testSessionAttributes、getSessionAttributes、delSessionAttributes方法中,多次不同请求都能在request域中获取到testSessionAttributes里存储的msg值。这是因为有@SessionAttributes注解的原因。如果没有此注解,则不会发生以上情况。
①把值存储于session

I、前端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zAnjgSng-1596719294308)(img\image-20200429151403623.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rHBT8EYy-1596719294310)(img\image-20200429151448626.png)]

II、后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V4aOjMbe-1596719294311)(img\image-20200429151324807.png)]

III、执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hQM1Fqz-1596719294313)(img\image-20200429151514722.png)]

IIII、跳转到成功页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByTO0PHd-1596719294316)(img\image-20200501100738732.png)]

IIIII、最终结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-koO38ZD3-1596719294319)(img\image-20200429151533655.png)]

②获取存储值

I、前端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UatUnNL-1596719294320)(img\image-20200429151906897.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GyBGKh9a-1596719294322)(img\image-20200429151448626.png)]

II、后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMamJaPh-1596719294324)(img\image-20200429151810343.png)]

III、执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKOkitDC-1596719294328)(img\image-20200429152032559.png)]

IIII、跳转到成功页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tULDSqWx-1596719294329)(img\image-20200501100738732.png)]

IIIII、最终结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fZVTqIiU-1596719294331)(img\image-20200429152003171.png)]

③清除session里的内容

I、前端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hk7yituD-1596719294333)(img\image-20200429151448626.png)]

II、后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9BZYb7di-1596719294335)(img\image-20200429152126584.png)]

III、执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUpPkvEU-1596719294336)(img\image-20200429152411071.png)]

IIII、跳转到成功页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zgoRXV2-1596719294338)(img\image-20200501100738732.png)]

IIIII、最终结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZTvswnJ-1596719294340)(img\image-20200429152351789.png)]

七、请求参数绑定

1、关于绑定的说明

(1)绑定机制

SpringMVC绑定请求参数的过程是通过把表单提交的参数,作为控制器中方法参数进行绑定的。

(2)支持的数据类型

①基本类型参数
基本类型和 String 类型:根据请求参数的键名和方法参数名称进行绑定,进行赋值。
②POJO 类型参数
实体类,以及关联的实体类
③数组和集合类型参数
List 结构和 Map 结构的集合(包括数组)

2、使用演示

(1)参数 为基本类型或String 类型

①点击

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AyKC651s-1596719294341)(img\image-20200429103113854.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dG2bAxEL-1596719294343)(img\image-20200429103141261.png)]

②经过后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKK5Zva1-1596719294344)(img\image-20200429103232848.png)]

③执行后端代码结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKvP7U0Y-1596719294346)(img\image-20200429103252720.png)]

(2)参数为POJO 类型

①情況1
POJO类型里的属性全都为基本数据包装类型或String类型

I、提交数据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLYLoHJU-1596719294348)(img\image-20200429104620933.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DeuddPf0-1596719294349)(img\image-20200429104048522.png)]

II、经过后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NjKurTy8-1596719294355)(img\image-20200429103907780.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibyHyaGS-1596719294357)(img\image-20200429103933304.png)]

III、结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ACr0kWv-1596719294358)(img\image-20200429104102763.png)]

②情況2
POJO类型里包含其他类.

I、Domian

Account类里包含User类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sXvu7AHo-1596719294360)(img\image-20200429105851071.png)]

User类[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAHJWCGG-1596719294361)(img\image-20200429110237921.png)]

II、前端

封装的详细情况在此图里的注解中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Ea9sG0O-1596719294363)(img\image-20200429105821478.png)]

III、后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFABaH9n-1596719294364)(img\image-20200429110322220.png)]

IIII、执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDPSmbu4-1596719294365)(img\image-20200429110341404.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CO28UYw0-1596719294367)(img\image-20200429110410809.png)]

③情况3
POJO 类中包含集合类型参数

I、Domian

Account里包含集合类,且集合里有泛型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yRzMM6q4-1596719294370)(img\image-20200429112118203.png)]


User类,在集合泛型里的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nFFx1gAH-1596719294371)(img\image-20200429112216601.png)]

II、前端

如何将提交的数据封装,写在这里面的注释里

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dCe2Y4QB-1596719294373)(img\image-20200429112358735.png)]

III、后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjB5diWX-1596719294374)(img\image-20200429112057168.png)]

IIII、执行及其结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SJEPNB3-1596719294376)(img\image-20200429112043533.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLwsIbBi-1596719294378)(img\image-20200429112722061.png)]

3、自定义类型转换器

编写自定义类型转换器的目的,其实就是为了让前端提交的格式和自身期望的格式一样。如果不一样,就报错。

(1)步骤

①定义一个类,实现 Converter 接口,该接口有两个泛型<S,T>,S表示接受的类型,T表示目标类型。 

	②在 springmvc配置文件中配置类型转换器。 
		<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    		<property name="converters">
        		<set>
            		<bean class="自定义的转换类"/>
        		</set>
   			 </property>
		</bean>
        
	③在 annotation-driven标签中引用配置的类型转换服务
    	<mvc:annotation-driven conversion-service="类型转换器的id"/>

(2)具体演示

①自定义类型转换器[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kWNuVLwv-1596719294380)(img\image-20200429124910432.png)]
②配置自定义类型转换器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndg4iHui-1596719294382)(img\image-20200429125152980.png)]

③User类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnfMYxl8-1596719294384)(img\image-20200429125335125.png)]

④后端代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q4YvjGFr-1596719294386)(img\image-20200429125300083.png)]

⑤前端代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2DH5izZ-1596719294390)(img\image-20200429125419604.png)]

⑥结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxD75mpn-1596719294392)(img\image-20200429125521250.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfFq4CxV-1596719294396)(img\image-20200429125538693.png)]

⑦不按照格式写的错误
不按照自定义转换器的格式写将会导致错误

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j84X7buo-1596719294398)(img\image-20200429125618216.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4tp1hhsw-1596719294399)(img\image-20200429125633211.png)]

4、ServletAPI 对象作为方法参数来接收

SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。
    支持原始 ServletAPI 对象有: 
        ①HttpServletRequest  
        ②HttpServletResponse 
        ③HttpSession 
        ④java.security.Principal 
        ⑤Locale 
        ⑥InputStream  
        ⑦OutputStream  
        ⑧Reader  
        ⑨Writer

八、响应数据和结果视图

1、返回值分类

(1)String 类型

Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hJUHsaV-1596719294401)(img\image-20200429154143885.png)]

(2)void 类型

①如果方法返回值为void,默认去请求requestMapping里的值的jsp文件。即user/testVoid.jsp.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cfOL9GaP-1596719294403)(img\image-20200429155356863.png)]

②可以使用请求转发或者重定向跳转到指定的页面

I、请求转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KajgyEhd-1596719294405)(img\image-20200429155730709.png)]

II、重定向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TsJHx1KD-1596719294407)(img\image-20200429155823243.png)]

(3)ModelAndView

ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y5jghjnf-1596719294408)(img\image-20200501103905974.png)]

2、转发和重定向关键字

(1)forward 转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HpmX13Ed-1596719294410)(img\image-20200430093330189.png)]

(2)Redirect 重定向

这个重定向不用加虚拟路径,springmvc会帮我们加上。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XiBmnq9B-1596719294411)(img\image-20200430093754345.png)]

3、过滤静态资源问题

(1)设置标签

<mvc:resource location="/static"   mapping="/static/**" />
	表示DispatcherServlet不会拦截以/static开头的所有请求路径,写在springmvc配置文件里.

(2)具体用法

<!--前端控制器,哪些静态资源不拦截,即直接请求,不需要经过DispatcherServlet控制器
	如果结果DispatcherServlet就请求不到这些资源了.-->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

4、ResponseBody 响应 json 数据

(1)导Jar包解析Json字符串

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

(2)前端Ajax编写

传送json字符串必须要写上contentType,作用就是设置发送给服务器的格式.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clQqshva-1596719294412)(img\image-20200430102216714.png)]

(3)后端编写

个人想法:并且RequestBody会将中文数据给URL解码,然后封装进User里。
而且要想把请求的数据封装到类里,前端的ajax必须要用ajax数据格式的。并且ajax要设置contentType.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaKZFWpI-1596719294414)(img\image-20200430112836222.png)]

(4)结果测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yonpFHeo-1596719294415)(img\image-20200430112720808.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqSuHTHs-1596719294416)(img\image-20200430112735182.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dKBWHQxt-1596719294418)(img\image-20200430112911301.png)]

九、异常

1、定义

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息, 后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端 控制器交由异常处理器进行异常处理,如下图。那为什么要加异常处理器?因为如果不加,最终用户就能看到未经处理的异常信息,从而导致一脸懵逼。所以需要加异常处理器处理下,即给整成人话。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eYMtpD3-1596719294419)(img\05.bmp)]

2、具体配置步骤

(1)自定义异常类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T3JB11dV-1596719294420)(img\image-20200430125739604.png)]

(2)编写异常处理器

继承HandlerExceptionResolver接口,即出现异常,抛异常到最顶层就执行此处理器.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xCkEBHRl-1596719294421)(img\image-20200430125909313.png)]

(3)配置异常处理器

在springmvc中配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTwDhfNf-1596719294423)(img\image-20200430125959330.png)]

3、具体演示

(1)前端

①前端1
点击页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oMlvkqEK-1596719294424)(img\image-20200430130318281.png)]

②前端2
失败界面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddoPwDY4-1596719294425)(img\image-20200430130241333.png)]

(2)后端

编写一个出现异常的Controller的方法
第二个红线框的throw抛完,需要选择try...catch处理或者throws向上抛。但我们选择throws向上抛,最终抛给了异常处理器处理。(出现异常,throw出自定义的异常类,再用throws向上抛,最终给异常处理器处理)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSlZ9Fb0-1596719294426)(img\image-20200430130122332.png)]

(3)执行及结果

①点击执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5irowodj-1596719294428)(img\image-20200430130327495.png)]

②结果

后台打印了异常信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtbX9V78-1596719294429)(img\image-20200430130425060.png)]


前台跳转到error页面,并说明了用户能看懂的异常信息。这样对用户就比较友好。这就是编写异常处理器的目的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5jUrEEpE-1596719294430)(img\image-20200430130411033.png)]

十、拦截器

1、定义

拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。它只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。

2、自定义拦截器实现步骤

(1)编写一个普通类实现 HandlerInterceptor 接口 

    (2)配置拦截器 

    (3)测试运行结果

3、HandlerInterceptor接口中的方法

(1)preHandle

preHandle方法是controller方法执行前拦截的方法 
 		①可以使用request或者response跳转到指定的页面 
 		②return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。 
 		③ return false不放行,不会执行controller中的方法。

(2)postHandle

postHandle是controller方法执行后执行的方法,在JSP视图执行前.
		①可以使用request或者response跳转到指定的页面 
		②如果指定了跳转的页面,那么controller方法跳转的页面将不会显示

(3)afterCompletion

该方法是在JSP执行后执行 
		request或者response不能再跳转页面了

4、 配置多个拦截器

(1)步骤

①编写两个拦截器类
		②在springmvc中配置这两个拦截器

(2)拦截器执行顺序

按照xml里的配置顺序执行.

(3)具体实现

①自定义拦截器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZ3l58w3-1596719294432)(img\image-20200430134322820.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lWtK487p-1596719294433)(img\image-20200430134352156.png)]

②配置拦截器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjpjtmWe-1596719294435)(img\image-20200430134452022.png)]

③控制器方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtalJJ7D-1596719294436)(img\image-20200430134503928.png)]

④执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q8TATA32-1596719294437)(img\image-20200430134515901.png)]

⑤结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NfBe4iTK-1596719294439)(img\image-20200430134629058.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDHClHjQ-1596719294440)(img\image-20200430134524266.png)]

十一、文件上传案例

1、所需jar包

以下三种方式都需要借助第三方组件实现文件上传

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

2、前端分析

(1)form表单

1、form 表单的enctype取值必须是:multipart/form-data(默认值是:application/x-www-form-urlencoded) enctype:是表单请求正文的类型

        2、method 属性取值必须是 Post,因为get请求的参数大小有限制.

        3、提供一个文件选择域<input type=”file” />

(2)form表单提交的数据格式

1、当 form 表单的 enctype 取值不是默认值后,request.getParameter()将失效。

        2、当enctype="application/x-www-form-urlencoded"时,form 表单的正文内容是:
            key=value&key=value&key=value

        3、当enctype="Mutilpart/form-data"时,请求正文内容就变成:
            每一部分都是 MIME 类型描述的正文 
            -----------------------------7de1a433602ac   分界符 
            Content-Disposition: form-data; name="userName"  协议头
            aaa              协议的正文 
            -----------------------------7de1a433602ac 
            Content-Disposition: form-data; name="file"; 
            filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt" 
            Content-Type: text/plain         协议的类型(MIME 类型) 

            bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 
            -----------------------------7de1a433602ac--

3、传统实现

(1)步骤

①编写 页面,并设置form表单的enctype 

        ②编写控制器 

        ③配置文件解析器

(2)具体实现

①前端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7zJvuwH-1596719294441)(img\image-20200430135708878.png)]

②后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PD8iQH4F-1596719294443)(img\image-20200430140920479.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izhR1raq-1596719294444)(img\image-20200430141142015.png)]

③测试及其结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fENUOa96-1596719294447)(img\image-20200430141338103.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ARFzOiO-1596719294448)(img\image-20200430141351972.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzOI46F3-1596719294450)(img\image-20200430141419863.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P2uB8skj-1596719294451)(img\image-20200430141406390.png)]

中文名不会乱码的原因,因为过滤器设置了request.setCharacterEncoding

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KorukEiz-1596719294453)(img\image-20200501121550478.png)]

4、SpringMvc实现

(1)原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiEE7ElP-1596719294454)(img\03-原理.bmp)]

(2)具体操作

①前端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZBZKaaL5-1596719294455)(img\image-20200501125000540.png)]

②后端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VG5uAVys-1596719294457)(img\image-20200501124927676.png)]

③springmvc.xml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYO3XTi9-1596719294459)(img\image-20200501124823688.png)]

④结果及测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Op3KWKkO-1596719294462)(img\image-20200501125026248.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFOSKuWd-1596719294464)(img\image-20200501125055477.png)]

上传结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhiv2rqb-1596719294466)(img\image-20200501125202637.png)]

十二、补充

DispatcherServlet里的/和/*区别:

    /*:所有资源都会被拦截到,但被拦截的资源如果不是控制器,而是其他资源就会404,因为它会把资源当作一个Controller去匹配,匹配不到就返回404.

    /:不会拦截Jsp资源.

----------------------------7de1a433602ac–

## 			3、传统实现

### 			(1)步骤
①编写 页面,并设置form表单的enctype 

    ②编写控制器 

    ③配置文件解析器
### 			(2)具体实现

#### 						①前端

[外链图片转存中...(img-S7zJvuwH-1596719294441)]

#### 						②后端

[外链图片转存中...(img-PD8iQH4F-1596719294443)]

[外链图片转存中...(img-izhR1raq-1596719294444)]

#### 						③测试及其结果

[外链图片转存中...(img-fENUOa96-1596719294447)]

[外链图片转存中...(img-7ARFzOiO-1596719294448)]

[外链图片转存中...(img-CzOI46F3-1596719294450)]

[外链图片转存中...(img-P2uB8skj-1596719294451)]

中文名不会乱码的原因,因为过滤器设置了request.setCharacterEncoding

[外链图片转存中...(img-KorukEiz-1596719294453)]



## 			4、SpringMvc实现

### 		(1)原理

[外链图片转存中...(img-jiEE7ElP-1596719294454)]

### 		(2)具体操作

#### 				①前端

[外链图片转存中...(img-ZBZKaaL5-1596719294455)]

#### 				②后端

[外链图片转存中...(img-VG5uAVys-1596719294457)]

#### 				③springmvc.xml

[外链图片转存中...(img-iYO3XTi9-1596719294459)]

#### 				④结果及测试

	[外链图片转存中...(img-Op3KWKkO-1596719294462)]

[外链图片转存中...(img-fFOSKuWd-1596719294464)]
上传结果
[外链图片转存中...(img-vhiv2rqb-1596719294466)]

# 十二、补充
DispatcherServlet里的/和/*区别:

/*:所有资源都会被拦截到,但被拦截的资源如果不是控制器,而是其他资源就会404,因为它会把资源当作一个Controller去匹配,匹配不到就返回404.

/:不会拦截Jsp资源.