目錄
1. Spring MVC 概述
2. Spring MVC 項目搭建
3. Spring MVC 執行流程
4. Spring MVC @RequestMapping 注解
5. Spring MVC 獲取請求參數
6. Spring MVC 常見注解
7. Spring MVC 響應處理
8. Spring MVC SSM 整合
9. Spring MVC 作用域傳參
10. Spring MVC 上傳
11. Spring MVC 下載
12. Spring MVC 攔截器
13. Spring MVC 異常處理
14. Spring MVC 其他注解
總結
前言
在 Java Web 開發領域,Spring MVC 框架無疑是眾多開發者的選擇之一。它基于 Spring 框架,提供了強大的 MVC 架構支持,幫助開發者構建高性能、可維護的 Web 應用程序。本文將按照清晰的目錄結構,帶你深入了解 Spring MVC 的核心概念、功能特性以及實戰應用。
1. Spring MVC 概述
Spring MVC 是 Spring 框架的一部分,專門用于構建 Web 應用程序。它遵循 MVC(Model-View-Controller)設計模式,將應用程序分為模型、視圖和控制器三個部分,從而實現代碼的高內聚和低耦合。
2. Spring MVC 項目搭建
搭建一個 Spring MVC 項目需要以下步驟:
-
創建 Maven 項目 :在 IDE 中創建一個新的 Maven 項目,并添加 Spring MVC 的依賴。
xml
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.10</version>
</dependency>
-
配置前端控制器 :在
web.xml
文件中配置DispatcherServlet
,作為前端控制器。
xml
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
-
配置視圖解析器 :在 Spring 配置文件中配置視圖解析器,指定視圖文件的前綴和后綴。
xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/>
</bean>
3. Spring MVC 執行流程
Spring MVC 的執行流程如下:
-
用戶發送請求 :用戶通過瀏覽器發送 HTTP 請求到服務器。
-
前端控制器接收請求 :
DispatcherServlet
接收到請求,并將其分發到合適的處理器。 -
處理器映射器查找處理器 :
HandlerMapping
查找與請求匹配的處理器(Controller)。 -
處理器適配器調用處理器 :
HandlerAdapter
調用處理器方法,并返回ModelAndView
對象。 -
視圖解析器解析視圖 :
ViewResolver
將視圖名稱解析為實際的視圖對象。 -
視圖渲染 :視圖對象使用模型數據進行渲染,并將結果返回給用戶。
4. Spring MVC @RequestMapping
注解
@RequestMapping
是 Spring MVC 中最常用的注解之一,用于將請求映射到處理器方法上。以下是一個簡單的示例:
java
@Controller
public class MyController {@RequestMapping("/hello")public String hello() {return "hello";}
}
5. Spring MVC 獲取請求參數
Spring MVC 提供了多種方式獲取請求參數,包括:
-
通過方法參數獲取 :直接在方法參數中聲明需要的參數名稱。
java
@Controller
public class MyController {@RequestMapping("/greet")public String greet(@RequestParam("name") String name, Model model) {model.addAttribute("message", "Hello, " + name + "!");return "greet";}
}
-
通過
@ModelAttribute
獲取 :將請求參數綁定到 Java 對象上。
java
@Controller
public class MyController {@RequestMapping("/user")public String getUser(@ModelAttribute("user") User user, Model model) {model.addAttribute("user", user);return "userDetail";}
}
6. Spring MVC 常見注解
Spring MVC 中常用的注解包括:
-
@Controller
:標記一個類為控制器。 -
@RequestMapping
:將請求映射到處理器方法上。 -
@RequestParam
:獲取請求參數。 -
@ModelAttribute
:綁定請求參數到 Java 對象。 -
@ResponseBody
:將方法返回值直接寫入響應體。
7. Spring MVC 響應處理
Spring MVC 支持多種響應處理方式,包括:
-
返回字符串 :返回視圖名稱,由視圖解析器解析為實際視圖。
java
@Controller
public class MyController {@RequestMapping("/hello")public String hello() {return "hello";}
}
-
返回
ModelAndView
:包含模型數據和視圖信息。
java
@Controller
public class MyController {@RequestMapping("/hello")public ModelAndView hello() {ModelAndView modelAndView = new ModelAndView("hello");modelAndView.addObject("message", "Hello, Spring MVC!");return modelAndView;}
}
-
返回 JSON 數據 :通過
@ResponseBody
注解返回 JSON 數據。
java
@Controller
public class MyController {@RequestMapping("/user")@ResponseBodypublic User getUser() {User user = new User("John", 30);return user;}
}
8. Spring MVC SSM 整合
SSM(Spring + Spring MVC + MyBatis)是常見的 Java Web 開發框架組合。整合步驟如下:
-
添加依賴 :在
pom.xml
中添加 Spring、Spring MVC 和 MyBatis 的依賴。 -
配置數據源 :配置數據庫連接信息。
xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="root"/>
</bean>
-
配置事務管理器 :配置事務管理器,管理數據庫事務。
xml
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
-
配置 MyBatis :配置 MyBatis 的 SqlSessionFactory 和 Mapper。
xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
9. Spring MVC 作用域傳參
Spring MVC 支持多種作用域傳參,包括:
-
請求作用域(Request Scope) :默認作用域,參數在請求范圍內有效。
-
會話作用域(Session Scope) :參數在會話范圍內有效。
java
@Controller
public class MyController {@RequestMapping("/login")public String login(@RequestParam("username") String username, HttpSession session) {session.setAttribute("user", username);return "home";}
}
-
應用作用域(Application Scope) :參數在應用范圍內有效。
10. Spring MVC 上傳
Spring MVC 提供了簡單的文件上傳功能,通過 @RequestParam
注解獲取上傳的文件對象。
java
@Controller
public class FileController {@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) {try {file.transferTo(new File("path/to/save/" + file.getOriginalFilename()));} catch (IOException e) {e.printStackTrace();}return "uploadSuccess";}
}
11. Spring MVC 下載
Spring MVC 也支持文件下載功能,通過設置響應頭和輸出流實現。
java
@Controller
public class FileController {@GetMapping("/download")public void download(HttpServletResponse response) {File file = new File("path/to/download/file.txt");response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=file.txt");try (FileInputStream fis = new FileInputStream(file);OutputStream os = response.getOutputStream()) {byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) > 0) {os.write(buffer, 0, len);}} catch (IOException e) {e.printStackTrace();}}
}
12. Spring MVC 攔截器
Spring MVC 支持攔截器,用于在請求處理的不同階段執行特定邏輯。以下是一個簡單的攔截器示例:
java
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Pre Handle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Post Handle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("After Completion");}
}
注冊攔截器:
xml
<bean class="org.springframework.web.servlet.HandlerInterceptorAdapter"><property name="interceptors"><list><ref bean="myInterceptor"/></list></property>
</bean>
13. Spring MVC 異常處理
Spring MVC 提供了全局異常處理器,通過 @ControllerAdvice
注解實現。
java
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception e) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("message", e.getMessage());return modelAndView;}
}
14. Spring MVC 其他注解
Spring MVC 還提供了其他一些有用的注解,如:
-
@InitBinder
:用于初始化數據綁定。
java
@Controller
public class MyController {@InitBinderpublic void initBinder(WebDataBinder binder) {binder.setFieldDefaultPrefix("user.");}
}
-
@SessionAttributes
:用于將模型屬性添加到會話中。
java
@Controller
@SessionAttributes("user")
public class MyController {// ...
}
總結
Spring MVC 作為 Spring 框架的重要組成部分,提供了強大的 Web 開發能力。通過學習 Spring MVC 的核心概念和功能特性,結合實戰應用,可以快速構建高性能、可維護的 Web 應用程序。希望本文能夠幫助你深入理解 Spring MVC 的精髓,為你的開發工作提供有力支持。如果你有任何問題或建議,歡迎在評論區留言,我們一起交流學習!