Upload
cheney-s
View
2.699
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
Spring MVCRESTful Web Service 和应用开发
cheney.s 2010.10
主题
•快速启动•如何使用•为什么选择•深入 MVC
快速启动
快速启动
创建 Spring MVC 项目1. web.xml 注册 DispatcherServlet
• 映射到” /”• FrontController
2. 创建 spring 容器 : root & web
快速启动
这么复杂,不玩了请留步 ...
DemoSpring 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. @RequestBody5. @CookieValue("name") 6. JavaBean7. HttpEntity<T>
如何使用
类型转换• 自动转换• ConversionService 提供功能• 常规的转换功能开箱即用
• Primitives, Strings, Dates, Collections, Maps, 自定义
• 使用注解声明转换规则• @NumberFormat, @DateTimeFormat ,自定义 @Format
如何使用
注入标准对象
任意组合使用
HttpServletRequest HttpServletResponse 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.HandlerMethodInvo
ker#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.BufferedImageHttpMessageConverter11.MarshallingHttpMessageConverter
• R/W RssChannels(application/rss+xml)• Classpath 中有 Rome 时自动注册
• BufferedImageHttpMessageConverter
1. BufferedImageHttpMessageConverter
深入 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
数据绑定 注解带来的问题
使用约束上 ,请听下回分解
谢谢