Spring MVC 是基於 Servlet API 的請求驅動型 Web 框架,核心是 DispatcherServlet 前端控制器模式。本文梳理核心流程與最小化配置步驟。
DispatcherServlet 接收所有匹配的 HTTP 請求<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.x</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:context="https://www.springframework.org/schema/context"
xmlns:mvc="https://www.springframework.org/schema/mvc"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
https://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 掃描 Controller -->
<context:component-scan base-package="com.example.controller" />
<!-- 啟用註解驅動:@RequestMapping, @RequestBody, @ResponseBody 等 -->
<mvc:annotation-driven />
<!-- 靜態資源映射 -->
<mvc:resources mapping="/static/**" location="/static/" />
<!-- 視圖解析器:JSP 為例 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public String detail(@PathVariable Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "user/detail"; // 邏輯視圖名 -> /WEB-INF/views/user/detail.jsp
}
@PostMapping
@ResponseBody
public Result<User> create(@RequestBody UserDTO dto) {
User user = userService.create(dto);
return Result.success(user);
}
}
RequestMappingHandlerMapping 掃描 @RequestMappingRequestMappingHandlerAdapter 支持方法參數綁定、返回值處理mvc:interceptors 配置攔截器,實現權限、日誌、國際化等橫切關注點@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
}
Spring Boot 進一步簡化為自動配置,只需 @SpringBootApplication 即可啟動,但理解原生配置有助於排查問題與定制擴展。