38
Spring MVC RESTful Web Service 和和和和和 cheney.s 2010.10

Spring mvc

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Spring mvc

Spring MVCRESTful Web Service 和应用开发

cheney.s 2010.10

Page 2: Spring mvc

主题

•快速启动•如何使用•为什么选择•深入 MVC

Page 3: Spring mvc

快速启动

Page 4: Spring mvc

快速启动

创建 Spring MVC 项目1. web.xml 注册 DispatcherServlet

• 映射到” /”• FrontController

2. 创建 spring 容器 : root & web

Page 5: Spring mvc

快速启动

这么复杂,不玩了请留步 ...

DemoSpring Roo

http://www.springsource.org/roo

Page 6: Spring mvc

如何使用

Page 7: Spring mvc

如何使用

MVC 的编程模型• request @Controller

• @RequestMapping 映射规则• Method 参数获取请求数据• 返回结果产生 response

DispatcherServlet

Page 8: Spring mvc

如何使用

请求映射• 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/*")

Page 9: Spring mvc

如何使用

@RequestMapping• 在 class 级别使用

Page 10: Spring mvc

如何使用

@RequestMapping• 在 method 级别使用

Page 11: Spring mvc

如何使用

获取请求数据1. @RequestParam("name")

• @RequestParam(value="id", required="false")

2. @PathVariable("var")3. @RequestHeader("name")4. @RequestBody5. @CookieValue("name") 6. JavaBean7. HttpEntity<T>

Page 12: Spring mvc

如何使用

类型转换• 自动转换• ConversionService 提供功能• 常规的转换功能开箱即用

• Primitives, Strings, Dates, Collections, Maps, 自定义

• 使用注解声明转换规则• @NumberFormat, @DateTimeFormat ,自定义 @Format

Page 13: Spring mvc

如何使用

注入标准对象

任意组合使用

HttpServletRequest HttpServletResponse HttpSession

InputStream OutputStream Principal

Reader Writer Locale

Page 14: Spring mvc

如何使用

注入我的对象WebArgumentResolver

Page 15: Spring mvc

如何使用

产生 Response• 返回 @ResponseBody

• 返回 ResponseEntity<T>

Page 16: Spring mvc

如何使用

视图呈现• DispatcherServlet 也能呈现视图

• HttpMessageConverter 输出响应• 通过模版 (jsp) 输出 text/* 类型的内容

• 通过 Model 导出数据到视图中

Page 17: Spring mvc

如何使用

视图呈现• 通过字符串选择视图

• 这种方式下不要使用 @ResponseBody• 可以配置 ViewResolver 把名称和实例对象绑定

• 默认的 ViewResoler 转向内部的 servlet资源• 开箱即用:

JSP 、 Tiles 、 Freemarker 、 Velocity 、 iText PDF 、 Jexcel 、 JasperReports 、 XSLT

• 支持自定义视图

Page 18: Spring mvc

如何使用

Validation• JavaBean 使用 @Valid 触发• JSR-303 ,实现 hibernate-validator• 验证结果通过 BindingResult 获取,必须

在 JavaBean 之后• 不支持其它请求参数类型

(@RequestBody 等 )• 错误会自动导出到视图中

Page 19: Spring mvc

如何使用

Validation

1

2

Page 20: Spring mvc

如何使用

异常处理• @Controller 级别

• 在 Controller 中的一个单独的方法上加上@ExceptionHandler

• 自己捕获异常

• DispatcherServlet 级别• 依赖 DefaultHandlerExceptionResolver• 支持自定义 HandlerExceptionResolver

Page 21: Spring mvc

如何使用

测试• 单元测试

• just POJOs• 使用 mock 框架

• HttpServlet Mocks• MockHttpServletRequest• MockHttpServletResponse• MockServletContext

Page 22: Spring mvc

为什么选择

Page 23: Spring mvc

为什么选择

PK MVC• Struts• Spring MVC• JSF 、 Tapestry

开发的王道 (web vs jee vs ?)

Page 24: Spring mvc

为什么选择

PK REST• Spring MVC

• 缺少 http 响应状态码的支持,需要手工编写• Spring MVC 2.5 编程模型的延续

• JAX-RS(jersey)• @Path(“{username}/

portfolios/“) 、 @PathParam("username")• @QueryParam @FormParam @MatrixParam• @GET @POST• 缺少 spring MVC 参数匹配机制• 缺少基于注解的类型转换和数据验证

Page 25: Spring mvc

为什么选择

优点• 一脉相承的 spring 模式• 架构优雅,配置简单,使用灵活• JSR-303 支持• 简化 ajax 开发• Roo 支持

Page 26: Spring mvc

深入 MVC

Page 27: Spring 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

Page 28: Spring mvc

深入 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

Page 29: Spring mvc

深入 MVC

DispatcherServlet

Page 30: Spring mvc

深入 MVC

参数注入的魔法魔法来源:org.springframework.web.bind.annotation.support.HandlerMethodInvo

ker#resolveHandlerArguments()

魔法原理:反射

CodeReview

Page 31: Spring mvc

深入 MVC

HttpMessageConverters• 读取请求,产生响应• 可以为不同的 content types 注册多个的转换器• 对于 @RequestBody, 使用第一个能读

取” Content-Type” 请求的转换器,转换为方法参数值

• 对于 @ResponseBody, 使用客户端可以” Accept” 的返回类型的第一个找到的转换器回写数据

• 默认已经提供了一组转换器 (4 个 )• 可以自定义转换器,通过

AnnotationMethodHandlerAdapter 注册

Page 32: Spring mvc

深入 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

Page 33: Spring mvc

深入 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

Page 34: Spring mvc

深入 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

Page 35: Spring mvc

深入 MVC

Views vs @ResponseBody• 都为了呈现响应

• ViewResolver + View• HttpMessageConverter

• 触发方式不同• View 返回一个字符串• 通过 @ResponseBody 或 ResponseEntity 输出

• 如何选择• 使用 view 生成文档,例如 html 、 pdf 、 xls• 使用 @ResponseBody 提供 web service ,例如

xml 、 json

Page 36: Spring mvc

深入 MVC

资源文件的处理• servlet-mapping: /• 3.0.4 新增: • <mvc:resources mapping="/resources/**"

location="/resources/" />

Page 37: Spring mvc

RestTemplate Etag

数据绑定 注解带来的问题

使用约束上 ,请听下回分解

Page 38: Spring mvc

谢谢