繼前幾篇完成 Maven 專案建立、Hibernate 與 Spring 整合後,本篇將著手整合 Struts 2,構建 Web 應用的控制層。Struts 2 作為基於 WebWork 的 MVC 框架,通過攔截器機制、OGNL 表達式語言及靈活的結果類型,極大簡化了 Web 開發。整合完成後,專案將具備完整的請求處理流程:從用戶登錄請求進入 Action,經 Service 層驗證,最終跳轉至歡迎頁。
在 pom.xml 的 <dependencies> 區塊中加入以下兩個核心依賴(版本號與 Spring、Hibernate 版本協調一致):
<!-- struts2依賴 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.1.6</version>
</dependency>
完整的 pom.xml 還包含 JUnit、Spring(JDBC、ORM、DAO)、Log4j、MySQL 驅動、Hibernate 核心及其傳遞依賴(CGLIB、Dom4j、Antlr 等),確保專案編譯與運行時所需所有類庫齊全。
在 web.xml 中聲明 FilterDispatcher(Struts 2 核心控制器),攔截 *.action 後綴的請求;同時配置 Spring 的 ContextLoaderListener 載入應用上下文,並設定歡迎頁為 login.jsp:
<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>*.action</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<?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>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.objectFactory" value="spring" />
<include file="struts/user.xml"></include>
</struts>
關鍵常量說明:struts.objectFactory=spring 將 Action 實例化交由 Spring 容器管理,實現 IoC;struts.devMode 開發階段建議設為 true 以利調試。
<package name="user" namespace="/user" extends="struts-default">
<action name="login" class="userAction" method="login">
<result name="input">/login.jsp</result>
<result name="success" type="redirect">/welcome.jsp</result>
</action>
</package>
此處暫使用 redirect 方式跳轉,後續整合 Tiles 2 時將改為 tiles 結果類型。
繼承 ActionSupport,注入 UserManager,處理登錄邏輯:校驗用戶憑證、更新登錄次數、將用戶信息存入 Session。提供靜態工具方法 getSession()/setSession() 便於操作 Session Map。
public class UserAction extends ActionSupport {
private SsimUser user;
private UserManager userManager;
public String login() {
if (getSession("loginedUser") != null) return SUCCESS;
try {
if (getUserManager().checkLogin(user.getUserEmail(), user.getUserPassword())) {
user = getUserManager().findByEmail(user.getUserEmail());
setSession("username", user.getUserRealname());
setSession("loginedUser", user);
return SUCCESS;
}
} catch (Exception e) {
e.printStackTrace();
}
return INPUT;
}
// getter/setter 及 Session 工具方法省略...
}
封裝用戶驗證與查詢邏輯,依賴 SsimUserDAO 進行數據訪問:
public class UserManager {
private SsimUserDAO ssimUserDAO;
public boolean checkLogin(String userEmail, String password) throws Exception {
SsimUser user = findByEmail(userEmail);
if (user == null) return false;
return user.getUserPassword() != null && user.getUserPassword().equals(password);
}
@SuppressWarnings("unchecked")
public SsimUser findByEmail(String userEmail) {
List<SsimUser> users = ssimUserDAO.findByUserEmail(userEmail);
return (users != null && !users.isEmpty()) ? users.get(0) : null;
}
// getter/setter 省略...
}
在 application-context.xml 中導入各模組 Bean 定義文件,並在 ssim-user.xml 中聲明 userManager 與 userAction,實現依賴注入:
<bean id="userManager" class="net.selitech.ssim.user.UserManager">
<property name="ssimUserDAO" ref="SsimUserDAO" />
</bean>
<bean id="userAction" class="net.selitech.ssim.web.user.UserAction">
<property name="userManager" ref="userManager" />
</bean>
login.jsp 使用表單提交至 /user/login.action,包含前端 JS 校驗;welcome.jsp 簡單顯示「登錄成功」。運行專案,輸入正確郵箱與密碼點擊登錄,若見到歡迎頁即表示整合成功。
本篇完成了 Struts 2 與 Spring 的無縫整合,奠定了 Web 層基礎。下一篇將引入 Tiles 2 優化視圖佈局。