承接前三篇,專案已建立且 Tomcat 能正常啟動。本篇深入剖析 Struts2 運作的兩個核心設定檔:web.xml 與 struts.xml,說明它們如何讓 Struts2 介入請求處理流程。
web.xml 部署描述檔告訴 Servlet 容器 (Tomcat) 要載入 Struts2 的核心過濾器:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
關鍵點:
FilterDispatcher (Struts 2.0.x) 或 StrutsPrepareAndExecuteFilter (2.1.3+) 是所有請求的總入口url-pattern>/* 攔截所有請求,靜態資源需額外配置排除位於 src/ 根目錄,編譯後置於 WEB-INF/classes/。基本結構:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.example.action.LoginAction">
<result name="success">/welcome.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
web.xml,實例化 FilterDispatcherStrutsPrepareAndExecuteFilterstruts.xml 及所有 struts-plugin.xml,建立 Configuration 物件namespace + action name 找到對應 ActionMapping| 現象 | 可能原因 | 解決方式 |
|---|---|---|
| 404 無法找到 Action | namespace/action name 拼寫錯誤、struts.xml 未置於 classpath | 檢查編譯輸出目錄、確認 DTD 版本對應 |
| Filter 初始化失敗 | 缺少 struts2-core.jar、版本衝突 | 檢查 WEB-INF/lib、Maven 依賴樹 |
| 結果頁面空白 | result 路徑錯誤、未配置對應的 result type | 使用絕對路徑 /xxx.jsp、檢查 struts-default.xml 繼承 |
下一篇將介紹如何整合 Spring 2.5 管理 Action Bean,以及導入 iBATIS 2 進行資料存取層開發。