運行環境:myeclipse8.6+jboss5.1+jvm1.6
先看最後目錄結構:
直接上源碼:
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>
然後在用<div class="nobr"></div>把<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>