| 原職責 | Struts 組件 | 實現類 |
| 接收表單數據 | ActionForm | LoginActionForm |
| 業務驗證/查詢 | Action | LoginAction.execute() |
| 多出口轉發 | ActionForward | mapping.findForward("success/fail/error") |
3. 關鍵配置片段
<!-- struts-config.xml -->
<form-bean name="loginForm" type="bookstore.form.LoginActionForm"/>
<action path="/login"
type="bookstore.action.LoginAction"
name="loginForm"
scope="request"
validate="true"
input="/login.jsp">
<forward name="success" path="/welcome.jsp"/>
<forward name="fail" path="/fail.jsp"/>
<forward name="error" path="/error.jsp"/>
</action>
二、新增圖書管理模塊:可視化設計器全程演示
1. 數據庫表結構
CREATE TABLE T_BOOK (
BOOK_ID VARCHAR2(10) NOT NULL PRIMARY KEY,
ISBN VARCHAR2(20) NOT NULL,
BOOK_NAME VARCHAR2(50) NOT NULL,
AUTHOR VARCHAR2(50),
CREATE_DATE CHAR(8)
);
約束:BOOK_ID 唯一,ISBN/BOOK_NAME 非空 → 直接映射為 ActionForm 驗證規則。
2. Struts 流程圖(Action Designer 可視化)
bookAdd.jsp (頁面)
│
▼
bookActionForm (表單數據綁定 + 自動驗證)
│
▼
/bookInsertAction (業務控制器)
│
├─ 成功 → insertSuccess.htm
└─ 失敗 → 錯誤頁面
3. 核心組件代碼骨架
bookAdd.jsp(Struts 標籤庫 + 國際化)
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<html:form action="/bookInsertAction">
<html:text property="isbn"/>
<html:text property="bookName"/>
<html:text property="author"/>
<html:submit value="<bean:message key='btn.add'/>"/>
</html:form>
BookActionForm(驗證邏輯)
public class BookActionForm extends ActionForm {
private String isbn, bookName, author;
// getter/setter 省略
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (isbn == null || isbn.trim().length() == 0) {
errors.add("isbn", new ActionMessage("error.isbn.required"));
}
if (bookName == null || bookName.trim().length() == 0) {
errors.add("bookName", new ActionMessage("error.bookName.required"));
}
return errors;
}
}
BookInsertAction(業務處理)
public class BookInsertAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
BookActionForm bookForm = (BookActionForm) form;
// 1. 構建領域對象
Book book = new Book();
book.setIsbn(bookForm.getIsbn());
book.setBookName(bookForm.getBookName());
book.setAuthor(bookForm.getAuthor());
book.setCreateDate(new SimpleDateFormat("yyyyMMdd").format(new Date()));
// 2. 調用 Service/DAO 持久化
BookService service = ServiceLocator.getBookService();
try {
service.insertBook(book);
return mapping.findForward("success");
} catch (DuplicateKeyException e) {
// 主鍵衝突處理
return mapping.findForward("duplicate");
} catch (Exception e) {
log.error("Insert book failed", e);
return mapping.findForward("error");
}
}
}
三、項目初始化步驟
- File → New Project →
bookStore + Web Module webModule
- 覆蓋原 Servlet 專題代碼至新工程
- SQL Plus 執行
T_BOOK 建表腳本
- 將必要 JAR(Struts、JDBC 驅動等)加入 Library
四、遷移收益對比
| 維度 | switch.jsp 時代 | Struts 重構後 |
| 職責分離 | JSP 混雜 Java 代碼、SQL、轉發 | ActionForm/Action/Forward 清晰分層 |
| 表單驗證 | 手寫 JS + 服務端 if-else | ActionForm.validate() 集中聲明 |
| 國際化 | 硬編碼字符串 | ResourceBundle + bean:message |
| 異常處理 | try-catch 分散 | Action 全局異常映射 |
| 可測試性 | 需啟動容器 | Action 可單元測試 (Mock request/response) |
五、結語
通過 JBuilder 2005 的 Struts 可視化設計器,我們完成了從「頁面中心」到「控制器中心」的架構躍遷。ActionForm 封裝數據與驗證,Action 聚焦業務流程,ActionForward 解耦導航——這正是 MVC 在 Web 層的經典落地。後續可進一步引入 Spring 管理 Service/DAO、Hibernate 簡化持久化、Tiles 佈局復用,構建企業級標準化開發框架。
- 上一篇文章: J2EE 架構師必修的六大實戰法則:服務端驗證、安全內建與架構治理精要
- 下一篇文章: Java 網絡編程:配置 java.net.URL 通過 HTTP 代理訪問互聯網資源
Copyright ©
程式碼之家 All Rights Reserved