Struts/WebWork 等重型 MVC 框架為非本質功能引入過多複雜度。最樸素的 MVC:一個 JavaBean 實現 Controller 接口,承擔請求處理,享有 Spring IoC 注入優勢。
Spring MVC 屬靜態配置型 Front Controller:DispatcherServlet 攔截 *.do,依 XML 映射調用 Command 的 handleRequest(request, response),同時注入依賴。我們的 Controller 就是實現此方法的普通 JavaBean。
Controller 介面(單一方法),也可繼承 SimpleFormController 等豐富回調基類。public class MyController implements Controller {
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) {
// 業務邏輯
return new ModelAndView("viewName", "modelKey", modelObject);
}
}
需訪問 ServletContext 時繼承 WebApplicationObjectSupport。
反對「一個 Controller 一個 Action」(類膨脹)。採用傳統參數分派:
public class OrderController implements Controller {
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) {
String action = req.getParameter("action");
if ("list".equals(action)) return list(req);
if ("create".equals(action)) return create(req);
if ("update".equals(action)) return update(req);
throw new IllegalArgumentException("Unknown action: " + action);
}
// 各私有處理方法...
}
RoR、Groovy on Rails、Spring MultiActionController 皆採此模式。
只在「不重新編譯即需變更」時用 XML(如資料源、事務管理器);JSP 路徑、業務規則全寫在 Java 裡。
Spring DataBinder 處理巢狀物件需手動實例化。偷懶改用 Jakarta BeanUtils 自動處理 order.customer.customerNo 等巢狀綁定。
封裝 MultiAction 分派、通用輔助方法,Spring 內建 MultiActionController 參數簽名過於死板(強制前兩參數為 request/response)。
經層層化簡,Controller 變成人人可讀、可維護的純 JavaBean。技術浪潮再怎麼變,這樣的代碼永遠有人能接手。