用戶登錄幾乎是所有 Web 系統的核心模組。本教程將通過一個完整的登錄案例,詳細講解 Struts 2.1.6 如何利用約定優於配置的特性,結合註解來定義 Action 與 Result,實現零 XML 配置的開發模式。
在上一篇《Struts 2.1.6 實戰教程(一):環境搭建與 HelloSimple》中,我們將 Action 類放置於 cn.simple.action 套件下。Struts 2 的 Convention Plugin 預設會掃描包含 action、actions、struts、struts2 關鍵字的套件路徑。因此,只要將 Action 類置於如 cn.simple.action、cn.simple.struts 或 cn.simple.action.admin 等路徑下,即可無需在 struts.xml 中額外配置。詳細規則請參考官方文檔:Convention Plugin 文檔。
首先在 WEB-INF/content/ 目錄下建立 loginform.jsp。此處展示兩種寫法:原生 HTML 表單與 Struts 2 標籤庫版本。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用戶登錄</title>
</head>
<body>
<s:fielderror />
<form action="login.action" method="post">
賬號<input type="text" name="loginName" value="${loginName}" /><br/>
密碼<input type="password" name="password" /><br/>
<input type="submit" value="登錄" />
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用戶登錄</title>
</head>
<body>
<s:fielderror />
<s:form action="login">
<s:textfield name="loginName" label="賬號" />
<s:password name="password" label="密碼" />
<s:submit value="登錄" />
</s:form>
</body>
</html>
建立 cn.simple.action.LoginAction 類,使用 @Results 與 @Result 註解定義導航規則:
package cn.simple.action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@Results({
@Result(name = "success", location = "admin/index.action", type = "redirect"),
@Result(name = "input", location = "loginform.jsp", type = "dispatcher")
})
public class LoginAction extends ActionSupport {
private String loginName;
private String password;
@Override
public String execute() throws Exception {
return SUCCESS;
}
@Override
public void validate() {
if (!"simple".equals(loginName)) {
addFieldError("loginName", "登錄名不正確!");
} else if (!"simple".equals(password)) {
addFieldError("password", "密碼不正確!");
}
}
// Getter / Setter 省略
public String getLoginName() { return loginName; }
public void setLoginName(String loginName) { this.loginName = loginName; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
login.action,Convention Plugin 自動映射至 LoginAction。validate() 在 execute() 前執行,檢查帳號密碼是否為 "simple"。若失敗,addFieldError 將錯誤存入 Field 錯誤堆疊。INPUT → dispatcher 轉發回 loginform.jsp,<s:fielderror> 顯示錯誤訊息。execute() 返回 SUCCESS → redirect 重定向至 admin/index.action(後台首頁)。專案結構如下圖所示:

啟動 Tomcat 後訪問 https://localhost:8080/SimpleWeb/login.action:
simple / simple → 重定向至後台首頁顯示「登錄成功」

提示:本教程為演示核心機制,頁面排版極簡。實際專案建議使用前端框架或可視化工具構建美觀界面,再嵌入動態標籤。
「Struts 2.1.6 實戰教程(二):使用註解實現用戶登錄模組」講解完畢,歡迎動手實作,敬請期待後續內容!