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

Struts 2 入門實戰:從安裝配置到 MVC 架構重構的完整指南

     編輯:Java 相關知識

Struts 作為經典的 Java Web MVC 框架,雖然歷經 Struts 1 → Struts 2 演進,但其核心設計思想仍深刻影響現代框架。本文以 Struts 2 為主線(兼顧 Struts 1 關鍵差異),從環境搭建、核心組件、配置詳解、實戰範例到優缺點分析與實施經驗,為您提供完整的 Struts 入門與進階指南。

一、環境搭建與專案初始化

1. 下載與安裝

  • 官網:struts.apache.org
  • 建議下載 全功能發布包,包含核心 JAR、範例應用、文檔
  • 解壓後關鍵目錄:lib/(核心依賴)、apps/(WAR 範例)

2. Tomcat 整合驗證

  1. 將 apps/struts2-showcase.war 複製到 Tomcat/webapps/
  2. 啟動 Tomcat,訪問 https://localhost:8080/struts2-showcase/
  3. 看到「Powered by Struts 2」標誌即成功

3. 新專案快速建立

# 目錄結構
my-struts-app/
├── index.jsp
├── WEB-INF/
│   ├── web.xml
│   ├── struts.xml          # Struts 2 核心配置
│   ├── classes/            # 編譯後 class
│   └── lib/                # 複製 struts2-core.jar 等依賴

二、Struts 2 核心架構:MVC 重新定義

傳統 JSP/Servlet/JavaBean 三層:

  • JSP → View(展示)
  • Servlet → Controller(請求分發、參數處理、業務呼叫)
  • JavaBean → Model(業務邏輯、資料存取)

Struts 2 拆解 Controller 三大職責:

組件對應傳統角色核心職責
FilterDispatcher (Struts 2 核心過濾器)ActionServlet統一請求入口、生命週期管理、攔截器鏈調度
Action (POJO 動作類)Servlet 邏輯處理封裝業務流程、持有表單資料、返回結果碼
Interceptor (攔截器)Servlet 通用邏輯參數封裝、驗證、檔案上傳、國際化、記錄等橫切關注點
Result (結果類型)RequestDispatcher視圖渲染:JSP、FreeMarker、Velocity、JSON、Stream、Redirect

配置驅動導航:

struts.xml 集中定義所有請求映射、攔截器堆疊、結果視圖,一份檔案掌握全站脈絡,維護升級極具優勢。

三、實戰範例:使用者註冊系統

1. 表單頁面 — 註冊.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>User Registration</title></head>
<body>
    <s:form action="register" theme="simple">
        <s:textfield name="username" label="Username" required="true"/>
        <s:password name="password" label="Password" required="true"/>
        <s:textfield name="email" label="Email" required="true"/>
        <s:submit value="Register"/>
    </s:form>
</body>
</html>

2. Action 類 — RegisterAction.java

package com.example.action;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {
    // 表單屬性自動注入
    private String username;
    private String password;
    private String email;
    
    // Getter/Setter 省略
    
    @Override
    public String execute() {
        // 呼叫 Service 層業務邏輯
        boolean success = userService.register(username, password, email);
        return success ? SUCCESS : ERROR;
    }
    
    // 驗證方法(選配)
    public void validate() {
        if (username != null && username.length() < 3) {
            addFieldError("username", "用戶名至少 3 字元");
        }
        if (email != null && !email.contains("@")) {
            addFieldError("email", "Email 格式錯誤");
        }
    }
}

3. 核心配置 — struts.xml

<struts>
    <package name="default" extends="struts-default">
        <action name="register" class="com.example.action.RegisterAction">
            <result name="success">/success.jsp</result>
            <result name="error">/register.jsp</result>
            <result name="input">/register.jsp</result>  <!-- 驗證失敗返回 -->
        </action>
    </package>
</struts>

4. 成功頁面 — success.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<html><body>
    <h2>註冊成功!歡迎 <s:property value="username"/></h2>
    <p>Email: <s:property value="email"/></p>
</body></html>

四、Struts 2 關鍵技術深度解析

值棧 — 核心資料結構

  • 執行緒局部變數,存放 Action 實例、請求參數、Session/Application 屬性
  • OGNL (Object-Graph Navigation Language) 表達式語言存取值棧資料
  • <s:property value="username"/> 相當於 action.getUsername()

攔截器堆疊 — 橫切關注點模組化

<interceptor-stack name="myStack">
    <interceptor-ref name="params"/>        <!-- 參數注入 -->
    <interceptor-ref name="validation"/>    <!-- 驗證 -->
    <interceptor-ref name="workflow"/>      <!-- 驗證失敗返回 input -->
    <interceptor-ref name="fileUpload"/>    <!-- 檔案上傳 -->
</interceptor-stack>

結果類型多樣化

  • dispatcher (預設):JSP 轉發
  • redirect / redirectAction:重導向
  • json:REST API 回傳 JSON(需 struts2-json-plugin)
  • stream:檔案下載
  • freemarker/velocity:模板引擎

五、Struts 1 vs Struts 2 關鍵差異

維度Struts 1Struts 2
核心控制器ActionServletFilterDispatcher
Action 設計繼承 ActionForm/Action 類POJO,實作 Action 介面或繼承 ActionSupport
表單資料ActionForm 封裝Action 直接屬性 + 參數攔截器自動注入
標籤庫獨立 bean/html/logic 標籤統一 struts 標籤,支援主題/範本
驗證validate() 方法 / XMLvalidate() / 註解 / XML / 獨立驗證框架整合
依賴注入無原生支援(Spring 整合無縫)
測試性依賴 Servlet API,難測試POJO 易於單元測試

六、優缺點客觀評析

優勢:

  • 成熟穩定:十多年生產環境驗證,文檔豐富、坑點已知
  • 配置集中:struts.xml 一覽全站路由,團隊協作/接手維護極友善
  • 標籤庫強大:表單/資料顯示/邏輯控制標籤完整,主題機制支援 UI 快速切換
  • 攔截器架構:橫切關注點模組化,復用性高、擴展性強
  • 整合生態:Spring/Hibernate/JPA/Tiles/SiteMesh/JFreeChart 等無縫整合

劣勢:

  • 學習曲線陡:值棧/OGNL/攔截器/結果類型/標籤主題等概念較多
  • 配置繁瑣:大型專案 struts.xml 膨脹,模組化拆分需規劃
  • 效能開銷:值棧建立、OGNL 解析、攔截器鏈執行有額外成本
  • 靈活度受限:受限於框架生命週期,非標準需求常需繞路
  • 社區活躍度下降:新專案多轉向 Spring MVC,人才儲備趨緩

七、實施經驗與最佳實踐

  1. 專用模組管理 struts.xml:大型專案按業務模組拆分配置檔,<include file="user-struts.xml"/>
  2. Action 單一職責:一個 Action 對應一個用例,避免萬用 Action
  3. 業務邏輯下沉 Service:Action 僅負責參數接收、呼叫 Service、返回結果碼
  4. 善用攔截器堆疊:定義專案標準堆疊,避免重複配置
  5. 驗證分層:前端 JS 即時回饋 + Action validate() 伺服端強檢核
  6. 國際化從頭做起:所有訊息鍵值化,global.properties 管理
  7. 評估遷移成本:新專案優先考慮 Spring MVC;存量專案若穩定可維持,重構需權衡 ROI

八、總結

Struts 2 以 POJO Action + 攔截器鏈 + 值棧/OGNL + 配置驅動導航 重新定義了 Java Web MVC。雖非新專案首選,但理解其設計精髓——關注點分離、配置集中化、攔截器模組化——對掌握 Spring MVC、WebFlux 等現代框架有極大啟發價值。選擇框架無絕對標準,適合團隊能力、專案周期、維護預期者,即為最佳選擇。

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