五大標籤庫總覽
| 標籤庫 | URI (struts-config.xml 宣告) | 核心功能 | 常用前綴 |
| HTML | /tags/struts-html | 表單元素、超連結、圖片、表單驗證錯誤顯示 | html |
| Bean | /tags/struts-bean | Bean 建立、屬性輸出、資源訊息、迭代器暴露 | bean |
| Logic | /tags/struts-logic | 條件判斷、集合迭代、空值檢查、轉向 | logic |
| Nested | /tags/struts-nested | 巢狀屬性存取、支援上述三庫標籤巢狀使用 | nested |
| Template | /tags/struts-template | 頁面模板化(已被 Tiles 取代,**不建議新專案使用**) | template |
JSP 頁面引入宣告
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-nested" prefix="nested" %>
HTML 標籤:表單構建主力
表單與輸入元件
<html:form action="/user/save" method="post">
<!-- 文字輸入 -->
<html:text property="user.username" maxlength="20" />
<!-- 密碼 -->
<html:password property="user.password" />
<!-- 單選按鈕 -->
<html:radio property="user.gender" value="M" /> 男
<html:radio property="user.gender" value="F" /> 女
<!-- 核取方塊(單一) -->
<html:checkbox property="user.agreeTerms" />
<!-- 多選核取方塊(陣列/集合) -->
<html:multibox property="user.hobbies" value="reading" /> 閱讀
<html:multibox property="user.hobbies" value="gaming" /> 遊戲
<!-- 下拉選單 -->
<html:select property="user.city">
<html:option value="">-- 請選擇 --</html:option>
<html:option value="TPE">台北</html:option>
<html:option value="TAO">桃園</html:option>
</html:select>
<!-- 隱藏欄位 -->
<html:hidden property="user.id" />
<!-- 提交/重置 -->
<html:submit value="送出" />
<html:cancel />
</html:form>
驗證錯誤顯示
<html:errors property="username" /> <!-- 顯示特定欄位錯誤 -->
<html:errors /> <!-- 顯示所有錯誤 -->
Bean 標籤:資料輸出與暴露
<!-- 輸出 Bean 屬性(相當於 ${user.username}) -->
<bean:write name="user" property="username" />
<!-- 定義頁面範圍變數 -->
<bean:define id="interests" name="user" property="hobbies" type="java.util.List" />
<!-- 從資源檔取得國際化訊息 -->
<bean:message key="label.welcome" arg0="${user.name}" />
<!-- 輸出集合大小 -->
<bean:size id="count" name="userList" />
Logic 標籤:流程控制與迭代
集合迭代(最常用)
<logic:iterate name="userList" id="user" indexId="idx">
<tr>
<td><bean:write name="user" property="username" /></td>
<td><bean:write name="user" property="email" /></td>
<td>
<!-- 巢狀迭代興趣 -->
<bean:define id="hobbies" name="user" property="hobbies" type="java.util.List" />
<logic:iterate id="hobby" collection="<%=hobbies%>">
<bean:write name="hobby" /><br/>
</logic:iterate>
</td>
<td>
<a href="edit.do?id=<bean:write name='user' property='id'/>">編輯</a>
<a href="delete.do?id=<bean:write name='user' property='id'/>">刪除</a>
</td>
</tr>
</logic:iterate>
條件判斷
<logic:equal name="user" property="role" value="ADMIN">
<html:link action="/admin/panel">管理後台</html:link>
</logic:equal>
<logic:notEqual name="user" property="status" value="LOCKED">
<span class="active">正常</span>
</logic:notEqual>
<logic:present name="user" property="avatar"> <!-- 不為 null 且非空字串 -->
<img src="<bean:write name='user' property='avatar'/>" />
</logic:present>
<logic:empty name="userList">
<div class="alert">查無資料</div>
</logic:empty>
Nested 標籤:巢狀屬性存取
<!-- 直接存取巢狀屬性 user.address.city -->
<nested:write property="user.address.city" />
<!-- 巢狀迭代 -->
<nested:iterate property="user.orders" id="order">
<nested:write property="order.id" /> -
<nested:write property="order.totalAmount" />
</nested:iterate>
Struts 標籤 vs JSTL/EL 選擇指南
| 場景 | 推薦 | 理由 |
| 純資料顯示、迭代、條件 | JSTL/EL | 語法標準、效能較好、IDE 支援完整、不綁定 Struts |
| 表單輸入、驗證錯誤回填、ActionForm 綁定 | Struts HTML 標籤 | 自動綁定 ActionForm 屬性、支援驗證框架錯誤標記、html:multibox 處理集合綁定 |
| 國際化訊息 | Struts bean:message 或 fmt:message | Struts 整合資源包機制,fmt 標準通用 |
| 巢狀屬性存取 | Nested 標籤 或 EL | EL 直接 ${user.address.city} 更簡潔 |
Struts 標籤最大優勢:ActionForm 自動回填
// Action 中準備修改頁面資料
public ActionForward edit(ActionMapping mapping, ActionForm form, ...) {
UserForm uf = (UserForm) form;
User user = userService.findById(id);
uf.setUser(user); // 設定巢狀 Bean
uf.setHobbies(user.getHobbies().toArray(new String[0])); // 多選陣列
return mapping.findForward("edit");
}
<!-- edit.jsp 直接使用,無需手動 value="${user.username}" -->
<html:form action="/user/update">
<html:text property="user.username" /> <!-- 自動顯示 user.username -->
<html:multibox property="hobbies" value="reading" /> <!-- 自動勾選 -->
<html:multibox property="hobbies" value="gaming" />
<html:submit value="更新" />
</html:form>
總結:Struts 1.x 標籤庫在「表單綁定與驗證整合」上仍有獨特優勢,但純顯示邏輯建議改用 JSTL/EL。現代專案若仍維護 Struts 1,請善用 html:form、html:multibox、bean:write、logic:iterate 核心組合,其餘逐步遷移至標準標籤。