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

Spring MVC MultiActionController 詳解:一個 Controller 處理多 Action

     編輯:Java 相關知識

動機與定位

傳統 Spring MVC Controller 單一職責導致同業務的增刪改查分散在多個類中。MultiActionController 允許在一個 Controller 類中聚合多個處理方法,類似 Struts 的 DispatchAction,減少樣板代碼。

核心組件

  • HandlerMapping:URL → Controller 映射
  • MethodNameResolver:URL/參數 → 方法名解析

三種方法名解析器對比

1. InternalPathMethodNameResolver(默認)

根據 URL 路徑尾部直接匹配方法名。

Bean 配置

<bean name="/updateUser.html" class="com.unmi.UserController"/>
<bean name="/deleteUser.html" class="com.unmi.UserController"/>

URL 映射

  • /updateUser.html → updateUser()
  • /deleteUser.html → deleteUser()

缺點

同一 Controller 需配置多個 Bean 定義,非單例模式。

2. ParameterMethodNameResolver(推薦)

通過請求參數指定方法名,單一 Bean 定義,真正單例。

Bean 配置

<bean name="/user.html" class="com.unmi.UserController">
    <property name="methodNameResolver">
        <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
            <property name="paramName" value="method"/>
        </bean>
    </property>
</bean>

URL 映射

  • /user.html?method=updateUser → updateUser()
  • /user.html?method=deleteUser → deleteUser()

優勢

  • 單一 Controller Bean,單例模式
  • 支持 HTML 表單隱藏域/下拉框動態選擇 Action
  • URL 結構清晰,REST 風格友好

3. PropertiesMethodNameResolver(複雜、少用)

通過 key/value 映射文件關聯 URL 與方法名,需配合 SimpleUrlHandlerMapping。

配置複雜度

<bean id="userController" class="com.unmi.UserController"/>
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/updateUser.html">userController</prop>
            <prop key="/deleteUser.html">userController</prop>
        </props>
    </property>
</bean>
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
    <property name="mappings">
        <props>
            <prop key="/updateUser.html">updateUser</prop>
            <prop key="/deleteUser.html">deleteUser</prop>
        </props>
    </property>
</bean>

評價

HandlerMapping 與 MethodNameResolver 職責重疊,配置冗余,無明顯優勢,不推薦使用。

Controller 實現範例

public class UserController extends MultiActionController {
    
    public ModelAndView updateUser(HttpServletRequest request,
                                   HttpServletResponse response) {
        System.out.println("updateUser executed");
        return new ModelAndView("userList", "from", "updateUser");
    }
    
    public ModelAndView deleteUser(HttpServletRequest request,
                                   HttpServletResponse response) {
        System.out.println("deleteUser executed");
        return new ModelAndView("userList", "from", "deleteUser");
    }
    
    // 方法簽名要求:
    // 返回值:ModelAndView / Map / void
    // 參數:HttpServletRequest, HttpServletResponse
    //       或 @RequestParam 綁定參數(需適配器支持)
}

最佳實踐建議

  1. 優先使用 ParameterMethodNameResolver:單例 Bean、URL 簡潔、表單友好
  2. 方法簽名統一:建議統一使用 (HttpServletRequest, HttpServletResponse) 或 (@RequestParam Map<String, Object> params)
  3. 異常處理:在方法內捕獲業務異常,返回錯誤視圖或拋出自定義異常交由 HandlerExceptionResolver
  4. 遷移提示:Spring 3.0+ 推薦使用 @Controller + @RequestMapping 註解方式,MultiActionController 已過時

現代替代方案對比

方案優勢適用場景
@Controller + @RequestMapping註解驅動、RESTful、方法級映射靈活所有新項目
MultiActionController聚合同業務邏輯、減少類數量維護舊項目、簡單 CRUD 聚合
SimpleFormController表單工作流內置支持複雜表單驗證流程(已棄用)

總結

MultiActionController 通過 MethodNameResolver 實現一個 Controller 多方法分發,ParameterMethodNameResolver 是最實用的解析器。雖然註解式開發已成主流,但理解其機制有助於維護遺留系統並領會 Spring MVC 核心分發原理。

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