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

Struts2 通配符映射實戰:動態 Action 匹配與方法調用約定

     編輯:Java 相關知識

Struts2通配符映射讓單個 Action 配置處理多個請求,配合動態方法調用(`!` 或 `method:` 前綴),大幅減少 `struts.xml` 配置量。本文通過用戶註冊/登錄/查詢完整業務流程,演示通配符配置、Action 類設計、結果頁面跳轉、參數接收與驗證的最佳實踐。

一、通配符配置語法

<package name="user" namespace="/user" extends="struts-default">
    <!-- 匹配 user/user!register、user/user!login、user/user!query -->
    <action name="user*" class="com.action.UserAction" method="{1}">
        <result name="success">/success.jsp</result>
        <result name="input">/register.jsp</result>
        <result name="error">/error.jsp</result>
    </action>
</package>
  • user* 匹配以 `user` 開頭的所有路徑
  • {1} 捕獲 `*` 對應的字符串作為方法名(如 `register`、`login`)
  • 支持多通配符:user_*_{1}_{2} → 方法名由 `{1}`、`{2}` 拼接

二、Action 類設計

public class UserAction extends ActionSupport {
    private User user;           // 自動封裝表單參數
    private UserService userService;
    
    // 註冊方法
    public String register() {
        if (userService.exists(user.getUsername())) {
            addFieldError("username", "用戶名已存在");
            return INPUT;
        }
        userService.save(user);
        return SUCCESS;
    }
    
    // 登錄方法
    public String login() {
        User dbUser = userService.findByUsername(user.getUsername());
        if (dbUser != null && dbUser.getPassword().equals(user.getPassword())) {
            ActionContext.getContext().getSession().put("user", dbUser);
            return SUCCESS;
        }
        addActionError("用戶名或密碼錯誤");
        return ERROR;
    }
    
    // 查詢方法
    public String query() {
        List users = userService.findAll();
        ActionContext.getContext().put("users", users);
        return SUCCESS;
    }
    
    // Getter/Setter
}

三、前端頁面

註冊頁

<form action="${pageContext.request.contextPath}/user/user!register" method="post">
    用戶名: <input name="user.username" /> <s:fielderror fieldName="user.username"/><br/>
    密碼: <input type="password" name="user.password" /><br/>
    郵箱: <input name="user.email" /><br/>
    <input type="submit" value="註冊" />
</form>

登錄頁

<form action="${pageContext.request.contextPath}/user/user!login" method="post">
    用戶名: <input name="user.username" /><br/>
    密碼: <input type="password" name="user.password" /><br/>
    <input type="submit" value="登錄" />
</form>
<s:actionerror />

查詢結果頁

<table border="1">
    <tr><th>ID</th><th>用戶名</th><th>郵箱</th></tr>
    <s:iterator value="#request.users">
        <tr>
            <td><s:property value="id"/></td>
            <td><s:property value="username"/></td>
            <td><s:property value="email"/></td>
        </tr>
    </s:iterator>
</table>

四、動態方法調用(DMI)替代方案

若不想用通配符,可開啟 DMI(Struts 2.3+ 默認關閉):

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

URL 格式:/user/user!register.action 或 /user/user.action?method:register。不推薦:安全風險(任意方法調用)、REST 風格差、調試困難。

五、最佳實踐總結

  1. 通配符 + 方法名約定:`user*` + `{1}`,清晰 REST 風格
  2. Action 方法返回邏輯視圖名:`SUCCESS`、`INPUT`、`ERROR` 對應結果頁
  3. 驗證錯誤用 `addFieldError`/`addActionError`,頁面用 ``/`` 顯示
  4. 數據放入請求/會話:`ActionContext.getContext().put()` / `.getSession().put()`
  5. 關閉 DMI:安全優先,通配符足夠靈活

六、總結

Struts2 通配符映射是「約定優於配置」的典型應用。一個 `` 處理整個業務模塊的增刪改查,Action 類方法名與 URL 尾部對應,結果頁面通過邏輯名解耦。掌握此模式,能讓 `struts.xml` 保持極簡,業務邏輯集中在 Action 類,維護性大幅提升。

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