[英]Option Group capability for Spring Form taglib
在 HTML 中我們可以寫
<select name="..." value"...">
<optgroup label="Category 1">
<option ... />
<option ... />
</optgroup>
<optgroup label="Category 2">
<option ... />
<option ... />
</optgroup>
</select>
在 Spring <form>
標簽中,我們如何編寫諸如將項目分組之類的東西。
不幸的是,目前 spring mvc 沒有通過它的標簽提供這樣的功能。 這可以通過這里給出的一個很好的邏輯來實現。
https://jira.springsource.org/browse/SPR-3742仍有待解決。 建議而不是使用 form:options 使用 jstl 和 el 來構建列表。
控制器
注意集合是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;
}
}
另一種情況:有時 Select 項是MIXED (Flat 與 OptGroup 混合)
A
B
C (subgroup)
- C.1
- C.2
在這種情況下,集合可以是Map<String,Object>
其中每個條目將被鎖定到一個對象:或者(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(確定集合與否所需的技巧,通過迭代和設置 var 完成)在 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://stackoverflow.com/a/1490171/1005607 --%>
<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.