springmvc form:select 标签 map用法

在使用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>

是不是正确出来了?!!!!

猜你喜欢

转载自blog.csdn.net/zhaohefeijava/article/details/65628303
今日推荐