private void createDefaultEditors() {
thisdefaultEditors = new HashMap(64);
// Simple editors, without parameterization capabilities
// The JDK does not contain a default editor for any of these target types
thisdefaultEditorsput(Charsetclass, new CharsetEditor());
thisdefaultEditorsput(Classclass, new ClassEditor());
thisdefaultEditorsput(Class[]class, new ClassArrayEditor());
thisdefaultEditorsput(Currencyclass, new CurrencyEditor());
thisdefaultEditorsput(Fileclass, new FileEditor());
thisdefaultEditorsput(InputStreamclass, new InputStreamEditor());
thisdefaultEditorsput(InputSourceclass, new InputSourceEditor());
thisdefaultEditorsput(Localeclass, new LocaleEditor());
thisdefaultEditorsput(Patternclass, new PatternEditor());
thisdefaultEditorsput(Propertiesclass, new PropertiesEditor());
thisdefaultEditorsput(Resource[]class, new ResourceArrayPropertyEditor());
thisdefaultEditorsput(TimeZoneclass, new TimeZoneEditor());
thisdefaultEditorsput(URIclass, new URIEditor());
thisdefaultEditorsput(URLclass, new URLEditor());
thisdefaultEditorsput(UUIDclass, new UUIDEditor());
// Default instances of collection editors
// Can be overridden by registering custom instances of those as custom editors
thisdefaultEditorsput(Collectionclass, new CustomCollectionEditor(Collectionclass));
thisdefaultEditorsput(Setclass, new CustomCollectionEditor(Setclass));
thisdefaultEditorsput(SortedSetclass, new CustomCollectionEditor(SortedSetclass));
thisdefaultEditorsput(Listclass, new CustomCollectionEditor(Listclass));
thisdefaultEditorsput(SortedMapclass, new CustomMapEditor(SortedMapclass));
// Default editors for primitive arrays
thisdefaultEditorsput(byte[]class, new ByteArrayPropertyEditor());
thisdefaultEditorsput(char[]class, new CharArrayPropertyEditor());
// The JDK does not contain a default editor for char!
thisdefaultEditorsput(charclass, new CharacterEditor(false));
thisdefaultEditorsput(Characterclass, new CharacterEditor(true));
// Spring's CustomBooleanEditor accepts more flag values than the JDK's default editor
thisdefaultEditorsput(booleanclass, new CustomBooleanEditor(false));
thisdefaultEditorsput(Booleanclass, new CustomBooleanEditor(true));
// The JDK does not contain default editors for number wrapper types!
// Override JDK primitive number editors with our own CustomNumberEditor
thisdefaultEditorsput(byteclass, new CustomNumberEditor(Byteclass, false));
thisdefaultEditorsput(Byteclass, new CustomNumberEditor(Byteclass, true));
thisdefaultEditorsput(shortclass, new CustomNumberEditor(Shortclass, false));
thisdefaultEditorsput(Shortclass, new CustomNumberEditor(Shortclass, true));
thisdefaultEditorsput(intclass, new CustomNumberEditor(Integerclass, false));
thisdefaultEditorsput(Integerclass, new CustomNumberEditor(Integerclass, true));
thisdefaultEditorsput(longclass, new CustomNumberEditor(Longclass, false));
thisdefaultEditorsput(Longclass, new CustomNumberEditor(Longclass, true));
thisdefaultEditorsput(floatclass, new CustomNumberEditor(Floatclass, false));
thisdefaultEditorsput(Floatclass, new CustomNumberEditor(Floatclass, true));
thisdefaultEditorsput(doubleclass, new CustomNumberEditor(Doubleclass, false));
thisdefaultEditorsput(Doubleclass, new CustomNumberEditor(Doubleclass, true));
thisdefaultEditorsput(BigDecimalclass, new CustomNumberEditor(BigDecimalclass, true));
thisdefaultEditorsput(BigIntegerclass, new CustomNumberEditor(BigIntegerclass, true));
// Only register config value editors if explicitly requested
if (thisconfigValueEditorsActive) {
StringArrayPropertyEditor sae = new StringArrayPropertyEditor();
thisdefaultEditorsput(String[]class, sae);
thisdefaultEditorsput(short[]class, sae);
thisdefaultEditorsput(int[]class, sae);
thisdefaultEditorsput(long[]class, sae);
}
}
@RequestMapping("testdo")
public void test(int num) {
}
"testdo" method="post">
"num" value="10" type="text"/>
注意:表单中input的name值和Controller的参数变量名保持一致,就能完成基本数据类型的数据绑定,如果不一致可以使用@RequestParam标注实现。值得一提的是,如果Controller方法参数中定义的是基本数据类型,但是从jsp提交过来的数据为null或者""的话,会出现数据转换的异常。也就是说,必须保证表单传递过来的数据不能为null或"",所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型。
3、包装类型
@RequestMapping("testdo")
public void test(Integer num) {
}
"testdo" method="post">
"num" value="10" type="text"/>
和基本数据类型基本一样,不同之处在于,JSP表单传递过来的数据可以为null或"",以上面代码为例,如果jsp中num为""或者表单中无num这个input,那么,Controller方法参数中的num值则为null。
4、自定义对象类型
public class User {
private String firstName;
private String lastName;
}
@RequestMapping("testdo")
public void test(User user) {
}
"testdo" method="post">
"firstName" value="张" type="text"/>
"lastName" value="三" type="text"/>
只需将对象的属性名和input的name值一一对应即可。
5、自定义复合对象类型
public class ContactInfo {
private String tel;
private String address;
。。。
}
public class User {
private String firstName;
private String lastName;
private ContactInfo contactInfo;
。。。
}
@RequestMapping("testdo")
public void test(User user) {
Systemoutprintln(usergetFirstName());
Systemoutprintln(usergetLastName());
Systemoutprintln(usergetContactInfo()getTel());
Systemoutprintln(usergetContactInfo()getAddress());
}
<</span>form action="testdo" method="post">
<</span>input name="firstName" value="张" /><</span>br>
<</span>input name="lastName" value="三" /><</span>br>
<</span>input name="contactInfotel" value="13809908909" /><</span>br>
<</span>input name="contactInfoaddress" value="北京海淀" /><</span>br>
<</span>input type="submit" value="Save" />
</</span>form>
User对象中有ContactInfo属性,Controller中的代码和第3点说的一致,但是,在jsp代码中,需要使用“属性名(对象类型的属性)属性名”来命名input的name。
spring mvc数据绑定
spring mvc通过反射机制对目标方法的签名进行分析,将请求消息绑定到处理方法入参中。
数据绑定的核心部件是DataBinder。
spring
mvc主框架将servletRequest对象及处理方法入参对象实例传递给DataBinder,DataBinder调用装配在spring
mvc上下文中的ConversionService组件进行数据类型转换,数据格式化的工作,将servletRequest中的消息填充到入参对象中,然后再调用Validator组件对已绑定了请求消息数据的入参对象进行数据合法性检验,并最终生成数据绑定结果BindingResult对象,BindingResult包含了已完成数据绑定的入参对象,还包含相应的校验错误对象。
数据转换
conversionService是spring类型转换体系的核心接口,位于orgspringframeworkcoreconvert包中,可以利用orgspringframeworkcontextsupportConversionServiceFactoryBean在spring上下文中定义一个ConversionSerivce。spring
自动识别出上下文中的ConversionService,并在Bean属性配置及springmvc处理方法入参绑定等场合使用它进行数据的转换。
<bean id="conversionSerivce"
class="orgspringframeworkcontextsupportConversionServiceFactoryBean"/>
该FactoryBean创建ConversionSerivce内建了很多转换器,可通过该FactoryBean的convertors属性注册自定义的类型转换器
<bean id="conversionSerivce"
class="orgspringframeworkcontextsupportConversionServiceFactoryBean">
<propertyname="converters">
<list>
<bean class="xxxxx"/>
</list>
</property>
</bean>
spring 内置3中类型转换器接口,分别是
Converter<S,T>
ConverterFactory<S,R>
GenericConverter
自定义的类型转换器必须实现其中一个
Converter
Converter接口是spring最简单的转换器接口,仅包含一个方法
public interface Converter<S,T>{
Tconverter(S source);//负责将S类型对象转换成T类型对象
}
ConverterFactory<S,R>
ConverterFactory接口定义如下
public interface ConverFactory<S,R>{
<T,R>Converter<S,T> getConverter(Class<T> targetType);
}
S为源类型,R为目标类型的基类,T为扩展于R基类的类型。如spring的stringToNumberConverFactory就实现了ConverterFactory接口,封装了String转换成各种数据类型的Converter
在spring mvc中使用conversionSerivce
<userName>:<password>:<realName>-> User
1、<mvc:annotation-drivenconversion-service="conversionService"/>装配自定义conversionService
<mvc:annotation-driven>该标签可以简化springmvc相关配置,默认情况下,它会创建并注册一个默认的DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter,如果上下文中存在自定义的对应组件bean,spring
mvc会自动利用自定义的bean覆盖默认的,除此之外,<mvc:annotation-driven/>标签还会注册一个默认的ConversionService,即FormattingConversionServiceFactoryBean,由于要自定义converter,因此要显示定义一个ConversionSerivce覆盖默认的实现。
2、装配自定义转换器
<bean id="conversionSerivce"
class="orgspringframeworkcontextsupportConversionServiceFactoryBean">
<propertyname="converters">
<list>
<bean class="StringToUserConverter"/>
</list>
</property>
</bean>
3、编写转换器类
public class StringToUserConverter implementsConverter<String,User>{
publicUser convert(String source){
Useruser = new User();
if(source!=null){
Stringitems = sourcesplit(“:”);
usersetUserName(items[0]);
usersetPassword(items[1]);
usersetRealName(items[2]);
}
}
}
@InitBinder
在控制器中使用@InitBinder添加自定义编辑器
@InitBinder
public void initBinder(WebDataBinder binder){
binderregisterCustomEditor(Userclass,newUserEditor());
}
spring mvc使用WebDataBinder处理请求消息和处理方法入参的绑定工作,自定义编辑器必须实现PropertyEditor接口。
全局范围自定义编辑器
1、实现WebBindingInitalizer接口
public void initBinder(WebDataBinder binder,WebRequestrequest);
2、在web上下文中通过AnnotationMethodHandlerAdapter装配
<bean class="orgspringframeworkwebservletmvcannotationAnnotationMethodHandlerAdapter">
<propertyname="webBindingInitializer">
<bean class="xxx"/>
</property>
</bean>
spring mvc将按以下顺序查找类型转换编辑器
@InitBinder->ConversionService->WebBindingInitializer
数据格式化
spring 使用转换器进行源类型对象到目标类型对象的转换,spring 转换器并不提供输入输出信息格式化工作。
注解驱动格式化
注解驱动重要接口
spring在orgspringframeworkformat包中提供了一个
AnnotationFormatterFactory<A extends Annotation>接口,接口方法如下:
Set<Class<>> getFieldTypes():表示哪些类可以标注A注解
Parser<> getParser(A annotation,Class<>fieldType):根据注解A获取特定类型的Parser
Printer<> getPrinter(Aannotation,Class<> fieldType):根据注解A获取特定类型的Printer
spring提供2个内建实现类,分别支持数组及数字类型的注解驱动格式化
NumberFormatAnnotationFormatterFactoryBean:支持数字类型的属性使用(@NumberFormat)
JodaDateTimeFormatAnnotationFormatFactoryBean:用于日期类型(@DateTimeFormat)
启用注解驱动格式化功能
spring中定义了一个实现了ConversionSerivce实现类FormattingConversionService,该类扩展于GenericConversionService,它既有类型转换功能也有格式化功能。
FormattingConversionService也拥有一个FormattingConversionServiceFactoryBean,后者用于在spring上下文中构造一个FormattingConversionSerivce,通过这个类即可以注册自定义转换器,还可以注册自定义注解驱动逻辑。
NumberFormatAnnotationFormatterFactoryBean/JodaDateTimeFormatAnnotationFormatFactory
会自动注册到FormattingConversionServiceFactoryBean中,因此装配该FactoryBean后,就可以在入参绑定及模型数据输出使用注解驱动格式化功能。
<bean id="conversionService"
class="orgspringframeworkformatsupportFormattingConversionServiceFactoryBean">
<propertyname="converters">
<list><bean class="xxxx"/></list>
</property>
</bean>
用FormattingConversionServiceFactoryBean替换原来的ConversionServiceFactoryBean
<mvc:annotation-driven/>标签默认创建了FormattingConversionServiceFactoryBean
@DateTimeFormat
可以对JavautilDate,javautilCalendar,javalangLong,joda时间类型属性标注
@DateTimeFormat(partten=”yyyy-MM-dd”)
@NumberFormat可对数字类型属性标注
@NumberFormat(pattern=”#,#####”)
selectlist 一般都是把它绑定到 dropdownlist中查看的 格式:
ViewBagCollegeID = new SelectList(dbCollege, "CollegeID", "Name"); 在control里面写方法
然后在 view中 绑定:
<div class="editor-field">
@HtmlDropDownList("CollegeID","请选择")
@HtmlValidationMessageFor(model => modelCollegeName)
</div>
这样就会绑定到这个dropdownlist中。。然后你就可以查看了
呵呵希望能帮到你 望采纳!!!
Step 1: 创建新项目
我们通过创建一个新的 ASPNET MVC3 项目开始,点击 文件 -> 新建项目,我们使用 Internet 项目模板,这将为我们的应用提供一个默认的起始模板。
当你在解决方案管理器中观察新创建的项目时,你将会看到 ASPNET MVC3 更新后的工具增为我们的 ASPNET MVC3 项目增加了一个新的程序集 EntityFramework 。
EntityFramework 程序集实现了 Entity Framework41 ,EF41 为 NET 的数据访问提供了巨大的改进,包括 Code First。EF Code First 提供了完全优雅和干净的数据处理方式 ,使你不再需要设计器或者 XML 的映射文件。通过 ASPNET MVC3 项目就可以简单的使用这个优点。
我们将使用 EF Code First 来实现项目的数据访问。
Step 2: 实现数据模型类
第一步,我们将创建两个类,Product 和 Category,我们应用程序的数据模型,我们在 Models 文件中中创建标准的 POCO “简单的老的 C# 对象” 。代码如下:
注意到上面的类是标准的 NET 数据类型,不需要派生自任何基类,也不需要实现任何接口。
对于每个单独的属性,每个类有一个关联属性,例如,Product 类有一个名为 Category 的属性使开发人员可以获取产品所属的 Category ,而 Category 类中有一个名为 Products 的属性,使得开发人员可以获取分类的所有产品,EF Code First 可以自动管理这些关联(使用主外键关系),还可以在后台延迟加载数据。
Step 3: 使用 EF Code First 实现 StoreContext 类
现在,我们已经定义了两个模型类,下一步我们将要实现 DbContext 类,使用 EF Code First 需要使用这个类将模型对象映射到数据库中表,我们的实现如下所示:
我们使用 StoreContext 类映射我们的 Product 和 Category 与数据库的关系,它派生自 EF Code First 中的 DbContext,提供了两个属性关联到数据库中的表,对于我们的例子来说,使用默认的“约定胜于配置”方式,这意味着 Products 属性映射到数据库中的 Products 表,Categories 映射到数据库中的 Categories 表。在博文的后面,我还将讨论如何实现自定义的映射。
你可以将这个类加入到解决方案的任何位置,例如,可以放置在 Models 文件夹中,或者放在一个独立的类库项目中,可能你需要在代码的前面增加对于命名空间 SystemDataEntity 的引用。DbContext 和 DbSet 定义在其中。
Step 4: 搭建 Categories 控制器的脚手架
我们已经创建了从数据库获取或者保存数据的所有内容。现在,我们创建一个 ASPNET MVC 的控制器来实现对于分类数据的创建/编辑/删除/更新,从前的时候,你不得不手动写一个控制器来完成这些功能,包括你自己实现通过 EF Code First 访问数据代码,现在,ASPNET MVC3 工具更新现在包括内建的脚手架支持帮助你自动完成这些工作。
搭建一个新的 Categories 控制器类,我们在 /Controllers 文件夹上右键,然后选择 增加 Add -> 控制器 Controller 上下文菜单。
以上就是关于为什么springmvc用注解将后台查询所得数据以list类型放入map类型集合:map.put(全部的内容,包括:为什么springmvc用注解将后台查询所得数据以list类型放入map类型集合:map.put(、spring mvc怎么转换数据格式、mvc中将数据库的查询结果放入selectlist 怎样才能查看其中的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)