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

Struts2 進階實戰(二):Action 接收參數三種方式、動態方法調用、通配符映射

     編輯:Java 綜合教學

Struts2 核心進階:Action 參數接收三大模式、動態方法調用、通配符映射簡化配置

Struts2 作為經典 MVC 框架,其 Action 作為「業務控制器」承擔參數接收、業務調度、結果導向三大職責。本文深度講解屬性驅動、模型驅動、JavaBean三種參數接收模式的適用場景與代碼實現,並演示動態方法調用與通配符映射如何大幅簡化 struts.xml 配置量。

一、Struts2 在 MVC 中的定位

  • 核心控制器:StrutsPrepareAndExecuteFilter,攔截所有請求,委派給 Action
  • 業務控制器:Action,接收參數 → 調用 Service → 返回結果視圖
  • 模型:Service + DAO + Entity
  • 視圖:JSP / FreeMarker / Velocity / JSON

二、Action 接收參數三種方式

1. 屬性驅動 —— 最原始、最直接


// Action
public class UserAction extends ActionSupport {
    private String username;
    private String password;
    // 必須提供 setter,框架調用 setXxx()
    public void setUsername(String username) { this.username = username; }
    public void setPassword(String password) { this.password = password; }
    
    public String login() {
        // 直接使用 username, password
        return SUCCESS;
    }
}

<!-- login.jsp -->
<form action="login" method="post">
  用戶名: <input name="username" />  <!-- name 與 Action 屬性名一致 -->
  密碼: <input name="password" />
  <input type="submit" />
</form>

優點:簡單直觀;缺點:Action 膨脹、參數多時維護困難、無法直接接收復雜對象。

2. JavaBean 驅動 —— 封裝參數對象


// 實體類
public class User {
    private String username;
    private String password;
    // getter/setter...
}

// Action
public class UserAction extends ActionSupport {
    private User user; // 封裝參數
    public void setUser(User user) { this.user = user; }
    public User getUser() { return user; }
    
    public String execute() { ... }
}

<!-- JSP 字段名加前綴 -->
<input name="user.username" />
<input name="user.password" />

優點:參數對象化、便於傳遞給 Service;缺點:JSP 字段名冗長。

3. ModelDriven 模式 —— 棧頂即模型,字段名最簡潔


public class UserAction implements ModelDriven {
    private User user = new User(); // 必須實例化
    
    @Override
    public User getModel() { return user; } // 返回棧頂模型
    
    public String execute() {
        // 直接 user.getUsername(),或 Service 直接用 user
        return SUCCESS;
    }
}

<!-- JSP 字段名無前綴 -->
<input name="username" />
<input name="password" />

原理:Struts2 通過 ModelDrivenInterceptor 調用 getModel() 將返回對象壓入 ValueStack 棧頂,OGNL 表達式直接解析到模型屬性。

三、struts.xml 中 method 屬性與動態方法調用

1. 靜態指定 method


<action name="login" class="action.UserAction" method="login">
  <result name="input">login.jsp</result>
  <result>welcome.jsp</result>
</action>
<action name="all" class="action.DeptAction" method="getDept">
  <result>list.jsp</result>
</action>

一個 Action 類可配置多個 <action>,各自指定不同 method,實現「一類多入口」。

2. 動態方法調用 (DMI) —— 不推薦生產使用


<action name="user" class="action.UserAction"> <!-- 無 method -->
  <result>list.jsp</result>
</action>

<form action="user!save" method="post"> <!-- 格式:actionName!methodName -->
  ...
</form>

風險:暴露內部方法名、繞過攔截器棧、安全審計困難。禁用方式:


<constant name="struts.enable.DynamicMethodInvocation" value="false" />

四、通配符映射簡化配置

基本語法


<action name="user_*" class="action.UserAction" method="{1}">
  <result>{1}.jsp</result>  <!-- {1} 為通配符捕獲的內容 -->
</action>

user_add → 調用 add() → 返回 add.jsp
user_delete → 調用 delete() → 返回 delete.jsp

多通配符優先級規則


<action name="user_add" class="action.UserAction" method="add">  <!-- 精確匹配優先 -->
  <result>add.jsp</result>
</action>
<action name="user_*" class="action.UserAction" method="{1}">  <!-- 通配符次之 -->
  <result>{1}.jsp</result>
</action>

匹配順序:

  1. 精確匹配 (最高優先級)
  2. 通配符匹配(按配置文件順序,第一個匹配生效)

進階:通配符捕獲多組內容


<action name="*/user/*" class="action.{1}UserAction" method="{2}">
  <result>/{1}/user/{2}.jsp</result>
</action>

admin/user/save → 類 action.AdminUserAction、方法 save()、視圖 /admin/user/save.jsp

五、最佳實踐總結

  1. 參數接收首選 ModelDriven:字段名乾淨、Action 瘦身、模型復用性高
  2. 複雜對象圖用 JavaBean:user.address.city 自動級聯賦值
  3. 禁用 DMI:struts.enable.DynamicMethodInvocation=false
  4. 通配符映射 CRUD:user_* 覆蓋增刪改查,配置量減少 80%
  5. 命名空間隔離模塊:<package namespace="/admin"> 避免 action 名稱衝突

掌握這些進階技巧,能讓 Struts2 專案從「配置地獄」進化為「約定優於配置」的輕量級 MVC 架構,專注於業務邏輯而非 XML 搬運。

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