1、Spring MVC可以用来干什么?
可以让不同的层次做不同的事情
Spring可以类似的理解称为控制层。
Servlet,是一种协议,框架技术,一套标准,javaweb开发的一套标准,java动态web框架技术。
传统的Servlet:接受用户的请求,并对其进行处理,处理完之后给用户一个响应。一个servlet只能接搜对应的一个用户请求,会导致 我们开发出许多 Servlet。
处理请求参数的时候过于繁琐,如果有100个参数,就要写100次的获取参数
SpringMVC的出现可以解决以上的问题。对代码进行简化,节省时间。简化web开发,请求方式可以在一个类里写多个请求。
2、新建一个Spring MVC的Hello World
1、IDEA》new project > Maven >直接新建项目就可以了,什么都不需要勾选。
2、修改pom.xml文件,对项目进行依赖下载和配置
<?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>org.example</groupId>
<artifactId>springmvc-study</artifactId>
<version>1.0-SNAPSHOT</version>
<!--为pom定义一些常用变量,在pom中的其他地方可以直接引用
使用方式如下: ${spring.version} -->
<properties>
<file.encoding>UTF-8</file.encoding>
<java.source.version>1.8</java.source.version>
<java.target.version>1.8</java.target.version>
<spring.version>5.3.12</spring.version>
<servlet.version>4.0.1</servlet.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<!-- <version>5.3.12</version>-->
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<!-- <version>4.0.1</version>-->
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
依赖下载完毕之后会出现的依赖包。
3、新建一个控制器
4、手动新建目录
在hello.jsp文件中输入下列代码:
<%@page contentType="text/html; charset=utf-8"
pageEncoding="UTF-8" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Welcome ${name} to Spring MVC!</h1>
</body>
</html>
并且在pom.xml配置中添加一行代码:
表明这是一个web的项目,并且加入这一行代码后,
webapp的图标颜色也发生了变化,表示这是一个web的项目
5、接下来创建SpringMVC的配置文件
新建文件spring-servlet.xml
输入:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- Handler(处理器) : name="/hello" -->
<bean name="/hello" class="com.neu.springmvc.controller.HelloController"/>
<!-- HandlerMapping(处理器映射器) : Bean Name 映射 到一个 访问的URL -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- HandlerAdapter(处理器适配器) -->
<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- ViewResolver(视图解析器)-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
6、新建加载Spring MVC 的web.xml文件
在webapp/WEB-INF的目录下新建,与jsp同级
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意,如果文件和下图所示报错,那也仍然可以正常运行。
7、配置Tomcat文件,
之后运行,出现这种界面
这是不要慌,改变地址栏,加入hello
出现这个界面,表示Spring MVC已经OK了
3、Spring的运行流程
4、Spring组件
1、DispatcherServlet:前端控制器 (重点)
用户请求到达前端控制器,它就相当于 mvc 模式中的c,DispatcherServlet 是整个流程控制的中心,相当于是 SpringMVC 的大脑,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
2、HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器(也就是我们所说的 Controller),SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等,在实际开发中,我们常用的方式是注解方式。
3、Handler:处理器
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。由于Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。(这里所说的 Handler 就是指我们的 Controller)
4、HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
5、ViewResolver:视图解析器
ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对View 进行渲染将处理结果通过页面展示给用户。
SpringMVC 框架提供了很多 的 View 视图类型,包括:jstlView、freemarkerView、pdfView 等。一般情况 下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
5、结合上面代码来理解Spring MVC 的运行流程和组件
1、HelloController就相当于处理器。接收用户请求,进行处理,创建了一个ModelAndView,名字叫hello,往mv中添加了一个参数,参数名是name,参数值是666,然后返回这个视图。
2、视图层,是在hello.jsp中
问:这么几行代码,HelloController中的666是如何传到hello.jsp中的呢?
我们在HelloController中的hello会找一个视图解析器把hello解析为
/WEB-INF/jsp/hello.jsp
我们在resources中的spring-servlet.xml写过视图解析器的代码。
其中prefix是前缀,suffix是后缀。所以hello就在这个解析器中,重组了一次。默认的查找到了hello.jsp的位置。
顺序应该是 前端控制器 (controller)> 处理器映射器( Beannameurl 分析处理器的数据,对其进行映射,映射到处理器) > 处理器 > 处理器适配器 > 视图解析器
即一个请求过来,首先通过前端控制器,然后到处理器映射器(HandlerMapping :Bean Name映射到一个访问的URL )
<bean id="handlerMapping" class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping ">
id中的值不能修改,因为这个是查找指定的handlerMapping。然后这个bean进行自动装配,查找/hello
查找到了/hello的处理器,然后进行处理器适配。
6、DispatcherServlet作用
DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,
负责职责的分派,不做业务逻辑只负责分派任务,而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的优点。
DispatcherServlet 主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
- 文件上传解析,如果请求类型是 multipart 将通过 MultipartResolver 进行文件上传
解析; - 通过 HandlerMapping(处理器映射器),将请求映射到处理器(返回一个HandlerExecutionChain(处理器执行链),包含:一个处理器、多个 HandlerInterceptor 拦截器);
- 通过 HandlerAdapter (处理器适配)支持多种类型的处理器(HandlerExecutionChain 中的处理器);
- 通过 ViewResolver (视图解析器)解析逻辑视图名到具体视图实现;
- 本地化解析; (自动识别本地语言并输出,支持各种语言)
- 渲染具体的视图等;
- 如果执行过程中遇到异常将交给 HandlerExceptionResolver(处理器异常解析器) 来解析。
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet< /servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
load-on-startup:表示启动容器时初始化该 Servlet;
url-pattern:表示哪些请求交给 Spring Web MVC 处理, “/” 是用来定义默认servlet映射的。也可以如 *.html 表示拦截所有以 html 为扩展名的请求
contextConfigLocation :表示 SpringMVC 配置文件的路径
contextClass 实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。如果这个参数没有指定,默认使用XmlWebApplicationContext。
contextConfigLocation 传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。这个字符串可以被分成多个字符串(使用逗号作为分隔符)来支持多个上下文。(在多上下文的情况下,如果同 一个bean被定义两次,后面一个优先)。
namespace :WebApplicationContex命名空间,默认值是[server-name]-servlet。