Spring思维导图,让Spring不再难懂(mvc篇)
Spring MVC 教程目录:
1)经典的MVC架构
存在的问题:1、控制器负责流程控制、请求数据整理与校验、模型与视图选择等功能,过于复杂。2、模型层没有进行分层设计
2)改进的MVC设计
a、控制器功能拆分:Front Controller + Application Controller + Page Controller + Context
前端控制器:表现层提供统一访问点,主要负责流程控制
应用控制器:负责选择具体的页面控制器(处理器)和具体的视图
页面控制器:功能处理代码,收集参数、封装参数到模型,转调业务对象处理模型,返回逻辑视图名交给前端控制器(和具体的视图技术解耦)
b、模型(JavaBean)采用三层架构
Spring MVC 框架图
1)设计原则:约定大于配置(惯例优先原则)的契约式编程
2)DispatcherServlet -> 前端控件器, HandlerMapping与ViewResolver -> 应用控制器, Handler -> 页面控制器
2)web.xml 用于配置过滤条件、DispatcherServlet
3)用于设置DispatcherServlet上下文bean的配置文件默认路径:WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml
1)DispatcherServlet相关属性可在web.xml中配置,如配置文件路径
2)DispatcherServlet的默认配置在DispatcherServlet.properties(和DispatcherServlet类在一个包下)中
第四章 Controller接口控制器详解
Controller接口类图,其中,Spring 4 不支持BaseCommandController
继承自Controller接口的实现类AbstractController,可实现:
1)请求类型限定,如post
2)session校验
3)缓存控制,如强缓存、协商缓存
无功能处理,直接映射到视图的Controller接口的实现类:
1、ParameterizableViewController 指定某一视图名
2、UrlFilenameViewController 采用Ant-style 模式进行匹配,通过url生成视图名
一个Controller能够映射多个功能处理方法的实现类:MultiActionController,两种使用方式:
1)继承MultiActionController
2)直接实例化MultiActionController, 定义并注入delegate
5、 4.16 数据类型转换和数据验证
a、 4.16.1 数据类型转换
PropertyEditor被限制为只能String<——>Object之间转换,不能Object<——>Object,包括两类
1)Spring内建的PropertyEditor
2)用户自定义,需继承PropertyEditorSupport ,用户自定义PropertyEditor有三类注册方式:
a、WebDataBinder:针对单个控制器,暂无使用方式
b、WebBindingInitializer:批量注册,MultiActionController中存在setter方法,可通过bean注入
c、使用约定自动全局注册:自定义的PropertyEditor放在和模型类同包下,且Editor命名规则必须是“模型类名Editor”
b、 4.16.2 数据类型验证
接口为HandlerInterceptor,一个实现类为HandlerInterceptorAdapter,继承该类允许我们只实现需要的回调方法
1、拦截器本质也是AOP(面向切面编程),有三个切入点:preHandle(处理前),postHandle(处理后、渲染前)、afterCompletion(渲染后)
2、自定义拦截器的步骤:
a、从HandlerInterceptorAdapter继承,自定义拦截器
b、配置文件中,定义拦截器bean
c、注入到HandlerMapping bean中
3、推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的、最先应该使用的。如登录这种拦截器最好使用Filter来实现 (未尝试,待实践)
第六章 注解式控制器详解
1)注解式控制器开发步骤(相对于非注解)
a、HandlerMapping 与HandlerAdapter 分别配置为RequestMappingHandlerMapping、RequestMappingHandlerAdapter(或者添加配置:<mvc:annotation-driven />,详见:<mvc:annotation-driven/>的作用)
b、定义Controller类,添加注解@Controller
c、实例化为bean(xml中显示配置为bean,或添加配置:<context:component-scan />)
2)注解式Controller类为POJO类
a、类上添加注解@Controller,与@Service、@Repository对应常见的三层开发架构组件
b、@RequestMapping定义到方法上为提供映射规则,定义在Controller类则为窄化请求映射
3)注解式返回数据(如json、xml),而非页面
a、@ResponseBody 作用于控制器的某一方法,参见:@responseBody注解的使用
b、@RestController 作用于控制器,参见:@Controller和@RestController的区别
c、在pom文件中须添加两个依赖,用于json类型转换
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.3</version> </dependency>
d、json转换默认采用ISO-8859-1编码,对于中文会出现乱码,解决方法:Spring Mvc @ResponseBody String返回中文字符串乱码
e、对tomcat跨域请求,通过filter添加跨域头部,参见: tomcat 添加CROS跨源请求
2、 6.5 请求映射
依据http协议结构中的可变部分,可以将映射规则分为四类:
1)URL路径映射
2)请求方法映射限定
3)请求参数映射限定
4)请求头映射限定
3、 6.6 参数绑定
参数绑定的两种方式:自动绑定与注解绑定
讲解了调用功能处理方法时,spring mvc默认自动绑定的参数类型
讲解了调用功能处理方法时,通过注解的方式,从url、cookie等绑定方法参数
1)@RequestParam 绑定单个请求参数值
2)@PathVariable 绑定URI模板变量值
3)@CookieValue 绑定Cookie数据值
4)@RequestHeader 绑定请求头数据
5)@ModelAttribute 绑定请求参数到命令对象
6)@SessionAttributes 绑定命令对象到session
7)@Value 绑定SpEL表示式
a、MIME类型的格式:type/subtype(;parameter)
b、控制器的功能处理方法中,通过HttpServletRequest、HttpServletResponse对htpp请求和响应进行操控
c、在java代码中进行http请求发送与响应解析功能,可通过ClientHttpRequest、ClientHttpResponse实现
d、从请求头中Accept、Content-Type与响应头中Content-Type的解析关系,抽象出了消息的生产者与消费者模型
1)可使用@RequestMapping属性值headers,限定请求的过滤和响应
2)@RequestMapping单独提供了consumes、produces两个属性,对应生产者与消费者,其中consumes对请求的Content-Type进行过滤,表示处理方法能处理的请求类型,produces对请求的Accept进行过滤,表示处理方法能生产的响应类型
e、@RequestMapping的窄化处理,只有生产者/消费者 模式 是 覆盖(功能方法的限制覆盖类的限制),其他是继承
5、静态文件的访问
a、‘webapp’ 是站点的根目录,tomcat默认禁止对目录 'WEB-INFO' 及非 jsp文件的访问
b、开放对静态访问的方法有多种,常用的方式是使用默认servlet:default,详细可参考 web.xml中出现default是什么意思?
第七章 注解式控制器的数据验证、类型转换及格式化
a)类型转换有两个技术框架:PropertyEditor、Converter
1)PropertyEditor只提供String<-->Object之间的转换,Spring默认使用该方式,内置的类型转换无需要额外注册
2)Converter提供任何类型之间的转换,需注册才能生效
3)PropertyEditor、Converter同时存在时,优先PropertyEditor,如无法转换则使用Converter
b)本节提供了注解式控制器下,注册自定义PropertyEditor的方法
Spring MVC处理异常有3种方式:
(1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
(2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
(3)使用@ExceptionHandler注解实现异常处理;
多种方式的并存会增大维护的成本,因此异常处理方式选择其中一种,再配合web.xml中的<error-page>即可
异常处理与<error-page>配合关系,参见 spring 思维导图
关于异常处理的补充:
第九章 Spring定时任务的几种实现
定时任务有三种方式:
1、java.util.Timer 只支持固定频度的定时任务,很少使用
2、使用Quartz
a、作业类继承自特定的基类 该方式已从spring 4.0开始不支持
b、作业类不继承特定基类 spring 4.0之后依然支持,但CronTriggerBean、CronTriggerBean须替换成SimpleTriggerFactoryBean、CronTriggerFactoryBean,使用方式相同
3、Spring Task 支持配置及注解两种方式
项目一般使用spring task方式,详细配置及cron表达式详解可参考:spring定时任务详解(@Scheduled注解)