SpringMVC⾼级_第⼀部分 Spring MVC 应⽤

Spring MVC ⾼级框架

Spring MVC Spring 给我们提供的⼀个⽤于简化 Web 开发的框架
主要课程内容
  • Spring MVC 应⽤(常规使⽤)
  • Spring MVC ⾼级技术(拦截器、异常处理器等)
  • ⼿写 MVC 框架(⾃定义 MVC 框架,难点/重点)
  • Spring MVC 源码深度剖析(难点/重点)
  • SSM 整合

第⼀部分 Spring MVC 应⽤

1 Spring MVC 简介

1.1 MVC 体系结构

三层架构

我们的开发架构⼀般都是基于两种形式,⼀种是 C/S 架构,也就是客户端 / 服务器;另⼀种是 B/S 架构 ,也就是浏览器服务器。在 JavaEE 开发中,⼏乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使⽤的⾮常多,所以我们课程中的案例也都是基于三层架构设计的。
三层架构中,每⼀层各司其职,接下来我们就说说每层都负责哪些⽅⾯:
  • 表现层 :
也就是我们常说的 web 层。它负责接收客户端请求,向客户端响应结果,通常客户端使⽤ http
议请求 web 层, web 需要接收 http 请求,完成 http 响应。
表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。
表现层依赖业务层,接收到客户端请求⼀般会调⽤业务层进⾏业务处理,并将处理结果响应给客户端。
表现层的设计⼀般都使⽤ MVC 模型。( MVC 是表现层的设计模型,和其他层没有关系)
  • 业务层 :
也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项⽬的需求息息相关。 web 层依赖业务层,但是业务层不依赖 web 层。
业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务⼀致性。(也就是我们说的, 事务应该放到业务层来控制)
  • 持久层 :
也就是我们是常说的 dao 层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进⾏持久化的载体,数据访问层是业务层和持久层交互的接⼝,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进⾏增删改查的。

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 的后续产品。

SpringMVC 已经成为 ⽬前最主流的 MVC 框架 之⼀,并且 随着 Spring3.0 的发布,全⾯超越 Struts2 ,成为最优秀的 MVC 框架。
servlet struts 实现接⼝、 springmvc 中要让⼀个 java 类能够处理请求只需要添加注解就 ok 它通过⼀套注解,让⼀个简单的 Java 类成为处理请求的控制器,⽽⽆须实现任何接⼝。同时它还⽀持
RESTful 编程⻛格的请求。
总之: Spring MVC Struts2 ⼀样,都是 为了解决表现层问题 的 web 框架,它们都是基于 MVC 设计模式的。⽽这些表现层框架的主要职责就是处理前端HTTP 请求。
Spring MVC 本质可以认为是对 servlet 的封装,简化了我们 serlvet 的开发
作⽤: 1 )接收请求 2 )返回响应,跳转⻚⾯

2 Spring Web MVC ⼯作流程

需求:前端浏览器请求 url http://localhost:8080/demo/handle01 ,前端⻚⾯显示后台服务器的时间
开发过程
1 )配置 DispatcherServlet 前端控制器
2 )开发处理具体业务逻辑的 Handler @Controller @RequestMapping
3 xml 配置⽂件配置 controller 扫描,配置 springmvc 三⼤件
4 )将 xml ⽂件路径告诉 springmvc DispatcherServlet

2.1 Spring MVC 请求处理流程流程说明

第⼀步:⽤户发送请求⾄前端控制器 DispatcherServlet
第⼆步: DispatcherServlet 收到请求调⽤ HandlerMapping 处理器映射器
第三步:处理器映射器根据请求 Url 找到具体的 Handler (后端控制器),⽣成处理器对象及处理器拦截 器( 如果 有则⽣成 ) ⼀并返回 DispatcherServlet
第四步: DispatcherServlet 调⽤ HandlerAdapter 处理器适配器去调⽤ Handler
第五步:处理器适配器执⾏ Handler
第六步: Handler 执⾏完成给处理器适配器返回 ModelAndView
第七步:处理器适配器向前端控制器返回 ModelAndView ModelAndView SpringMVC 框架的⼀个底层对 象,包括 Model View
第⼋步:前端控制器请求视图解析器去进⾏视图解析,根据逻辑视图名来解析真正的视图。
第九步:视图解析器向前端控制器返回 View
第⼗步:前端控制器进⾏视图渲染,就是将模型数据(在 ModelAndView 对象中)填充到 request
第⼗⼀步:前端控制器向⽤户响应结果

2.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 的。

3 节 请求参数绑定(串讲)

请求参数绑定:说⽩了 SpringMVC 如何接收请求参数
http 协议(超⽂本传输协议)
原⽣ servlet 接收⼀个整型参数:
1 String ageStr = request.getParameter("age");
2) Integer age = Integer.parseInt(ageStr);
SpringMVC 框架对 Servlet 的封装,简化了 servlet 的很多操作
SpringMVC 在接收整型参数的时候,直接在 Handler ⽅法中声明形参即可
@RequestMapping("xxx")
public String handle(Integer age) {
System.out.println(age);
}
参数绑定:取出参数值绑定到 handler ⽅法的形参上
  • 默认⽀持 Servlet API 作为⽅法参数
当需要使⽤ HttpServletRequest HttpServletResponse HttpSession 等原⽣ servlet 对象时,直
接在 handler ⽅法中形参声明使⽤即可。
/**
*
* SpringMVC 对原⽣ servlet api 的⽀持 url /demo/handle02?id=1
*
* 如果要在 SpringMVC 中使⽤ servlet 原⽣对象,⽐如
HttpServletRequest\HttpServletResponse\HttpSession ,直接在 Handler ⽅法形参中声
明使⽤即可
*
*/
@RequestMapping ( "/handle02" )
public ModelAndView handle02 ( HttpServletRequest request ,
HttpServletResponse response , HttpSession session ) {
String id = request . getParameter ( "id" );
Date date = new Date ();
ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ; }
  • 绑定简单类型参数
简单数据类型:⼋种基本数据类型及其包装类型
参数类型推荐使⽤包装数据类型,因为基础数据类型不可以为 null
整型: Integer int
字符串: String
单精度: Float flfloat
双精度: Double double
布尔型: Boolean boolean
说明:对于布尔类型的参数, 请求的参数值为 true false 。或者 1 0
注意:绑定简单数据类型参数,只需要直接声明形参即可(形参参数名和传递的参数名要保持⼀
致,建议 使⽤包装类型,当形参参数名和传递参数名不⼀致时可以使⽤ @RequestParam 注解进⾏
⼿动映射)
/*
* SpringMVC 接收简单数据类型参数 url /demo/handle03?id=1
*
* 注意:接收简单数据类型参数,直接在 handler ⽅法的形参中声明即可,框架会取出参数值
然后绑定到对应参数上
* 要求:传递的参数名和声明的形参名称保持⼀致
*/
@RequestMapping ( "/handle03" )
public ModelAndView handle03 ( @RequestParam ( "ids" ) Integer id , Boolean
flag ) {
Date date = new Date ();
ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
绑定 Pojo 类型参数
/*
* SpringMVC 接收 pojo 类型参数 url /demo/handle04?id=1&username=zhangsan
*
* 接收 pojo 类型参数,直接形参声明即可,类型就是 Pojo 的类型,形参名⽆所谓
* 但是要求传递的参数名必须和 Pojo 的属性名保持⼀致
*/
@RequestMapping ( "/handle04" )
public ModelAndView handle04 ( User user ) {
Date date = new Date (); ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
  • 绑定Pojo包装对象参数
包装类型 QueryVo
package com . lagou . edu . pojo ;
/**
* @author 应癫
*/
public class QueryVo {
private String mail ;
private String phone ;
// 嵌套了另外的 Pojo 对象
private User user ;
public String getMail () {
return mail ;
}
public void setMail ( String mail ) {
this . mail = mail ;
}
public String getPhone () {
return phone ;
}
public void setPhone ( String phone ) {
this . phone = phone ;
}
public User getUser () {
return user ;
}
public void setUser ( User user ) {
this . user = user ;
}
}
Handler ⽅法
/*
* SpringMVC 接收 pojo 包装类型参数 url /demo/handle05?
user.id=1&user.username=zhangsan
* 不管包装 Pojo 与否,它⾸先是⼀个 pojo ,那么就可以按照上述 pojo 的要求来
* 1 、绑定时候直接形参声明即可
* 2 、传参参数名和 pojo 属性保持⼀致,如果不能够定位数据项,那么通过属性名 + "."
⽅式进⼀步锁定数据
*
*/
@RequestMapping ( "/handle05" )
public ModelAndView handle05 ( QueryVo queryVo ) {
Date date = new Date ();
ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
绑定⽇期类型参数(需要配置⾃定义类型转换器)
  • 前端jsp
<fieldset>
<p> 测试⽤例: SpringMVC 接收⽇期类型参数 </p>
<a href = "/demo/handle06?birthday=2019-10-08" > 点击测试 </a>
</fieldset>
  • 后台Handler⽅法
/**
* 绑定⽇期类型参数
* 定义⼀个 SpringMVC 的类型转换器 接⼝,扩展实现接⼝接⼝,注册你的实现
* @param birthday
* @return
*/
@RequestMapping ( "/handle06" )
public ModelAndView handle06 ( Date birthday ) {
Date date = new Date (); ModelAndView modelAndView = new
ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
  • ⾃定义类型转换器
package com . lagou . edu . converter ;
import org . springframework . core . convert . converter . Converter ;
import java . text . ParseException ;
import java . text . SimpleDateFormat ;
import java . util . Date ;
/**
* @author 应癫
* ⾃定义类型转换器
* S source ,源类型
* T target :⽬标类型
*/
public class DateConverter implements Converter < String , Date > {
@Override
public Date convert ( String source ) {
// 完成字符串向⽇期的转换
SimpleDateFormat simpleDateFormat = new
SimpleDateFormat ( "yyyy-MM-dd" );
try {
Date parse = simpleDateFormat . parse ( source );
return parse ;
} catch ( ParseException e ) {
e . printStackTrace ();
}
return null ;
}
}
  • 注册⾃定义类型转换器
<!--
⾃动注册最合适的处理器映射器,处理器适配器 ( 调⽤ handler ⽅法 )
-->
<mvc:annotation-driven conversion
service = "conversionServiceBean" />
<!-- 注册⾃定义类型转换器 -->
<bean id = "conversionServiceBean"
class = "org.springframework.format.support.FormattingConversionServiceF
actoryBean" >
<property name = "converters" >
<set>

<bean class = "com.lagou.edu.converter.DateConverter" >
</bean>
</set>
</property>
</bean

4 节 对 Restful ⻛格请求⽀持

rest ⻛格请求是什么样的?
springmvc rest ⻛格请求到底提供了怎样的⽀持
是⼀个注解的使⽤ @PathVariable ,可以帮助我们从 uri 中取出参数

4.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>
<h2> SpringMVC Restful ⻛格 url 的⽀持 </h2>
<fieldset>
<p> 测试⽤例: SpringMVC Restful ⻛格 url 的⽀持 </p>
<a href = "/demo/handle/15" > rest_get 测试 </a>
<form method = "post" action = "/demo/handle" >
<input type = "text" name = "username" />
<input type = "submit" value = " 提交 rest_post 请求 " />
</form>
<form method = "post" action = "/demo/handle/15/lisi" >
<input type = "hidden" name = "_method" value = "put" />
<input type = "submit" value = " 提交 rest_put 请求 " />
</form>
<form method = "post" action = "/demo/handle/15" >
<input type = "hidden" name = "_method" value = "delete" />
<input type = "submit" value = " 提交 rest_delete 请求 " />
</form>
</fieldset>
</div>
  • 后台Handler⽅法
/*
* restful get /demo/handle/15
*/
@RequestMapping ( value = "/handle/{id}" , method =
{ RequestMethod . GET })
public ModelAndView handleGet ( @PathVariable ( "id" ) Integer id ) {
Date date = new Date ();
ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
/*
* restful post /demo/handle
*/
@RequestMapping ( value = "/handle" , method = { RequestMethod . POST })
public ModelAndView handlePost ( String username ) {
Date date = new Date ();
ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
/*
* restful put /demo/handle/15/lisi
*/
@RequestMapping ( value = "/handle/{id}/{name}" , method =
{ RequestMethod . PUT })
public ModelAndView handlePut ( @PathVariable ( "id" ) Integer
id , @PathVariable ( "name" ) String username ) {
Date date = new Date ();
ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
/*
* restful delete /demo/handle/15
*/
@RequestMapping ( value = "/handle/{id}" , method =
{ RequestMethod . DELETE })
public ModelAndView handleDelete ( @PathVariable ( "id" ) Integer id ) {
Date date = new Date ();
ModelAndView modelAndView = new ModelAndView ();
modelAndView . addObject ( "date" , date );
modelAndView . setViewName ( "success" );
return modelAndView ;
}
  • web.xml中配置请求⽅式过滤器(将特定的post请求转换为putdelete请求)
<!-- 配置 springmvc 请求⽅式转换过滤器,会检查请求参数中是否有 _method 参数,如果有就
按照指定的请求⽅式进⾏转换 -->
<filter>
<filter-name> hiddenHttpMethodFilter </filter-name>
<filter
class> org.springframework.web.filter.HiddenHttpMethodFilter </filter
class>
</filter>

5 Ajax Json交互

交互:两个⽅向
1 )前端到后台:前端 ajax 发送 json 格式字符串,后台直接接收为 pojo 参数,使⽤注解 @RequstBody
2 )后台到前端:后台直接返回 pojo 对象,前端直接接收为 json 对象或者字符串,使⽤注解
@ResponseBody

5.1 什么是 Json

Json 是⼀种与语⾔⽆关的数据交互格式,就是⼀种字符串,只是⽤特殊符号 {} 内表示对象、 [] 内表示数组、"" 内是属性或值、:表示后者是前者的值
{"name": "Michael"} 可以理解为是⼀个包含 name Michael 的对象
[{"name": "Michael"},{"name": "Jerry"}] 就表示包含两个对象的数组

5.2 @ResponseBody注解

@responseBody 注解的作⽤是将 controller 的⽅法返回的对象通过适当的转换器转换为指定的格式之后,写⼊到response 对象的 body 区,通常⽤来返回 JSON 数据或者是 XML 数据。 注意:在使⽤此注解之后不会再⾛视图处理器,⽽是直接将数据写⼊到输⼊流中,他的效果等同于通过response 对象输出指定格式的数据。

5.3 分析Spring MVC 使⽤ Json 交互

所需 jar
<!--json 数据交互所需 jar start-->
<dependency>
<groupId> com.fasterxml.jackson.core </groupId>
<artifactId> jackson-core </artifactId>
<version> 2.9.0 </version>
</dependency>
<dependency>
<groupId> com.fasterxml.jackson.core </groupId>
<artifactId> jackson-databind </artifactId> <version> 2.9.0 </version>
</dependency>
<dependency>
<groupId> com.fasterxml.jackson.core </groupId>
<artifactId> jackson-annotations </artifactId>
<version> 2.9.0 </version>
</dependency>
<!--json 数据交互所需 jar end-->
  • 示例代码
前端 jsp ⻚⾯及 js 代码
<div>
<h2> Ajax json 交互 </h2>
<fieldset>
<input type = "button" id = "ajaxBtn" value = "ajax 提交 " />
</fieldset>
</div>
$ ( function () {
$ ( "#ajaxBtn" ). bind ( "click" , function () {
// 发送 ajax 请求
$ . ajax ({
url : '/demo/handle07' ,
type : 'POST' ,
data : '{"id":"1","name":" 李四 "}' ,
contentType : 'application/json;charset=utf-8' ,
dataType : 'json' ,
success : function ( data ) {
alert ( data . name );
}
})
})
})
后台 Handler ⽅法
@RequestMapping ( "/handle07" )
// 添加 @ResponseBody 之后,不再⾛视图解析器那个流程,⽽是等同于 response 直接输出
数据
public @ResponseBody User handle07 ( @RequestBody User user ) {
// 业务逻辑处理,修改 name 为张三丰
user . setName ( " 张三丰 " );
return user ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值