在本文中我们会先了解什么是 MVC,SpringMVC,以及如何在 maven 中配置 SpringMVC 环境,最后再通过一个小案例来对 SpringMVC 的使用来进行引入。
什么是 MVC
MVC 是一种软件架构的思想,将软件按照模型(Model)、视图(View)、控制器(Controller)来划分
M:Model,模型层,是指我们工程中所用到的 JavaBean,作用是处理数据
对于 JavaBean 我们可以将其分为两类:
-
实体类 Bean:专门存储业务中所用到的数据和信息,如 Student 、User等
-
业务处理 Bean:专门用于处理业务逻辑和数据访问,如 Service 、Dao
V:View,视图层,指工程中的一些前台页面,用于与用户进行交互,展示数据,如 HTML、JSP等
C:Controller,控制层,指工程中的 servlet,用于接受请求和相应浏览器
MVC 的工作流程:
什么是 SpringMVC
我们都知道软件开发一共分为三层架构,分别是表示层、业务逻辑层、数据访问层,而SpringMVC 则是 Spring 为表述层开发提供的一整套完备的解决方案。
SpringMVC环境配置
在了解了什么是 MVC 和 SpringMVC 后,下面就开始在 maven 中配置 SpringMVC 的环境
1、使用 Maven 创建一个 Web 项目,并引入下面的依赖
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
2、配置 web.xml
注册 SpringMVC 的前端控制器 DispatcherServlet,主要有以下两种方法。
①:默认配置方式
如果要使用默认配置方式,则需将 SpringMVC 的配置文件放在 WEB-INF 下,默认名称为 <servlet-name>-servlet.xml
例如以下配置所对应的配置文件的名称就应该为 springMVC-servlet.xml 并放于 WEB-INF 目录下
<!--配置 SpringMVC 的前端控制器,对浏览器发送的请求进行统一处理-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!-- 设置 SpringMVC 核心控制器所能处理的请求的请求路径
/ 所能匹配的请求可以是 /login 或 .html 或 .js 或 .css 方式的请求路径
但是 / 不能匹配 .jsp 请求路径的请求;而 /* 就可以匹配所有请求,包括 .jsp
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
但是由于我们一般将配置文件都是放在 resources 包下,因此我们常用以下方式来进行配置
②:扩展配置方式
我们可以通过 <init-param> 标签来配置 SpringMVC 的名称和路径
<!--配置 SpringMVC 配置文件的位置和名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
使用 <load-on-startup> 标签来设置前端控制器 DispatcherServlet 的初始化时间
<!--将前端控制器 DispatcherServlet 的初始化提前到服务器启动时-->
<load-on-startup>1</load-on-startup>
配置完成后 web.xml 文件应该包含如下内容
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置 SpringMVC 配置文件的位置和名称-->
<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>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
创建请求控制器
之前我们对浏览器的请求是使用对应的 servlet 来进行处理,而 SpringMVC 则是用前端控制器对浏览器发送的请求进行了统一的处理。但是具体的请求有不同的处理过程,因此我们需要创建处理具体请求的类,即请求控制器。请求控制器中每一个处理请求的方法称为控制器方法
我们可以通过 @Controller 注解来将一个普通的 Java 类标识为控制器组件,通过扫描 SpringMVC 才能知道其是一个控制器
@Controller
public class HelloController{
}
配置 SpringMVC 配置文件
在 resources 文件夹中创建了 springMVC.xml 文件作为 SpringMVC 配置文件,该配置文件的名称与路径应与 web.xml 中配置的一致,下面就开始配置该文件
首先我们要开启扫描组件,同样需开启对应的名称空间
<!--开启扫描组件-->
<context:component-scan base-package="com.zhouyue.mvc.controller"></context:component-scan>
然后配置视图解析器,我们在视图解析器里面添加了视图前缀 "/WEB-INF/templates/",表明视图在该路径下;添加了视图后缀 .html,表明视图为 html 类型。我们在页面跳转时就可以直接使用视图名称来进行跳转。
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
入门小案例
在开始小案例之前应配置好上面所需的配置文件
首先我们来实现对首页的访问
先在 WEB-INF/templates/ 目录下创建 index.html 页面,注意要加上是 xmlns:th="http://www.
thymeleaf.org" 后面使用 Thymeleaf 需要
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
</body>
</html>
我们在 HelloController 控制器中来实现页面的跳转
@RequestMapping:用来将请求和控制器方法创建映射关系,简单来说当我们访问 http://localhost:8080/springMVC/ 时该注解就会将我们的请求与 index() 方法创建映射关系,返回视图名称进行对应页面的跳转。注意:不能出现一个请求对应多个控制器方法。
@Controller
public class HelloController {
// "/" --> WEB-INF/templates/index.html
//使用 @RequestMapping 注解来将请求和控制器方法创建映射关系
@RequestMapping(value = "/")
public String index(){
//返回视图名称
return "index";
}
}
然后我们来实现访问指定页面
我们可以直接在 index.html 中添加如下形式的链接,href 中为绝对路径
<a href="/springMVC/target">访问目标页面 target.html </a>
但是由于上下文路径 springMVC 是可以更改的,因此我们需要让其动态变化。可以利用 Thymeleaf ,通过如下形式来进行实现。
<a th:href="@{/target}">访问目标页面 target.html </a>
控制器处理请求的方法,这样我们点击跳转链接就可以进行页面跳转
@RequestMapping(value = "/target")
public String toTarget(){
return "target";
}