您的位置:首页 > 编程语言 > Java开发

springmvc form:select 标签 map用法

2017-03-24 11:02 351 查看
在使用form:select 标签 时, itemValue和itemLabel属性怎么填都报错,如下,teacherTypes为Map

<div class="form-group">
<form:label path="teacherTypeId">类型选择:</form:label>
<form:select path="teacherTypeId" items="${teacherTypes}" itemValue="value"/>
</div>


只好跟源码看看咋解决。

直接贴源码

package org.springframework.web.servlet.tags.form;

import java.beans.PropertyEditor;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.jsp.JspException;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.web.servlet.support.BindStatus;
import org.springframework.web.servlet.tags.form.SelectedValueComparator;
import org.springframework.web.servlet.tags.form.TagWriter;
import org.springframework.web.servlet.tags.form.ValueFormatter;

class OptionWriter {
public void writeOptions(TagWriter tagWriter) throws JspException {
if(this.optionSource.getClass().isArray()) {
this.renderFromArray(tagWriter);
} else if(this.optionSource instanceof Collection) {
this.renderFromCollection(tagWriter);
} else if(this.optionSource instanceof Map) {
this.renderFromMap(tagWriter);
} else {
if(!(this.optionSource instanceof Class) || !((Class)this.optionSource).isEnum()) {
throw new JspException("Type [" + this.optionSource.getClass().getName() + "] is not valid for option items");
}

this.renderFromEnum(tagWriter);
}

}


form:select标签有springmvc框架组装html的select标签,里面需要把下拉选项的options标签也同时组装出来,有上面代码可以看出,针对map格式会有单独则组装方法,

继续看renderFromMap方法

private void renderFromMap(TagWriter tagWriter) throws JspException {
Map optionMap = (Map)this.optionSource;
Iterator var3 = optionMap.entrySet().iterator();

while(var3.hasNext()) {
Entry entry = (Entry)var3.next();
Object mapKey = entry.getKey();
Object mapValue = entry.getValue();
Object renderValue = this.valueProperty != null?PropertyAccessorFactory.forBeanPropertyAccess(mapKey).getPropertyValue(this.valueProperty):mapKey;
Object renderLabel = this.labelProperty != null?PropertyAccessorFactory.forBeanPropertyAccess(mapValue).getPropertyValue(this.labelProperty):mapValue;
this.renderOption(tagWriter, mapKey, renderValue, renderLabel);
}

}


可以看出,map类型会先迭代每个键值对,拿到 mapKey和mapValue,然后根据你在上面填入的itemLabel和itemValue值,将会在这个mapKey和mapValue是否含有上述属性,

假设取到的的mapValue为某个自定义类对象,而且定义了这个私有itemValue属性setter getter方法,那么ok,取到了这个自定义类对象的itemValue的属性值;

但是如果你没有定义这个私有itemValue属性setter getter方法 ,或者你这个对象根本就是基本类型(int、boolean等包含string),根本就没有自定义的属性,则会抛出找不到getter属性值的异常;

好了,说道这里,也知道为啥咋写都不对了,应该itemLabel和itemValue属性,全部不填,就ok了

<div class="form-group">
<form:label path="teacherTypeId">类型选择:</form:label>
<form:select path="teacherTypeId" items="${teacherTypes}" />
</div>


是不是正确出来了?!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: