type
status
date
slug
summary
tags
category
icon
password
Author:Shine
Version:9.0.2

一、SpringMVC


1.1 引言

java开源框架,Spring Framework的一个独立模块。
MVC框架,在项目中开辟MVC层次架构
对控制器中的功能 包装 简化 扩展践行工厂模式,功能架构在工厂之上

1.2 MVC架构

1.2.1 概念

名称
职责
Model
模型:即业务模型,负责完成业务中的数据通信处理,对应项目中的 service和dao
View
视图:渲染数据,生成页面。对应项目中的Jsp
Controller
控制器:直接对接请求,控制MVC流程,调度模型,选择视图。对应项目中的Servlet

1.2.2 好处

MVC是现下软件开发中的最流行的代码结构形态;人们根据负责的不同逻辑,将项目中的代码分成 M V C 3个层次;层次内部职责单一,层次之间耦合度低;符合低耦合 高内聚的设计理念。也实际有利于项目的长期维护。

二、开发流程


2.1 导入依赖

2.2 配置核心(前端)控制器

作为一个MVC框架,首先要解决的是:如何能够收到请求!
所以MVC框架大都会设计一款前端控制器,选型在 Servlet 或 Filter两者之一,在框架最前沿率先工作,接收所有请求。
此控制器在接收到请求后,还会负责springMVC的核心的调度管理,所以既是前端又是核心。

2.3 后端控制器

等价于之前定义的Servlet

2.4 配置文件

默认名称:核心控制器名-servet.xml 默认位置:WEB-INF
随意名称:mvc.xml 随意位置:resources 但需要配置在核心控制器中

2.5 访问

三、接收请求参数


3.1 基本类型参数

请求参数和方法的形参 同名即可
springMVC默认可以识别的日期字符串格式为: YYYY/MM/dd HH:mm:ss 通过@DateTimeFormat可以修改默认日志格式

3.2 实体收参【重点

请求参数和实体的属性 同名即可

3.3 数组收参

简单类型的 数组

3.4 集合收参 【了解】

3.5 路径参数

3.6 中文乱码

首先,页面中字符集统一
其次,tomcat中字符集设置,对get请求中,中文参数乱码有效
最后,设置此filter,对post请求中,中文参数乱码有效

四、跳转


4.1 转发

4.2 重定向

4.3 跳转细节

在增删改之后,为了防止请求重复提交,重定向跳转在查询之后,可以做转发跳转

五、传值


C得到数据后,跳转到V,并向V传递数据。进而V中可以渲染数据,让用户看到含有数据的页面
转发跳转:Request作用域
重定向跳转:Session作用域

5.1 Request和Session

5.2 JSP中取值

建议:重点复习 EL JSTL

5.3 Model

5.4 ModelAndView

5.5 @SessionAttributes

@SessionAttributes({"gender","name"}) :model中的 name和gender 会存入session中SessionStatus 移除session

六、静态资源


6.1 静态资源问题

静态资源:html,js文件,css文件,图片文件
静态文件没有url-pattern,所以默认是访问不到的,之所以可以访问,是因为,tomcat中有一个全局的servlet:org.apache.catalina.servlets.DefaultServlet,它的url-pattern是 "/",是全局默认的Servlet. 所以每个项目中不能匹配的静态资源的请求,有这个Servlet来处理即可。
但,在SpringMVC中DispatcherServlet也采用了 “/” 作为url-pattern, 则项目中不会再使用全局的Serlvet,则静态资源不能完成访问。

6.2 解决方案1

DispathcerServlet采用其他的url-pattern
此时,所有访问handler的路径都要以 action结尾!!

6.3 解决方案2

DispathcerServlet的url-pattern依然采用 "/",但追加配置

6.4 解决方案3

mapping是访问路径,location是静态资源存放的路径将/html/** 中 /**匹配到的内容,拼接到 /hhh/后 http://..../html/a.html 访问 /hhh/a.html

七、Json处理


7.1 导入依赖

7.2 使用@ResponseBody

7.3 使用@RestController

Controller类上加了@RestController注解,等价于在类中的每个方法上都加了@ResponseBody

7.4 使用@RequestBody

@RequestBody, 接收Json参数

7.4.1 定义Handler

7.4.2 Ajax发送json

7.5 Jackson常用注解

7.5.1 日期格式化

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

7.5.2 属性名修改

@JsonProperty("new_name")

7.5.3 属性忽略

@JsonIgnore

7.5.4 null和empty属性排除

Jackson 默认会输出null值的属性,如果不需要,可以排除。
@JsonInclude(JsonInclude.Include.NON_NULL) //null值 属性不输出 @JsonInclude(value= JsonInclude.Include.NON_EMPTY) // empty属性不输出( 空串,长度为0的集合,null值)

7.5.5 自定义序列化

@JsonSerialize(using = MySerializer.class) // 使用MySerializer输出某属性

7.6 FastJson

7.6.1 导入依赖

7.6.2 安装FastJson

7.6.3 使用

@ResponseBody @RequestBody @RestController 使用方法不变

7.6.4 常用注解

日期格式化:@JSONField(format="yyyy/MM/dd")属性名修改:@JSONField(name="birth")忽略属性:@JSONField(serialize = false)包含null值:@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) 默认会忽略所有null值,有此注解会输出null@JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) null的String输出为""自定义序列化:@JSONField(serializeUsing = MySerializer2.class)

八、异常解析器


8.1 现有方案,分散处理

Controller中的每个Handler自己处理异常
此种处理方案,异常处理逻辑,分散在各个handler中,不利于集中管理

8.2 异常解析器,统一处理

Controller中的每个Handler不再自己处理异常,而是直接throws所有异常。
定义一个“异常解析器” 集中捕获处理 所有异常
此种方案,在集中管理异常方面,更有优势!

九、拦截器


9.1 作用

作用:抽取handler中的冗余功能

9.2 定义拦截器

执行顺序: preHandle--postHandle--afterCompletion

9.3 配置拦截路径

十、上传


10.1 导入jar

10.2 表单

10.3 上传解析器

10.4 Handler

十一、下载


11.1 超链

11.2 Handler

十二、验证码


12.1 作用

防止暴力攻击,前端安全保障

12.2 导入jar

12.3 声明验证码组件

12.4 Page

十三、REST


13.1 开发风格

是一种开发风格,遵从此风格开发软件,符合REST风格,则RESTFUL。
两个核心要求:
  • 每个资源都有唯一的标识(URL)
  • 不同的行为,使用对应的http-method
访问标识
资源
所有用户
用户1
用户1的所有订单
请求方式
标识
意图
GET
查询所有用户
POST
在所有用户中增加一个
PUT
在所有用户中修改一个
DELETE
删除用户1
GET
查询用户1
GET
查询用户1的所有订单
POST
在用户1的所有订单中增加一个

13.2 优点

**输出json:

13.3 使用

13.3.1 定义Rest风格的 Controller

@RequestMapping(value="/users",method = RequestMethod.GET)
等价
@GetMapping("/users")

13.3.2 Ajax请求

十四、跨域请求


14.1 域

域:协议+IP+端口

14.2 Ajax跨域问题

Ajax发送请求时,不允许跨域,以防用户信息泄露。当Ajax跨域请求时,响应会被浏览器拦截(同源策略),并报错。即浏览器默认不允许ajax跨域得到响应内容。互相信任的域之间如果需要ajax访问,(比如前后端分离项目中,前端项目和后端项目之间),则需要额外的设置才可正常请求。

14.3 解决方案

允许其他域访问在被访问方的Controller类上,添加注解
携带对方cookie,使得session可用在访问方,ajax中添加属性:withCredentials: true

十五、SpringMVC执行流程



notion image

十六、Spring整合


16.1 整合思路

此时项目中有两个工厂
  • DispatcherServlet 启动的springMVC工厂==负责生产C及springMVC自己的系统组件
  • ContextLoaderListener 启动的spring工厂==负责生产其他所有组件
  • springMVC的工厂会被设置为spring工厂的子工厂,可以随意获取spring工厂中的组件
  • 整合过程,就是累加:代码+依赖+配置。然后将service注入给controller即可

16.2 整合技巧

两个工厂不能有彼此侵入,即,生产的组件不能有重合。
 
SpringServlet
IT小舟
IT小舟
微信公众号:IT小舟
公告
type
status
date
slug
summary
tags
category
icon
password
notion image
你好,我是小舟。 欢迎来到我的博客,我喜欢运动、阅读、音乐和写作。如果有什么想要交流的,可以加我微信:upcodezhou。再次感谢你的光临!
notion image