1、Spring MVC教程,内容概要,1.SpringMVC 概述 2.SpringMVC 的 HelloWorld 3.使用 RequestMapping 映射请求 4.映射请求参数 & 请求头 5.处理模型数据 6.视图和视图解析器 7.RESTful CRUD 8.SpringMVC 表单标签 &处理静态资源 9.数据转换 & 数据格式化 & 数据校验 ,10.处理 JSON:使用 HttpMessageConverter 11.国际化 12.文件的上传 13.使用拦截器, 14.异常处理 15.SpringMVC 运行流程 16.在 Spring 的环境下使用 SpringMVC 17.
2、SpringMVC 对比 Struts2,内容概要,SpringMVC 概述 SpringMVC 的 HelloWorld 使用 RequestMapping 映射请求 映射请求参数 & 请求头 处理模型数据 视图和视图解析器 RESTful CRUD SpringMVC 表单标签 &处理静态资源 数据转换 & 数据格式化 & 数据校验 处理 JSON:使用 HttpMessageConverter 国际化 文件的上传 使用拦截器, 异常处理 SpringMVC 运行流程 在 Spring 的环境下使用 SpringMVC SpringMVC 对比 Struts2,SpringMVC 概述,
3、Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请 求的控制器,而无须实现任何接口。 支持 REST 风格的 URL 请求 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具 扩展性和灵活性,HelloWorld, 步骤: 加入 jar 包 在 web.xml 中配置 DispatcherServlet 加入 Spring MVC 的配置文件 编写处理请求的处理器,并标识为处理器 编写视图
4、,HelloWorld:加入 jar 包,jar 包: commons-logging-1.1.3.jar spring-aop-4.0.0.RELEASE.jar spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar spring-web-4.0.0.RELEASE.jar spring-webmvc-4.0.0.RELEASE.jar,HelloWorld:配置 web.xml,配置 D
5、ispatcherServlet :DispatcherServlet 默认加载 /WEB- INF/.xml 的 Spring 配置文件, 启动 WEB 层 的 Spring 容器。可以通过 contextConfigLocation 初始化参数自定 义配置文件的位置和名称,HelloWorld:创建 Spring MVC 配置文件, 配置自动扫描的包 配置视图解析器:视图名称解析器:将视图逻辑 名解析为: /WEB-INF/pages/.jsp,HelloWorld:创建请求处理器类,*. action springmvc-1/helloWorld.action url, dispatch
6、erServlet,Controller public class HelloWorldController RequestMapping(“/helloWorld“) public String helloWolrd() System.out.println(“HelloWorld SpringMVC“);,return “success“;,/WEB-INF/view/success.jsp,web.xml,Handler,SpringMVC 配置文件,实际的物理视图,内容概要,SpringMVC 概述 SpringMVC 的 HelloWorld 使用 RequestMapping 映射
7、请求 映射请求参数 & 请求头 处理模型数据 视图和视图解析器 RESTful CRUD SpringMVC 表单标签 &处理静态资源 数据转换 & 数据格式化 & 数据校验 处理 JSON:使用 HttpMessageConverter 国际化 文件的上传 使用拦截器, 异常处理 SpringMVC 运行流程 在 Spring 的环境下使用 SpringMVC SpringMVC 对比 Struts2,使用 RequestMapping 映射请求,Spring MVC 使用 RequestMapping 注解为控制器指定可 以处理哪些 URL 请求 在控制器的类定义及方法定义处都可标注 Re
8、questMapping 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若 类定义处未标注 RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录 DispatcherServlet 截获请求后,就通过控制器上 RequestMapping 提供的映射信息确定请求所对应的处理 方法。,使用 RequestMapping 映射请求示例,类定义处标记的 RequestMapping 限定了处理 器类可以处理所有 URI 为 /hello 的请求,它相对于 WEB 容器部 署的根路径,处理器类可
9、以定义多个处理方法,处理来 自/hello 下的请求,映射请求参数、请求方法或请求头, 标准的 HTTP 请求报头 请求方法 请求URL HTTP协议及版本 报 文 头, 报 文 体,映射请求参数、请求方法或请求头,RequestMapping 除了可以使用请求 URL 映射请求外, 还可以使用请求方法、请求参数及请求头映射请求 RequestMapping 的 value、method、params 及 heads 分别表示请求 URL、请求方法、请求参数及请求头的映射条 件,他们之间是与的关系,联合使用多个条件可让请求映射 更加精确化。 params 和 headers支持简单的表达式:
10、param1: 表示请求必须包含名为 param1 的请求参数 !param1: 表示请求不能包含名为 param1 的请求参数 param1 != value1: 表示请求包含名为 param1 的请求参数,但其值 不能为 value1 “param1=value1”, “param2”: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1,映射请求参数、请求方法或请求头,使用 RequestMapping 映射请求, Ant 风格资源地址支持 3 种匹配符: ?:匹配文件名中的一个字符 *:匹配文件名中的任意字符 *:* 匹配多层
11、路径 RequestMapping 还支持 Ant 风格的 URL: /user/*/createUser: 匹配 /user/aaa/createUser、/user/bbb/createUser 等 URL /user/*/createUser: 匹配 /user/createUser、/user/aaa/bbb/createUser 等 URL /user/createUser?: 匹配 /user/createUseraa、/user/createUserbb 等 URL,PathVariable 映射 URL 绑定的占位符, 带占位符的 URL 是 Spring3.0 新增的功能,该
12、功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的 意义 通过 PathVariable 可以将 URL 中占位符参数绑定到控 制器处理方法的入参中:URL 中的 xxx 占位符可以通过 PathVariable(“xxx“) 绑定到操作方法的入参中。,REST,REST:即 Representational State Transfer。(资源)表现层状态转化。是目前 最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用 资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它 可以是一段文本、一张图
13、片、一首歌曲、一种服务,总之就是一个具体的存在。 可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要 获取这个资源,访问它的URI就可以,因此 URI 即为每一个资源的独一无二的识 别符。 表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格 式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。 状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一 次交互过程。HTTP协议,是一个无状态协议,即所有的状态
14、都保存在服务器 端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“ 状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “ 表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动 词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET 用来获 取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。,REST, 示例: /order/1 HTTP GET :得到 id = 1 的 order /order/1 HTTP DELETE:删除 id = 1的 order /ord
15、er/1 HTTP PUT:更新id = 1的 order /order HTTP POST:新增 order HiddenHttpMethodFilter:浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支 持,Spring3.0 添加了一个过滤器,可以将这些请求转换 为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。,PathVariable 绑定 URL 占位符到入参, 带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑
16、的 意义 通过 PathVariable 可以将 URL 中占位符参数绑定到控 制器处理方法的入参中:URL 中的 xxx 占位符可以通过 PathVariable(“xxx“) 绑定到操作方法的入参中。,内容概要,SpringMVC 概述 SpringMVC 的 HelloWorld 使用 RequestMapping 映射请求 映射请求参数 & 请求参数 处理模型数据 视图和视图解析器 RESTful CRUD SpringMVC 表单标签 &处理静态资源 数据转换 & 数据格式化 & 数据校验 处理 JSON:使用 HttpMessageConverter 国际化 文件的上传 使用拦截器
17、, 异常处理 SpringMVC 运行流程 在 Spring 的环境下使用 SpringMVC SpringMVC 对比 Struts2,请求处理方法签名, Spring MVC 通过分析处理方法的签名,将 HTTP 请求信 息绑定到处理方法的相应人参中。 Spring MVC 对控制器处理方法签名的限制是很宽松的, 几乎可以按喜欢的任何方式对方法进行签名。 必要时可以对方法及方法入参标注相应的注解( PathVariable 、RequestParam、RequestHeader 等)、Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参 中,并根据方法的返回值类型做出相
18、应的后续处理。,使用 RequestParam 绑定请求参数值, 在处理方法入参处使用 RequestParam 可以把请求参 数传递给请求方法 value:参数名 required:是否必须。默认为 true, 表示请求参数中必须包含对应 的参数,若不存在,将抛出异常,使用 RequestHeader 绑定请求报头的属性值, 请求头包含了若干个属性,服务器可据此获知客户端的信 息,通过 RequestHeader 即可将请求头中的属性值绑 定到处理方法的入参中,使用 CookieValue 绑定请求中的 Cookie 值,CookieValue 可让处理方法入参绑定某个 Cookie 值,使
19、用 POJO 对象绑定请求参数值, Spring MVC 会按请求参数名和 POJO 属性名进行自动匹 配,自动为该对象填充属性值。支持级联属性。 如:dept.deptId、dept.address.tel 等,使用 Servlet API 作为入参,MVC 的 Handler 方法可以接受 哪些 ServletAPI 类型的参数,HttpServletRequest HttpServletResponse HttpSession java.security.Principal Locale InputStream OutputStream Reader Writer,内容概要,Spring
20、MVC 概述 SpringMVC 的 HelloWorld 使用 RequestMapping 映射请求 映射请求参数 & 请求头 处理模型数据 RESTful CRUD 视图和视图解析器 SpringMVC 表单标签 &处理静态资源 数据转换 & 数据格式化 & 数据校验 处理 JSON:使用 HttpMessageConverter 国际化 文件的上传 使用拦截器, 异常处理 SpringMVC 运行流程 在 Spring 的环境下使用 SpringMVC SpringMVC 对比 Struts2,处理模型数据, Spring MVC 提供了以下几种途径输出模型数据: ModelAndVi
21、ew: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据 Map 及 Model: 入参为 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。 SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性 ModelAttribute: 方法入参标注该注解后, 入参的对象 就会放到数据模型中,ModelAndView, 控制器处理方法的
22、返回值如果为 ModelAndView, 则其既 包含视图信息,也包含模型数据信息。 添加模型数据: MoelAndView addObject(String attributeName, Object attributeValue) ModelAndView addAllObject(Map modelMap) 设置视图: void setView(View view) void setViewName(String viewName)j,Map 及 Model,Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存 储模型数据 具体步骤 S
23、pring MVC 在调用方法前会创建一个隐 含的模型对象作为模型数据的存储容器。 如果方法的入参为 Map 或 Model 类 型,Spring MVC 会将隐含模型的引用传 递给这些入参。在方法体内,开发者可以 通过这个入参对象访问到模型中的所有数 据,也可以向模型中添加新的属性数据,Map 及 Model 示例,SessionAttributes, 若希望在多个请求之间共用某个模型属性数据,则可以在 控制器类上标注一个 SessionAttributes, Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。 SessionAttributes 除了可以通过属性
24、名指定需要放到会 话中的属性外,还可以通过模型属性的对象类型指定哪些 模型属性需要放到会话中 SessionAttributes(types=User.class) 会将隐含模型中所有类型 为 User.class 的属性添加到会话中。 SessionAttributes(value=“user1”, “user2”) SessionAttributes(types=User.class, Dept.class) SessionAttributes(value=“user1”, “user2”, types=Dept.class),SessionAttributes 示例,update(),.
25、 表单参数赋值 new 一个新的对象,. 传递给目标方法,执行 update 操作,db,update(),db, 从数据库中 取出数据,. 表单参数赋值,. 传递给目标方法,执行 update 操作,db,ModelAttribute,在方法定义上使用 ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 ModelAttribute 的方法。 在方法的入参前使用 ModelAttribute 注解: 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 绑定到对象中,再传入入参 将方法入参对象添加到模型中,由SessionAtt
26、ributes引发的异常,org.springframework.web.HttpSessionRequiredException: Session attribute user required - not found in session 如果在处理类定义处标注了SessionAttributes(“xxx”),则 尝试从会话中获取该属性,并将其赋给该入参,然后再用 请求消息填充该入参对象。如果在会话中找不到对应的属 性,则抛出 HttpSessionRequiredException 异常,如何避免SessionAttributes引发的异常,Controller RequestMapp
27、ing(“/user“) SessionAttributes(“user”) public class UserController ModelAttribute(“user“) public User getUser() User user = new User(); return user; ,RequestMapping(value = “/handle71“) public String handle71(ModelAttribute(“user”) User user) . RequestMapping(value = “/handle72“) public String handl
28、e72(ModelMap modelMap,SessionStatus sessionStatus) . ,该方法会往隐含模型中添加一,个名为user的模型属性,内容概要,SpringMVC 概述 SpringMVC 的 HelloWorld 使用 RequestMapping 映射请求 映射请求参数 & 请求头 处理模型数据 视图和视图解析器 RESTful CRUD SpringMVC 表单标签 &处理静态资源 数据转换 & 数据格式化 & 数据校验 处理 JSON:使用 HttpMessageConverter 国际化 文件的上传 使用拦截器, 异常处理 SpringMVC 运行流程 在
29、 Spring 的环境下使用 SpringMVC SpringMVC 对比 Struts2,Spring MVC如何解析视图,ViewViewResolver,视图对象 JSP/JSTL/PDF.,请求处理方法返回值类型String,ModelAndView,ModelAndView,herServlet,herServlet,AnnotationMethodHandlerAdapter,AnnotationMethodHandlerAdapter,ServletHandlerMethodInvoker,ServletHandlerMethodInvoker,UserHandler,UserH
30、andler,InternalResourceViewResolver,InternalResourceViewResolver,InternalResourceView,InternalResourceView,2: handle,3: invokeHandlerMethod,4: login,ModelAndView 对象5: getModelAndView6: processDispatchResult,7: resolveViewName,8: resolveViewName渲染视图 9: render10: exp,11: for,调用目标处理器的目标方法,由视图解析器解析逻辑视图到
31、物理视图,把目标方法返回值转为,视图和视图解析器, 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的 处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图 Spring MVC 借助视图解析器(ViewResolver)得到最终 的视图对象(View),最终的视图可以是 JSP ,也可能是 Excel、JFreeChart 等各种表现形式的视图 对于最终究竟采取何种视图对象对模型数据进行渲染,处 理器并不关心,处理器工作重点聚焦在生产模型
32、数据的工 作上,从而实现 MVC 的充分解耦,视图, 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客,户。 为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口:, 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们 不会有线程安全的问题,常用的视图实现类,视图解析器, SpringMVC 为逻辑视图名的解析提供了不同的策略,可 以在 Spring WEB 上下文中配置一种或多种解析策略,并 指定他们之间的先后顺序。每一种映射策略对应一个具体 的视图解析器实现类。
33、视图解析器的作用比较单一:将逻辑视图解析为一个具体 的视图对象。 所有的视图解析器都必须实现 ViewResolver 接口:,常用的视图解析器实现类, 程序员可以选择一种视图解析器或混用多种视图解析器 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可 以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。 SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解 析,直到解析成功并返回视图对象,否则将抛出 ServletException 异 常,InternalResourceViewResolver, JSP 是最常见的视图技术
34、,可以使用 InternalResourceViewResolver 作为视图解析器:,/WEB-INF/pages/user/createSucess.jsp,InternalResourceViewResolver, 若项目中使用了 JSTL,则 SpringMVC 会自动把视图由 InternalResourceView 转为 JstlView 若使用 JSTL 的 fmt 标签则需要在 SpringMVC 的配置文件中配置国际 化资源文件, 若希望直接响应通过 SpringMVC 渲染的页面,可以使用 mvc:view- controller 标签实现,Excel 视图, 若希望使用
35、Excel 展示数据列表,仅需要扩展 SpringMVC 提供的 AbstractExcelView 或 AbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以 了。 AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。 视图对象需要配置 IOC 容器中的一个 Bean,使用 BeanNameViewResolver 作为视图解析器即可 若希望直接在浏览器中直接下载 Excel 文档,则可以设置 响应头 Content
36、-Disposition 的值为 attachment;filename=xxx.xls,关于重定向, 一般情况下,控制器方法返回字符串类型的值会被当成逻 辑视图名处理 如果返回的字符串中带 forward: 或 redirect: 前缀 时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理 redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作 forward:success.jsp:会完成一个到 success.jsp 的转发操作,内容概要,SpringMVC 概述
37、SpringMVC 的 HelloWorld 使用 RequestMapping 映射请求 映射请求参数 & 请求头 处理模型数据 视图和视图解析器 RESTful CRUD SpringMVC 表单标签 &处理静态资源 数据转换 & 数据格式化 & 数据校验 处理 JSON:使用 HttpMessageConverter 国际化 文件的上传 使用拦截器, 异常处理 SpringMVC 运行流程 在 Spring 的环境下使用 SpringMVC SpringMVC 对比 Struts2,RESTful SpringMVC CRUD, 1. 显示所有员工信息 URI:emps 请求方式:GET 显示效果,RESTful SpringMVC CRUD, 2. 添加所有员工信息 显示添加页面: URI:emp 请求方式:GET 显示效果, 添加员工信息:,URI:emp 请求方式:POST 显示效果:完成添加,重定向到 list 页 面。,