首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Struts 2 入門實戰 (一):環境搭建、Hello World、核心執行流程與攔截器機制

     編輯:Java 綜合教學

Struts 2 入門實戰 (一):環境搭建、Hello World、核心執行流程與攔截器機制

Struts 2 以 WebWork 為核心,融合 Struts 1 優點,構建了基於**攔截器模式**的 MVC 框架。本文通過**最小化 Hello World** 完整演示:環境搭建、Action 實現三種方式、配置文件詳解、請求處理流程、結果類型、常見錯誤排查。

一、Struts 2 核心架構特點

  • 攔截器鏈:取代 Struts 1 的基類繼承,橫切關注點 (參數封裝、驗證、文件上傳、事務、日誌) 以攔截器插拔組合。
  • POJO Action:Action 無需實現接口或繼承基類,**普通 Java 類**即可,`execute()` 方法名可自定義。
  • OGNL 表達式語言:強大的對象圖導航語言,支援屬性遍歷、集合操作、投影選擇、Lambda 表達式 (Struts 2.5+)。
  • 結果類型豐富:Dispatcher (默認 JSP 轉發)、FreeMarker、Velocity、JasperReports、Stream (文件下載)、JSON (REST)、Chain (Action 鏈) 等。

二、環境搭建與依賴管理

2.1 官方下載

地址:https://struts.apache.org/download.cgi
建議下載 **`struts--all.zip`** 包含 Jar、源碼、文檔、示例應用。

2.2 Maven 依賴 (推薦)

<properties>
    <struts2.version>2.5.30</struts2.version>  <!-- 當前穩定版 -->
</properties>

<dependencies>
    <!-- 核心 -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>${struts2.version}</version>
    </dependency>
    <!-- JSON 插件 (REST API 必備) -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-json-plugin</artifactId>
        <version>${struts2.version}</version>
    </dependency>
    <!-- JSP 標簽庫 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

三、三種 Action 實現方式

方式代碼示例優缺點
1. 普通 POJO
public class UserAction {
    private String name;
    public String execute() { return "success"; }
    // Getter/Setter
}
最簡潔,推薦
2. 實現 Action 接口
public class UserAction implements Action {
    public String execute() { return SUCCESS; }
}
強制規範,可用常量 SUCCESS/ERROR/INPUT/LOGIN/NONE
3. 繼承 ActionSupport (最常用)
public class UserAction extends ActionSupport {
    private String name;
    public String execute() {
        addActionMessage("歡迎 " + name);
        return SUCCESS;
    }
}
**提供驗證、國際化、ActionMessage 等豐富基礎功能**,實戰首選

四、完整 Hello World 步驟

4.1 web.xml 註冊核心過濾器

<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee" version="3.1">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

關鍵點: Struts 2.5+ 使用 `StrutsPrepareAndExecuteFilter` (單一過濾器),舊版為 `StrutsPrepareAndExecuteFilter` (ng 包) 或雙過濾器。

4.2 struts.xml 核心配置 (放置 src 根目錄)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "https://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <!-- 開發模式:修改配置熱加載,無需重啟 -->
    <constant name="struts.devMode" value="true" />
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />

    <package name="default" namespace="/" extends="struts-default">
        <!-- 全局結果 -->
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>

        <!-- Action 定義 -->
        <action name="userAction" class="com.able.action.UserAction" method="execute">
            <result name="success">/index.jsp</result>
            <result name="input">/register.jsp</result> <!-- 驗證失敗返回 -->
        </action>

        <action name="login" class="com.able.action.LoginFieldAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

4.3 Action 類實現

package com.able.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    private String name;
    private String message;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }

    public String execute() {
        System.out.println("接收參數 name:" + name);
        message = "Hello World, " + name;
        return "success";  // 對應 result name="success"
    }
}

4.4 JSP 頁面 (使用 Struts 標簽庫)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>Struts2 Hello World</title></head>
<body>
    <s:form action="userAction">
        <s:textfield name="name" label="用戶名" />
        <s:submit value="提交" />
    </s:form>

    <div>
        <s:property value="message" /> <!-- 輸出 Action 中的 message 屬性 -->
    </div>

    <div>
        通過屬性傳值:<br/>
        <s:property value="username" /><br/>
        <s:property value="password" />
    </div>

    <div>
        通過 JavaBean (ModelDriven) 獲取:<br/>
        <s:property value="user.username" /><br/>
        <s:property value="user.password" />
    </div>
</body>
</html>

五、核心執行流程詳解

  1. 瀏覽器請求 `https://host:port/app/userAction` (或表單提交 `action="userAction"`)。
  2. StrutsPrepareAndExecuteFilter 攔截請求,**Prepare 階段**查找 ActionMapping,**Execute 階段**執行攔截器鏈與 Action。
  3. **ActionMapping 匹配**:根據 `struts.xml` 中 `` + `` 匹配請求路徑。
  4. **參數封裝攔截器** (`params`):將請求參數 `name=xxx` 通過 OGNL 設置到 Action 的 `setName()`。
  5. **執行 Action 方法**:默認 `execute()`,或 `` 指定方法。
  6. **結果處理**:Action 返回字符串 `success`,匹配 `/index.jsp`。
  7. **結果類型執行**:默認 `DispatcherResult`,轉發至 `/index.jsp`,JSP 渲染輸出。

六、常見錯誤與排查

現象原因解決
404 無法找到 Actionnamespace/action name 不匹配、struts.xml 未放在 classpath 根目錄檢查 namespace="/", action name="userAction",請求路徑 /userAction
參數無法封裝 (null)表單字段 name 與 Action 屬性名不一致、缺少 Getter/Setter嚴格對應 name="username" ↔ setUsername()
JSP 標簽庫報錯缺少 jstl 依賴、taglib uri 錯誤引入 jstl:1.2,uri="/struts-tags"
開發模式不生效struts.devMode=true 但修改配置未重啟devMode 僅熱加載配置文件,Java 類修改仍需重啟或熱部署

七、總結

Struts 2 以**攔截器鏈**替代傳統基類繼承,**POJO Action** 降低侵入性,**OGNL** 提供強大表達能力。
掌握:web.xml Filter → struts.xml Package/Action/Result → POJO Action → JSP + Struts Tags 這條主線,即可快速上手。
下一篇將深入:**攔截器棧定制、驗證框架、文件上傳、類型轉換、REST 插件、約定優於配置**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved