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

Struts2 動態方法調用 (DMI) 實作教學:一個 Action 處理多個請求

     編輯:Java 綜合教學

動態方法調用 (DMI) 簡介

Struts2 預設每個 Action 只處理 execute() 方法對應的單一請求。實際開發中,同一業務實體常需多種操作 (增刪改查),Dynamic Method Invocation (DMI) 允許在同一 Action 類中定義多個方法,透過 URL 指定調用哪個方法。

啟用 DMI 設定

在 struts.xml 中設定常數啟用:

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

注意:Struts 2.3+ 預設關閉 DMI (安全性考量),必須顯式開啟。

完整實作範例

1. JSP 頁面定義 Action 方法

登入頁面 (DMI_login.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>登入</title></head>
<body>
    <h4>請輸入帳號密碼</h4>
    <s:form action="DMIAction!login">
        <s:textfield name="username" label="使用者名稱" />
        <s:password name="password" label="密碼" />
        <s:submit value="登入" />
    </s:form>
</body>
</html>

註冊頁面 (DMI_register.jsp)

<s:form action="DMIAction!register">
    <s:textfield name="username" label="使用者名稱" />
    <s:password name="password" label="密碼" />
    <s:submit value="註冊" />
</s:form>

關鍵語法:action="ActionName!methodName",驚嘆號分隔 Action 名稱與方法名。

2. Struts 設定檔 (struts.xml)

<?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="true"/>
    <package name="default" extends="struts-default">
        <action name="DMIAction" class="struts2.action.DMIAction">
            <result name="success">RegisterSuccess.jsp</result>
        </action>
    </package>
</struts>

3. Action 類實作

package struts2.action;

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;

public class DMIAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    
    // 登入業務邏輯
    public String login() {
        // 驗證帳密邏輯...
        return SUCCESS;
    }
    
    // 註冊業務邏輯
    public String register() {
        // 註冊存檔邏輯...
        return SUCCESS;
    }
    
    // 表單屬性驅動
    private String username;
    private String password;
    // getter/setter 省略...
    
    // Session/Application 注入 (可選)
    private Map sessionMap;
    private Map applicationMap;
    public void setSession(Map sessionMap) { this.sessionMap = sessionMap; }
    public void setApplication(Map applicationMap) { this.applicationMap = applicationMap; }
}

DMI 進階用法

方法簽名規則

  • 回傳類型:String (對應 result 名稱)
  • 方法名:公開、非靜態、無參數
  • 拋出異常:可拋出 Exception

通配符映射 (Wildcard Mapping) 替代方案

Struts 2.3+ 推薦使用通配符而非 DMI:

<action name="DMIAction_*" class="struts2.action.DMIAction" method="{1}">
    <result name="success">{1}Success.jsp</result>
    <result name="login">login.jsp</result>
    <result name="register">register.jsp</result>
</action>

URL 格式:/DMIAction_login.action、/DMIAction_register.action

REST 風格慣例插件

<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<package name="default" extends="struts-default,rest-default">
    <action name="users/*" class="struts2.action.UserAction">
        <result name="success" type="redirectAction">users</result>
    </action>
</package>

安全性考量

  1. 預設關閉:Struts 2.5+ 預設 false,防止惡意調用內部方法
  2. 方法白名單:可配置 struts.allowedMethods 限制可調用方法
  3. 生產建議:優先使用通配符映射或 REST 插件,避免 DMI 安全風險

總結

DMI 讓單一 Action 處理多個相關業務邏輯,減少 Action 類數量。核心步驟:

  1. struts.xml 設定 struts.enable.DynamicMethodInvocation = true
  2. JSP 表單 action="ActionName!methodName"
  3. Action 類實作對應的公開方法 public String methodName()

現代 Struts 開發建議改用通配符映射或 REST 風格,兼顧安全與維護性。

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