“一个人最好的状态:梦想藏在心里,行动落于腿脚。”
目录
1、前言
今天我们介绍的SpringMVC框架底层用的就是Servlet,对Servlet加以封装,核心的DispatcherServlet继承自HttpServlet
只要我们Servlet的基础打的牢固,那么学习SpringMVC框架就会变的得心应手
在介绍框架之前,我们先回想一下之前学习Servlet时,它有哪些缺点
2、Servlet的缺点
-
通常情况下,一个Servlet类只负责处理一个请求,若项目中有成百上千个请求需要处理,就需要我们手动创建成百上千的Servlet类,这样就会造成项目中的Servlet类暴增,资源浪费
-
在Servlet3.0版本之前,每一个Servlet类都需要在web.xml文件中至少配置八行信息,配置内容多且繁琐。当Sertvlet类变多时,web.xml文件配置信息过多,不利于团队开发
-
当通过客户端提交参数给服务器,通过Servlet进行接收,无论数据本身是什么格式,在Servlet中一律按照字符串进行接收,后期需要进行类型转换,复杂类型还需要特殊处理,非常麻烦
-
Servlet有容器依赖性,必须放在服务器中运行,不利于单元测试。
3、什么是SpringMVC?
-
SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需中间层整合
-
SpringMVC提供了基于MVC(模型—视图—控制器)架构和用于开发灵活和松耦合的web应用程序的组件
-
模型(Model)封装了应用程序数据,通常它们由pojo类组成
-
视图(View)负责展示数据,一般来说它生成客户端浏览器可以解释HTML输出
-
控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行解析展示
3.1 为什么要使用SpringMVC框架?
-
我们在日常开发中了解到很多应用程序的问题在于处理业务数据和显示业务数据的视图的对象之间存在紧密耦合。通常,更新业务对象的命令都是从视图本身发起的,使视图对任何业务对象更改都有高度敏感性。而且,当多个视图依赖于同一个业务对象时是没有灵活性的。
-
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的
3.2 SpringMVC框架入门(基于注解方式)
创建maven web项目,导入所需要的JAR包
-
点击File,新建Project项目
-
选中Maven,直接点击Next即可
-
依次填写groupid和artifactid后点击next即可
-
选择配置自己的maven仓库(具体操作方法这里不再赘述)
-
输入项目名称SpringMVC,点击Next即可
-
这样就创建好了一个名称为SpringMVC的maven项目,结构如下图:
项目创建完成之后没有的java,resources,test包自己创建即可
-
我们可以看到包创建好之后是灰色的,需要选中相应的文件夹右击Mark Directory as,选中相应的颜色即可
现在项目的结构就变成了如下样子:
-
在pom.xml文件中导入所需要的的jar包
<?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.cn</groupId>
<artifactId>SpringMVC</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>SpringMVC Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-asm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-asm</artifactId>
<version>3.0.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/org.springframework.web.servlet -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web.servlet</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
</dependencies>
</project>
3.3 添加SpringMVC框架支持
-
在项目名SpringMVC上右击选择Add framework support
-
按照图中方框中的提示选中后点击ok按钮即可
注意:如果我们在点击Add framework support中找不到Spring,那么有可能项目中已经存在了Spring文件,但不一定是完善的,我们只需要把它删除然后重新添加即可
方法:点击File,选择Project Structure,选择Facets,就会看到有一个Spring,右击它,点删除就行啦,然后再回到上一个步骤重新Add framework support,Spring就会出现啦。
添加SpringMVC支持后,我们会发现项目目录中多了两个文件,我又单独创建了一个views用来存放映射文件JSP等
3.4 配置SpringMVC核心控制器
-
在web.xml中配置SpringMVC的核心信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>\
<!--把applicationContext.xml加入到配置文件中-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置springmvc DispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--配置dispatcher-servlet.xml作为mvc的配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 其中的斜杠(/)表示拦截所有请求(除JSP以外), 所有请求都要经过springmvc前端控制器 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
-
配置dispatcher-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" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--此文件负责整个mvc中的配置-->
<!-- 1.配置前端控制器放行静态资源(html/css/js等,否则静态资源将无法访问) -->
<mvc:default-servlet-handler/>
<!-- 2.配置注解驱动,用于识别注解(比如@Controller) -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 3.配置需要扫描的包:spring自动去扫描 base-package 下的类,
如果扫描到的类上有 @Controller、@Service、@Component等注解,
将会自动将类注册为bean
-->
<context:component-scan base-package="com.cn.controller"></context:component-scan>
<!-- 4.配置内部资源视图解析器
prefix:配置路径前缀
suffix:配置文件后缀
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3.5 创建并实现HelloController控制器类
-
创建并实现HelloController类
@Controller
public class HelloController {
/**
* 这个注解用于:映射请求的资源路径(/hello)和当前方法(hello)的对应关系
* 当浏览器请求 /hello 路径时, 将会访问(执行)当前这个方法
*/
@RequestMapping("/hello")
public String hello() {
System.out.println("hello springmvc...");
return "home";
}
}
-
在WEB-INF/views/目录下创建home.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>hello springmvc~~~</h1>
</body>
</html>
3.6 部署Tomcat和相关环境
-
在 Run 菜单项下找到 Edit Configurations
- 配置Tomcat环境
-
选择好本地的Tomcat并修改好名称
-
在Deployment页面下完成以下操作
-
在弹出框中选中SpringMVC:war exploded后点击OK
-
启动Tomcat服务器,进行测试
成功在浏览器页面上显示出了页面中的数据内容
到此为止我们的SpringMVC框架入门就测试完成了,是不是很简单?
接下来我们来一起来探究SpringMVC的具体工作流程
SpringMVC工作流程
-
用户发送请求 至 前端控制器(DispatcherServlet),也就是我们之前配置的核心控制器
作用:接收请求,调用其它组件处理请求,响应结果,相当于转发器、中央处理器,是整个流程控制的核心
-
前端控制器(DispatcherServlet)收到请求后调用处理器映射器(HandlerMapping)
-
处理器映射器(HandlerMapping)找到具体的Handler处理器(可以根据xml配置、注解进行查找),并将Handler返回给DispatcherServlet;
-
前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行相应的Handler处理器,也就是Controller
-
Controller执行完成后返回ModelAndView(SpringMVC封装对象)
Model(模型数据,即Controller处理的结果,Map) View(逻辑视图名,即负责展示结果的JSP页面的名字)
-
前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析器(ViewReslover)
-
视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面
-
前端控制器(DispatcherServlet)根据Model对View进行渲染(即将模型数据填充至视图中);
前端控制器(DispatcherServlet)将填充了数据的网页响应给用户。
上面的工作流程中,我们是没有讲过处理器映射器,处理器适配器,视图解析器这些组件的。但是SpringMVC的环境还是被我们搭建起来测试成功了,接下来咱们一一介绍
处理器映射器
作用就是根据客户端请求的URL路径去寻找匹配的Handler处理器信息,返回给前端控制器 DispatcherServlet
在SpringMVC中,有两种配置方式,一种是基于XML的配置,也就是非注解的方式(本篇文章不再过多赘述);一种是基于Annotation注解的配置,也就最常用的方式
注解处理方式不需要在XML中进行配置,只需要在指定的地方声明一些注解信息即可,在 spring3.1 之后配置如下:
<!--映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
我们上面的入门案例使用的是简写方式(最常用),它会自动的去注册处理器映射器
<mvc:annotation-driven/>
使用了注解方式以后就不需要XML中配置任何信息了,只需要在作为 Handler 处理器的 Java 类中添加相应的注解即可
@Controller
public class HelloController {
/**
* 这个注解用于:映射请求的资源路径(/hello)和当前方法(hello)的对应关系
* 当浏览器请求 /hello 路径时, 将会访问(执行)当前这个方法
*/
@RequestMapping("/hello")
public String hello() {
System.out.println("hello springmvc...");
return "home";
}
}
@Controller注解表示该类是一个控制器类,可以被处理器映射器找到
@RequestMapping注解用于配置哪个请求对应哪个业务方法
这时为了让处理器适配器找到Handler处理器,需要在dispatcher-servlet.xml文件中添加一个扫描配置,方便找出添加@Controller注解的控制器类
<!-- 配置自动扫描包 -->
<context:component-scan base-package="com.cn"/>
处理器适配器
作用就是根据处理器映射器匹配的Handler处理器信息去执行具体的Handler处理器,处理后就会返回一个 ModleAndView 对象
处理器适配器的配置方法和之前的处理器映射器配置一样,方法可以通用
我们只需要配置一次以下的代码即可,框架就会自动的帮我们注册映射器和适配器,方便又快捷
<mvc:annotation-driven/>
3.7 视图解析器
作用就是通过ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View
如果Handler处理器中编写的是视图真实路径(真实路径=路径前缀+视图逻辑名+路径后缀),那么视图解析器就可选配置
如果Handler处理器中编写的是视图逻辑路径,那么视图解析器就必须配置
<!-- 4.配置内部资源视图解析器
prefix:配置路径前缀
suffix:配置文件后缀
-->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
开发过程中我们程序员需要根据业务开发的是 Handler 处理器和 View 视图,但其他的每一步都至关重要,在 SpringMVC 的整个工作流程中,了解它的每一步作用,更有利于日后的学习和理解。