springmvc-demo
├── src/main/java
│ └── com.sprmvc.po
│ ├── User.java // 實體類
│ └── HelloWorldController.java
├── src/main/resources
│ └── applicationContext.xml // Spring MVC 配置
├── src/main/webapp
│ ├── WEB-INF
│ │ └── web.xml // Servlet 容器部署描述符
│ ├── index.jsp // 輸入頁
│ └── hello.jsp // 結果頁
└── pom.xml // Maven 依賴
<dependencies>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.x</version>
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</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>
<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee" version="4.0">
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> <!-- 攔截所有請求 -->
</servlet-mapping>
</web-app>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:context="https://www.springframework.org/schema/context"
xmlns:mvc="https://www.springframework.org/schema/mvc"
xsi:schemaLocation="...">
<!-- 1. 掃描控制器包 -->
<context:component-scan base-package="com.sprmvc.po" />
<!-- 2. 視圖解析器:邏輯視圖名 → 物理 JSP 路徑 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" /> <!-- 前綴 -->
<property name="suffix" value=".jsp" /> <!-- 後綴 -->
</bean>
<!-- 3. 靜態資源處理(可選) -->
<mvc:default-servlet-handler />
<mvc:annotation-driven />
</beans>
package com.sprmvc.po;
public class User {
private String userName;
private String password;
// getter/setter 省略
}
package com.sprmvc.po;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
@Controller
public class HelloWorldController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String printHelloWorld(HttpServletRequest request, User user) {
// Spring 自動將請求參數綁定到 user 對象
request.setAttribute("userName", user.getUserName());
request.setAttribute("password", user.getPassword());
return "hello"; // 邏輯視圖名 → /hello.jsp
}
}
<%@ page contentType="text/html;charset=UTF-8" %>
<html><body>
<form method="get" action="hello">
用戶名:<input type="text" name="userName"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body></html>
<%@ page contentType="text/html;charset=UTF-8" %>
<html><body>
<h1>操作成功</h1>
您的用戶名為:${userName}<br>
您的密碼為:${password}
</body></html>
tomcat7:run 或 IDE 部署)。https://localhost:8080/springmvc-demo/ → 顯示 index.jsp。/hello → Controller 處理 → 視圖解析器定位 /hello.jsp → 顯示結果。| 組件 | 作用 | 關鍵配置 |
|---|---|---|
| DispatcherServlet | 前端控制器,統一入口 | web.xml <url-pattern>/</url-pattern> |
| @Controller | 標識控制器 Bean | 掃描包 context:component-scan |
| @RequestMapping | URL 映射到方法 | value + method 限定 |
| 參數綁定 | 請求參數 → 方法參數/POJO | 名稱匹配自動賦值 |
| InternalResourceViewResolver | 邏輯視圖名 → 物理路徑 | prefix + suffix |
| Model/RequestAttribute | 數據傳遞到視圖 | request.setAttribute / ModelMap |
@RestController + @RequestBody/@ResponseBody 返回 JSON。@Valid + JSR-303 註解 + BindingResult。@ControllerAdvice + @ExceptionHandler。HandlerInterceptor 配置 mvc:interceptors。掌握上述最小化 Spring MVC 閉環,是進階學習 Spring 生態、微服務架構的紮實基石。