? ? ? ? 介紹了Spring MVC框架的概念、特征及核心功能,通過案例詳細介紹了Spring MVC開發所需要的開發環境以及基本的開發步驟。
一、Spring MVC框架概述
????????Spring MVC是Spring框架的一個模塊,是一個基于Java的實現了MVC設計模式的輕量級Web框架。它通過一套注解和接口,讓簡單的Java類成為處理請求的控制器,無需實現任何接口,同時支持REST風格的編程。
1. Spring MVC主要特征
-
清晰的職責分離:將控制器、模型對象、分派器以及處理程序對象的角色分開
-
靈活配置:支持基于XML和注解的配置方式
-
可重用的業務代碼:可以使用現有的業務對象作為命令或表單對象
-
可定制的綁定和驗證:支持類型轉換和驗證
-
強大的視圖技術:支持JSP、Velocity、FreeMarker等多種視圖技術
-
REST支持:原生支持REST風格的URL
-
國際化支持:內置國際化支持
-
主題支持:支持主題和外觀的更改
2.?MVC 與 Spring MVC
????????MVC 是一種廣泛適用的設計模式,而 Spring MVC 是該模式在 Java Web 開發中的一種優秀實現。Spring MVC 通過提供豐富的功能和簡化的開發方式,使開發者能更高效地構建 Web 應用程序,同時保持了 MVC 模式的核心優勢。理解二者的關系有助于在不同場景下做出更合適的技術選擇。
2.1 MVC 設計模式
1. 基本概念
MVC(Model-View-Controller)是一種軟件架構設計模式,將應用程序分為三個核心組件:
-
Model(模型):處理數據和業務邏輯
-
View(視圖):負責數據展示
-
Controller(控制器):處理用戶輸入,協調模型和視圖
2. 典型工作流程
用戶請求 → 控制器 → 調用模型 → 返回數據 → 控制器選擇視圖 → 視圖渲染 → 響應給用戶
2.2 Spring MVC 框架
1. 基本概念
Spring MVC 是基于 Java 的實現 MVC 設計模式的請求驅動型 Web 框架,屬于 Spring Framework 的一部分。
2. 核心組件
組件 | 說明 |
---|---|
DispatcherServlet | 前端控制器,接收所有請求 |
HandlerMapping | 請求到處理器的映射 |
Controller | 實際處理請求的組件 |
ModelAndView | 封裝模型和視圖信息 |
ViewResolver | 視圖解析器 |
3. 請求處理流程
1. 用戶發送請求 → DispatcherServlet
2. DispatcherServlet 查詢 HandlerMapping → 找到對應 Controller
3. Controller 調用業務邏輯 → 返回 ModelAndView
4. DispatcherServlet 查詢 ViewResolver → 解析視圖
5. 視圖渲染 → 返回響應
3.?Spring MVC 工作流程
3.1?Spring MVC 的請求執行順序
(1)用戶向服務端發送一次請求,在滿足?web.xml
?文件中前端控制器的匹配規則的前提下,這個請求在 Tomcat 的解析下,會先到前端控制器 DispatcherServlet(也叫中央控制器)。如我們發出*.action
?的請求,則只對以“.action”結尾的請求路徑進行處理。某些訪問 JSP 的頁面請求則不會被框架攔截處理。
(2)DispatcherServlet 作為框架的核心,通過處理器映射器(框架提供 SimpleUrlHandlerMapping 類,也可能是其他的映射器類),從映射文件中根據請求路徑找到對應的處理器類,并得到該類的實例對象。
(3)DispatcherServlet 通過處理器適配器(框架提供的一個類),對處理類的實例對象進行適配器處理以及參數綁定,并將請求轉移到處理類中進行業務處理。
(4)處理類通過實現框架提供的 Controller 接口,最終完成適配功能。并在這里完成具體的業務邏輯功能,將數據和視圖信息封裝到 ModelAndView 對象中,并返回給 DispatcherServlet 處理。
(5)DispatcherServlet 獲取從處理器返回的 ModelAndView 對象后,交給視圖解析器(框架中提供的功能類)解析,并顯示在相應的視圖中。
3.2 Spring MVC 框架的核心接口
(1)前端控制器(DispatcherServlet):它也稱為中央控制器,是整個請求響應的控制中心。組件的調用都由它統一調度。配置在?web.xml
?文件中,隨服務器啟動而實例化。
(2)簡單處理器映射器(SimpleUrlHandlerMapping):根據用戶訪問的 URL 映射到對應的后端處理器?Handler
,并將該處理器的實例返回給前端控制器。
(3)處理器適配器(HandlerAdapter):常用的有?SimpleControllerHandlerAdapter
,該功能組件在框架中默認運行。它用于封裝參數數據,綁定視圖等。
(4)視圖解析器(ViewResolver):常用的有?InternalResourceViewResolver
,在框架中該功能組件默認運行。它用于將?ModelAndView
?邏輯視圖解析為具體的視圖(如 JSP)。
(5)后端處理器(Handler):即由程序員編寫的處理類,對用戶具體請求進行處理,該類必須實現框架提供的?Controller
?接口,才能作為處理器完成組件功能。
(6)處理器中使用的類(ModelAndView):用于封裝數據和視圖信息,并返回給前端控制器。該類實現了對原生?Servlet
?中?Request
?對象的封裝,因此可以作為域對象封裝數據,并在視圖中用 EL 表達式取出數據。
二、案例——Spring MVC框架實現模擬登錄
案例說明:使用Spring MVC框架進行用戶登錄驗證
1.新建web項目并引入依賴?
在Idea中配置Tomcat并運行第一個servlet程序——初試Jakarta EE項目 https://blog.csdn.net/m0_74808313/article/details/142817862?sharetype=blog&shareId=142817862&sharerefer=APP&sharesource=m0_74808313&sharefrom=link
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><!-- spring基本依賴--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><version>3.0.0</version><type>maven-plugin</type></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.22.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.22.0</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.apache.maven.plugins</groupId><artifactId>maven-install-plugin</artifactId><version>3.0.1</version><type>maven-plugin</type></dependency>
2. 配置Spring MVc的前端控制器
????????Spring MVC 框架通過前端控制器對符合匹配規則的客戶端請求進行統一的攔截處理。這些匹配規則放置在 Spring MVC 的配置文件中,框架通過默認的路徑去加載這些文件。
配置文件路徑:在?Webapp/WEB-INF/web.xml
?中進行配置。
配置內容:由于 Spring MVC 框架的前端控制器是一個?Servlet
,該?Servlet
?在前面的支持 JAR 包中存在。其配置方式與?Servlet
?的配置一致,具體代碼如下。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 配置前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.action</url-pattern><!-- 截所有請求并交由DispatcherServlet處理 -->
<!-- <url-pattern>/</url-pattern>--></servlet-mapping>
</web-app>
3. 配置 Spring MVC 的核心映射文件?springmvc-servlet.xml
文件路徑:在?Webapp/WEB-INF
?目錄下新建?springmvc-servlet.xml
。文件名來源于?web.xml
?配置的前端控制器的名稱與后綴?-servlet
,前端控制器在加載過程中會自動在該路徑下尋找該映射文件。因此該文件的路徑和文件名不能隨意更改。如要更改,則需在?web.xml
?中配置前端控制器時,修改其默認的映射文件路徑和文件名,這里暫時不做講解。
配置內容如下:
(1)xml
?文件中的約束
(2)配置訪問路徑與后臺處理器之間的映射。該配置需要框架提供的映射類?SimpleUrlHandlerMapping
?來完成請求路徑的跳轉。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="org.rainpet"></context:component-scan><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${db.driver}"/><property name="url" value="${db.url}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><tx:annotation-driven transaction-manager="transactionManager"/><mvc:annotation-driven/><import resource="classpath:mybatisConfig.xml"/><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="configLocation" value="classpath:mybatisConfig.xml"/><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/><property name="configuration"><bean class="org.apache.ibatis.session.Configuration"><property name="mapUnderscoreToCamelCase" value="true"/></bean></property></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 掃描所有dao接口 --><property name="basePackage" value="org.rainpet.mapper"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!-- 配置訪問路徑與后臺處理器之間的映射 --><bean id="loginController" class="org.rainpet.LoginController"></bean><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/login.action">loginController</prop><!-- 配置了一個SimpleUrlHandlerMapping,將URL路徑/login映射到loginController,用于處理登錄請求 -->
<!-- <prop key="/login">loginController</prop>--></props></property></bean>
</beans>
4. 新建登錄頁面login.jsp和登錄成功后的頁面success,jsp
文件路徑:在?Webapp/
?目錄下新建?login.jsp、success,jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登錄</title>
</head>
<body><form action="/springMvc01/login.action" method="post">用戶名:<input type="text" name="userName"><br>密碼:<input type="password" name="password"><br><input type="submit" value="登錄"></form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登錄成功</title>
</head>
<body><h1>登錄成功</h1>${userName}
</body>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error</title>
</head>
<body><h1>error</h1>${info}
</body>
5. 新建登錄處理器LoginController.java
package org.rainpet;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {String userName = request.getParameter("userName");String password = request.getParameter("password");ModelAndView mav=new ModelAndView();if(password!=null&&password.equals("123456")){mav.addObject("userName","歡迎您:"+userName);mav.setViewName("success.jsp");}else {mav.addObject("info","用戶名或密碼錯誤");mav.setViewName("error.jsp");}return mav;}
}
7. 啟動TomCat
瀏覽器地址欄輸入http://localhost:8080/springMvc01/login.jsp,到登錄界面,實現登錄