本文總結 SpringMVC 中攔截器配置、處理器映射解析、多種 Controller 實現方式。
以 Bean 的 name 屬性作為 URI 直接映射:
優點:簡單直觀;缺點:URI 與類強耦合。
通過映射關係綁定 URI 與 Controller ID,降低耦合:
public class TimeInterceptor extends HandlerInterceptorAdapter {
@Override public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
System.out.println("preHandle: " + new Date()); return true;
}
@Override public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView mv) {
System.out.println("postHandle: " + new Date());
}
@Override public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) {
System.out.println("afterCompletion: " + new Date());
}
}
需重寫 handleRequestInternal,將 protected 改為 public,單動作控制器。
public class MultiController extends MultiActionController {
public ModelAndView insert(HttpServletRequest req, HttpServletResponse res) {
return new ModelAndView("insertSuccess");
}
public ModelAndView delete(HttpServletRequest req, HttpServletResponse res) {
return new ModelAndView("deleteSuccess");
}
}
配置方法名解析器:
insert delete
自動將請求參數綁定到命令對象,類似 Struts2 模型驅動:
public class DemoController extends AbstractCommandController {
public DemoController() { setCommandClass(User.class); }
@Override
protected ModelAndView handle(HttpServletRequest req, HttpServletResponse res, Object cmd, BindException errors) {
User user = (User)cmd;
System.out.println(user.getUsercode());
return new ModelAndView("test");
}
}
SpringMVC 流程控制核心:核心控制器、映射解析器、Controller、攔截器擴展。掌握大方向,細節查 API 文檔。