SpringMVC
1 Overview
学习方法 课程说明 秦老师课前说的:
2020年4月23日 发布
SE 入门, 能看懂代码
Web 框架在精简它
框架 按正常, 这里是要从官网文档自学的, 不能再被老师带. 锻炼自学能力, 锻炼笔记能力, 锻炼项目能力
SSM整合, 相当于在Web阶段的项目
Spring IoC和AOP特别重要, 要再复习
SpringMVC中也有个很重要的东西, 执行流程
博客很重要, 工作时如果没有对应文档, 可能会崩溃
版本: 老师用5.1.9, 我自己选用了5.2.0
1.1 MVC
模型(DAO service) | 视图(jsp) | 控制器(Servlet)
后端很多特别牛批的控制器, 很多底层也都是Servlet
职责
Controller 1. 取得表单数据 2. 调用业务逻辑 3. 转向指定页面
Model 1. 业务逻辑 2. 保存数据状态
View 显示页面
pojo:
- vo: 视图层的实体类对象, 更灵活
- dto: 数据传输时的对象
- …
面试: 你的项目的架构是设计好的还是演进的??
坑 一般都是演进的. 才合理. 阿里巴巴, MySQL --> AliSQL --> AliRedis
所有项目一般都是All in one --> 微服务
1.2 SpringMVC
为什么要用它呢?
- 轻量, 易学
- 高效地, 基于请求\响应的框架. (不是以事件为驱动)
- 可与SpringFramework无缝集成
- 约定优于配置
- 功能强大, 支持: RESTful | 数据合法验证 | 异常处理 | 拦截器 …
- 市占率高
RESTful, 不需要问号拼接参数
1.3 基本原理 执行流程
A - DispatcherServlet
Spring的web框架围绕 DispatcherServlet 设计
作用: 转发\调度 ,将请求分发到不同"处理器"
本质: 还是Servlet, 如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ScKeGjYf-1587626996863)(D:\微云同步助手\364291826\同步文件夹\知识库\10 - md文库 秦疆老师\框架\SpringMVC.assets\image-20200422105032987.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZK1wibv-1587626996865)(D:\微云同步助手\364291826\同步文件夹\知识库\10 - md文库 秦疆老师\框架\SpringMVC.assets\image-20200421214015127.png)]
中文版
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIyZM00F-1587626996866)(SpringMVC.assets/image-20200422111900346.png)]
秦老师的图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pW9fkAAz-1587626996869)(SpringMVC.assets/image-20200422114808087.png)]
基本原理 - 简述: (based on 老师公众号)
DispatcherServlet
, 代表FrontController
, 是整个SpirngMVC的"控制中心". 用户发出request, DS接收请求. 解析URL:- 例如:
http://localhost:8080/SpringMVC/hello
http://localhost:8080
- 服务器域名端口/SpringMVC
- 部署在服务器上的具体web站点/hello
- 控制器- 综述: 请求位于服务器上"SpringMVC站点"的"hello"控制器
- 例如:
HandlerMapping
根据url中信息, 中众多注册过的Handler们中找具体的HandlerExecution
(理解不太深刻), 主要作用是根据url\查找控制器helloHandlerAdapter
按特定规则执行Handler, Handler再让具体的Controller执行Controller
调用执行我们写的业务代码, 得到数据, 存入ModelAndView
对象, 并把该对象返回给Adapter
, 再给DS- DS调用
ViewResolver
解析mv对象中的"逻辑视图名", 同时将数据渲染给这个具体的View - DS通过逻辑视图名, 找到渲染好的View, 呈现
摘自老师: 没有笨人只有懒人
基本原理 - 个人理解:
HandlerMapping
是众多Handler们的映射器 注册中心, 通过它找到具体的Handler的信息, 把信息告诉给DS, DS再通过Adapter调用具体的handler, 也就是我们写的Controller
ModelAndView
是Controller方法的返回值, 理解可以认为"给前端带个需要的值, 并且指定哪个页面文件"
ViewResolver
作用
- 提取mv中model中的数据
- 解析mv中指定的view名字信息
- 拼接前缀路径+视图名字+后缀, 找到对应view
- 将数据渲染到view中
- 个人理解: VR是从MandV中提取出数据和指定view信息, 再把两者结合(渲染), 丢给DS, DS展现…ok
B - 补充: Maven资源过滤问题
Maven存在资源过滤问题, 经常出现xml文件编辑后不能正常out到target中, 可以在parent module的pom.xml中添加以下代码来解决:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
1.4 RESTful
(已经比较熟悉了, 这里只补充一些)
作用:
- 简洁, 显而易见
- 高效 (支持缓存)
- 可能有一定安全性, 因为url上可以避免暴露太多后台代码信息 (秦老师看法)
注意点:
- requestMapping有相同url, 但接收请求的method不同的 (一个get 一个post), 则会根据实际请求方式不同自动匹配
- 别忘了
@PathVariable
1.5 小黄鸭调试法
向自己, 如同向他人一样, 解释一下代码的作用 流程. 说到一半可能就明白了
2 Hello SpringMVC
2.1 通过代码理解: XML
手动配置各个组件, 用Spring + SpringMVC实现一次HelloWorld!
-
确保Maven中webmvc的依赖正确导入, 确保projectStructure > artifact > 中依赖都正确
-
准备好一个SpringFramework的核心配置文件: springmvc-servlet.xml, in resources目录(classpath:)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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"> </beans>
-
配置DispatcherServlet: in 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_4_0.xsd" version="4.0"> <!--配置DS--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--DS需要绑定Spring的核心配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别: 1--> <load-on-startup>1</load-on-startup> </servlet> <!--斜杠和斜杠* 有区别: 斜杠只匹配请求,斜杠*匹配请