Spring mvc

3,308 views

Published on

Published in: Technology, News & Politics
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,308
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
50
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Spring mvc

  1. 1. Spring MVC RESTful Web Service和应用开发 cheney.s 2010.10
  2. 2. 主题 •快速启动 •如何使用 •为什么选择 •深入MVC
  3. 3. 快速启动
  4. 4. 快速启动 创建Spring MVC项目 1. web.xml注册DispatcherServlet • 映射到”/” • FrontController 2. 创建spring容器: root & web
  5. 5. 快速启动 这么复杂,不玩了 请留步... Demo Spring Roo http://www.springsource.org/roo
  6. 6. 如何使用
  7. 7. 如何使用 MVC的编程模型 • request @Controller • @RequestMapping映射规则 • Method参数获取请求数据 • 返回结果产生response DispatcherServlet
  8. 8. 如何使用 请求映射 • 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/*")
  9. 9. 如何使用 @RequestMapping • 在class级别使用
  10. 10. 如何使用 @RequestMapping • 在method级别使用
  11. 11. 如何使用 获取请求数据 1. @RequestParam("name") • @RequestParam(value="id", required="false") 2. @PathVariable("var") 3. @RequestHeader("name") 4. @RequestBody 5. @CookieValue("name") 6. JavaBean 7. HttpEntity<T>
  12. 12. 如何使用 类型转换 • 自动转换 • ConversionService提供功能 • 常规的转换功能开箱即用 • Primitives, Strings, Dates, Collections, Maps, 自定义 • 使用注解声明转换规则 • @NumberFormat, @DateTimeFormat,自定义@Format
  13. 13. 如何使用 注入标准对象 任意组合使用 HttpServletReque st HttpServletRespo nse HttpSession InputStream OutputStream Principal Reader Writer Locale
  14. 14. 如何使用 注入我的对象 WebArgumentResolver
  15. 15. 如何使用 产生Response • 返回@ResponseBody • 返回ResponseEntity<T>
  16. 16. 如何使用 视图呈现 • DispatcherServlet也能呈现视图 • HttpMessageConverter输出响应 • 通过模版(jsp)输出text/*类型的内容 • 通过Model导出数据到视图中
  17. 17. 如何使用 视图呈现 • 通过字符串选择视图 • 这种方式下不要使用@ResponseBody • 可以配置ViewResolver把名称和实例对象绑定 • 默认的ViewResoler转向内部的servlet资源 • 开箱即用: JSP、Tiles、Freemarker、Velocity、 iText PDF、Jexcel、JasperReports、XSLT • 支持自定义视图
  18. 18. 如何使用 Validation • JavaBean 使用@Valid触发 • JSR-303,实现hibernate-validator • 验证结果通过BindingResult获取,必须在 JavaBean之后 • 不支持其它请求参数类型(@RequestBody等) • 错误会自动导出到视图中
  19. 19. 如何使用 Validation 1 2
  20. 20. 如何使用 异常处理 • @Controller级别 • 在Controller中的一个单独的方法上加上 @ExceptionHandler • 自己捕获异常 • DispatcherServlet级别 • 依赖DefaultHandlerExceptionResolver • 支持自定义HandlerExceptionResolver
  21. 21. 如何使用 测试 • 单元测试 • just POJOs • 使用mock框架 • HttpServlet Mocks • MockHttpServletRequest • MockHttpServletResponse • MockServletContext
  22. 22. 为什么选择
  23. 23. 为什么选择 PK MVC • Struts • Spring MVC • JSF、Tapestry 开发的王道(web vs jee vs ?)
  24. 24. 为什么选择 PK REST • Spring MVC • 缺少http响应状态码的支持,需要手工编写 • Spring MVC 2.5编程模型的延续 • JAX-RS(jersey) • @Path(“{username}/portfolios/“)、@PathParam("username") • @QueryParam @FormParam @MatrixParam • @GET @POST • 缺少spring MVC参数匹配机制 • 缺少基于注解的类型转换和数据验证
  25. 25. 为什么选择 优点 • 一脉相承的spring模式 • 架构优雅,配置简单,使用灵活 • JSR-303支持 • 简化ajax开发 • Roo支持
  26. 26. 深入MVC
  27. 27. 深入MVC 配置解析 • web.xml • DispatcherServlet -> servlet-context.xml • servlet-context.xml • <mvc:annotation-driven /> -> AnnotationMethodHandlerAdapter • <context:component-scan base-package="org.springframework.samples.mvc" /> • 初始化DispatcherServlet
  28. 28. 深入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
  29. 29. 深入MVC DispatcherServlet
  30. 30. 深入MVC 参数注入的魔法 魔法来源: org.springframework.web.bind.annotation.support.HandlerMethodInvoker #resolveHandlerArguments() 魔法原理:反射 CodeReview
  31. 31. 深入MVC HttpMessageConverters • 读取请求,产生响应 • 可以为不同的content types注册多个的转换器 • 对于@RequestBody,使用第一个能读取”Content- Type”请求的转换器,转换为方法参数值 • 对于@ResponseBody,使用客户端可以”Accept” 的返回类型的第一个找到的转换器回写数据 • 默认已经提供了一组转换器(4个) • 可以自定义转换器,通过 AnnotationMethodHandlerAdapter注册
  32. 32. 深入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
  33. 33. 深入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
  34. 34. 深入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
  35. 35. 深入MVC Views vs @ResponseBody • 都为了呈现响应 • ViewResolver + View • HttpMessageConverter • 触发方式不同 • View 返回一个字符串 • 通过@ResponseBody或ResponseEntity输出 • 如何选择 • 使用view生成文档,例如html、pdf、xls • 使用@ResponseBody提供web service,例如xml、json
  36. 36. 深入MVC 资源文件的处理 • servlet-mapping: / • 3.0.4新增: • <mvc:resources mapping="/resources/**" location="/resources/" />
  37. 37. RestTemplate Etag 数据绑定 注解带来 的问题 使用约束 上 ,请听下回分解
  38. 38. 谢谢

×