SpringMVC入门详细讲解包括底层源码介绍

1、什么是springmvc?

SpringMVC入门详细讲解包括底层源码介绍

2、mvc是什么?

a、 模型(Model):负责封装应用的状态,并实现应用的功能。通常分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如订单信息、用户信息等;而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等。通常由java开发人员编写程序完成代码量最多

b、 视图(View):视图通过控制器从模型获得要展示的数据,然后用自己的方式展现给用户,相当于提供界面来与用户进行人机交互。通常有前端和java开发人员完成代码量较多

c、 控制器(Controller):用来控制应用程序的流程和处理用户所发出的请求。当控制器接收到用户的请求后,会将用户的数据和模型的更新相映射,也就是调用模型来实现用户请求的功能;然后控制器会选择用于响应的视图,把模型更新后的数据展示给用户。起到总调度的作用Controller通常

3、用一张图来介绍mvc设计

SpringMVC入门详细讲解包括底层源码介绍

4、springmvc架构图(面试必备)

SpringMVC入门详细讲解包括底层源码介绍

5、第一个springmvc程序

5.1、创建工程,这里以maven工程作为演示

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

5.2、引入依赖pom.xml

SpringMVC入门详细讲解包括底层源码介绍

5.3、配置web.xml

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

6、springmvc的配置文件

用户发送请求到web容器,并被DispatchServlet拦截之后进入springmvc容器,springmvc该怎么处理那,这就需要springmvc的配置文件。

那么springmvc的配置文件该放在什么位置,又该怎么命名呢?

找到DispatchServlet这个类:

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

由此知道,springmvc默认读取/WEB-INF/{servlet-name}-servlet.xml这个配置文件,因为我们在web.xml中的servlet-name配置的是springmvc,所以在WEB-INF目录下创建springmvc-servlet.xml文件:

SpringMVC入门详细讲解包括底层源码介绍

springmvc配置文件的头信息和spring一样

SpringMVC入门详细讲解包括底层源码介绍

7、HandlerMapping映射器

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

8、HandlerAdapter适配器

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

9、ViewResolver试图解析器

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

由此可见,视图解析器的规则是:prefix+viewName+suffix

10、完整的配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

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-4.0.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置映射器,把bean的name属性作为一个url -->

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

    <!-- 配置适配器 -->

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

    <bean name="/hello.do" class="cn.itcast.springmvc.controller.HelloController" />

    <!-- 配置视图解析器 -->

    <!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" -> "/WEB-INF/jsp/test.jsp"  -->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="prefix" value="/WEB-INF/views/"></property>

    <property name="suffix" value=".jsp"></property>

    </bean>

</beans>

11、​​​​​​​HelloController

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

12、添加jsp页面

SpringMVC入门详细讲解包括底层源码介绍

jsp内容

SpringMVC入门详细讲解包括底层源码介绍

13、添加log日志

SpringMVC入门详细讲解包括底层源码介绍

Log4j.properties内容:

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

14、流程分析

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

15、优化helloworld程序

web.xml

SpringMVC入门详细讲解包括底层源码介绍

springmvc-servlet.xml

SpringMVC入门详细讲解包括底层源码介绍

找到DispatchServlet.properties文件

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

在这个默认的配置文件中,已经配置了映射器和适配器。

所以在springmvc-servlet.xml文件中可以省略之前配置的映射器和适配器

SpringMVC入门详细讲解包括底层源码介绍

再次测试:

SpringMVC入门详细讲解包括底层源码介绍

16、helloword的缺点

1)每个类需要都实现Controller接口

2)每个类(Controller)只能完成一个用户请求(或者只能处理一个业务逻辑)

3)每个类(Controller)都要在配置文件里,进行配置

解决方案:

注解程序

在DispatchServlet.properties文件中,已经提供了默认的注解映射器和适配器,所以咱们可以直接书写注解的代码

SpringMVC入门详细讲解包括底层源码介绍

创建hello2Controller

SpringMVC入门详细讲解包括底层源码介绍

内容:

SpringMVC入门详细讲解包括底层源码介绍

推荐使用的注解配置

springmvc-servlet.xml

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

以上方式虽然已经很好,但还有最佳方案:注解驱动

17、在springmvc-servlet.xml中配置注解驱动

<mvc:annotation-driven />

SpringMVC入门详细讲解包括底层源码介绍

注解驱动原理图:

SpringMVC入门详细讲解包括底层源码介绍

18、使用注解驱动后springmvc-servlet.xml这个配置文件:

SpringMVC入门详细讲解包括底层源码介绍

19、标准URL映射

@RequestMapping(value=”xxx”)

在springmvc众多Controller以及每个Controller的众多方法中,请求时如何映射到具体的处理方法上

它可以定义在方法上,也可以定义在类上

请求映射的规则:

类上的@RequestMapping的value+方法上的@RequestMapping的value,如果value不以“/”开头,springmvc会自动加上

类上的@RequestMapping可省略,这时请求路径就是方法上的@RequestMapping的value

路径不可重复

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

20、占位符的映射

@RequestMapping(value=“/user/{userId}/{name} ")

请求URL:http://localhost:8080/user/1001/zhangsan.do

这种方式虽然和通配符“*”类似,却比通配符更加强大,占位符除了可以起到通配的作用,最精要的地方是在于它还可以传递参数。

比如:@PathVariable(“userId”) Long id, @PathVariable(“name”)String name获取对应的参数。

注意:@PathVariable(“key”)中的key必须和对应的占位符中的参数名一致,而方法形参的参数名可任意取

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

如果传递的参数类型和接受参数的形参类型不一致,则会自动转换,如果转换出错(例如:id传了abc字符串,方法形参使用Long来接受参数),则会报400错误(参数列表错误)

21、@RequestMapping注解介绍

@RequestMapping 类上 方法上

Value:标准的URL Ant风格(通配符:? * **) Rest风格(占位符{xxx} @PathVariable(参数名))

Method:限定请求方法(RequestMethod:post get delete put)

Params:限定请求参数(id !id id=1 id!=1 {“id”,“name”})

22、接收数据及数据绑定

SpringMVC入门详细讲解包括底层源码介绍

23、接收请求路径中的占位符

@PathVariable(value=”id”)获取占位符中的参数

注意:(value=”id”)不能省

SpringMVC入门详细讲解包括底层源码介绍

24、接收普通的请求参数

@RequestParam(value=””, required=true/false, defaultValue=””)

1、value:参数名

2、required:是否必须,默认为true,标示请求参数中必须包含该参数,如果不包含则抛出异常

3、defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果请求中不包含该参数则使用默认值

SpringMVC入门详细讲解包括底层源码介绍

25、基本数据类型的绑定,包括(字符串、整型、浮点型、布尔型、数组。)

在webapp目录下,创建user.html表单:

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

可以通过localhost:8080/user.html访问

SpringMVC入门详细讲解包括底层源码介绍

测试:

SpringMVC入门详细讲解包括底层源码介绍

由于Controller方法没有任何返回值,所以浏览器没有任何信息:

SpringMVC入门详细讲解包括底层源码介绍

Log日志

SpringMVC入门详细讲解包括底层源码介绍

26、Springmvc和struts2比较

SpringMVC入门详细讲解包括底层源码介绍

单例:在使用的过程中,一直是一个对象。只被创建一次

多例:会被创建多次。

单例模式是spring推荐的配置,它在高并发下能极大的节省资源,提高服务抗压能力。spring IOC的bean管理器是“绝对的线程安全”。

27、JSON(重点)

在实际开发过程中,json是最为常见的一种方式,所以springmvc提供了一种更为简便的方式传递数据。

@ResponseBody 是把Controller方法返回值转化为JSON,称为序列化

@RequestBody 是把接收到的JSON数据转化为Pojo对象,称为反序列化

举例:

引入依赖

在Pom.xml中引入jackson依赖,参考父工程:

SpringMVC入门详细讲解包括底层源码介绍

当一个处理请求的方法标记为@ResponseBody时,表示该方法需要输出其他视图(json、xml),springmvc通过默认的json转化器转化输出

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

当一个处理请求的方法标记为@RequestBody时

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

28、@RequestMapping   和  @GetMapping @PostMapping 区别

@GetMapping是一个组合注解 是@RequestMapping(method = RequestMethod.GET)的缩写

@PostMapping是一个组合注解 是@RequestMapping(method = RequestMethod.POST)的缩写

29、拦截器

HandlerExecutionChain是一个执行链,当请求到达DispatchServlet时,DispatchServlet根据请求路径到HandlerMapping查询具体的Handler,从HandlerMapping返回给DispatcherServlet,其中包含了一个具体的Handler对象和Interceptors(拦截器集合)。

如何自定义拦截器:

springmvc的拦截器接口(HandlerInterceptor)定义了三个方法:

a、preHandle调用Handler之前执行,称为前置方法

返回值:true表示放行,后续业务逻辑继续执行

false表示被拦截,后续业务逻辑不再执行,但之前返回true的拦截器的完成方法会倒叙执行

b、postHandle调用Handler之后执行,称为后置方法

c、afterCompletion视图渲染完成之后执行

拦截器执行过程:

SpringMVC入门详细讲解包括底层源码介绍

SpringMVC入门详细讲解包括底层源码介绍

结论:

拦截器的前置方法依次执行,

后置方法和完成方法倒续执行

当前置方法返回false时,后续的拦截器以及Handler方法不再执行,但它前序的前置方法返回true的拦截器的完成方法会倒续执行。

完成方法会在视图渲染完成之后才去执行。