常見原因排查清單
1. Action 中 List 未初始化
private List listString = new ArrayList<>(); // 必須初始化
public List getListString() { return listString; }
public void setListString(List listString) { this.listString = listString; }
- 未初始化導致
NullPointerException 或空集合。
- Getter/Setter 必須符合 JavaBean 規範 (首字母大寫)。
2. JSP 迭代器屬性錯誤
<!-- 錯誤:value 屬性寫成變量名而非 OGNL 表達式 -->
<s:iterator value="listString" var="item"> <!-- 正確 -->
<s:property value="#item" /><br/>
</s:iterator>
<!-- 常見錯誤 -->
<s:iterator value="listString"> ... </s:iterator> // 缺少 var,無法引用當前項
<s:iterator value="%{listString}"> ... </s:iterator> // 加 %{} 也是可行的
3. 作用域與生命周期
- Action 實例默認
prototype (每請求一個),List 數據在 execute() 中填充。
- 若使用
ModelDriven 或 Preparable 接口,確保 prepare() 不覆蓋已填充數據。
4. 類型不匹配
- List 泛型類型與 JSP 取值方式一致:
List 用 #item,List 用 #item.username。
完整可用示例
Action
public class UserAction extends ActionSupport {
private List userList = new ArrayList<>();
public String execute() {
userList.add(new User("Alice", 25));
userList.add(new User("Bob", 30));
return SUCCESS;
}
// getter/setter 省略
}
JSP
<table>
<s:iterator value="userList" var="user" status="st">
<tr>
<td><s:property value="#st.index + 1" /></td>
<td><s:property value="#user.name" /></td>
<td><s:property value="#user.age" /></td>
</tr>
</s:iterator>
</table>
調試技巧
- 在 Action
execute() 末尾打印 System.out.println(userList) 確認數據已填充。
- JSP 頁面臨時加
<s:debug></s:debug> 查看值棧內容。
- 檢查 Struts2 版本與標簽庫
struts-tags.tld 是否匹配。