- 浏览: 21513672 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2420451
-
Spring杂谈
浏览量:3010227
-
跟开涛学SpringMVC...
浏览量:5640572
-
Servlet3.1规范翻...
浏览量:260217
-
springmvc杂谈
浏览量:1597941
-
hibernate杂谈
浏览量:250369
-
跟我学Shiro
浏览量:5860584
-
跟我学Nginx+Lua开...
浏览量:702883
-
亿级流量网站架构核心技术
浏览量:785743
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
7.1、简介
在编写可视化界面项目时,我们通常需要对数据进行类型转换、验证及格式化。
一、在Spring3之前,我们使用如下架构进行类型转换、验证及格式化:
流程:
①:类型转换:首先调用PropertyEditor的setAsText(String),内部根据需要调用setValue(Object)方法进行设置转换后的值;
②:数据验证:需要显示调用Spring的Validator接口实现进行数据验证;
③:格式化显示:需要调用PropertyEditor的getText进行格式化显示。
使用如上架构的缺点是:
(1、PropertyEditor被设计为只能String<——>Object之间转换,不能任意对象类型<——>任意类型,如我们常见的Long时间戳到Date类型的转换是办不到的;
(2、PropertyEditor是线程不安全的,也就是有状态的,因此每次使用时都需要创建一个,不可重用;
(3、PropertyEditor不是强类型的,setValue(Object)可以接受任意类型,因此需要我们自己判断类型是否兼容;
(4、需要自己编程实现验证,Spring3支持更棒的注解验证支持;
(5、在使用SpEL表达式语言或DataBinder时,只能进行String<--->Object之间的类型转换;
(6
、不支持细粒度的类型转换/格式化,如UserModel的registerDate需要转换/格式化类似“
2012-05-01
”的数据,而OrderModel的orderDate需要转换/格式化类似“2012-05-01
15:11:13”的数据,因为大家都为java.util.Date类型,因此不太容易进行细粒度转换/格式化。
在Spring Web MVC环境中,数据类型转换、验证及格式化通常是这样使用的:
流程:
①、类型转换:首先表单数据(全部是字符串)通过WebDataBinder进行绑定到命令对象,内部通过PropertyEditor实现;
②:数据验证:在控制器中的功能处理方法中,需要显示的调用Spring的Validator实现并将错误信息添加到BindingResult对象中;
③:格式化显示:在表单页面可以通过如下方式展示通过PropertyEditor
格式化的数据和错误信息:
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
首先需要通过如上taglib指令引入spring的两个标签库。
//1、格式化单个命令/表单对象的值(好像比较麻烦,真心没有好办法) <spring:bind path="dataBinderTest.phoneNumber">${status.value}</spring:bind>
//2、通过form标签,内部的表单标签会自动调用命令/表单对象属性对应的PropertyEditor进行格式化显示 <form:form commandName="dataBinderTest"> <form:input path="phoneNumber"/><!-- 如果出错会显示错误之前的数据而不是空 --> </form:form>
//3、显示验证失败后的错误信息 <form:errors></form:errors>
如上PropertyEditor和验证API使用起来比较麻烦,而且有许多缺点,因此Spring3提供了更强大的类型转换(Type Conversion)支持,它可以在任意对象之间进行类型转换,不仅仅是String<——>Object;也提供了强大的数据验证支持;同时提供了强大的数据格式化支持。
二、从Spring3开始,我们可以使用如下架构进行类型转换、验证及格式化:
流程:
①:类型转换:内部的ConversionService会根据S源类型/T目标类型自动选择相应的Converter SPI进行类型转换,而且是强类型的,能在任意类型数据之间进行转换;
②:数据验证:支持JSR-303验证框架,如将@Valid放在需要验证的目标类型上即可;
③:格式化显示:其实就是任意目标类型---->String的转换,完全可以使用Converter SPI完成。
Spring为了更好的诠释格式化/解析功能提供了Formatter SPI,支持根据Locale信息进行格式化/解析,而且该套SPI可以支持字段/参数级别的细粒度格式化/解析,流程如下:
①:类型解析(转换):String---->T类型目标对象的解析,和PropertyEditor类似;
③:格式化显示:任意目标类型---->String的转换,和PropertyEditor类似。
Formatter SPI最大特点是能进行字段/参数级别的细粒度解析/格式化控制,即使是Converter SPI也是粗粒度的(到某个具体类型,而不是其中的某个字段单独控制),目前Formatter SPI还不是很完善,如果您有好的想法可以到Spring官网提建议。
Formatter SPI内部实现实际委托给Converter SPI进行转换,即约束为解析/格式化String<---->任意目标类型。
在Spring Web MVC环境中,数据类型转换、验证及格式化通常是这样使用的:
①、类型转换:首先表单数据(全部是字符串)通过WebDataBinder进行绑定到命令对象,内部通过Converter SPI实现;
②:数据验证:使用JSR-303验证框架进行验证;
③:格式化显示:在表单页面可以通过如下方式展示通过内部通过Converter SPI
格式化的数据和错误信息:
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
首先需要通过如上taglib指令引入spring的两个标签库。
//1、格式化单个命令/表单对象的值(好像比较麻烦,真心没有好办法) <spring:bind path="dataBinderTest.phoneNumber">${status.value}</spring:bind>
//2、<spring:eval>标签,自动调用ConversionService并选择相应的Converter SPI进行格式化展示 <spring:eval expression="dataBinderTest.phoneNumber"></spring:eval>
如上代码能工作的前提是在RequestMappingHandlerMapping配置了ConversionServiceExposingInterceptor,它的作用是暴露conversionService到请求中以便如<spring:eval>标签使用。
//3、通过form标签,内部的表单标签会自动调用命令/表单对象属性对应的PropertyEditor进行格式化显示 <form:form commandName="dataBinderTest"> <form:input path="phoneNumber"/><!-- 如果出错会显示错误之前的数据而不是空 --> </form:form>
//4、显示验证失败后的错误信息 <form:errors></form:errors>
接下来我们就详细学习一下这些知识吧。
7.2、数据类型转换
7.2.1、Spring3之前的PropertyEditor
PropertyEditor介绍请参考【4.16.1、数据类型转换】。
一、测试之前我们需要准备好测试环境:
(1、模型对象,和【4.16.1、数据类型转换】使用的一样,需要将DataBinderTestModel模型类及相关类拷贝过来放入cn.javass.chapter7.model包中。
(2、控制器定义:
package cn.javass.chapter7.web.controller; //省略import @Controller public class DataBinderTestController { @RequestMapping(value = "/dataBind") public String test(DataBinderTestModel command) { //输出command对象看看是否绑定正确 System.out.println(command); model.addAttribute("dataBinderTest", command); return "bind/success"; } }
(3、Spring配置文件定义,请参考chapter7-servlet.xml,并注册DataBinderTestController:
<bean class="cn.javass.chapter7.web.controller.DataBinderTestController"/>
(4、测试的URL:
http://localhost:9080/springmvc-chapter7/dataBind?username=zhang&bool=yes&schooInfo.specialty=computer&hobbyList[0]=program&hobbyList[1]=music&map[key1]=value1&map[key2]=value2&phoneNumber=010-12345678&date=2012-3-18 16:48:48&state=blocked
二、注解式控制器注册PropertyEditor:
1、使用WebDataBinder进行控制器级别注册PropertyEditor(控制器独享)
@InitBinder //此处的参数也可以是ServletRequestDataBinder类型 public void initBinder(WebDataBinder binder) throws Exception { //注册自定义的属性编辑器 //1、日期 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); CustomDateEditor dateEditor = new CustomDateEditor(df, true); //表示如果命令对象有Date类型的属性,将使用该属性编辑器进行类型转换 binder.registerCustomEditor(Date.class, dateEditor); //自定义的电话号码编辑器(和【4.16.1、数据类型转换】一样) binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEditor()); }
和【4.16.1、数据类型转换】一节类似,只是此处需要通过@InitBinder来注册自定义的PropertyEditor。
2、使用WebBindingInitializer批量注册
PropertyEditor
和【4.16.1、数据类型转换】不太一样,因为我们的注解式控制器是POJO,没有实现任何东西,因此无法注入WebBindingInitializer,此时我们需要把WebBindingInitializer注入到我们的RequestMappingHandlerAdapter或AnnotationMethodHandlerAdapter,这样对于所有的注解式控制器都是共享的。
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="webBindingInitializer"> <bean class="cn.javass.chapter7.web.controller.support.initializer.MyWebBindingInitializer"/> </property> </bean>
此时我们注释掉控制器级别通过@InitBinder注册PropertyEditor的方法。
3、全局级别注册PropertyEditor(全局共享)
和【4.16.1、数据类型转换】一节一样,此处不再重复。请参考【4.16.1、数据类型转换】的【全局级别注册PropertyEditor(全局共享)】。
接下来我们看一下Spring3提供的更强大的类型转换支持。
7.2.2、Spring3开始的类型转换系统
Spring3引入了更加通用的类型转换系统,其定义了SPI接口(Converter等)和相应的运行时执行类型转换的API(ConversionService等),在Spring中它和PropertyEditor功能类似,可以替代PropertyEditor来转换外部Bean属性的值到Bean属性需要的类型。
该类型转换系统是Spring通用的,其定义在org.springframework.core.convert包中,不仅仅在Spring Web MVC场景下。目标是完全替换PropertyEditor,提供无状态、强类型且可以在任意类型之间转换的类型转换系统,可以用于任何需要的地方,如SpEL、数据绑定。
Converter SPI完成通用的类型转换逻辑,如java.util.Date<---->java.lang.Long或java.lang.String---->PhoneNumberModel等。
7.2.2.1、架构
1、类型转换器:提供类型转换的实现支持。
一个有如下三种接口:
(1、Converter:类型转换器,用于转换S类型到T类型,此接口的实现必须是线程安全的且可以被共享。
package org.springframework.core.convert.converter; public interface Converter<S, T> { //① S是源类型 T是目标类型 T convert(S source); //② 转换S类型的source到T目标类型的转换方法 }
示例:请参考cn.javass.chapter7.converter.support.StringToPhoneNumberConverter转换器,用于将String--->PhoneNumberModel。
此处我们可以看到Converter接口实现只能转换一种类型到另一种类型,不能进行多类型转换,如将一个数组转换成集合,如(String[] ----> List<String>、String[]----->List<PhoneNumberModel>等)。
(2、GenericConverter和ConditionalGenericConverter:GenericConverter接口实现能在多种类型之间进行转换,ConditionalGenericConverter是有条件的在多种类型之间进行转换。
package org.springframework.core.convert.converter; public interface GenericConverter { Set<ConvertiblePair> getConvertibleTypes(); Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType); }
getConvertibleTypes:指定了可以转换的目标类型对;
convert:在sourceType和targetType类型之间进行转换。
package org.springframework.core.convert.converter; public interface ConditionalGenericConverter extends GenericConverter { boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType); }
matches:用于判断sourceType和targetType类型之间能否进行类型转换。
示例:如org.springframework.core.convert.support.ArrayToCollectionConverter和CollectionToArrayConverter用于在数组和集合间进行转换的ConditionalGenericConverter实现,如在String[]<---->List<String>、String[]<---->List<PhoneNumberModel>等之间进行类型转换。
对于我们大部分用户来说一般不需要自定义GenericConverter, 如果需要可以参考内置的GenericConverter来实现自己的。
(3、ConverterFactory:工厂模式的实现,用于选择将一种S源类型转换为R类型的子类型T的转换器的工厂接口。
package org.springframework.core.convert.converter; public interface ConverterFactory<S, R> { <T extends R> Converter<S, T> getConverter(Class<T> targetType); }
S:源类型;R目标类型的父类型;T:目标类型,且是R类型的子类型;
getConverter:得到目标类型的对应的转换器。
示例:如org.springframework.core.convert.support.NumberToNumberConverterFactory用于在Number类型子类型之间进行转换,如Integer--->Double, Byte---->Integer, Float--->Double等。
对于我们大部分用户来说一般不需要自定义ConverterFactory,如果需要可以参考内置的ConverterFactory来实现自己的。
2、类型转换器注册器、类型转换服务:提供类型转换器注册支持,运行时类型转换API支持。
一共有如下两种接口:
(1、ConverterRegistry:类型转换器注册支持,可以注册/删除相应的类型转换器。
package org.springframework.core.convert.converter; public interface ConverterRegistry { void addConverter(Converter<?, ?> converter); void addConverter(Class<?> sourceType, Class<?> targetType, Converter<?, ?> converter); void addConverter(GenericConverter converter); void addConverterFactory(ConverterFactory<?, ?> converterFactory); void removeConvertible(Class<?> sourceType, Class<?> targetType); }
可以注册:Converter实现,GenericConverter实现,ConverterFactory实现。
(2、ConversionService:运行时类型转换服务接口,提供运行期类型转换的支持。
package org.springframework.core.convert; public interface ConversionService { boolean canConvert(Class<?> sourceType, Class<?> targetType); boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType); <T> T convert(Object source, Class<T> targetType); Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType); }
convert:将源对象转换为目标类型的目标对象。
Spring提供了两个默认实现(其都实现了ConverterRegistry、ConversionService接口):
DefaultConversionService:默认的类型转换服务实现;
DefaultFormattingConversionService:带数据格式化支持的类型转换服务实现,一般使用该服务实现即可。
7.2.2.2、Spring内建的类型转换器如下所示:
类名 |
说明 |
第一组:标量转换器 |
|
StringToBooleanConverter |
String----->Boolean true:true/on/yes/1; false:false/off/no/0 |
ObjectToStringConverter |
Object----->String 调用toString方法转换 |
StringToNumberConverterFactory |
String----->Number(如Integer、Long等) |
NumberToNumberConverterFactory |
Number子类型(Integer、Long、Double等)<——> Number子类型(Integer、Long、Double等) |
StringToCharacterConverter |
String----->java.lang.Character 取字符串第一个字符 |
NumberToCharacterConverter |
Number子类型(Integer、Long、Double等)——> java.lang.Character |
CharacterToNumberFactory |
java.lang.Character ——>Number子类型(Integer、Long、Double等) |
StringToEnumConverterFactory |
String----->enum类型 通过Enum.valueOf将字符串转换为需要的enum类型 |
EnumToStringConverter |
enum类型----->String 返回enum对象的name()值 |
StringToLocaleConverter |
String----->java.util.Local |
PropertiesToStringConverter |
java.util.Properties----->String 默认通过ISO-8859-1解码 |
StringToPropertiesConverter |
String----->java.util.Properties 默认使用ISO-8859-1编码 |
第二组:集合、数组相关转换器 |
|
ArrayToCollectionConverter |
任意S数组---->任意T集合(List、Set) |
CollectionToArrayConverter |
任意T集合(List、Set)---->任意S数组 |
ArrayToArrayConverter |
任意S数组<---->任意T数组 |
CollectionToCollectionConverter |
任意T集合(List、Set)<---->任意T集合(List、Set) 即集合之间的类型转换 |
MapToMapConverter |
Map<---->Map之间的转换 |
ArrayToStringConverter |
任意S数组---->String类型 |
StringToArrayConverter |
String----->数组 默认通过“,”分割,且去除字符串的两边空格(trim) |
ArrayToObjectConverter |
任意S数组---->任意Object的转换 (如果目标类型和源类型兼容,直接返回源对象;否则返回S数组的第一个元素并进行类型转换) |
ObjectToArrayConverter |
Object----->单元素数组 |
CollectionToStringConverter |
任意T集合(List、Set)---->String类型 |
StringToCollectionConverter |
String----->集合(List、Set) 默认通过“,”分割,且去除字符串的两边空格(trim) |
CollectionToObjectConverter |
任意T集合---->任意Object的转换 (如果目标类型和源类型兼容,直接返回源对象;否则返回S数组的第一个元素并进行类型转换) |
ObjectToCollectionConverter |
Object----->单元素集合 |
第三组:默认(fallback)转换器:之前的转换器不能转换时调用 |
|
ObjectToObjectConverter |
Object(S)----->Object(T) 首先尝试valueOf进行转换、没有则尝试new 构造器(S) |
IdToEntityConverter |
Id(S)----->Entity(T) 查找并调用public static T find[EntityName](S)获取目标对象,EntityName是T类型的简单类型 |
FallbackObjectToStringConverter |
Object----->String ConversionService作为恢复使用,即其他转换器不能转换时调用(执行对象的toString()方法) |
S:代表源类型,T:代表目标类型
如上的转换器在使用转换服务实现DefaultConversionService和DefaultFormattingConversionService时会自动注册。
7.2.2.3、示例
(1、自定义String----->PhoneNumberModel的转换器
package cn.javass.chapter7.web.controller.support.converter; //省略import public class StringToPhoneNumberConverter implements Converter<String, PhoneNumberModel> { Pattern pattern = Pattern.compile("^(\\d{3,4})-(\\d{7,8})$"); @Override public PhoneNumberModel convert(String source) { if(!StringUtils.hasLength(source)) { //①如果source为空 返回null return null; } Matcher matcher = pattern.matcher(source); if(matcher.matches()) { //②如果匹配 进行转换 PhoneNumberModel phoneNumber = new PhoneNumberModel(); phoneNumber.setAreaCode(matcher.group(1)); phoneNumber.setPhoneNumber(matcher.group(2)); return phoneNumber; } else { //③如果不匹配 转换失败 throw new IllegalArgumentException(String.format("类型转换失败,需要格式[010-12345678],但格式是[%s]", source)); } } }
String转换为Date的类型转换器,请参考cn.javass.chapter7.web.controller.support.converter.StringToDateConverter。
(2、测试用例(cn.javass.chapter7.web.controller.support.converter.ConverterTest)
@Test public void testStringToPhoneNumberConvert() { DefaultConversionService conversionService = new DefaultConversionService(); conversionService.addConverter(new StringToPhoneNumberConverter()); String phoneNumberStr = "010-12345678"; PhoneNumberModel phoneNumber = conversionService.convert(phoneNumberStr, PhoneNumberModel.class); Assert.assertEquals("010", phoneNumber.getAreaCode()); }
类似于PhoneNumberEditor将字符串“010-12345678”转换为PhoneNumberModel。
@Test public void testOtherConvert() { DefaultConversionService conversionService = new DefaultConversionService(); //"1"--->true(字符串“1”可以转换为布尔值true) Assert.assertEquals(Boolean.valueOf(true), conversionService.convert("1", Boolean.class)); //"1,2,3,4"--->List(转换完毕的集合大小为4) Assert.assertEquals(4, conversionService.convert("1,2,3,4", List.class).size()); }
其他类型转换器使用也是类似的,此处不再重复。
7.2.2.4、集成到Spring Web MVC环境
(1、注册ConversionService实现和自定义的类型转换器
<!-- ①注册ConversionService --> <bean id="conversionService" class="org.springframework.format.support. FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="cn.javass.chapter7.web.controller.support. converter.StringToPhoneNumberConverter"/> <bean class="cn.javass.chapter7.web.controller.support. converter.StringToDateConverter"> <constructor-arg value="yyyy-MM-dd"/> </bean> </list> </property> </bean>
FormattingConversionServiceFactoryBean:是FactoryBean实现,默认使用DefaultFormattingConversionService转换器服务实现;
converters:注册我们自定义的类型转换器,此处注册了String--->PhoneNumberModel和String--->Date的类型转换器。
(2、通过ConfigurableWebBindingInitializer注册ConversionService
<!-- ②使用ConfigurableWebBindingInitializer注册conversionService --> <bean id="webBindingInitializer" class="org.springframework.web.bind.support. ConfigurableWebBindingInitializer"> <property name="conversionService" ref="conversionService"/> </bean>
此处我们通过ConfigurableWebBindingInitializer绑定初始化器进行ConversionService的注册;
3、注册ConfigurableWebBindingInitializer到RequestMappingHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.method.annotation. RequestMappingHandlerAdapter"> <property name="webBindingInitializer" ref="webBindingInitializer"/> </bean>
通过如上配置,我们就完成了Spring3.0的类型转换系统与Spring Web MVC的集成。此时可以启动服务器输入之前的URL测试了。
此时可能有人会问,如果我同时使用PropertyEditor和ConversionService,执行顺序是什么呢?内部首先查找PropertyEditor进行类型转换,如果没有找到相应的PropertyEditor再通过ConversionService进行转换。
如上集成过程看起来比较麻烦,后边我们会介绍<mvc:annotation-driven>和@EnableWebMvc,ConversionService会自动注册,后续章节再详细介绍。
评论
呵呵
确实是早期的作品,其实不是不好,而是作为入门来说,还是略微费劲些
====================================================================
第七章的确有点费劲,有些应该讲到的地方没讲到。不过,我还是整体下来,我觉得tao哥讲的springmvc讲的很棒了,比我看的两部书上讲的更深入,整体勾勒了springmvc运行流程是怎样的和一些重点知识的原理是怎样的。表示很接受,第七章部分没讲清楚的,自己查看源码也理解差不多啦,收获很大。在此谢谢开头啦
好像以前写日记,流水账
确实是早期的作品,其实不是不好,而是作为入门来说,还是略微费劲些
====================================================================
第七章的确有点费劲,有些应该讲到的地方没讲到。不过,我还是整体下来,我觉得tao哥讲的springmvc讲的很棒了,比我看的两部书上讲的更深入,整体勾勒了springmvc运行流程是怎样的和一些重点知识的原理是怎样的。表示很接受,第七章部分没讲清楚的,自己查看源码也理解差不多啦,收获很大。在此谢谢开头啦
确实是早期的作品,其实不是不好,而是作为入门来说,还是略微费劲些
瞎比比,这是博客,如果你觉得不好,不要来看啊,就算你说的是事实又怎样,这些博客确实帮助了很多人,这就够了
org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'bean.PhoneNumberModel'
1300534022@qq.com
org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'bean.PhoneNumberModel'
通过 实现Converter 接口的验证方式,抛出异常后,页面上应该怎么样获取错误结果呢,我使用之前用的<form:error path="*" /> 获取不到任何错误信息(异常确认已抛出)
另外,
<spring:bind path="dataBinderTest.phoneNumber">${status.value}</spring:bind>
<spring:eval expression="dataBinderTest.phoneNumber"></spring:eval>
这两个标签具体是做什么用的,能解释一下吗,我尝试用了一下,使用和<form:input 效果一样,只是少了和文本框?
有些常见可能不需要文本框,但需要格式化时就可以使用eval转,否则直接使用el是转不了的
那错误信息应该怎么显示呢? <form:error path="*" /> 不管用 显示为空,异常断点确实已经抛出
异常断点确实已经抛出 加到Errors里了吗
1、
<form:errors></form:errors> 显示所有
<form:errors path="*"/> 显示所有
<form:errors path="id" /> 显示某个路径的
通过 实现Converter 接口的验证方式,抛出异常后,页面上应该怎么样获取错误结果呢,我使用之前用的<form:error path="*" /> 获取不到任何错误信息(异常确认已抛出)
另外,
<spring:bind path="dataBinderTest.phoneNumber">${status.value}</spring:bind>
<spring:eval expression="dataBinderTest.phoneNumber"></spring:eval>
这两个标签具体是做什么用的,能解释一下吗,我尝试用了一下,使用和<form:input 效果一样,只是少了和文本框?
有些常见可能不需要文本框,但需要格式化时就可以使用eval转,否则直接使用el是转不了的
那错误信息应该怎么显示呢? <form:error path="*" /> 不管用 显示为空,异常断点确实已经抛出
通过 实现Converter 接口的验证方式,抛出异常后,页面上应该怎么样获取错误结果呢,我使用之前用的<form:error path="*" /> 获取不到任何错误信息(异常确认已抛出)
另外,
<spring:bind path="dataBinderTest.phoneNumber">${status.value}</spring:bind>
<spring:eval expression="dataBinderTest.phoneNumber"></spring:eval>
这两个标签具体是做什么用的,能解释一下吗,我尝试用了一下,使用和<form:input 效果一样,只是少了和文本框?
有些常见可能不需要文本框,但需要格式化时就可以使用eval转,否则直接使用el是转不了的
通过 实现Converter 接口的验证方式,抛出异常后,页面上应该怎么样获取错误结果呢,我使用之前用的<form:error path="*" /> 获取不到任何错误信息(异常确认已抛出)
另外,
<spring:bind path="dataBinderTest.phoneNumber">${status.value}</spring:bind>
<spring:eval expression="dataBinderTest.phoneNumber"></spring:eval>
这两个标签具体是做什么用的,能解释一下吗,我尝试用了一下,使用和<form:input 效果一样,只是少了和文本框?
看你熟悉程度了 我现在用的挺多的
建议你下载代码看看
什么代码?spring源代码吗?
http://jinnianshilongnian.iteye.com/blog/1752171
谢谢
建议你下载代码看看
什么代码?spring源代码吗?
http://jinnianshilongnian.iteye.com/blog/1752171
建议你下载代码看看
什么代码?spring源代码吗?
建议你下载代码看看
发表评论
-
跟我学SpringMVC目录汇总贴、PDF下载、源码下载
2012-12-22 08:05 620823扫一扫,关注我的公众号 购买地址 ... -
源代码下载——第七章 注解式控制器的数据验证、类型转换及格式化
2012-12-01 07:12 33474源代码请到附件中下载。 其他下载: ... -
SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-23 07:47 2389947.4、数据验证 7.4.1 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 19:18 890197.3、数据格式化 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 16:41 46支持一下博主:------------------ ... -
扩展SpringMVC以支持绑定JSON格式的请求参数
2012-11-08 07:43 126077上一篇:《扩展SpringMVC以支持更精准的数据绑 ... -
扩展SpringMVC以支持更精准的数据绑定1
2012-11-06 07:38 76792最新版请点击查看FormM ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-26 07:57 1528796.6.2、@RequestParam绑定单个请求参 ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-23 14:45 15---------------------------- ... -
SpringMVC强大的数据绑定(1)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-16 07:48 121082到目前为止,请求已经能交给我们的处理器进行处理了,接下来 ... -
Spring MVC 3.1新特性 生产者、消费者请求限定 —— 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-10 14:16 484966.6.5、生产者、消费者限定 6.6.5.1、基 ... -
SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 15:29 104892声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:50 946.5.1.1、普通URL路径映射 @Request ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:48 536.5.2、请求方法映射 ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 10:47 216.5.2、请求方法映射限定 一般我们熟悉的表单 ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 07:05 1636.5.1.1、普通URL路径映射 @Reques ... -
源代码下载 第六章 注解式控制器详解
2012-09-22 07:11 42057源代码请到附件中下载。 其他下载: 跟着 ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 17:47 67447声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 15:54 96.1、注解式控制器简介 一、Spring2. ... -
源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC
2012-09-17 07:34 33684源代码请到附件中下 ...
相关推荐
总结来说,Spring MVC的注解式控制器提供了强大的数据验证、类型转换和格式化功能,简化了Web开发过程,提升了应用的安全性和用户体验。通过合理利用这些特性,开发者可以构建更加健壮、易于维护的Web应用。
PDF,源代码 开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 第四章 Controller接口控制器详解 源代码下载 第五章 处理器拦截器详解——跟着...第七章 注解式控制器的数据验证、类型转换及格式化
SpringMVC在数据类型转换、验证及格式化方面做了大量的改进和完善,为开发者提供了极为方便的工具和支持。通过对Spring 3之后的新特性进行深入理解,可以帮助开发者更好地利用这些功能,提升项目的整体质量。
在进行Web应用开发时,尤其是在使用Spring MVC框架的过程中,经常需要对用户提交的数据进行处理,包括但不限于数据类型转换、数据验证以及数据格式化等操作。这些操作对于确保数据的准确性和应用程序的健壮性至关...
在Spring MVC框架中,数据类型转换、数据格式化和数据校验是开发Web应用程序时不可或缺的部分。这些功能有助于确保从客户端接收到的数据准确无误,同时提供了一种优雅的方式来处理和展示这些数据。本篇文章将深入...
在SpringMVC中,数据类型转换、验证和格式化是Web应用程序开发中不可或缺的部分。在早期的Spring版本中,这一过程主要依赖于`PropertyEditor`来完成,但这种方法存在一些限制和不足。随着Spring框架的不断发展,...
总之,"跟开涛学SpringMVC(7.2)SpringMVC数据"课程旨在通过详细讲解Spring MVC的数据处理、格式化和Java开发实践,帮助开发者掌握Web应用程序开发的关键技术,提高他们的开发效率和代码质量。通过学习和实践,学员...
第七章注解式控制器的数据验证、类型转换及格式化则专注于如何在SpringMVC中处理数据验证、类型转换和格式化。这包括了如何使用SpringMVC内建的数据绑定器,将HTTP请求参数绑定到控制器方法的参数上;如何对输入数据...
为了解决这个问题,我们需要确保SpringMVC能够正确地将返回的数据转换为JSON格式,并设置合适的响应头。 首先,我们需要引入Jackson库来处理JSON序列化和反序列化。Jackson是Java中广泛使用的JSON处理库,包括三个...
数据类型转换、数据格式化也是SpringMVC提供的强大功能,这部分内容将教会我们如何进行数据类型的转换和格式化操作。 最后,教程会提供每章的源代码下载链接,帮助学习者通过实践来加深对知识的理解。通过下载和...
在Spring MVC中,注解被广泛用于配置控制器、方法映射、数据绑定等。例如,`@Controller`用于标识一个类作为处理HTTP请求的控制器,而`@RequestMapping`注解则用于将URL路径映射到特定的方法。 2. **@Controller与...
在控制器方法中,可以使用`@Valid`注解来激活验证,如: ```java @PostMapping("/register") public String register(@Valid User user, BindingResult result) { if (result.hasErrors()) { // 处理错误,如...
**第七章 注解式控制器的数据验证、类型转换及格式化** 这部分内容详细讲解了Spring MVC如何处理数据验证,利用JSR-303/JSR-349标准进行Bean验证。同时,探讨了数据类型的自动转换和格式化,包括日期、数字等特殊...
开涛在其开源电子书中《跟开涛学SpringMVC》对SpringMVC进行了详细的介绍,并提供了入门Web开发的学习手册,以其简单易懂的方式阐述了相关知识点。 首先,书中提到了Web开发中的请求-响应模型。在Web世界中,Web...
1. **@Controller**:这个注解用于标记一个类作为SpringMVC的控制器。控制器类将处理HTTP请求,并调用业务逻辑方法。 2. **@RequestMapping**:此注解用于映射HTTP请求到特定的方法。可以放在类级别或方法级别,...
当你在控制器方法的参数中使用 `@RequestParam` 或 `@PathVariable` 注解时,Spring MVC 将自动使用已注册的 `Formatter` 进行解析和格式化。 除了手动实现 `Formatter`,Spring MVC还提供了 `...
在SpringMVC中,数据格式化是将用户输入的数据转换为业务对象的过程。这通常涉及到日期、货币和其他复杂类型的输入。Spring提供了`@DateTimeFormat`和`@NumberFormat`注解来帮助自动解析和格式化日期和数字。另外,...