Struts2 级联下拉框 详解析
先看最后目录结构:
直接上源码:
complexFormTag.jsp:
[html]
<%@ page language="java" contentType="text/html; charset=gb2312"pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>复杂表单标签使用范例</title>
<s:head />
</head>
<body>
<h3 align="left">doubleselect标签使用范例</h3>
<p>
<s:form name="doubleselectExample">
<s:doubleselect label="材料" headerValue="" headerKey="0"
list="itemList" listKey="itemId" listValue="item"
doubleName="materialId" doubleList="materialMap.get(top.itemId)"
doubleListKey="materialId" doubleListValue="material" />
</s:form>
</p>
</body>
</html>
解析:
若不使用Struts2,则需要结合JavaScript和HTML标签共同开发完成此功能。
doubleselect标签的功能是提供两个有级联关系的下拉框。用户选中第一个下拉框中的某选项,则第二个下拉框中的选项根据第一个下拉框被选中的某选项内容来决定它自己的下拉框选项内容,产生联动效果。
下面是doubleselect标签的属性列表:
名称
必 需
默认
类型
描述
list
是
无
Cellection Map
Enumeration Iterator array
要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容
listKey
否
无
String
指定集合对象中的哪个属性作为选项的value,该选项只对第一个列表框起作用
listValue
否
无
String
指定集合对象中的哪个属性作为选项的内容,该选项只对第一个列表框起作用
headerKey
否
无
String
设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值
headerValue
否
无
String
显示在页面中header选项内容
emptyOption
否
false
Boolean
multiple
否
false
Boolean
是否多选
size
否
无
Integer
显示的选项个数,该选项只对第一个列表框起作用
doubleId
否
无
String
指定第二个列表框的ID
doubleList
是
无
Cellection Map
Enumeration Iterator array
要迭代的集合
doubleListKey
否
无
String
指定集合对象中的哪个属性作为选项的value,该选项只对第二个列表框起作用
doubleListValue
否
无
String
指定集合对象中的哪个属性作为选项的内容,该选项只对第二个列表框起作用
doubleSize
否
无
Integer
选项个数
doubleName
否
无
String
指定第二个列表框的name映射
doubleValue
否
无
Object
第二个列表框的初始选种项
对于代码"materialMap.get(top.itemId)",其中的top返回的是材料类别map集合的value即材料list集合中的材料类对象实例。
注意:<s:doubleselect/>标签必须放在<s:form>中,放在普通<form>中会出错,而且s:form必须指定name属性。
另外,希望页面美观的话,希望s:doubleselect标签和左边的字对齐,则指定s:doubleselect属性theme="simple"
希望两个select排成一行(默认是上下行的),则在<s:form></s:form>间加入css样式:
<style>
.nobr br{display:none}
</style>
然后在用<p class="nobr"></p>把<s:doubleselect .. />包起来就可以了!
下面通过一张图形象的表示联动关系:
对应的组件:
最后,两个下拉框要联动起来,靠的是“ItemId”与下面"Integer类型变量"的一一对应关系。
complexFormTagAction.java:
[java]
package action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
import model.*;
public class ComplexFormTagAction extends ActionSupport {
//级联第一个下拉框数据
private List<Item> itemList;
//级联第二个下拉框数据
private Map<Integer, List<Material>> materialMap;
public String execute() throws Exception {
itemList = new ArrayList<Item>();
//循环新建10个类别
for (int j = 0; j < 10; j++) {
Item item = new Item();
item.setItemId(j + 1);
item.setItem("类别" + (j + 1));
itemList.add(item);
}
materialMap = new HashMap<Integer, List<Material>>();
//循环新建每个类别中的10个材料
for (int j = 0; j < 10; j++) {
List<Material> materialList = new ArrayList<Material>();
for (int i = 0; i < 10; i++) {
Material material = new Material();
material.setMaterialId(i);
material.setMaterial("类别" + (j + 1)+"-->"+"材料"+(i + 1));
materialList.add(material);
}
materialMap.put((j + 1), materialList);
}
return SUCCESS;
}
public Map<Integer, List<Material>> getMaterialMap() {
return materialMap;
}
public void setMaterialMap(Map<Integer, List<Material>> materialMap) {
this.materialMap = materialMap;
}
public List<Item> getItemList() {
return itemList;
}
public void setItemList(List<Item> itemList) {
this.itemList = itemList;
}
}
Material.java:
[java]
package model;
public class Material implements java.io.Serializable {
// Fields
private int materialId;
private String material;
public Material() {}
public int getMaterialId() {
return this.materialId;
}
public void setMaterialId(int materialId) {
this.materialId = materialId;
}
public String getMaterial() {
return this.material;
}
public void setMaterial(String material) {
this.material = material;
}
}
Item.java:
[java]
package model;
public class Item implements java.io.Serializable {
private int itemId;
private String item;
public Item() {}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public String getItem() {
return this.item;
}
public void setItem(String item) {
this.item = item;
}
}
struts.xml:
[html]
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="gb2312"/>
<package name="OGNLTAG" extends="struts-default">
<action name="complexFormTag" class="action.ComplexFormTagAction">
<result name="success">/jsp/complexFormTag.jsp</result>
</action>
</package>
</struts>