如何在Spring MVC中将Java Map放入Optgroup选项?

3

我正在使用Spring MVC。

目前,我有一个Map通过request.setAttribute('userLocales', bluh bluh bluh)从Java传递到我的页面中的变量"userLocales"。

我需要以某种方式获取该变量中的字符串,以构建一个optgroup选择元素中的选项元素列表。我的初步想法是以某种方式将此Map转换为Javascript对象,然后将字符串添加到新创建的选项元素中,以放置在optgroup元素中。

optgroup元素是静态的并已创建。我只需要包含这些字符串的选项。

2个回答

6
我想,我在发布这个问题后立即找到了答案。太棒了。
来源:http://www.imrantariq.com/blog/option-group-capability-for-spring-mvc-form-taglib/ 当设置“optgroup”属性时,“optgroup”首先会按照“optgroup”中定义的任何“expression”进行排序,然后会跟踪迭代的进展,并在适当的位置插入“optgroup”html开始标记和结束标记,使用“optgroup”中的表达式作为标签。
不幸的是,当前spring mvc没有通过其标签提供这种功能。可以通过下面给出的一个好的逻辑来实现这一点。 您需要从控制器发送一个hashMap。
Map<String, ArrayList<String>>

在这个映射中,字符串是键,即组名,而arraylist表示属于该组的值的数量。JSP代码可以这样编写。
<form:select multiple="single" path="itemType" id="itemType">
    <form:option value="0" label="Select" />
    <c:forEach var="itemGroup" items="${itemTypeList}" varStatus="itemGroupIndex">
       <optgroup label="${itemGroup.key}">
           <form:options items="${itemGroup.value}"/>        
       </optgroup>
    </c:forEach>        
</form:select>

0

控制器

请注意,集合是Map<String, List<KeyValueBean>>

它存储例如:Group 1 -> { ("Option 1.1 Label","OPTION_1_1_VAL"), ("Option 1.2 Label","OPTION_1_2_VAL"), ..}

@ModelAttribute("careerOptions")
Map<String, List<KeyValueBean>> getCareerOptions() {        
    HashMap<String, List<KeyValueBean>> result = new HashMap<String, List<KeyValueBean>>();
    result.put("Grp1", new ArrayList<KeyValueBean>());
    result.get("Grp1").add(new KeyValueBean("Option 1.1", "OPT_1_1"));
    result.get("Grp1").add(new KeyValueBean("Option 1.2", "OPT_1_2"));
    result.put("Grp2", new ArrayList<KeyValueBean>());
    result.get("Grp2").add(new KeyValueBean("Option 2.1", "OPT_2_1"));

    return result;
}       

JSP

<form:select path="careerSelected" id="careerElement">
    <form:option label="" value="" />
    <c:forEach var="optionGroup" items="${careerOptions}">
       <optgroup label="${optionGroup.key}">
       <c:forEach var="option" items="${optionGroup.value}">
          <form:option label="${option.key}" value="${option.value}" />                             
       </c:forEach>                                                          
       </optgroup>
    </c:forEach>
</form:select>

KeyValueBean(我创建了自己的,但 Java 内置的是 AbstractMap.SimpleEntry<K,V> —— 你也可以使用它,只是代码有点丑陋)

public class KeyValueBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private String key;
    private String value;

    public KeyValueBean(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }

}

另一种情况:有时选择项是混合的(平面混合OptGroup)

A
B
C (subgroup)
  - C.1
  - C.2

在这种情况下,集合可以是一个映射,其中每个条目都将被键入为一个对象要么(1)一个字符串或(2)一个HashMap,我们将从JSP中发现。 混合数据结构的控制器
@ModelAttribute("careerOptionsMixed")
Map<String, Object> getCareerOptionsMixed() {

    LinkedHashMap<String, Object> result = new LinkedHashMap<String, Object>();

    result.put("Flat Option 1", "OPT_1_FLAT");
    result.put("Group Option 2", myHashMap); // Fill out your HashMap for Group (Key->Value) and add it here
    result.put("Flat Option 3", "OPT_3_FLAT");

    return result;
}           

JSP中的混合数据结构(需要技巧来确定集合或非集合,通过迭代和设置变量完成)在JSP中,我们需要确定我们是否获取到了一个集合或字符串。唯一的方法是通过迭代和设置变量来实现。

<form:select path="career" id="careerField">
   <form:option label="" value="" />
   <c:forEach var="optionOrOptionGroup" items="${careerOptionsMixed}">
      <%--  Must use iteration to find out if this is a Collection or not: https://dev59.com/snI_5IYBdhLWcg3wMf5_#1490171 --%>
      <c:set var="collection" value="false" />
      <c:forEach var="potentialOptionGroup" items="${optionOrOptionGroup.value}" varStatus="potentialOptionGroupStatus">
         <c:if test="${potentialOptionGroupStatus.index > 0}">
            <c:set var="collection" value="true" />
         </c:if>
      </c:forEach>
      <c:choose>
         <c:when test="${collection eq true}">
            <%--  Now we know this is a LinkedHashMap --%>
            <optgroup label="${optionOrOptionGroup.key}">
               <c:forEach var="optionGroup" items="${optionOrOptionGroup.value}">
                  <form:option label="${optionGroup.key}" value="${optionGroup.value}" />
               </c:forEach>
            </optgroup>
         </c:when>
         <c:otherwise>
            <%--  Now we know this is a flat String --%>
            <form:option label="${optionOrOptionGroup.key}" value="${optionOrOptionGroup.value}" />
         </c:otherwise>
      </c:choose>
   </c:forEach>
</form:select>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接