一、初识Spring MVC
1.1 Spring MVC概述
Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架,是一种基于java的实现请求驱动类型(使用请求-响应模型)的轻量级框架,即使用了MVC架构模式的思想,将web层进行职责解耦,以便简化我们的开发。它与Struts 2框架一样,都属于MVC框架,但其使用和性能等方面比Struts 2更加优异。
Spring MVC即Model(模型)—View(视图)—Controller(控制器)三元组,其工作状态一般分为四个步骤:
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,也就是指客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作,在Web MVC模式下,模型无法主动推数据给视图,如果用户想要视图的更新,就需要在此发送请求,即请求—响应模型。
1.2 Spring MVC的工作流程
这些执行过程中,DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver对象的工作是在框架内部执行的,我们并不需要关心这些对象背部的实现过程,只需要配置前端控制器,完成Controller类中的业务处理,并将响应的信息显示在视图中即可。
1.3 Spring MVC优点
- 是Spring框架的一部分,可以方便地利用Spring所提供的其他功能;
- 灵活性强,易于与其他框架集成;
- 提供了一个前端控制器,是开发人员无需额外开发控制器对象;
- 可自动绑定用户输入,并能正确的转换数据类型;
- 内置了常见的校验器,可以校验用户输入。如果校验不能通过,name就会重定向到输入表单;
- 支持国际化。可以跟据用户区域西显示多国语言;
- 支持多种视图技术;
- 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序。
1.3 Spring MVC入门应用
基于Spring MVC的具体实现步骤(这里我们以maven中的模块为例):
1. 创建项目,并在pom文件中导入相关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>cn.springMVC1</groupId>
<artifactId>springMVC1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springMVC1 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>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>springMVC1</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2. 在web.xml文件中配置前端控制器
<?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_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!--配置前端过滤器-->
<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:applicationContext-springmvc.xml</param-value>
</init-param>
<!--表示容器在启动时立即加载Servlet 这个值越小,启动级别越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--这个“/”就是指匹配不到.jsp,所以默认不拦截jsp页面,其他页面和请求一律拦截,也就是.jsp不会进入spring的DaispatcherServlet类;
会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
“/*”表示会匹配所有url,路径和后缀型的url(包括/login,*.jsp和.html等等)
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
小贴士:
"/“与”/"的区别:
“/”:表示会匹配所有url,路径和后缀型的url(包括/login,.jsp和.html等等,也就是会拦截所有;
“/*”:表示会匹配到/login这样的路径型url,不会匹配到模式为.jsp这样的后缀型url,也就是除了jsp页面拦截所有。
3. 创建HelloController类
package cn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 控制器类
*/
@Controller
public class HelloController {
@RequestMapping("/showHello")
public String showHello(){
//这里只写了Hello,是因为在springmvc文件里已经启用了注解
return "Hello";
}
}
4. 创建Spring MVC的配置文件,并配置控制器映射信息(这里我们配置的的是注解方式)
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--指定Spring要扫描的包-->
<context:component-scan base-package="cn.controller"/>
<!--启用SpringMVC注解-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--后缀:表示加载以.jsp结尾的文件-->
<property name="suffix" value=".jsp"/>
<!--前缀:表示加载这个目录下的文件-->
<property name="prefix" value="/WEB-INF/jsp/"/>
</bean>
5. 创建视图页面Hello.jsp
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>MySpringMVC</title>
</head>
<body>
<h2>Hello MySpringMVC!</h2>
</body>
</html>
至此,我们的第一个Spring MVC就创建好了!