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

Spring 2.5 註解驅動 Spring MVC 完整指南:告別 XML 配置

     編輯:Java 相關知識

Spring 2.5 為 Spring MVC 引入註解驅動模型,Controller 無需實作介面、無需 XML 定義 URL 映射,純 POJO + 註解即可完整表達 Web 層邏輯。核心註解 @Controller、@RequestMapping、@RequestParam、@ModelAttribute、@SessionAttributes、@InitBinder 涵蓋請求映射、參數綁定、模型管理、視圖解析全流程。

最簡 Controller 範例

@Controller
@RequestMapping("/forum.do")
public class BbtForumController {

    @Autowired
    private BbtForumService bbtForumService;

    @RequestMapping  // 處理 /forum.do
    public String listAllBoard() {
        bbtForumService.getAllBoard();
        return "listBoard";  // 邏輯視圖名
    }
}

Spring MVC 配置啟用註解支援

<beans ... xmlns:context="..." xmlns:p="...">
    <!-- 1. 掃描 Controller,隱式註冊 AutowiredAnnotationBeanPostProcessor 等 -->
    <context:component-scan base-package="com.baobaotao.web"/>
    
    <!-- 2. 關鍵:註解處理器適配器,解析 @RequestMapping 等 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    
    <!-- 3. 視圖解析器:邏輯視圖名 → 物理 JSP 路徑 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
</beans>

@RequestMapping 進階映射策略

單 Controller 多 URL (替代 MultiActionController)

@Controller
public class BbtForumController {
    
    @RequestMapping("/listAllBoard.do")
    public String listAllBoard() { return "listBoard"; }
    
    @RequestMapping("/listBoardTopic.do")
    public String listBoardTopic(int topicId) { return "listTopic"; }
}

參數化分流 (單 URL + method 參數)

@Controller
@RequestMapping("/bbtForum.do")
public class BbtForumController {
    
    @RequestMapping(params = "method=listAllBoard")
    public String listAllBoard() { return "listBoard"; }
    
    @RequestMapping(params = "method=listBoardTopic")
    public String listBoardTopic(int topicId) { return "listTopic"; }
}

HTTP 方法限制

@RequestMapping(params = "method=createTopic", method = RequestMethod.POST)
public String createTopic() { return "createTopic"; }  // 僅 POST 生效

方法參數綁定規則詳解

參數類型綁定規則備註
基本類型 / String按參數名匹配 URL 參數,自動類型轉換基本類型缺參數拋 TypeMismatchException
JavaBean (Command/Form Object)屬性名匹配 URL 參數,支援巢狀屬性 dept.deptId缺參數基本類型屬性預設值 (0/false)
@RequestParam("xxx")強制指定 URL 參數名,可設 required=false改變預設匹配行為
Servlet API 對象HttpServletRequest, HttpServletResponse, HttpSession自動注入當前請求/響應/會話
ModelMap / Map綁定隱含模型對象,向視圖傳遞數據model.addAttribute("key", val)
@ModelAttribute("xxx")從模型/Session 獲取屬性綁定參數配合 @SessionAttributes 跨請求共享
Errors / BindingResult驗證結果對象,必須緊跟 Command Object 後表單驗證必備
SessionStatus控制 Session 屬性清理,status.setComplete()表單完成清理 @SessionAttributes

參數綁定範例

// URL: /bbtForum.do?method=listBoardTopic&id=1&userId=10&userName=tom&dept.deptId=12
@RequestMapping(params = "method=listBoardTopic")
public String listBoardTopic(
    @RequestParam("id") int topicId,  // 綁定 id 參數
    User user,                         // 綁定 userId、userName、dept.deptId
    ModelMap model) {                  // 注入模型對象
    model.addAttribute("currUser", user);
    return "listTopic";
}

模型屬性與 Session 管理

@SessionAttributes - 跨請求共享模型屬性

進階用法:@SessionAttributes(types=User.class)、@SessionAttributes(value={"a","b"}, types={User.class, Dept.class})

返回值類型靈活支援

返回類型視圖解析規則模型處理
void邏輯視圖名 = 請求 URL 路徑 (去除副檔名)無
String返回值即邏輯視圖名透過 ModelMap 參數控制
ModelMap邏輯視圖名 = 請求 URL 路徑返回的 ModelMap 為模型
ModelAndView完全控制視圖與模型傳統方式,兼容性最好

@InitBinder - 客製化屬性編輯器

全域配置 (AnnotationMethodHandlerAdapter)

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="com.baobaotao.web.MyBindingInitializer"/>
    </property>
</bean>
public class MyBindingInitializer implements WebBindingInitializer {
    public void initBinder(WebDataBinder binder, WebRequest request) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        df.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(df, false));
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
    }
}

Controller 級配置

@Controller
public class MyFormController {
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        df.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(df, false));
    }
}

@ModelAttribute - 請求前數據預備

@Controller
@RequestMapping("/bbtForum.do")
public class BbtForumController {
    
    @ModelAttribute("items")  // 每次請求前執行,返回值放入模型 key="items"
    public List<String> populateItems() {
        List<String> list = new ArrayList<String>();
        list.add("item1"); list.add("item2");
        return list;
    }
    
    @RequestMapping(params = "method=listAllBoard")
    public String listAllBoard(ModelMap model) {
        // 直接訪問 model.get("items") → size=2
        return "listBoard";
    }
}

註解 vs XML 配置權衡

⚠ 註解配置的不足

  • 參數化分流需每個方法加 @RequestMapping(params="method=xxx"),XML 僅需一個 ParameterMethodNameResolver
  • 全域異常處理、攔截器配置仍需 XML
  • 複雜 URL 映射模式 (Ant 路徑、正則) XML 表達力更強

✅ 註解配置優勢

  • Controller 為純 POJO,易測試、可復用
  • 請求映射與處理邏輯共存,閱讀即時理解
  • 參數綁定類型安全,IDE 重構支援完善
  • 視圖名解耦 URL,重構不破壞映射

最佳實踐建議

  1. REST 風格映射:@RequestMapping(value="/users/{id}", method=RequestMethod.GET) + @PathVariable (Spring 3.0+)
  2. 表單處理模式:GET 顯示表單 → POST 提交驗證 → 成功 redirect、失敗回顯
  3. 統一異常處理:@ExceptionHandler (Spring 3.0+) 或 XML HandlerExceptionResolver
  4. 資料綁定白名單:@InitBinder 設定 setAllowedFields 防止大量賦值攻擊
  5. 混合配置:基礎設施 (視圖解析器、攔截器、異常解析器) 用 XML,Controller 邏輯用註解

Spring MVC 註解驅動模型是 Web 框架設計的里程碑,將「配置」內化為「代碼意圖」,讓開發者專注於業務邏輯而非 XML 角力。配合 Spring 3.0+ 的 @PathVariable、@ExceptionHandler、@CookieValue、@RequestHeader 等增強,構建現代化 Web 應用更加得心應手。

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