SlideShare une entreprise Scribd logo
1  sur  38
Spring MVC
RESTful Web Service和应用开发
cheney.s 2010.10
主题
•快速启动
•如何使用
•为什么选择
•深入MVC
快速启动
快速启动
创建Spring MVC项目
1. web.xml注册DispatcherServlet
• 映射到”/”
• FrontController
2. 创建spring容器: root & web
快速启动
这么复杂,不玩了
请留步...
Demo
Spring Roo
http://www.springsource.org/roo
如何使用
如何使用
MVC的编程模型
• request @Controller
• @RequestMapping映射规则
• Method参数获取请求数据
• 返回结果产生response
DispatcherServlet
如何使用
请求映射
• By Path
• @RequestMapping("path")
• By HTTP Method
• @RequestMapping(value="path", method=RequestMethod.GET)
• By Query Parameter
• @RequestMapping(value="path", params="foo")
• @RequestMapping(value="path", params={"foo", "!bar"})
• @RequestMapping(value="path", params="day=Monday")
• @RequestMapping(value="path", params="day!=Sunday")
• By Request Header
• @RequestMapping("path", headers="content-type=text/*")
如何使用
@RequestMapping
• 在class级别使用
如何使用
@RequestMapping
• 在method级别使用
如何使用
获取请求数据
1. @RequestParam("name")
• @RequestParam(value="id", required="false")
2. @PathVariable("var")
3. @RequestHeader("name")
4. @RequestBody
5. @CookieValue("name")
6. JavaBean
7. HttpEntity<T>
如何使用
类型转换
• 自动转换
• ConversionService提供功能
• 常规的转换功能开箱即用
• Primitives, Strings, Dates, Collections, Maps, 自定义
• 使用注解声明转换规则
• @NumberFormat, @DateTimeFormat,自定义@Format
如何使用
注入标准对象
任意组合使用
HttpServletReque
st
HttpServletRespo
nse
HttpSession
InputStream OutputStream Principal
Reader Writer Locale
如何使用
注入我的对象
WebArgumentResolver
如何使用
产生Response
• 返回@ResponseBody
• 返回ResponseEntity<T>
如何使用
视图呈现
• DispatcherServlet也能呈现视图
• HttpMessageConverter输出响应
• 通过模版(jsp)输出text/*类型的内容
• 通过Model导出数据到视图中
如何使用
视图呈现
• 通过字符串选择视图
• 这种方式下不要使用@ResponseBody
• 可以配置ViewResolver把名称和实例对象绑定
• 默认的ViewResoler转向内部的servlet资源
• 开箱即用: JSP、Tiles、Freemarker、Velocity、
iText PDF、Jexcel、JasperReports、XSLT
• 支持自定义视图
如何使用
Validation
• JavaBean 使用@Valid触发
• JSR-303,实现hibernate-validator
• 验证结果通过BindingResult获取,必须在
JavaBean之后
• 不支持其它请求参数类型(@RequestBody等)
• 错误会自动导出到视图中
如何使用
Validation
1
2
如何使用
异常处理
• @Controller级别
• 在Controller中的一个单独的方法上加上
@ExceptionHandler
• 自己捕获异常
• DispatcherServlet级别
• 依赖DefaultHandlerExceptionResolver
• 支持自定义HandlerExceptionResolver
如何使用
测试
• 单元测试
• just POJOs
• 使用mock框架
• HttpServlet Mocks
• MockHttpServletRequest
• MockHttpServletResponse
• MockServletContext
为什么选择
为什么选择
PK MVC
• Struts
• Spring MVC
• JSF、Tapestry
开发的王道(web vs jee vs ?)
为什么选择
PK REST
• Spring MVC
• 缺少http响应状态码的支持,需要手工编写
• Spring MVC 2.5编程模型的延续
• JAX-RS(jersey)
• @Path(“{username}/portfolios/“)、@PathParam("username")
• @QueryParam @FormParam @MatrixParam
• @GET @POST
• 缺少spring MVC参数匹配机制
• 缺少基于注解的类型转换和数据验证
为什么选择
优点
• 一脉相承的spring模式
• 架构优雅,配置简单,使用灵活
• JSR-303支持
• 简化ajax开发
• Roo支持
深入MVC
深入MVC
配置解析
• web.xml
• DispatcherServlet -> servlet-context.xml
• servlet-context.xml
• <mvc:annotation-driven /> -> AnnotationMethodHandlerAdapter
• <context:component-scan base-package="org.springframework.samples.mvc" />
• 初始化DispatcherServlet
深入MVC
DispatcherServlet
• Controllers
• Handler mappings
• type: org.springframework.web.servlet.HandlerMapping
• View resolvers
• type: org.springframework.web.servlet.ViewResolver
• Local resolver
• name:localeResolver
• Theme resolver
• name:tmemeResolver
• Mulipart resolver
• name:multipartResolver
• Handler exception mappings
• type: org.springframework.web.servlet.HandlerExceptionResolver
• HandlerAdapter
• type: org.springframework.web.servlet.HandlerAdapter
深入MVC
DispatcherServlet
深入MVC
参数注入的魔法
魔法来源:
org.springframework.web.bind.annotation.support.HandlerMethodInvoker
#resolveHandlerArguments()
魔法原理:反射
CodeReview
深入MVC
HttpMessageConverters
• 读取请求,产生响应
• 可以为不同的content types注册多个的转换器
• 对于@RequestBody,使用第一个能读取”Content-
Type”请求的转换器,转换为方法参数值
• 对于@ResponseBody,使用客户端可以”Accept”
的返回类型的第一个找到的转换器回写数据
• 默认已经提供了一组转换器(4个)
• 可以自定义转换器,通过
AnnotationMethodHandlerAdapter注册
深入MVC
默认HttpMessageConverters
1. StringHttpMessageConverter
• text/* read String
• String write text/plain
2. FormHttpMessageConverter
• application/x-www-form-urlencoded read MultiValueMap<String,
String>
• MultiValueMap<String, String> write application/x-www-form-
urlencoded
3. ByteArrayMessageConverter
• */* read byte[]
• Object write application/octet-stream
深入MVC
默认HttpMessageConverters
4. Jaxb2RootElementHttpMessageConverter
• text/xml || application/xml read Object(JAXB annotated)
• JAXB-annotated Objects write text/xml || application/xml
• Classpath中有JAXB时自动注册
5. MappingJacksonHttpMessageConverter
• application/json read Object
• Object write application/json
• Classpath中有Jackson API时自动注册
6. SourceHttpMessageConverter
• text/xml || application/xml read javax.xml.transform.Source
• javax.xml.transform.Source write text/xml || application/xml
深入MVC
默认HttpMessageConverters
7. ResourceHttpMessageConverter
• R/W org.springframework.core.io.Resource
8. AtomFeedHttpMessageConverter
• R/W Rome Feed (application/atom+xml)
• Classpath中有Rome时自动注册
9. RssChannelHttpMessageConverter
• R/W RssChannels(application/rss+xml)
• Classpath中有Rome时自动注册
10.BufferedImageHttpMessageConverter
11.MarshallingHttpMessageConverter
深入MVC
Views vs @ResponseBody
• 都为了呈现响应
• ViewResolver + View
• HttpMessageConverter
• 触发方式不同
• View 返回一个字符串
• 通过@ResponseBody或ResponseEntity输出
• 如何选择
• 使用view生成文档,例如html、pdf、xls
• 使用@ResponseBody提供web service,例如xml、json
深入MVC
资源文件的处理
• servlet-mapping: /
• 3.0.4新增:
• <mvc:resources mapping="/resources/**" location="/resources/" />
RestTemplate Etag 数据绑定
注解带来
的问题
使用约束
上 ,请听下回分解
谢谢

Contenu connexe

Tendances

Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用Shengyou Fan
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPJustin Lin
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器Chieh Kai Yang
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Laravel - 系統全攻略
Laravel - 系統全攻略Laravel - 系統全攻略
Laravel - 系統全攻略Vincent Chi
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作Shengyou Fan
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發俊仁 陳
 
Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Vincent Chi
 

Tendances (20)

CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
整合 Open ID
整合 Open ID整合 Open ID
整合 Open ID
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用
 
Route路由控制
Route路由控制Route路由控制
Route路由控制
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
 
Laravel - 系統全攻略
Laravel - 系統全攻略Laravel - 系統全攻略
Laravel - 系統全攻略
 
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作
 
CRUD 綜合應用
CRUD 綜合應用CRUD 綜合應用
CRUD 綜合應用
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
 
Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 

Similaire à Spring mvc

How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4Daniel Chou
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Justin Lin
 
Introduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesIntroduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesJeff Chu
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Justin Lin
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践Li JianYe
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVCjeffz
 
纵览Loadrunner核心功能
纵览Loadrunner核心功能纵览Loadrunner核心功能
纵览Loadrunner核心功能beiyu95
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Justin Lin
 
实时Web的前世今生未来
实时Web的前世今生未来实时Web的前世今生未来
实时Web的前世今生未来RolfZhang
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kaoxwcoder
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索Will Huang
 
Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________Gelis Wu
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web FrameworkFred Chien
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 

Similaire à Spring mvc (20)

How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4
 
使用 Controller
使用 Controller使用 Controller
使用 Controller
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
Introduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesIntroduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 Features
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVC
 
Berserk js
Berserk jsBerserk js
Berserk js
 
纵览Loadrunner核心功能
纵览Loadrunner核心功能纵览Loadrunner核心功能
纵览Loadrunner核心功能
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
 
实时Web的前世今生未来
实时Web的前世今生未来实时Web的前世今生未来
实时Web的前世今生未来
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kao
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
 
Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web Framework
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 

Spring mvc