为什么springmvc用注解将后台查询所得数据以list类型放入map类型集合:map.put(

为什么springmvc用注解将后台查询所得数据以list类型放入map类型集合:map.put(,第1张

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);

}

}

2、基本数据类型绑定:

@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 怎样才能查看其中的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9809584.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存