本例的性别和称谓都使用了MapValue功能.
通常而言map映射都是应用在被map的key的值并不多情况下,如性别,学历,称谓等。示例图:

mapValue的处理机制通常有三种用法:
- xml配置
- json赋值
- provider赋值
性别(xml赋值)
本例中性别的映射并没有直接配置在视图模型中,而是直接配置到DataSet对应的DataType声明模块中,我们找到工程src中models的demo.model.xml文件,并找到其中Employee的sex的mapValues声明:


XML内容为:
<PropertyDef name="sex" label="性别">
<Property name="mapping">
<Property name="mapValues">
<Collection>
<Entity>
<Property name="key">true</Property>
<Property name="value">Male</Property>
</Entity>
<Entity>
<Property name="key">false</Property>
<Property name="value">Female</Property>
</Entity>
</Collection>
</Property>
</Property>
</PropertyDef>
称谓(provider赋值)
与性别相对固定的形态不一样,在本例中称谓被设计为可以动态维护的信息,这样我们就无法通过<Property name="mapValues">这种固化到xml中的形态进行定义,必须采用一种更灵活的形态动态的从第三方存储中(例如数据库)获取。我们再来看称谓的定义,本例中在视图模型中重新覆盖了原始Employee这个DataType中titleOfCourtesy的定义:
<DataType name="EmployeeX" parent="Employee">
<PropertyDef name="titleOfCourtesy" mapValues='${dorado.getDataProvider("employeeInterceptor#getTitlesOfCourtesy").getResult()}' />
</DataType>
其中的mapValues属性通过视图模型所支持的EL表达式通过一个DataProvider对象提供数据,通过dataProvider服务定位方式,我们可以找到com.bstek.dorado.sample.interceptor.EmployeeInterceptor.其中getTitlesOfCourtesy恰恰就是提供数据的服务方法:
@DataProvider
public Map<String, String> getTitlesOfCourtesy() {
Map<String, String> mapValue = new LinkedHashMap<String, String>();
mapValue.put("Mr.", "Mister");
mapValue.put("Mrs.", "Mistress");
mapValue.put("Ms.", "Miss");
mapValue.put("Dr.", "Doctor");
return mapValue;
}
为便于数据请求,方法声明中要记得添加"@DataProvider"标识.
json赋值
事实上上面的范例中称谓的mapValues我们也可以用json赋值的方式,如:
dataSet1.get("dataType").getPropertyDef("titleOfCourtesy").set("mapping",[
{key:"Mr.", value:"Mister"},
{key:"Mrs.", value:"Mistress"},
{key:"Ms." value:"Miss"},
{key:"Dr.", value:"Doctor"}]);
特别说明
在上述范例中我们都采用了"key"和"value"的关键字,这是mapValue处理机制中Dorado的默认关键字,当实际使用中我们可以通过PropertyDef的keyProperty和valueProperty属性改变这个规则,如:
<PropertyDef name="sex" label="性别"> <Property name="keyProperty">key1</Property> <Property name="valueProperty">value1</Property> <Property name="mapValues"> <Collection> <Entity> <Property name="key1">true</Property> <Property name="value1">Male</Property> </Entity> <Entity> <Property name="key1">false</Property> <Property name="value1">Female</Property> </Entity> </Collection> </Property> </PropertyDef>
上述使用方法中,我们XML赋值和provider赋值都可以通过这种机制实现,但是JSON赋值处理方式中,目前还不支持.其原因XML赋值和Provider赋值的最终处理结果都是在Client端统一为关键字key和value,由于JSON方式是在Client端运行的,此时规则已经统一为key和value.无法再做更改.