<!-- 僅掃描 Controller 註解 -->
<context:component-scan base-package="com.cjw.test.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 缺少這行! -->
<!-- <mvc:annotation-driven/> -->
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.cjw.test.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 關鍵:啟用 @RequestMapping、@RequestBody、@ResponseBody 等註解處理器 -->
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
| 組件 | 作用 | 缺失後果 |
|---|---|---|
context:component-scan | 將 `@Controller` 類實例化為 Bean,註冊到 IOC 容器 | Bean 不存在,自然無法映射 |
mvc:annotation-driven | 註冊 RequestMappingHandlerMapping、RequestMappingHandlerAdapter、ExceptionHandlerExceptionResolver 等核心 MVC 基礎設施 | **雖然 Bean 存在,但無 HandlerMapping 識別 @RequestMapping,DispatcherServlet 找不到處理器,拋給 DefaultServletHttpRequestHandler → 404** |
mvc:default-servlet-handler | 讓容器默認 Servlet 處理靜態資源、無映射路徑 | 靜態資源 404 |
關鍵認知:`component-scan` 只負責「造 Bean」,`mvc:annotation-driven` 負責「讓 Bean 能被 MVC 機制識別並調用」。**二者缺一不可**。
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Spring MVC 404 且無報錯,**首查 `