本示例基於Spring 3.x / 4.x,採用Java註解配置(無XML)、Maven構建、Tomcat/Jetty運行,演示Spring MVC核心流程:請求 → DispatcherServlet → Controller → Service → View → 響應。
<dependencies>
<!-- Spring MVC核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.21</version>
</dependency>
<!-- Servlet API (provided by container) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- JSP視圖渲染 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
// 替代web.xml:Servlet 3.0+ 容器自動掃描
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
// 1. 創建Spring上下文
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(AppConfig.class); // 掃描配置類
// 2. 註冊DispatcherServlet
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(ctx));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/"); // 攔截所有請求
}
}
@Configuration
@EnableWebMvc // 啟用Spring MVC預設配置(視圖解析器、靜態資源等)
@ComponentScan(basePackages = "com.example") // 掃描Controller、Service
public class AppConfig implements WebMvcConfigurer {
// 視圖解析器:JSP路徑前綴/後綴
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
// 靜態資源處理(CSS/JS/圖片)
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addHandler("/resources/**").addResourceLocations("/resources/");
}
}
public interface GreetingService {
String greet(String name);
}
@Service
public class GreetingServiceImpl implements GreetingService {
@Override
public String greet(String name) {
return "Hello, " + name + "! Welcome to Spring MVC.";
}
}
<!-- /WEB-INF/views/helloForm.jsp -->
<%@ taglib prefix="form" uri="https://www.springframework.org/tags/form" %>
<html>
<body>
<h2>Spring MVC 入門示例</h2>
<form:form modelAttribute="user" method="POST">
<form:label path="name">您的名字:</form:label>
<form:input path="name" />
<input type="submit" value="提交" />
</form:form>
</body>
</html>
<!-- /WEB-INF/views/helloResult.jsp -->
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<h2>結果頁面</h2>
<p><c:out value="${message}" /></p>
<a href="/hello">返回</a>
</body>
</html>
# Maven命令啟動內嵌Tomcat
mvn tomcat7:run
# 瀏覽器訪問
https://localhost:8080/hello
→ 顯示輸入表單
→ 輸入 "ZhangSan" 提交
→ 顯示 "Hello, ZhangSan! Welcome to Spring MVC."
GET /hello → DispatcherServlet 接收HandlerMapping 匹配 HelloController.showForm()"helloForm"ViewResolver 解析為 /WEB-INF/views/helloForm.jspPOST /hello → 匹配 submitForm()@ModelAttribute 自動綁定表單數據到 UserFormGreetingService.greet() 獲取業務結果message 轉發到 helloResult.jsp 渲染最終頁面| 錯誤現象 | 根因 | 修正 |
|---|---|---|
| 404 Not Found | DispatcherServlet映射路徑錯誤(如/app/*而非/) | 確保addMapping("/")或*.do覆蓋目標路徑 |
| 視圖解析失敗 | JSP路徑不在/WEB-INF/views/或後綴不匹配 | 檢查InternalResourceViewResolver前綴後綴 |
| 表單數據綁定為null | 表單字段名與UserForm屬性名不一致 | path="name" 對應 getName()/setName() |
| @Autowired注入失敗 | Service未掃描(包路徑錯誤)或缺少@Service | 檢查@ComponentScan基礎包、類註解 |
| JSTL標簽不生效 | 缺少jstl依賴或JSP未聲明taglib | 添加依賴、頁面頂部<%@ taglib prefix="c" ...%> |
@RestController 直接返回 JSON,配合 @RequestBody 接收 JSON。@Valid @ModelAttribute + JSR-303 註解(@NotBlank 等)。@ControllerAdvice + @ExceptionHandler。MessageSource + LocaleResolver。spring-boot-starter-web 零配置啟動,生產級監控、打包部署開箱即用。本示例通過零XML、純註解、Maven標準結構,在 50 行核心代碼內跑通 Spring MVC 完整閉環。掌握 DispatcherServlet、@Controller、@RequestMapping、ViewResolver、@Autowired 五大核心組件交互,即可舉一反三構建企業級 Web 應用。建議以此為骨架,漸進式引入校驗、異常處理、安全、緩存等橫切能力。