在使用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>
是不是正确出来了?!!!!