SpringMVC学习笔记-基础入门
三层架构与MVC模式

可以看看我之前写的文章!!!
(1)MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的表现层 ,也就是说, MVC把三层架构中 的表现层再度进行了分化,分成了控制器、视图、实体三个部分,
(2)MVC可以是三层中的一个表现层框架,属于表现层。三层和mvc可以共存。
(3)三层是基于业务逻辑来分的,而MVC是基于页面来分的。
(4)三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协作关系。
三层架构
-
表现层:负责数据展示
-
业务层:负责业务处理
-
数据层:负责数据操作
MVC

MVC(Model View Controller),一种用于设计创建Web应用程序表现层的模式
Model(模型):数据模型,用于封装数据
View(视图):页面视图,用于展示数据
-
jsp
-
html
Controller(控制器):处理用户交互的调度器,用于根据用户需求处理程序逻辑
-
Servlet
-
SpringMVC
浏览器发出一个请求request,浏览器最后希望的是得到一个页面。我们需要将Model中的数据放到View的页面中,两者组合起来的工作由Controller来做!所以三者是相互协调的。Model、View、Controller三者协同可以生成用户想要看到的页面,再由response相应回给浏览器。
SpringMVC
简介
SpringMVC在三层架构中属于表现层,是一种基于Java实现的MVC模型的轻量级Web框架。

优点
- 使用简单
- 性能突出
- 灵活性强
SpringMVC入门案例
项目结构

详细代码
从我们开始学习SSM框架的时候,我们一般都使用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.Harmony</groupId>
<artifactId>SpringMVC_demo01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring web的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring mvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
<!--构建-->
<build>
<!--设置插件-->
<plugins>
<!--具体的插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
由于是有用到web,所以我们设置打包的方式是war包。导入servlet,jsp,spring,springweb、springwebmvc的架包,最后我们之后项目是在maven的tomcat插件下跑的所以在<build>中配置一下。
UserController
//设置当前类为Spring的控制器类
@Controller
public class UserController {
//设定当前方法的访问映射地址
@RequestMapping("/save")
//设置当前方法返回值类型为String,用于指定请求完成后跳转的页面
public String save(){
System.out.println("user mvc controller is running ...");
//设定具体跳转的页面
return "success.jsp";
}
}
我们将Controller层下的UserController配置成一个bean
然后使用@RequestMapping() 进行页面跳转(后续的文章我们会介绍该注解...)
spirng-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<!--扫描加载所有的控制类类-->
<context:component-scan base-package="com.Harmony"/>
</beans>
我们最好将Spring与SpringMVC区分开,即在SpringMVC中使用的bean就写在spirng-mvc.xml中。
success.jsp
<%@page pageEncoding="UTF-8" language="java" contentType="text/html;UTF-8" %>
<html>
<body>
<h1>第一个spring-mvc页面</h1>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
version="3.0">
<!--要配置servlet,在SpringMVC中叫 DispatcherServlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载配置文件 spring-mvc.xml -->
<init-param>
<!--表示加载的是配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--表示拦截所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在web.xml中我们的配置和之前学习Servlet的配置类似!只不过之前是使用Serlvet类,现在使用DispatcherServlet前端控制器(详细内容我们在之后叙述!)
注意我们需要加上<init-param>标签,即初始化参数,只有这样子我们才能将spring-mvc.xml加载进去!
运行如下:

执行流程分析
服务器启动的时候,项目首先加载web.xml,加载了一个Servlet,但是这里的Servlet是SpringMVC专门提供的!DispatcherServlet是SpringMVC的核心控制器,在<init-param>要求加载spring-mvc.xml核心配置文件,该文件中加载了所有SpringMVC所需要的bean。
项目跑起来后,我们在浏览器输入localhost/save(发了一个请求),由<servlet-mapping>中得知要过滤所有的请求,然后到spring-mvc.xml找bean,看看哪一个bean有对应的操作名“/save”,找到后就运行对应的方法,并且按照return的内容找页面,最后将页面的内容作为响应,返回给浏览器。
SpringMVC工作流程(超重点!!!)
组件介绍&架构图
-
DispatcherServlet:前端控制器, 是整体流程控制的中心,由其调用其它组件处理用户的请求, 有效的降低了组件间的耦合性
-
HandlerMapping:处理器映射器, 负责根据用户请求找到对应具体的Handler处理器
-
Handler:处理器,业务处理的核心类,通常由开发者编写,描述具体的业务
-
HandlAdapter:处理器适配器,通过它对处理器进行执行
-
View Resolver:视图解析器, 将处理结果生成View视图
-
View:视图,最终产出结果, 常用视图如jsp、 html

上述这些组件需要我们开发者自己写的只有HandlerMapping、Handler。
详细流程

(1)浏览器发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。并且会加载springmvc.xml配置文件。
(2)前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc.xml中配置的或者注解的url与对应的处理类找到并进行存储,用map<url,handler>这样的方式来存储。
(3)HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。
(4)DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。
(5)执行处理器Handler
(6)处理器会返回一个ModelAndView对象给HandlerAdapter
(7)通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)
(8)前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象
(9)返回视图对象到前端控制器。
(10)视图渲染,就是将ModelAndView对象中的数据放到响应request域中,用来让页面加载数据的。
通过第8步,通过名称找到了对应的页面,通过第10步,request域中有了所需要的数据,那么就能够进行视图渲染了。最后将其返回即可。

浙公网安备 33010602011771号