SpringMVC介绍和使用
一、概念介绍
1.1三层结构介绍
我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器;另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构包括:表现层、业务层、持久层
- 表现层
- 也就是我们常说的web层,她负责接收客户端请求,向客户端相应结果,通常客户端使用http协议请求web层,web需要接收http请求,完成http响应
- 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示
- 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端
- 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)
- 业务层
- 也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web 层依赖业务层,但是业务层不依赖 web 层
- 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的, 事务应该放到业务层来控制)
- 持久层
- 也就是我们是常说的 dao 层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行增删改查的。
1.2 MVC设计模式介绍
MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职:
- Model(模型)
- 模型包含业务模型和数据模型,数据模型用于封装数据,业务模型用于处理业务
- View(视图)
- 通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。
- 通常视图是依据模型数据创建的
- Controller(控制器):
- 是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。
1.3SpringMVC介绍
Spring MVC是什么?
- SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring 的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。
- SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。
- 它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。
总之:
Spring MVC和Struts2一样,都是为了解决表现层问题的web框架,它们都是基于MVC设计模式的。而这些表现层框架的主要职责就是处理前端HTTP请求。
Spring MVC由来?
Spring MVC全名叫Spring Web MVC,它是Spring家族Web模块的一个重要成员。这一点,我们可以从Spring的整体结构中看得出来:
为什么学习SpringMVC?
SpringMVC的市场占有率是40%,而Struts2只有可怜的6%。这已然说明了学习SpringMVC的必要性了,再说了,SpringMVC本身就是spring家族的一员,与整合spring时,SpringMVC根本无需中间整合包,而struts2得需要。
1.4 SpringMVC如何处理请求?
SpringMVC是基于MVC设计模式的,MVC模式指的就是Model(业务模型)、View(视图)、Controller(控制器)。SpringMVC处理请求的过程就是通过MVC这三个角色的功能来实现的。
不过千万不要把MVC设计模式和工程的三层结构混淆,三层结构指的是表现层、业务层、数据持久层。而MVC只针对表现层进行设计。
二、入门程序
2.1学习目标
- 如何配置前端控制器
- 如何开发处理器
2.2 入门需求
访问/queryItem,返回商品列表页面,商品数据暂时使用静态数据(不从数据库查询)。
2.3 开发环境
Jdk:jdk1.8
IDE:IDEA
Tomcat:apache-tomcat-8.5.x
SpringMVC:5.0.7
Maven:3.3.9
2.4工程搭建
2.4.1 创建一个maven web 工程
工程名称为:springmvc
2.4.2 POM文件添加依赖
就是spring ioc依赖、aop依赖、mvc依赖、jstl依赖还有servlet-api依赖
<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.kkb</groupId> <artifactId>springmvc-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- spring ioc组件需要的依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.0.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.0.7.RELEASE</version> </dependency> <!-- 基于AspectJ的aop依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.7.RELEASE</version> </dependency> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <!-- spring MVC依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.7.RELEASE</version> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <!-- 配置Maven的JDK编译级别 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configu
2.5 开发步骤
2.5.1 MVC中的C:配置前端控制器
在web.xml中添加DispatcherServlet的配置。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- 学习前置条件 --> <!-- 问题1:web.xml中servelet、filter、listener、context-param加载顺序 --> <!-- 问题2:load-on-startup标签的作用,影响了servlet对象创建的时机 --> <!-- 问题3:url-pattern标签的配置方式有四种:/dispatcherServlet、 /servlet/* 、* 、/ ,以上四种配置,加载顺序是如何的--> <!-- 问题4:url-pattern标签的配置为/*报错,原因是它拦截了JSP请求,但是又不能处理JSP请求。为什么配置/就不拦截JSP请求,而配置/*,就会拦截JSP请求--> <!-- 问题5:配置了springmvc去读取spring配置文件之后,就产生了spring父子容器的问题 --> <!-- 配置前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 设置spring配置文件路径 --> <!-- 如果不设置初始化参数,那么DispatcherServlet会读取默认路径下的配置文件 --> <!-- 默认配置文件路径:/WEB-INF/springmvc-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 指定初始化时机,设置为2,表示Tomcat启动时,DispatcherServlet会跟随着初始化 --> <!-- 如果不指定初始化时机,DispatcherServlet就会在第一次被请求的时候,才会初始化,而且只会被初始化一次 --> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- URL-PATTERN的设置 --> <!-- 不要配置为/*,否则报错 --> <!-- 通俗解释:/*,会拦截整个项目中的资源访问,包含JSP和静态资源的访问,对于静态资源的访问springMVC提供了默认的Handler处理器 --> <!-- 但是对于JSP来讲,springmvc没有提供默认的处理器,我们也没有手动编写对于的处理器,此时按照springmvc的处理流程分析得知,它短路了 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- <servlet> --> <!-- <servlet-name>sss</servlet-name> --> <!-- <servlet-class>sss</servlet-class> --> <!-- </servlet> --> <!-- <servlet-mapping> --> <!-- <servlet-name>sss</servlet-name> --> <!-- <url-pattern>/sss</url-pattern> -->
2.5.2 创建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" xmlns:mvc="http://www.springframework.org/schema/mvc" 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">
2.5.3 MVC中的M:编写处理器
处理器开发方式有多种:实现HttpRequestHandler接口、实现Controller接口、注解方式等。
不过企业开发中,推荐使用注解方式开发处理器,本课程讲解的就是注解方式
注解方式必要的注解主要有以下两个:
- @Controller注解:在类上添加该注解,指定该类为一个请求处理器,不需要实现任何接口或者继承任何类。
- @RequestMapping注解:在方法上或者类上添加该注解,指定请求的url由该方法处理。如果url-pattern配置的是*的话,url中的“”可以加也可以不加。
处理器的返回值是ModelAndView对象,该对象的具体理解如下:
ModelAndView:方法返回值对象,该对象包含两个功能:
- 一个是将数据存储到Request域中
- 一个是设置响应视图,比如将视图设置为“/WEB-INF/jsp/item-list.jsp”
2.5.4MVC中的M:配置处理器
使用组件扫描器省去在spring容器配置每个controller类的繁琐。
使用<context:component-scan>自动扫描标记@controller的控制器类,在springmvc.xml配置如下:
<!-- 扫描controller注解,多个包中间使用半角逗号分隔 --> <context:component-scan base-package="org.example.demo"/>
2.6访问测试
http://localhost:8080/queryItem
三、springMVC原理分析
3.1框架结构
3.2架构流程
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 HandlerAdapter执行处理器(handler,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将handler执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View对象
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户
3.3组件说明
-
DispatcherServlet:前端控制器
- 用户请求到达前端控制器,它就相当于mvc模式中的C,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
- HandlerMapping:处理器映射器
- HandlerMapping负责根据用户请求找到Handler处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- handler:处理器
- Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
- 由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
- HandlerAdapter:处理器适配器
- 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
- View Resolver:视图解析器
- View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
- View:视图
- springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
- 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
说明:
在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开发的组件有:处理器、视图