SpringSide 3.1.4 棄用 CodeBehind,改用 Struts 2 Convention 插件。核心規則:
web 關鍵字的包(struts.convention.package.locators=web)Action 結尾,方法映射為 actionName!methodName.actionWEB-INF/content/,直接返回邏輯名(如 SUCCESS → article.jsp)故 Action 包名為 personal.youxia.web。
繼承 CrudActionSupport<Article>(實現 ModelDriven、Preparable),默認 execute() 調用 list()。
@Autowired private ArticleManager articleManager;
private Page<Article> page = new Page<Article>(10);
public Page<Article> getPage() { return page; }
@Override
public String list() {
page = articleManager.getAll(page);
return SUCCESS; // → WEB-INF/content/article.jsp
}
article.jsp 遍歷 page.result:
<s:iterator value="page.result">
<tr><td>${subject}</td><td><a href="article!delete.action?id=${id}">刪除</a></td></tr>
<tr><td>${content}</td></tr>
</s:iterator>
private Long id;
@Override
public String delete() {
articleManager.delete(id);
return RELOAD; // 基類常量,觸發 redirect
}
@Results({ @Result(name = CrudActionSupport.RELOAD, location = "article.action", type = "redirect") })
準備模型:
private Article article;
@Override
protected void prepareModel() {
if (id != null) article = articleManager.get(id); // 修改:回顯數據
else article = new Article(); // 新增:空對象
}
public Article getModel() { return article; }
輸入頁 article!input.action → input() 返回 INPUT → article-input.jsp 表單提交到 article!save.action。
保存:
@Override
public String save() {
articleManager.save(article); // ModelDriven 已自動注入表單數據
return RELOAD;
}
getModel() 返回的實體對象save/input 前調用 prepareModel() 保證模型非空第八步:Spring Security 整合保護 Action;第九步:多分據源遷移。完整掌握數據流向(請求→Action→Model→Manager→DAO→DB→Model→JSP)是避免暈頭轉向的關鍵。