SpringMVC
一、概述
-
MVC
是一种软件架构思想,将软件按照模型、视图、控制器类划分
M:model,模型层,用来处理数据,指Service、Dao、Pojo
V:view,视图层,用来与用户交互,展示数据,指html页面或jsp页面
C:controller,控制层,用来接收请求、处理请求、响应浏览器,指Servlet组件
-
MVC工作流程
用户通过Browser浏览器(视图层 V)发送请求到服务器,在服务器中请求被Servlet组件(控制层 C)接收,Servlet 调用Service(模型层 M)根据不同的请求进行对应的处理,处理的结果返回Servlet组件(控制层 C),Servlet根据处理的结果投射到相应的html页面上(视图层 V),进行数据渲染后相应到Browser浏览器上
-
SpringMVC
是SpringMVC是Spring的一个后续产品,是Spring为表述层开发提供的一整套完备的解决方案,目前业界普遍选择SpringMVC作为JavaEE项目表述层开发的首选方案
曾经的表述层框架:Strust、WebWork、Strust2等
-
SpringMVC的特点
① Spring家族原生产品,与IOC容器等基础设施无缝对接
② 基于原生的Servlet,通过功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
③ 性能卓越,适合现代大型、超大型互联网项目的要求
二、搭建环境
-
创建一个maven工程
-
对maven工程的核心配置文件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>com.atguigu.mvc</groupId> <artifactId>demo01</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <!-- 1.配置打包方式为 war 包 --> <packaging>war</packaging> <!-- 2.添加依赖 --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.1</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> </dependencies> </project>
-
配置后通过maven加载对应的jar包
-
添加web模块,在main目录下新建一个webapp文件夹
-
在web模块下创建web.xml配置文件
三、配置文件
-
在 web.xml 内配置SpringMVC前端控制器DispatcherServlet 及 url请求模型
<?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"> <!--1.配置组件的别名和全类名 因为SpringMVC的前端控制器DispatcherServlet基于Servlet,故使用配置Servlet的方式 配置DispatcherServlet从而对浏览器发送的请求进行统一处理 --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 3.通过初始化参数,配置SpringMVC的xml配置文件的位置和名称 ① 参数名一定是SpringMVC在其前端控制器DispatcherServlet中定义好的某参数,这样 才会产生对应的功能,此处的param-name:contextConfigLocation,指的是 上下文配置路径 ② contextConfigLocation参数对应的param-value设置的是两部分内容,一个是位置, 一个是名称。 所以一定要加上classpath(类路径),classpath对应的就是java或resources(即 main文件夹下的两个文件夹) ③ 同时,要在resources文件夹下创建一个与classpath后同名的xml配置文件,该xml文件 为spring类型的xml文件,因为springMVC本质就是基于Spring的基础实现的 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC.xml</param-value> </init-param> <!-- 4.设置DispatcherServlet的启动时间 因为DispatcherServlet会处理所有的请求,故其初始化时就会执行很多的内容,如果把 这些众多的内容全部放在第一次初始化时执行,就会严重影响我们第一次访问时的速度。 故通过下面设置,将DispatcherServlet的初始化时间提前到服务器启动时 --> <load-on-startup>1</load-on-startup> </servlet> <!-- 2.配置与组件的别名相匹配的url请求模型,即前端控制器DispatcherServlet所能处理的请求的路径 模型 因为DispatcherServlet要处理浏览器发送的所有请求,故此处的url-pattern不能写成某一个 具体的路径,所以写成了:"/"。 "/":所能匹配的请求可以是.html或.js或.css或/login等各种不同的请求方式,同时屏蔽.jsp 的请求 注: ① "/" 之所以不能匹配.jsp的请求,是因为jsp本质上也是servlet,需要服务器中特定的 Servlet组件进行处理后转到jsp页面,故DispatcherServlet不会也不能去匹配.jsp的请求 ② url-pattern不能使用"/*",因为"/*"表示所有类型的请求,包含.jsp --> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
在resources文件夹下创建 SpringMVC.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: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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
-
创建请求控制器
由于DispatcherServlet对Browser发来的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建具体请求的类,即请求控制器。
请求控制器内对应每一个请求的处理方法称为控制器方法
因为SpringMVC的控制器是由一个普通的Java类担任,因此需要通过@Controller注解将其标识成一个控制层组件,交给SpringMV的IOC容器管理
@Controller public class HelloController {}
-
配置SpringMVC.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: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"> <!-- 1.组件扫描 --> <context:component-scan base-package="com.atguigu.mvc"/> <!-- 2.配置Thymeleaf视图解析器 ① order:设置优先级。从而可以推断,在一个xml中可以配置多个Thymeleaf视图解析器 ② WEB-INF文件夹下的文件是不能通过Browser或重定向访问的,只能通过转发 ③ 视图名称通过Thymeleaf解析后,会自动加上视图前缀和视图后缀 --> <bean id="viewResolve" 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> </beans>
-
在WEB-INF文件夹下创建templates文件夹,用于存放前端文件
四、访问页面
-
访问主页面
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>首页</h1> </body> </html>
java
@Controller public class HelloController { /* 注解@RequestMapping 1.通过注解@RequestMapping中的value值,将请求与控制器方法进行匹配,其匹配的类型还有很多种 2.这种匹配方式与方法名无关 3.首次匹配与tomcat服务器中的url请求设置有关 4.返回值:是视图名称,会被thymeleaf视图解析器进行解析,然后加上前缀和后缀,跳转到具体的 html页面 */ @RequestMapping(value = "/") public String index() { return "index"; } }
-
访问目标页面
html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <!-- 访问目标页面 1.前台路径是指,由浏览器解析执行的代码中所包含的路径。例如,html、css、js中的路径。 2.前台路径的参照路径是 Web 服务器的根路径,即 http://localhost:8080/ 3.添加th:后,该请求路径被thymeleaf进行了渲染,会自动添加上上下文路径,上下文路径是在 Tomcat服务器中的applicationContext中配置好的: 4.访问路径 = 参照路径 + 上下文路径 + 前台路径 --> <a th:href="@{/target}">访问目标页面target</a> </body> </html>
注:tomcat中配置的上下文路径
java
@Controller public class HelloController { /* 1.html页面上通过超链接标签href发来的请求 改 */ @RequestMapping(value = "/target") public String toTarget() { return "target"; } }
五、总结
-
功能体简介
Tomcat
实现JavaEE规范中的Servlet和JSP的轻量级服务器
Servlet
全称为Java Servlet,服务连接器,用于交互式浏览和生成数据,生成动态的web内容,并用于扩展基于HTTP协议的web服务器
Thymeleaf
是适用于Web和独立环境的现代服务器端Java模板引擎,模板引擎的作用是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档。从字面上理解
模板引擎
,最重要的就是模板二字,这个意思就是做好一个模板后套入对应位置的数据,最终以html的格式展示出来,这就是模板引擎的作用。Thymeleaf选用html作为模板页,这是任何一款其他模板引擎做不到的!Thymeleaf使用html通过一些特定标签语法代表其含义,但并未破坏html结构,即使无网络、不通过后端渲染也能在浏览器成功打开,大大方便界面的测试和修改。
maven
Maven是一个(特别是Java编程)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
-
SpringMVC的具体执行流程