SpringMVC之基础应用-1
1. Spring MVC 应用
1.1 Spring MVC 简介
1. 三层架构
我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器;另一种是 B/S 架构 ,也就是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系 统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用的非常多,所以 我们课程中的案例也都是基于三层架构设计的。
三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面:
表现层 :
也就是我们常说的web 层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http 协 议请求web 层,web 需要接收 http 请求,完成 http 响应。
表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)业务层 :
也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web 层依赖业务层,但是业务层不依赖 web 层。 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的, 事务应该放到业务层来控制)持久层 :
也就是我们是常说的 dao 层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进 行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化 到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行增删改查的。
2. MVC设计模式
MVC 全名是 Model View Controller,是 模型(model)-视图(view)-控制器(controller) 的缩写, 是一
种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职:
Model(模型):模型包含业务模型和数据模型,数据模型用于封装数据,业务模型用于处理业务。
View(视图): 通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。通常视图是依据 模型数据创建的。
Controller(控制器): 是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。 MVC提倡:每一层只编写自己的东⻄,不编写任何其他的代码;分层是为了解耦,解耦是为了维护方便和分工协作。
1.2 Spring MVC 是什么?
SpringMVC 全名叫 Spring Web MVC,是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级
Web 框架,属于 SpringFrameWork 的后续产品。
.png)
SpringMVC 已经成为 目前最主流的 MVC 框架 之一,并且 随着 Spring3.0 的发布,全面超越 Struts2, 成为最优秀的 MVC 框架。
servlet、struts实现接口、springmvc中要让一个java类能够处理请求只需要添加注解就ok
它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程⻛格的请求。
总之:Spring MVC和Struts2一样,都是 为了解决表现层问题 的web框架,它们都是基于 MVC 设计模 式的。而这些表现层框架的主要职责就是处理前端HTTP请求。
Spring MVC 本质可以认为是对servlet的封装,简化了我们serlvet的开发
作用:
- 接收请求
- 返回响应
- 跳转⻚面
.png)
1.3 pring Web MVC 工作流程
开发过程
配置DispatcherServlet前端控制器
开发处理具体业务逻辑的Handler(@Controller、@RequestMapping)
xml配置文件配置controller扫描,配置springmvc三大件
将xml文件路径告诉springmvc(DispatcherServlet)
1. Spring MVC 请求处理流程
.png)
流程说明
- 第一步: 用户发送请求至前端控制器DispatcherServlet
- 第二步: DispatcherServlet收到请求调用HandlerMapping处理器映射器
- 第三步: 处理器映射器根据请求Url找到具体的Handler(后端控制器),生成处理器对象及处理器拦截 器(如果 有则生成)一并返回DispatcherServlet
- 第四步: DispatcherServlet调用HandlerAdapter处理器适配器去调用Handler
- 第五步: 处理器适配器执行Handler
- 第六步: Handler执行完成给处理器适配器返回ModelAndView
- 第七步: 处理器适配器向前端控制器返回 ModelAndView,ModelAndView 是SpringMVC 框架的一个 底层对 象,包括 Model 和 View
- 第八步: 前端控制器请求视图解析器去进行视图解析,根据逻辑视图名来解析真正的视图。
- 第九步:视图解析器向前端控制器返回View
- 第十步: 前端控制器进行视图渲染,就是将模型数据(在 ModelAndView 对象中)填充到 request 域 第十一步:前端控制器向用户响应结果
2. Spring MVC 九大组件
HandlerMapping(处理器映射器)
HandlerMapping 是用来查找 Handler 的,也就是处理器,具体的表现形式可以是类,也可以是 方法。比如,标注了@RequestMapping的每个方法都可以看成是一个Handler。Handler负责具 体实际的请求处理,在请求到达后,HandlerMapping 的作用便是找到请求相应的处理器 Handler 和 Interceptor.
HandlerAdapter(处理器适配器)
HandlerAdapter 是一个适配器。因为 Spring MVC 中 Handler 可以是任意形式的,只要能处理请 求即可。但是把请求交给 Servlet 的时候,由于 Servlet 的方法结构都是 doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定的 Servlet 处理 方法调用 Handler 来进行处理,便是 HandlerAdapter 的职责。
HandlerExceptionResolver
HandlerExceptionResolver 用于处理 Handler 产生的异常情况。它的作用是根据异常设置ModelAndView,之后交给渲染方法进行渲染,渲染方法会将 ModelAndView 渲染成⻚面。
ViewResolver
ViewResolver即视图解析器,用于将String类型的视图名和Locale解析为View类型的视图,只有一 个resolveViewName()方法。从方法的定义可以看出,Controller层返回的String类型视图名 viewName 最终会在这里被解析成为View。View是用来渲染⻚面的,也就是说,它会将程序返回 的参数和数据填入模板中,生成html文件。ViewResolver 在这个过程主要完成两件事情: ViewResolver 找到渲染所用的模板(第一件大事)和所用的技术(第二件大事,其实也就是找到 视图的类型,如JSP)并填入参数。默认情况下,Spring MVC会自动为我们配置一个 InternalResourceViewResolver,是针对 JSP 类型视图的。
RequestToViewNameTranslator
RequestToViewNameTranslator 组件的作用是从请求中获取 ViewName.因为 ViewResolver 根据 ViewName 查找 View,但有的 Handler 处理完成之后,没有设置 View,也没有设置 ViewName, 便要通过这个组件从请求中查找 ViewName。
LocaleResolver
ViewResolver 组件的 resolveViewName 方法需要两个参数,一个是视图名,一个是 Locale。 LocaleResolver 用于从请求中解析出 Locale,比如中国 Locale 是 zh-CN,用来表示一个区域。这 个组件也是 i18n 的基础。
ThemeResolver
ThemeResolver 组件是用来解析主题的。主题是样式、图片及它们所形成的显示效果的集合。 Spring MVC 中一套主题对应一个 properties文件,里面存放着与当前主题相关的所有资源,如图 片、CSS样式等。创建主题非常简单,只需准备好资源,然后新建一个“主题名.properties”并将资 源设置进去,放在classpath下,之后便可以在⻚面中使用了。SpringMVC中与主题相关的类有 ThemeResolver、ThemeSource和Theme。ThemeResolver负责从请求中解析出主题名, ThemeSource根据主题名找到具体的主题,其抽象也就是Theme,可以通过Theme来获取主题和 具体的资源。
MultipartResolver
MultipartResolver 用于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实 现。MultipartHttpServletRequest 可以通过 getFile() 方法 直接获得文件。如果上传多个文件,还 可以调用 getFileMap()方法得到Map<FileName,File>这样的结构,MultipartResolver 的作用就 是封装普通的请求,使其拥有文件上传的功能。
FlashMapManager
FlashMap 用于重定向时的参数传递,比如在处理用户订单时候,为了避免重复提交,可以处理完 post请求之后重定向到一个get请求,这个get请求可以用来显示订单详情之类的信息。这样做虽然 可以规避用户重新提交订单的问题,但是在这个⻚面上要显示订单的信息,这些数据从哪里来获得 呢?因为重定向时么有传递参数这一功能的,如果不想把参数写进URL(不推荐),那么就可以通 过FlashMap来传递。只需要在重定向之前将要传递的数据写入请求(可以通过ServletRequestAttributes.getRequest()方法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE 中,这样在重定向之后的Handler中Spring就会自动将其设置到Model中,在显示订单信息的⻚面 上就可以直接从Model中获取数据。FlashMapManager 就是用来管理 FalshMap 的。
1.4 请求参数绑定
- SpringMVC在接收整型参数的时候,直接在Handler方法中声明形参即可
参数绑定:取出参数值绑定到handler方法的形参上
- 默认支持 Servlet API 作为方法参数
当需要使用HttpServletRequest
、HttpServletResponse
、HttpSession
等原生servlet对象时,直 接在handler方法中形参声明使用即可。
/** |
- 绑定简单类型参数
简单数据类型:八种基本数据类型及其包装类型 参数类型推荐使用包装数据类型,因为基础数据类型不可以为null 整型:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean 说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0
注意:绑定简单数据类型参数,只需要直接声明形参即可(形参参数名和传递的参数名要保持一 致,建议 使用包装类型,当形参参数名和传递参数名不一致时可以使用@RequestParam注解进行 手动映射)
/** |
- 绑定Pojo类型参数
/** |
- 绑定Pojo包装对象参数
包装类型 QueryVo
|
Handler方法
/* |
- 绑定日期类型参数(需要配置自定义类型转换器)
前端jsp
<fieldset> |
后台Handler方法
/** |
自定义类型转换器
/** |
注册自定义类型转换器
<!-- 自动注册最合适的处理器映射器,处理器适配器(调用handler方法) --> |
1.5 对 Restful ⻛格请求支持
- rest⻛格请求是什么样的?
- springmvc对rest⻛格请求到底提供了怎样的支持
是一个注解的使用@PathVariable,可以帮助我们从uri中取出参数
1. 什么是 RESTful
Restful 是一种 web 软件架构⻛格,它不是标准也不是协议,它倡导的是一个资源定位及资源操作的⻛格。
什么是 REST:
REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统, 比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之 一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol, 简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像 是一种设计的⻛格。
它本身并没有什么实用性,其核心价值在于如何设计出符合 REST ⻛格的网络接口。
资源 表现层 状态转移
Restful 的优点
它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
Restful 的特性
资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统 一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比 如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进 制格式。
状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。
HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务 器, 必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层 之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议里面,四个表示操作方式的动词: GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资 源,PUT 用来更新资源,DELETE 用来删除资源。
RESTful 的示例: rest是一个url请求的⻛格,基于这种⻛格设计请求的url 没有rest的话,原有的url设计 http://localhost:8080/user/queryUserById.action?id=3 url中定义了动作(操作),参数具体锁定到操作的是谁
有了rest⻛格之后 rest中,认为互联网中的所有东⻄都是资源,既然是资源就会有一个唯一的uri标识它,代表它 http://localhost:8080/user/3 代表的是id为3的那个用户记录(资源) 锁定资源之后如何操作它呢?常规操作就是增删改查 根据请求方式不同,代表要做不同的操作
get 查询,获取资源
post 增加,新建资源
put 更新
delete 删除资源
rest⻛格带来的直观体现:就是传递参数方式的变化,参数可以在uri中了
/account/1 HTTP GET :得到 id = 1 的 account
/account/1 HTTP DELETE:删除 id = 1 的 account
/account/1 HTTP PUT:更新 id = 1 的 account
URL:资源定位符,通过URL地址去定位互联网中的资源(抽象的概念,比如图片、视频、app服务 等)。
RESTful ⻛格 URL:互联网所有的事物都是资源,要求URL中只有表示资源的名称,没有动词。 RESTful⻛格资源操作:使用HTTP请求中的method方法put、delete、post、get来操作资源。分别对应添加、删除、修改、查询。不过一般使用时还是 post 和 get。put 和 delete几乎不使用。
RESTful ⻛格资源表述:可以根据需求对URL定位的资源返回不同的表述(也就是返回数据类型,比如XML、JSON等数据格式)。
Spring MVC 支持 RESTful ⻛格请求,具体讲的就是使用 @PathVariable 注解获取 RESTful ⻛格的请求URL中的路径变量。
示例代码:
前端jsp代码:
<div> |
后台handler方法
|
web.xml中配置请求方式过滤器 (将特定的post请求转换为put和delete请求)
<!--配置springmvc请求方式转换过滤器,会检查请求参数中是否有_method参数,如果有就 按照指定的请求方式进行转换--> |
1.6 Ajax Json交互
交互:两个方向
前端到后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使用注解
@RequstBody
后台到前端:后台直接返回pojo对象,前端直接接收为json对象或者字符串,使用注解
@ResponseBody
1. 什么是 Json
Json是一种与语言无关的数据交互格式,就是一种字符串,只是用特殊符号{}内表示对象、[]内表示数
组、””内是属性或值、:表示后者是前者的值
{“name”: “Michael”}可以理解为是一个包含name为Michael的对象 [{“name”: “Michael”},{“name”: “Jerry”}]就表示包含两个对象的数组
2. @ResponseBody注解
@ResponseBody
注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之 后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。 注意:在使用此注解之 后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定 格式的数据。
3. 分析Spring MVC 使用 Json 交互
添加所需jar包
<dependency> |
前端jsp⻚面及js代码
<div> |
$(function () { |
后台handler方法
|