傳統 Spring MVC Controller 單一職責導致同業務的增刪改查分散在多個類中。MultiActionController 允許在一個 Controller 類中聚合多個處理方法,類似 Struts 的 DispatchAction,減少樣板代碼。
根據 URL 路徑尾部直接匹配方法名。
<bean name="/updateUser.html" class="com.unmi.UserController"/>
<bean name="/deleteUser.html" class="com.unmi.UserController"/>
/updateUser.html → updateUser()/deleteUser.html → deleteUser()同一 Controller 需配置多個 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>
/user.html?method=updateUser → updateUser()/user.html?method=deleteUser → deleteUser()通過 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 職責重疊,配置冗余,無明顯優勢,不推薦使用。
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 綁定參數(需適配器支持)
}
(HttpServletRequest, HttpServletResponse) 或 (@RequestParam Map<String, Object> params)@Controller + @RequestMapping 註解方式,MultiActionController 已過時| 方案 | 優勢 | 適用場景 |
|---|---|---|
| @Controller + @RequestMapping | 註解驅動、RESTful、方法級映射靈活 | 所有新項目 |
| MultiActionController | 聚合同業務邏輯、減少類數量 | 維護舊項目、簡單 CRUD 聚合 |
| SimpleFormController | 表單工作流內置支持 | 複雜表單驗證流程(已棄用) |
MultiActionController 通過 MethodNameResolver 實現一個 Controller 多方法分發,ParameterMethodNameResolver 是最實用的解析器。雖然註解式開發已成主流,但理解其機制有助於維護遺留系統並領會 Spring MVC 核心分發原理。