一文讲透 SpringMVC
MVC基础知识与应用
MVC体系结构
三层架构
在B / S架构中,系统标准的三层架构为:表现层 、业务层、持久层。三层架构中,每一层各司其职,共同协作实现对功能的支持与实现。
表现层
业务层
持久层
MVC设计模式
MVC全称是Model View Controller,就是模型 - 视图 - 控制器的缩写。是一种用于设计Web应用程序表现层的模式。
Model(模型):模型包含了数据模型和业务模型,数据模型用于封装数据,业务模型用于处理业务。
View(View ):通常指的是jsp或者html。用于展示数据。
Controller(Controller):负责应用程序与客户端交互的核心入口。基本只负责接受请求和响应。
Spring MVC简介
Spring MVC全称是Spring Web MVC,是基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架,属于Spring FrameWork的后续产品。
Spring MVC已经成为目前最流行的MVC框架之一,并且随着Spring3.0的发布,全面超过Struts2成为最优秀的MVC框架。
servlet / struts开发需要实现接口,Spring MVC可以实现接口Controller,也提供了注解方式,只需要一个注解就可以(简便开发)。Spring MVC提供一整套注解,让一个简单的Java类成为处理请求的控制器,不需要实现任何接口。并且对Restful编程风格提供了支持。
本质 Spring MVC其实就是对Servlet的封装,简化了我们Servlet的开发。
开发流程
web.xml配置DispatcherServlet前端控制器
开发具体的处理业务逻辑Handler(@Controller / @RequestMapper)
springmvc.xml配置注解扫描、配置InternalResourceViewResolver视图解析器、
<mvc:annotation-driven />
映射处理器
在web.xml的DispatcherServlet中配置springmvc.xml路径
Spring MVC请求处理流程
流程说明
1)用户发送请求到前端控制器DispatcherServlet
2)DispatcherServlet接受到用户发起的请求后调用HandlerMapping映射处理器
3)映射处理器根据请求的url找到具体的Handler(后端控制器),生成处理器对象以及处理器拦截器(有就生成)并将Handler返回给DispatcherServlet
4)DispatcherServlet调用HandlerAdapter处理器适配器去调用Handler
5)处理器适配器执行Handler
6)Handler处理完毕后返回ModelAndView给处理器适配器
7)处理器适配器将ModelAndView返回给前端控制器DispatcherServlet
8)前端控制器DispatcherServlet请求视图解析器ViewResolver解析视图
9)视图解析器将解析后的视图View返回给前端控制器DispatcherServlet
10)前端控制器DispatcherServlet对视图渲染,就是将数据模型填充到request域中
11)前端控制器DispatcherServlet想用户响应结果
Spring MVC九大组件
HandlerMapping(处理器控制器)
HandlerAdapter(处理器适配器)
HandlerExceptionResolver(异常解析器)
ViewResolver(视图解析器)
RequsetToViewNameTranslator
LocalResolver
ThemeResolver
MultipartResolver
FlashMapManager
请求参数绑定
基础数据类型绑定
简单的基础数据类型:八种基础数据类型及其包装类型,参数类型推荐使用包装类类型,因为基础数据类型不可以为null。
Short / short 、Long / long 、Integer / int 、Float / float 、Double / double 、Char / char 、Boolean / boolean 、String
说明:对于布尔值类型的参数,参数值只能为trur / false / 1 / 0。
注意:绑定基础数据类型,只需要直接声明形参即可。建议请求参数和形参参数名称一致,如不一致使用@RequestParam
注解。
html
java
Pojo类型参数绑定
html
java
Pojo包装对象绑定
html
java
日期类型绑定
html
java
自定义类型转化器
配置自定义类型转换器
对Restful风格请求的支持
Restful是一种web软件架构风格,它不是标准也不是协议,只是倡导url设计的时候使用资源定义以及资源操作的风格。
Restful是什么
REST(Representational State Transfer)描述了一个架构样式的网络系统。它由Roy Fielding在2000年的博士论文中提出,Roy Fielding是HTTP规范的主要编写者之一。REST相比SOAP(Simple Object Access protocol,简单对象访问协议)和XML-RPC更加简单明了,REST更倾向于简单轻量的方法设计和实现。所以REST是一种设计风格。
Restful的优点
结构清晰、符合标准、易于理解、方便扩展
Restful的特征
资源(Resources): 网络上的一个实体,可以是一段文本、一张图片、一首歌曲、一种服务。可以用URI(统一资源定位符)指定它,每种资源对应一个特定的URI。要获得资源只需要访问这个资源的URI即可。
表现层(Representation): 把资源呈现出来的形式,叫做表现层。比如:文本用txt格式、HTML格式、XML格式、JSON格式表现。
状态转化(State Transfer): 每一个请求,就代表了客户端和服务器的一次交互。
HTTP协议是一个无状态协议,所有的状态都保存在服务器端。如果客户端想要操作服务器,就必须通过一些手段,让服务器端发生状态转化。具体在HTTP协议中有四个表示操作方式的动词:PUT / DELETE / GET / POST。
Restful风格URL
互联网所有的一切都是资源,要求URL中只有表示资源的名称,没有动词。
Restful资源操作
使用HTTP请求中的method方法put(更新) / delete(删除) / post(新增) / get(查询)来操作资源。但是由于安全性问题主要使用post和get。put和delete基本不使用。如果强制要使用put和delete,可以在请求中使用post并携带参数_method=put,服务端再配置请求方式过滤器,如果请求参数中有__method
就会转换请求方式org.springframework.web.filter.HiddenHttpMethodFilter
。
Restful请求方式转换
html
web.xml
java
Ajax Json交互
什么是Json
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式
JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON
Json的语法
JSON 语法是 JavaScript 对象表示语法的子集。
数据在名称/值对
数据由逗号分隔
大括号保存对象
中括号保存数组
@RequestBody注解
@ReqeustBody注解是Spring MVC对Json的支持,作用是将用户请求的Json格式数据解析转换为对应的参数对象。这个注解解析的是Post请求的body区域参数。
@ResponseBody注解
@ResponseBody注解是Spring MVC对Json的支持,作用是将Controller返回的对象通过转换器转换为指定的格式之后,写入到reqsponse对象的body区域。
注意 使用这个注解后返回结果不走视图处理器,而是直接将数据写入到输出流中响应给客户端。
Spring MVC使用Json交互
pom引入jar
html
javascript
java
拦截器(Interceptor)
拦截器需要实现HandlerInterceptor
接口,其中包含三个方法
preHandle
: 在Handler方法执行前执行。
postHandle
: 在Handler方法返回前执行。
afterCompletion
: 在Handler方法返回后执行。
自定义拦截器
配置拦截器
multipart文件形式数据处理
引入jar
配置springmvc.xml
文件上传写法一
html
java
文件上传写法二
html
java
控制器异常处理
局部异常处理
局部异常处理是在单个Controller中使用@ExceptionHandler
标记一个方法为这个Controller的局部异常处理Handler。可以定义多个异常处理器,分别处理不同类型的异常。
全局异常处理
全局异常处理是创建一个Class,并且使用注解@ControllerAdvice
标记这个Controller增强类。这样可以在类中定义多个异常处理器,分别处理不同的异常。
注意 如果同时定义了局部异常和全局异常,那么优先匹配的是局部异常。
基于Flash属性的重定向数据传递
对于重定向后的参数传递问题,一般都是重定向后拼接参数,这种方式效率不高,而且使用get方式对于参数有长度限制而且不安全。spring mvc在Controller的方法参数中提供了RedirectAttributes
参数用于解决重定向后的参数传递问题。传递后的参数使用@ModelAttribute
注解接收。
SpringMVC学习思维导图
版权声明: 本文为 InfoQ 作者【知春秋】的原创文章。
原文链接:【http://xie.infoq.cn/article/118d19a4ca5de87163de4942c】。文章转载请联系作者。
评论 (2 条评论)