Скачать презентацию Spring MVC 3 0指南 参考 Spring 3 x企业应用开发实战 Скачать презентацию Spring MVC 3 0指南 参考 Spring 3 x企业应用开发实战

f8d43835cd4193edf7f9135cbefb7a95.ppt

  • Количество слайдов: 73

Spring MVC 3. 0指南 参考《Spring 3. x企业应用开发实战》 Spring MVC 3. 0指南 参考《Spring 3. x企业应用开发实战》

目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 7 其它

Spring MVC 3. 0新特性 • 支持REST风格的URL • 添加更多注解,可完全注解驱动 • 引入HTTP输入输出转换器( Http. Message. Converter) • Spring MVC 3. 0新特性 • 支持REST风格的URL • 添加更多注解,可完全注解驱动 • 引入HTTP输入输出转换器( Http. Message. Converter) • 和数据转换、格式化、验证框架无缝集成 • 对静态资源处理提供特殊支持 • 更加灵活的控制器方法签名,可完全独立于 Servlet API 参考《Spring 3. x企业应用开发实战》

Spring MVC框架结构 Handler. Mapping 2 Dispatcher. Servlet 1 7 Model 8 3 Model. And. Spring MVC框架结构 Handler. Mapping 2 Dispatcher. Servlet 1 7 Model 8 3 Model. And. View 5 Handler. Adapter 4 6 View. Resolver Handler View
 (JSP/XML/PDF, . . . ) 参考《Spring 3. x企业应用开发实战》

Spring MVC框架结构 package com. baobaotao. web; . . . @Controller ① 将User. Controller变成一个Handler @Request. Spring MVC框架结构 package com. baobaotao. web; . . . @Controller ① 将User. Controller变成一个Handler @Request. Mapping(“/user”) ② 指定控制器映射的URL public class User. Controller { @Request. Mapping(value = “/register”) ③ 处理方法对应的URL,相对于 ②处的URL public String register() { return “user/register”; ④ 返回逻辑视图名 } } 参考《Spring 3. x企业应用开发实战》

框架的实现者 Default. Annotation Handler. Mapping 2 Dispatcher. Servlet 3 Model. And. View 框架的实现者 Default. Annotation Handler. Mapping 2 Dispatcher. Servlet 3 Model. And. View "user/register" 1 7 Model 8 6 5 Annotation. Method Handler. Adapter 4 Internal. Resource View. Resolver User. Controller register. jsp 参考《Spring 3. x企业应用开发实战》

目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 7 其它

HTTP请求映射原理 WEB容器 HTTP请求报文 Spring MVC 框架 Handler 处理方法 参考《Spring 3. x企业应用开发实战》 HTTP请求映射原理 WEB容器 HTTP请求报文 Spring MVC 框架 Handler 处理方法 参考《Spring 3. x企业应用开发实战》

Spring MVC进行映射的依据 参考《Spring 3. x企业应用开发实战》 Spring MVC进行映射的依据 参考《Spring 3. x企业应用开发实战》

通过URL限定: URL表达式 @Request. Mapping不但支持标准的URL,还支持Ant风格(即? 、*和 **的字符,参见3. 3. 2节的内容)的和带{xxx}占位符的URL。以下URL都 是合法的: l/user/*/create. User 匹配/user/aaa/create. User、/user/bbb/create. User等URL。 通过URL限定: URL表达式 @Request. Mapping不但支持标准的URL,还支持Ant风格(即? 、*和 **的字符,参见3. 3. 2节的内容)的和带{xxx}占位符的URL。以下URL都 是合法的: l/user/*/create. User 匹配/user/aaa/create. User、/user/bbb/create. User等URL。 l/user/**/create. User 匹配/user/create. User、/user/aaa/bbb/create. User等URL。 l/user/create. User? ? 匹配/user/create. Useraa、/user/create. Userbb等URL。 l/user/{user. Id} 匹配user/123、user/abc等URL。 l/user/**/{user. Id} 匹配user/aaa/bbb/123、user/aaa/456等URL。 lcompany/{company. Id}/user/{user. Id}/detail 匹配company/123/user/456/detail等的URL。 参考《Spring 3. x企业应用开发实战》

通过URL限定: 绑定{xxx}中的值 @Request. Mapping( 通过URL限定: 绑定{xxx}中的值 @Request. Mapping("/{user. Id}") public Model. And. View show. Detail(@Path. Variable("user. Id") String user. Id){ Model. And. View mav = new Model. And. View(); mav. set. View. Name("user/show. Detail"); URL中的{xxx}占位符可以通过 mav. add. Object("user", user. Service. get. User. By. Id(user. Id)); @Path. Variable("xxx")绑定到操 return mav; 作方法的入参中。 } @Controller @Request. Mapping("/owners/{owner. Id}") public class Relative. Path. Uri. Template. Controller { 如果@Path. Variable不指定参数名, 只有在编译时打开debug开关( javac -debug=no)时才可行! !(不建议) @Request. Mapping("/pets/{pet. Id}") public void find. Pet(@Path. Variable String owner. Id, @Path. Variable String pet. Id, Model model) { … } } 参考《Spring 3. x企业应用开发实战》

通过请求方法限定: 请求方法,在HTTP中这被叫做动词(verb),除了两个大家熟知的 (GET和POST)之外,标准方法集合中还包含PUT、DELETE、HEAD 和OPTIONS。这些方法的含义连同行为许诺都一起定义在HTTP规范之 中。一般浏览器只支持GET和POST方法。 序号 请求方法 说明 1 GET 使用GET方法检索一个表述(representation)——也 就是对资源的描述。多次执行同一GET请求,不会对系 统造成影响,GET方法具有幂等性[指多个相同请求返回 相同的结果]。GET请求可以充分使用客户端的缓存。 通过请求方法限定: 请求方法,在HTTP中这被叫做动词(verb),除了两个大家熟知的 (GET和POST)之外,标准方法集合中还包含PUT、DELETE、HEAD 和OPTIONS。这些方法的含义连同行为许诺都一起定义在HTTP规范之 中。一般浏览器只支持GET和POST方法。 序号 请求方法 说明 1 GET 使用GET方法检索一个表述(representation)——也 就是对资源的描述。多次执行同一GET请求,不会对系 统造成影响,GET方法具有幂等性[指多个相同请求返回 相同的结果]。GET请求可以充分使用客户端的缓存。 2 POST方法,通常表示“创建一个新资源”,但它既不安全 也不具有幂等性(多次操作会产生多个新资源)。 3 DELETE 4 PUT DELETE,表示删除一个资源,你也可以一遍又一遍地 操作它,直到得出结果:删除不存在的东西没有任何问 题 幂等性同样适用于PUT(基本的含义是“更新资源数据, 如果资源不存在的话,则根据此URI创建一个新的资源”) 参考《Spring 3. x企业应用开发实战》

通过请求方法限定: 代码示例 示例1: @Request. Mapping(value=“/delete”) public String test 1(@Request. Param( 通过请求方法限定: 代码示例 示例1: @Request. Mapping(value=“/delete”) public String test 1(@Request. Param("user. Id") String user. Id){ return "user/test 1"; } 所有URL为/delete的请求由test 1处理(任何请求方法) 示例2: @Request. Mapping(value="/delete", method=Request. Method. POST) public String test 1(@Request. Param("user. Id") String user. Id){ return "user/test 1"; } 所有URL为/delete 且请求方法为POST 的请求由test 1处理 参考《Spring 3. x企业应用开发实战》

通过请求方法限定: 模拟请求方法 通过在web. xml中配置一个 org. springframework. web. filter. Hidden. Http. Method. Filter 通过POST请求的_method参数指定请求方法,Hidden. Http. 通过请求方法限定: 模拟请求方法 通过在web. xml中配置一个 org. springframework. web. filter. Hidden. Http. Method. Filter 通过POST请求的_method参数指定请求方法,Hidden. Http. Method. Filter 动态更改HTTP头信息。 method=PUT&. . . Hidden. Http. Method. Filter POST HTTP请求 PUT HTTP请求 Spring MVC 参考《Spring 3. x企业应用开发实战》

通过请求/请求头参数限定: 示例 通过请求参数限定: @Request. Mapping(value= 通过请求/请求头参数限定: 示例 通过请求参数限定: @Request. Mapping(value="/delete", params="user. Id") public String test 1(@Request. Param("user. Id") String user. Id){. . . } 通过请求头参数限定: @Request. Mapping(value="/show", headers="content-type=text/*")② public String test 2(@Request. Param("user. Id") String user. Id){. . . } 参考《Spring 3. x企业应用开发实战》

通过请求/请求头参数限定: 更多 params和headers分别通过请求参数及报文头属性进行映射,它们 支持简单的表达式,下面以params表达式为例说明,headers可以参照 params进行理解之。 l 通过请求/请求头参数限定: 更多 params和headers分别通过请求参数及报文头属性进行映射,它们 支持简单的表达式,下面以params表达式为例说明,headers可以参照 params进行理解之。 l"param 1":表示请求必须包含名为param 1的请求参数。 l"!param 1":表示请求不能包含名为param 1的请求参数。 l"param 1!=value 1":表示请求包含名为param 1的请求参数,但 其值不能为value 1。 l{"param 1=value 1", "param 2"}:请求必须包含名为param 1和 param 2的两个请求参数,且param 1参数的值必须为value 1。 参考《Spring 3. x企业应用开发实战》

目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 7 其它

通过注解绑定: 示意图 @Request. Param 绑定请求参数 @Request. Header 绑定请求头参数 @Cookie. Value 绑定Cookie的值 @Path. Variable 绑定URL中的变量 通过注解绑定: 示意图 @Request. Param 绑定请求参数 @Request. Header 绑定请求头参数 @Cookie. Value 绑定Cookie的值 @Path. Variable 绑定URL中的变量 public String handle 1(. . . ) 参考《Spring 3. x企业应用开发实战》

通过注解绑定: 示例 @Request. Mapping(value= 通过注解绑定: 示例 @Request. Mapping(value="/handle 1") public String handle 1(@Request. Param("user. Name") String user. Name, @Request. Param("password") String password, @Request. Param("real. Name") String real. Name){. . . } @Request. Mapping(value="/handle 2") public String handle 2(@Cookie. Value("JSESSIONID") String session. Id, @Request. Header("Accept-Language") String accpet. Language){. . . } 参考《Spring 3. x企业应用开发实战》

通过注解绑定: 小心抛出异常 @Request. Param有以下三个参数。 lvalue:参数名。 lrequired:是否必需,默认为true,表示请求中必须包含对应的参数名,如 果不存在将抛出异常。 ldefault. Value:默认参数名,设置该参数时,自动将required设为false。极 少情况需要使用该参数,也不推荐使用该参数。 @Request. Mapping(value= 通过注解绑定: 小心抛出异常 @Request. Param有以下三个参数。 lvalue:参数名。 lrequired:是否必需,默认为true,表示请求中必须包含对应的参数名,如 果不存在将抛出异常。 ldefault. Value:默认参数名,设置该参数时,自动将required设为false。极 少情况需要使用该参数,也不推荐使用该参数。 @Request. Mapping(value="/handle 1") public String handle 1(@Request. Param("user. Name") String user. Name, ){. . . } 上面的处理方法 ,如果HTTP请求不包含“user. Name”参数时,将产生异常 !! 因此,如果不能保证存在”user. Name”的参数,必须使用: @Request. Param(value = "user. Name", required = false) 参考《Spring 3. x企业应用开发实战》

使用命令/表单对象绑定 所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干属性的 POJO。Spring MVC按: “HTTP请求参数名 = 命令/表单对象的属性名” 的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转 换。 @Request. Mapping(value = 使用命令/表单对象绑定 所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干属性的 POJO。Spring MVC按: “HTTP请求参数名 = 命令/表单对象的属性名” 的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转 换。 @Request. Mapping(value = "/handle 14") public String handle 14(User user) { … } user. Name=xxx&password=yyy class User{ private String user. Name; private String password; } 参考《Spring 3. x企业应用开发实战》

使用Servlet API对象作为入参 在Spring MVC中,控制器类可以不依赖任何Servlet API对象,但是 Spring MVC并不阻止我们使用Servlet API的类作为处理方法的入参。值得注 意的是,如果处理方法自行使用Http. Servlet. Response返回响应,则处理方法 的返回值设置成void即可。 @Request. Mapping(value 使用Servlet API对象作为入参 在Spring MVC中,控制器类可以不依赖任何Servlet API对象,但是 Spring MVC并不阻止我们使用Servlet API的类作为处理方法的入参。值得注 意的是,如果处理方法自行使用Http. Servlet. Response返回响应,则处理方法 的返回值设置成void即可。 @Request. Mapping(value = "/handle 21") public void handle 21(Http. Servlet. Request request, Http. Servlet. Response response) { String user. Name = Web. Utils. find. Parameter. Value(request, "user. Name"); response. add. Cookie(new Cookie("user. Name", user. Name)); } public String handle 23(Http. Session session) { session. set. Attribute("session. Id", 1234); return "success"; } public String handle 24(Http. Servlet. Request request, @Request. Param("user. Name")String user. Name) { … return "success"; }

使用Spring的Servlet API代理类 Spring MVC在org. springframework. web. context. request包中定 义了若干个可代理Servlet原生API类的接口,如Web. Request和 Native. Web. Request,它们也允许作为处理类的入参,通过这些代理 类可访问请求对象的任何信息。 使用Spring的Servlet API代理类 Spring MVC在org. springframework. web. context. request包中定 义了若干个可代理Servlet原生API类的接口,如Web. Request和 Native. Web. Request,它们也允许作为处理类的入参,通过这些代理 类可访问请求对象的任何信息。 @Request. Mapping(value = "/handle 25") public String handle 25(Web. Request request) { String user. Name = request. get. Parameter("user. Name"); return "success"; } 参考《Spring 3. x企业应用开发实战》

使用IO对象作为入参 Spring MVC允许控制器的处理方法使用java. io. Input. Stream/java. io. Reader及 java. io. Output. Stream/java. io. Writer作为方法的入参 使用IO对象作为入参 Spring MVC允许控制器的处理方法使用java. io. Input. Stream/java. io. Reader及 java. io. Output. Stream/java. io. Writer作为方法的入参 @Request. Mapping(value = "/handle 31") public void handle 31(Output. Stream os) throws IOException{ Resource res = new Class. Path. Resource("/image. jpg"); //读取类路径下的图片文件 File. Copy. Utils. copy(res. get. Input. Stream(), os); //将图片写到输出流中 } Spring MVC将获取Servlet. Request的Input. Stream/Reader或Servlet. Response 的Output. Stream/Writer,然后按类型匹配的方式,传递给控制器的处理方法 入参。 参考《Spring 3. x企业应用开发实战》

其他类型的参数 控制器处理方法的入参除支持以上类型的参数以外,还支持 java. util. Locale、java. security. Principal,可以通过Servlet的 Http. Servlet. Request 的get. Locale()及get. User. Principal()得到相应的值。如果 其他类型的参数 控制器处理方法的入参除支持以上类型的参数以外,还支持 java. util. Locale、java. security. Principal,可以通过Servlet的 Http. Servlet. Request 的get. Locale()及get. User. Principal()得到相应的值。如果 处理方法的入参类型为Locale或Principal,Spring MVC自动从请求对象中获 取相应的对象并传递给处理方法的入参。 @Request. Mapping(value = "/handle 32") public void handle 31(Locale locale) throws IOException{. . . }

Http. Message. Converter<T> Http. Servlet. Request HTTP请求报文 Http. Message. Converter<T> @Request. Body/ Http. Entity<T> Http. Message. Converter Http. Servlet. Request HTTP请求报文 Http. Message. Converter @Request. Body/ Http. Entity @Response. Body/ Response. Entity

Http. Message. Converter<T>实现类 Annotation. Method. Handler. Adapter 注册到. . . Http. Message. Converter<T> 接口方法 Http. Message. Converter实现类 Annotation. Method. Handler. Adapter 注册到. . . Http. Message. Converter 接口方法 T read(Http. Input. Message http. Input. Message) void write(T t, Http. Output. Message http. Output. Message) 实现类: String. Http. Message. Converter Form. Http. Message. Converter Xml. Aware. Form. Http. Message. Converter Resource. Http. Message. Converter Buffered. Image. Http. Message. Converter Byte. Array. Http. Message. Converter Source. Http. Message. Converter Marshalling. Http. Message. Converter Jaxb 2 Root. Element. Http. Message. Converter Mapping. Jackson. Http. Message. Converter Rss. Channel. Http. Message. Converter Atom. Feed. Http. Message. Converter

使用@Request. Body/@Response. Body 将Http. Servlet. Request的get. Input. Stream()内容绑定到入参,将处理方法 返回值写入到Http. Servlet. Response的get. Output. Stream()中。 @Request. 使用@Request. Body/@Response. Body 将Http. Servlet. Request的get. Input. Stream()内容绑定到入参,将处理方法 返回值写入到Http. Servlet. Response的get. Output. Stream()中。 @Request. Mapping(value = "/handle 41") public String handle 41(@Request. Body String request. Body ) { System. out. println(request. Body); return "success"; } @Response. Body @Request. Mapping(value = "/handle 42/{image. Id}") public byte[] handle 42(@Path. Variable("image. Id") String image. Id) throws IOException { System. out. println("load image of "+image. Id); Resource res = new Class. Path. Resource("/image. jpg"); byte[] file. Data =File. Copy. Utils. copy. To. Byte. Array(res. get. Input. Stream()); return file. Data; } 优点:处理方法签名灵活不受限 缺点:只能访问报文体,不能访问报文头 参考《Spring 3. x企业应用开发实战》

http." src="https://present5.com/presentation/f8d43835cd4193edf7f9135cbefb7a95/image-29.jpg" alt="使用Http. Entity/Response. Entity @Request. Mapping(value = "/handle 43") public String handle 43(Http. Entity http." /> 使用Http. Entity/Response. Entity @Request. Mapping(value = "/handle 43") public String handle 43(Http. Entity http. Entity){ long content. Len = http. Entity. get. Headers(). get. Content. Length(); System. out. println(http. Entity. get. Body()); return "success"; } @Request. Mapping(params = "method=login") public Response. Entity do. First(){ Http. Headers headers = new Http. Headers(); Media. Type mt=new Media. Type("text", "html", Charset. for. Name(“UTF-8")); headers. set. Content. Type(mt); Response. Entity re=null; String return = new String("test"); re=new Response. Entity(return, headers, Http. Status. OK); return re; } 优点:处理方法签名受限 缺点:不但可以访问报文体,还能访问报文头 参考《Spring 3. x企业应用开发实战》

输出XML和JSON 处理XML转换 处理JSON转换 参考《Spring 3. x企业应用开发实战》 输出XML和JSON 处理XML转换 处理JSON转换 参考《Spring 3. x企业应用开发实战》

handle 51(Http. Entity" src="https://present5.com/presentation/f8d43835cd4193edf7f9135cbefb7a95/image-31.jpg" alt="使用Http. Entity/Response. Entity @Request. Mapping(value = "/handle 51") public Response. Entity handle 51(Http. Entity" /> 使用Http. Entity/Response. Entity @Request. Mapping(value = "/handle 51") public Response. Entity handle 51(Http. Entity request. Entity){ User user = request. Entity. get. Body(); user. set. User. Id("1000"); return new Response. Entity(user, Http. Status. OK); } 对于服务端的处理方法而言,除使用@Request. Body/@Response. Body 或Http. Entity /Response. Entity进行方法签名外,不需要进行任何额外 的处理,借由Spring MVC中装配的Http. Message. Converter,它即拥有了处 理XML及JSON的能力了。 参考《Spring 3. x企业应用开发实战》

目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 7 其它

数据绑定机理 Conversion. Service 数据类型转换/格式化 Servlet. Request 1 3 数据校验 Data. Binder 2 4 5 数据绑定机理 Conversion. Service 数据类型转换/格式化 Servlet. Request 1 3 数据校验 Data. Binder 2 4 5 处理方法入参对象集 Binding. Result 处理方法的签名 Validator

数据类型转换 低版本的Spring 只支持标准的Property. Editor类型体系,不过 Property. Editor存在以下缺陷: l只能用于字符串和Java对象的转换,不适用于任意两个Java类型之间的转 换; l对源对象及目标对象所在的上下文信息(如注解、所在宿主类的结构等) 不敏感,在类型转换时不能利用这些上下文信息实施高级转换逻辑。 有鉴于此,Spring 3. 0在核心模型中添加了一个通用的类型转换模块, Conversion. 数据类型转换 低版本的Spring 只支持标准的Property. Editor类型体系,不过 Property. Editor存在以下缺陷: l只能用于字符串和Java对象的转换,不适用于任意两个Java类型之间的转 换; l对源对象及目标对象所在的上下文信息(如注解、所在宿主类的结构等) 不敏感,在类型转换时不能利用这些上下文信息实施高级转换逻辑。 有鉴于此,Spring 3. 0在核心模型中添加了一个通用的类型转换模块, Conversion. Service是Spring类型转换体系的核心接口。 Spring 3. 0同时支持Property. Editor和Conversion. Service 进行类型转换, 在Bean配置、Spring MVC处理方法入参绑定中使用类型转换体系进行 作。 参考《Spring 3. x企业应用开发实战》

Property. Editor依然有效 对于简单的类型转换,依然建议使用Property. Editor。按照 Property. Editor的协议,会自动查找Bean类相同类包是否存在 <Bean. Name>Editor. class,如果存在会使用它作为Bean的编辑器。 com. book. core. cache. expired Property. Editor依然有效 对于简单的类型转换,依然建议使用Property. Editor。按照 Property. Editor的协议,会自动查找Bean类相同类包是否存在 Editor. class,如果存在会使用它作为Bean的编辑器。 com. book. core. cache. expired |_Cache. Space. java |_ Cache. Space. Editor. java com. Book. Space: com/com. Book/** book. Space: com/book/**: 100 company. Space: com/company/** 参考《Spring 3. x企业应用开发实战》

强大的Conversion. Service,让很多梦想成真 由于Conversion. Service在进行类型转换时,可以使用到Bean所在宿主类 的上下文信息(包括类结构,注解信息),所以可以实施更加高级的类型转 换,如注解驱动的格式化等功能。 public class User { @Date. Time. Format(pattern= 强大的Conversion. Service,让很多梦想成真 由于Conversion. Service在进行类型转换时,可以使用到Bean所在宿主类 的上下文信息(包括类结构,注解信息),所以可以实施更加高级的类型转 换,如注解驱动的格式化等功能。 public class User { @Date. Time. Format(pattern="yyyy-MM-dd") private Date birthday; } 以上User类,通过一个@Date. Time. Format注解,为类型转换提供了一些“ 额外”的信息,即代表日期的“源字符器”格式是“yyyy-MM-dd” 参考《Spring 3. x企业应用开发实战》

基于Conversion. Service体系,定义自定义的类型转换器 定义自定义转换器: Converter<String, User> org. springframework. core. converter. Converter String. To. User. Converter 基于Conversion. Service体系,定义自定义的类型转换器 定义自定义转换器: Converter org. springframework. core. converter. Converter String. To. User. Converter 注册自定义转换器: 参考《Spring 3. x企业应用开发实战》

格式化:带格式字符串 内部对象 相互转换 Printer<T> Parser<T> Formatter<T> 注册内置的格式化器 Conversion. Service Formatting. Conversion. Service. Factory. Bean 格式化:带格式字符串 内部对象 相互转换 Printer Parser Formatter 注册内置的格式化器 Conversion. Service Formatting. Conversion. Service. Factory. Bean

使用支持格式化的转换器 值得注解的是,标签内部默认创建的 Conversion. Service实例就是一个Formatting. Conversion. Service. Factory. Bean, 自动支持如下的格式化注解: [email protected] Formatter:用于数字类型对象的格式化。 [email protected] Formatter:用于货币类型对象的格式化。 [email protected] Formatter:用于百分数数字类型对象的格式化。 >>参见testhandle 82() 参考《Spring 3. x企业应用开发实战》

数据校验框架 Spring 3. 0拥有自己独立的数据校验框架,同时支持 JSR 303标准的校验框架。Spring 的Data. Binder在进行数 据绑定时,可同时调用校验框架完成数据校验 作。在 Spring MVC中,则可直接通过注解驱动的方式进行数据 校验。 Spring的org. 数据校验框架 Spring 3. 0拥有自己独立的数据校验框架,同时支持 JSR 303标准的校验框架。Spring 的Data. Binder在进行数 据绑定时,可同时调用校验框架完成数据校验 作。在 Spring MVC中,则可直接通过注解驱动的方式进行数据 校验。 Spring的org. springframework. validation是校验框架 所在的包 参考《Spring 3. x企业应用开发实战》

JSR 303是Java为Bean数据合法性校验所提供的标准框架,它已经包含在Java EE 6. 0中。JSR 303通过在Bean属性上标注类似于@Not. Null、@Max等标准的注解指定 校验规则,并通过标准的验证接口对Bean进行验证。 你可以通过http: //jcp. org/en/jsr/detail? id=303了解JSR 303的详细内容。 注 JSR 303是Java为Bean数据合法性校验所提供的标准框架,它已经包含在Java EE 6. 0中。JSR 303通过在Bean属性上标注类似于@Not. Null、@Max等标准的注解指定 校验规则,并通过标准的验证接口对Bean进行验证。 你可以通过http: //jcp. org/en/jsr/detail? id=303了解JSR 303的详细内容。 注 解 功能说明 @Null 被注释的元素必须为 null @Not. Null 被注释的元素必须不为 null @Assert. True 被注释的元素必须为 true @Assert. False 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @Decimal. Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Decimal. Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @Size(max, min) 被注释的元素的大小必须在指定的范围内 @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个将来的日期

数据校验框架 <mvc: annotation-driven/>会默认装配好一个 Local. Validator. Factory. Bean,通过在处理方法的入参上标注@Valid 注解即可让Spring MVC在完成数据绑定后执行数据校验的 作。 public class User { 数据校验框架 会默认装配好一个 Local. Validator. Factory. Bean,通过在处理方法的入参上标注@Valid 注解即可让Spring MVC在完成数据绑定后执行数据校验的 作。 public class User { @Pattern(regexp="w{4, 30}") private String user. Name; @Length(min=2, max=100) private String real. Name; @Past @Date. Time. Format(pattern="yyyy-MM-dd") private Date birthday; @Decimal. Min(value="1000. 00") @Decimal. Max(value="100000. 00") @Number. Format(pattern="#, ###. ##") private long salary; } 注意:Spring本身没有提供JSR 303的实现,所以必须将JSR 303的实现者(如 Hibernate Validator)的jar文件放到类路径下,Spring将自动加载并装配好JSR 303的 实现者。 参考《Spring 3. x企业应用开发实战》

如何使用注解驱动的校验 @Controller @Request. Mapping( 如何使用注解驱动的校验 @Controller @Request. Mapping("/user") public class User. Controller { @Request. Mapping(value = "/handle 91") public String handle 91(@Valid User user, Binding. Result binding. Result){ if(binding. Result. has. Errors()){ return "/user/register 3"; }else{ return "/user/show. User"; } } } 在已经标注了JSR 303注解的表单/命令对象前标注一个@Valid, Spring MVC框架在将请求数据绑定到该入参对象后,就会调用校验 框架根据注解声明的校验规则实施校验。 参考《Spring 3. x企业应用开发实战》

使用校验功能时,处理方法要如何签名? ? Spring MVC是通过对处理方法签名的规约来保存校验结果的: 前一个表单/命令对象的校验结果保存在其后的入参中,这个保存校 验结果的入参必须是Binding. Result或Errors类型,这两个类都位于 org. springframework. validation包中。 参考《Spring 3. x企业应用开发实战》 使用校验功能时,处理方法要如何签名? ? Spring MVC是通过对处理方法签名的规约来保存校验结果的: 前一个表单/命令对象的校验结果保存在其后的入参中,这个保存校 验结果的入参必须是Binding. Result或Errors类型,这两个类都位于 org. springframework. validation包中。 参考《Spring 3. x企业应用开发实战》

校验错误信息存放在什么地方?? l 4. Spring MVC将Http. Servlet. Request对象数据绑定到处理方法的入 参对象中(表单/命令对象); l 5. 将绑定错误信息、检验错误信息都保存到隐含模型中; l 6. 本次请求的对应隐含模型数据存放到Http. 校验错误信息存放在什么地方?? l 4. Spring MVC将Http. Servlet. Request对象数据绑定到处理方法的入 参对象中(表单/命令对象); l 5. 将绑定错误信息、检验错误信息都保存到隐含模型中; l 6. 本次请求的对应隐含模型数据存放到Http. Servlet. Request的属性列 表中,暴露给视图对象。 参考《Spring 3. x企业应用开发实战》

<%@ taglib prefix="c" uri="http:" src="https://present5.com/presentation/f8d43835cd4193edf7f9135cbefb7a95/image-46.jpg" alt="页面如何显示错误信息 <%@ page language="java" content. Type="text/html; charset=UTF-8" page. Encoding="UTF 8"%> <%@ taglib prefix="c" uri="http:" /> 页面如何显示错误信息 <%@ page language="java" content. Type="text/html; charset=UTF-8" page. Encoding="UTF 8"%> <%@ taglib prefix="c" uri="http: //java. sun. com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http: //www. springframework. org/tags/form" %> 注册用户

用户名:
参考《Spring 3. x企业应用开发实战》

如何对错误信息进行国际化(1) 一个属性发生校验错误时,Spring MVC会产生一系列对应的错 误码键: public class User { @Pattern(regexp=“w{4, 30}”) 假设发生错误 private String user. 如何对错误信息进行国际化(1) 一个属性发生校验错误时,Spring MVC会产生一系列对应的错 误码键: public class User { @Pattern(regexp=“w{4, 30}”) 假设发生错误 private String user. Name; } 如果user. Name的@Pattern校验规则未通过,则会在“隐含模型”中 产生如下的错误键,这些错误键可以作为“国际化消息”的属性键。 l l Pattern. user. Name Pattern. String Pattern 参考《Spring 3. x企业应用开发实战》

如何对错误信息进行国际化(2) 我们在conf/i 18 n/下添加基名为messages的国际化资源,一个是 默认的messages. properties,另一个是对应中国大陆的 messages_zh_CN. properties。来看一下messages_zh_ CN. properties资源文件的内容: <bean id= 如何对错误信息进行国际化(2) 我们在conf/i 18 n/下添加基名为messages的国际化资源,一个是 默认的messages. properties,另一个是对应中国大陆的 messages_zh_CN. properties。来看一下messages_zh_ CN. properties资源文件的内容: 参考《Spring 3. x企业应用开发实战》

目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 7 其它

数据模型访问结构 接收请求 处理请求 请求响应 Model. And. View,Map及 Model @Model. Attribute( 数据模型访问结构 接收请求 处理请求 请求响应 Model. And. View,Map及 Model @Model. Attribute("user") @Session. Attributes 数据模型 key 1=value 1 key 2=value 2. . . 暴露给. . . 视图对象 参考《Spring 3. x企业应用开发实战》

访问数据模型: Model. And. View 通过Model. And. View @Request. Mapping(method = Request. Method. POST) public 访问数据模型: Model. And. View 通过Model. And. View @Request. Mapping(method = Request. Method. POST) public Model. And. View create. User(User user) { user. Service. create. User(user); Model. And. View mav = new Model. And. View(); mav. set. View. Name("user/create. Success"); mav. add. Object("user", user); return mav; } 参考《Spring 3. x企业应用开发实战》

访问数据模型:@Model. Attribute 1. 使用方式一 @Request. Mapping(value = 访问数据模型:@Model. Attribute 1. 使用方式一 @Request. Mapping(value = "/handle 61") public String handle 61(@Model. Attribute("user") User user){ user. set. User. Id("1000"); return "/user/create. Success"; } Spring MVC将HTTP请求数据绑定到user入参中,然后再将user对象添加到数 据模型中。 2. 使用方式二 @Model. Attribute("user") public User get. User(){ User user = new User(); user. set. User. Id("1001"); return user; } 访问User. Controller中任何一个请求处理方法 前,Spring MVC先执行该方法,并将返回值 以user为键添加到模型中 在此,模型数据会赋给User的入参,然后再 根据HTTP请求消息进一步填充覆盖user对象 @Request. Mapping(value = "/handle 62") public String handle 62(@Model. Attribute("user") User user){ user. set. User. Name("tom"); return "/user/show. User"; } 参考《Spring 3. x企业应用开发实战》

访问数据模型:Map及Model org. springframework. ui. Model和java. util. Map: @Request. Mapping(value = 访问数据模型:Map及Model org. springframework. ui. Model和java. util. Map: @Request. Mapping(value = "/handle 63") public String handle 63(Model. Map model. Map){ model. Map. add. Attribute("test. Attr", "value 1"); User user = (User)model. Map. get("user"); user. set. User. Name("tom"); return "/user/show. User"; } Spring MVC一旦发现处理方法有Map或Model类型的入参,就会将请求内 在的隐含模型对象的引用传给这些入参。 参考《Spring 3. x企业应用开发实战》

访问数据模型:@Session. Attributes 如果希望在多个请求之间共用某个模型属性数据,则可以在控制器类标 注一个@Session. Attributes,Spring MVC会将模型中对应的属性暂存到 Http. Session中: @Controller @Request. Mapping( 访问数据模型:@Session. Attributes 如果希望在多个请求之间共用某个模型属性数据,则可以在控制器类标 注一个@Session. Attributes,Spring MVC会将模型中对应的属性暂存到 Http. Session中: @Controller @Request. Mapping("/user") @Session. Attributes(“user”)① public class User. Controller { 将②处的模型属性自动保存到 Http. Session中 @Request. Mapping(value = "/handle 71") public String handle 71(@Model. Attribute(“user”) User user){② user. set. User. Name("John"); return "redirect: /user/handle 72. html"; } 读取模型中的数据 @Request. Mapping(value = "/handle 72") public String handle 72(Model. Map model. Map, Session. Status session. Status){ User user = (User)model. Map. get(“user”); ③ if(user != null){ user. set. User. Name("Jetty"); session. Status. set. Complete(); ④ } 让Spring MVC清除本 return "/user/show. User"; } 处理器对应的会话属性 } 参考《Spring 3. x企业应用开发实战》

一场由@Session. Attributes引发的血案. . . org. springframework. web. Http. Session. Require d. Exception: Session attribute 一场由@Session. Attributes引发的血案. . . org. springframework. web. Http. Session. Require d. Exception: Session attribute 'user' required not found in session. . . 对入参标注@Model. Attribute(“xxx”)的处理方法,Spring MVC按如下流程 处理(handle 71(@Model. Attribute(“user”) User user)): 1. 如果隐含模型拥有名为xxx的属性,将其赋给该入参,再用请求消息填充 该入参对象直接返回,否则到 2步 。 2. 如果xxx是会话属性,即在处理类定义处标注了@Session. Attributes("xxx"), 则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该 入参对象。如果在会话中找不到对应的属性,则抛出 Http. Session. Required. Exception异常。否则到 3。 3. 如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参的对象 实例,再用请求消息填充该入参。 参考《Spring 3. x企业应用开发实战》

如何避免@Session. Attributes引发的血案 原来也是小Cakes一张. . . @Controller @Request. Mapping( 如何避免@Session. Attributes引发的血案 原来也是小Cakes一张. . . @Controller @Request. Mapping("/user") @Session. Attributes(“user”) public class User. Controller { @Model. Attribute("user") public User get. User(){ User user = new User(); return user; } 该方法会往隐含模型中添加一 个名为user的模型属性 @Request. Mapping(value = "/handle 71") public String handle 71(@Model. Attribute(“user”) User user){. . . } @Request. Mapping(value = "/handle 72") public String handle 72(Model. Map model. Map, Session. Status session. Status){. . . } }

目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 7 其它

Spring MVC如何解析视图 请求处理方法返回值类型 String Model. And. View Model. Map View. Resolver 视图对象 JSP/JSTL/PDF. . Spring MVC如何解析视图 请求处理方法返回值类型 String Model. And. View Model. Map View. Resolver 视图对象 JSP/JSTL/PDF. . . 参考《Spring 3. x企业应用开发实战》

视图解析器类型 完成单一解析逻辑的视图解析器: l l l Internal. Resource. View. Resolver Free. Marker. View. Resolver Bean. 视图解析器类型 完成单一解析逻辑的视图解析器: l l l Internal. Resource. View. Resolver Free. Marker. View. Resolver Bean. Name. View. Resolver Xml. View. Resolver. . . 基于协商的视图解析器: l Content. Negotiating. View. Resolver 该解析器是Spring 3. 0新增的,它不负责具体的视图解析,而是作为一 个中间人的角色根据请求所要求的MIME类型,从上下文中选择一个适合 的视图解析器,再将视图解析 作委托其负责

基于协商的视图解析器 <bean class= 基于协商的视图解析器 例子:http: //localhost: 9080/user/show. User. List. Mix

目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 目录 1 Spring MVC框架简介 2 HTTP请求地址映射 3 HTTP请求数据的绑定 4 数据转换、格式化、校验 5 数据模型控制 6 视图及解析器 7 其它

本地化: 基础原理 一般情况下,Web应用根据客户端浏览器的设置判断客户端的本地化类 型,用户可以通过IE菜单: 具→Internet选项. . . →语言. . . 在打开的“语言首 选项”对话框中选择本地化类型。 浏览器中设置的本地化类型会包含在HTML请求报文头中发送给Web服 务器,确切地说是通过报文头的Accept-Language参数将“语言首选项”对话 本地化: 基础原理 一般情况下,Web应用根据客户端浏览器的设置判断客户端的本地化类 型,用户可以通过IE菜单: 具→Internet选项. . . →语言. . . 在打开的“语言首 选项”对话框中选择本地化类型。 浏览器中设置的本地化类型会包含在HTML请求报文头中发送给Web服 务器,确切地说是通过报文头的Accept-Language参数将“语言首选项”对话 框中选择的语言发送到服务器,成为服务器判别客户端本地化类型的依据。 Tcp. Trace实例. . . 参考《Spring 3. x企业应用开发实战》

本地化: Spring MVC的本地化解析器 Accept. Header. Locale. Resolver:根据HTTP报文头的Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器,Spring MVC默 认采用Accept. Header- Locale. Resolver。 Cookie. 本地化: Spring MVC的本地化解析器 Accept. Header. Locale. Resolver:根据HTTP报文头的Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器,Spring MVC默 认采用Accept. Header- Locale. Resolver。 Cookie. Locale. Resolver:根据指定Cookie值确定本地化类型。 Session. Locale. Resolver:根据Session中特定的属性值确定本地化类型。 Locale. Change. Interceptor:从请求参数中获取本次请求对应的本地化 类型。 参考《Spring 3. x企业应用开发实战》

本地化: Spring MVC的本地化解析器 Accept. Header. Locale. Resolver:根据HTTP报文头的Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器,Spring MVC默 认采用Accept. Header- Locale. Resolver。 Cookie. 本地化: Spring MVC的本地化解析器 Accept. Header. Locale. Resolver:根据HTTP报文头的Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器,Spring MVC默 认采用Accept. Header- Locale. Resolver。 Cookie. Locale. Resolver:根据指定Cookie值确定本地化类型。 Session. Locale. Resolver:根据Session中特定的属性值确定本地化类型。 Locale. Change. Interceptor:从请求参数中获取本次请求对应的本地化 类型。 参考《Spring 3. x企业应用开发实战》

Locale. Change. Interceptor:通过URL参数指定 很多国际型的网站都允许通过一个请求参数控制网站的本地化,如 www. xxx. com? locale=zh_CN返回对应中国大陆的本地化网页,而 www. xxx. com? locale=en返回本地化为英语的网页。这样,网站使用者 可以通过URL的控制返回不同本地化的页面,非常灵活。 <bean Locale. Change. Interceptor:通过URL参数指定 很多国际型的网站都允许通过一个请求参数控制网站的本地化,如 www. xxx. com? locale=zh_CN返回对应中国大陆的本地化网页,而 www. xxx. com? locale=en返回本地化为英语的网页。这样,网站使用者 可以通过URL的控制返回不同本地化的页面,非常灵活。 例子: http: //localhost: 9080/user/handle 91? locale=en_US 参考《Spring 3. x企业应用开发实战》

静态资源处理 Spring MVC 3. 0提供的最 强大的功能之一!!! 1. 静态资源处理方式 2. 静态资源映射 参考《Spring 3. x企业应用开发实战》 静态资源处理 Spring MVC 3. 0提供的最 强大的功能之一!!! 1. 静态资源处理方式 2. 静态资源映射 参考《Spring 3. x企业应用开发实战》

静态资源处理: 使REST风格的URL成为实现 优雅REST风格的资源URL不希望带. html或. do等后缀,以 下是几个优雅的URL。 /blog/tom:用户tom的blog资源。 /forum/java:java论坛板块资源。 /order/4321:订单号为 4321的订单资源; 静态资源处理: 使REST风格的URL成为实现 优雅REST风格的资源URL不希望带. html或. do等后缀,以 下是几个优雅的URL。 /blog/tom:用户tom的blog资源。 /forum/java:java论坛板块资源。 /order/4321:订单号为 4321的订单资源;

静态资源处理: 原理 静态资源 Spring MVC 所有 请求 应用服务器默认Servlet 非静态资源 Spring MVC容器 静态资源处理: 原理 静态资源 Spring MVC 所有 请求 应用服务器默认Servlet 非静态资源 Spring MVC容器

静态资源处理: 如何配置? 第一步:web. xml让所有请求都由Spring MVC处理 <servlet> <servlet-name>spring. Servlet</servlet-name> <servletclass>org. springframework. web. servlet. Dispatcher. Servlet</servletclass> 静态资源处理: 如何配置? 第一步:web. xml让所有请求都由Spring MVC处理 spring. Servlet org. springframework. web. servlet. Dispatcher. Servlet 1 spring. Servlet / 参考《Spring 3. x企业应用开发实战》

静态资源处理: 如何配置? 第二步:spring. Servlet-servlet. xml 让Web应用服务器处理静态资源 <mvc: default-servlet-handler/> 获取应用服务器的默认Servlet, 大多数应用服务器的Servlet的名称都是 “default”,如果默认不是“default”则使用 <mvc: default-servlet-handler default-servlet-name=“<default. 静态资源处理: 如何配置? 第二步:spring. Servlet-servlet. xml 让Web应用服务器处理静态资源 获取应用服务器的默认Servlet, 大多数应用服务器的Servlet的名称都是 “default”,如果默认不是“default”则使用 "/> 参考《Spring 3. x企业应用开发实战》

<%@ page language="java" content. Type="text/html; charset=UTF-8"" src="https://present5.com/presentation/f8d43835cd4193edf7f9135cbefb7a95/image-71.jpg" alt="物理静态资源路径映射逻辑资源路径 <%@ page language="java" content. Type="text/html; charset=UTF-8"" /> 物理静态资源路径映射逻辑资源路径 <%@ page language="java" content. Type="text/html; charset=UTF-8" page. Encoding="UTF 8"%> <%@ taglib prefix="c" uri="http: //java. sun. com/jsp/jstl/core" %> 静态资源测试页面 参考《Spring 3. x企业应用开发实战》

允许利用浏览器的缓存且不当心不同步 public class Resource. Path. Exposer implements Servlet. Context. Aware { public void init() { String version = "1. 2. 1"; resource. Root = "/resources-" + version; get. Servlet. Context(). set. Attribute("resource. Root", get. Servlet. Context(). get. Context. Path()+resource. Root); } } <%@ page language="java" content. Type="text/html; charset=UTF-8" page. Encoding="UTF 8"%> <%@ taglib prefix="c" uri="http: //java. sun. com/jsp/jstl/core" %> 静态资源测试 . . .

AQ? 问题??? 参考《Spring 3. x企业应用开发实战》 AQ? 问题??? 参考《Spring 3. x企业应用开发实战》