在 Struts2 開發中,若需跨頁面重複使用相同的下拉選單(如性別、狀態等固定選項),最佳實踐是透過資料字典集中管理,再以自訂 Tag 標籤封裝輸出邏輯,方便後續維護。本文將完整示範如何從零建立一個自訂下拉框標籤,包含 Java 類實作、TLD 定義與 JSP 引用三大步驟。
TagSupport,覆寫 doEndTag() 輸出 HTML 選項。index 字段索引)。<%@ taglib %> 導入 TLD,即可在頁面使用自訂標籤。import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class DictionaryOptionTag extends TagSupport {
private static final long serialVersionUID = 1L;
private String index; // 頁面傳入的字段索引
@Override
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
StringBuilder options = new StringBuilder();
// 示範:依索引輸出不同選項,實務上應查詢資料庫或快取
if ("SEX".equals(index)) {
options.append("<option value=''>-請選擇-</option>");
options.append("<option value='1'>男</option>");
options.append("<option value='0'>女</option>");
}
try {
out.println(options.toString());
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;
}
public String getIndex() { return index; }
public void setIndex(String index) { this.index = index; }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"https://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>tagSample</short-name>
<uri>/hellotag</uri>
<tag>
<name>OptionDictionary</name>
<tag-class>com.itmyhome.DictionaryOptionTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>index</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue> <!-- true 時可用 ${} 表達式 -->
</attribute>
</tag>
</taglib>
<%@ taglib uri="/WEB-INF/tld/platForm.tld" prefix="PF" %>
<select>
<PF:OptionDictionary index="SEX" />
</select>
<s:set name="selList" value="#{'1':'品質','2':'成本','3':'進度'}" />
<s:select list="#selList" listKey="key" listValue="value"
name="columnName" headerKey="0" headerValue="--請選擇--" />
<s:select name="columnName" list="{'品質','成本','進度'}"
headerKey="-1" headerValue="--請選擇--" emptyOption="true" multiple="false" />
自訂 Tag 適合「固定選項、多頁共用、需集中維護」的情境;Struts2 內建標籤則適合「動態資料、單頁使用」的場景。依專案需求靈活選擇,即可兼顧開發效率與維護性。