SpringMVC介紹
MVC模型
MVC全稱Model View Controller,是一種設計創建Web應用程序的模式。這三個單詞分別代表Web應用程序的三個部分:
-
Model(模型):指數據模型。用于存儲數據以及處理用戶請求的業務邏輯。在Web應用中,JavaBean對象,業務模型等都屬于Model。
-
View(視圖):用于展示模型中的數據的,一般為jsp或html文件。
-
Controller(控制器):是應用程序中處理用戶交互的部分。接受視圖提出的請求,將數據交給模型處理,并將處理后的結果交給視圖顯示。
SpringMVC
SpringMVC是一個基于MVC模式的輕量級Web框架,是Spring框架的一個模塊,和Spring可以直接整合使用,我們使用的版本是Spring6,所以JDK需要17以上。SpringMVC代替了Servlet技術,它通過一套注解,讓一個簡單的Java類成為處理請求的控制器,而無須實現任何接口。
實時效果反饋
1. 在MVC模型中,Controller指的是
A 數據模型
B 展示數據的視圖
C 應用程序中處理用戶交互的部分
D 以上說法都不對
2. SpringMVC框架可以讓一個簡單JAVA類成為
A 控制器
B 視圖
C 模型
D 以上均可以
答案
1=>C 2=>A
SpringMVC入門案例
接下來我們編寫一個SpringMVC的入門案例
-
使用maven創建web項目,補齊包結構。
-
引入相關依賴
<dependencies><!-- Spring核心依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.11</version></dependency><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>6.0.11</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.11</version></dependency><!-- Servlet --><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope></dependency><!-- JSP --><dependency><groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api</artifactId><version>3.0.0</version><scope>provided</scope></dependency> </dependencies>
-
在web.xml中配置前端控制器DispatcherServlet。
<web-app><display-name>Archetype Created Web Application</display-name><!--SpringMVC前端控制器,本質是一個Servlet,接收所有請求,在容器啟動時就會加載--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping> </web-app>
-
編寫SpringMVC核心配置文件springmvc.xml,該文件和Spring配置文件寫法一樣。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.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="com.itbaizhan"/><!-- 開啟SpringMVC注解的支持 --><mvc:annotation-driven/></beans>
-
編寫控制器
@Controller public class MyController1 {// 該方法的訪問路徑是/c1/hello1@RequestMapping("/c1/hello1")public void helloMVC(){System.out.println("hello SpringMVC!");} }
-
配置tomcat10啟動項目,訪問 http://localhost:8080/c1/hello1
實時效果反饋
1. 使用SpringMVC必須要配置的是
A 監聽器
B IOC容器
C 前端控制器
D 編碼過濾器
答案
1=>C
SpringMVC執行流程
SpringMVC的組件
- DispatcherServlet:前端控制器,接受所有請求,調用其他組件。
- HandlerMapping:處理器映射器,根據配置找到方法的執行鏈。
- HandlerAdapter:處理器適配器,根據方法類型找到對應的處理器。
- ViewResolver:視圖解析器,找到指定視圖。
組件的工作流程
- 客戶端將請求發送給前端控制器。
- 前端控制器將請求發送給處理器映射器,處理器映射器根據路徑找到方法的執行鏈,返回給前端控制器。
- 前端控制器將方法的執行鏈發送給處理器適配器,處理器適配器根據方法類型找到對應的處理器。
- 處理器執行方法,將結果返回給前端控制器。
- 前端控制器將結果發送給視圖解析器,視圖解析器找到視圖文件位置。
- 視圖渲染數據并將結果顯示到客戶端。
實時效果反饋
1. 在SpringMVC中,通過組件找到指定視圖
A 前端控制器
B 處理器映射器
C 處理器適配器
D 視圖解析器
2. 在SpringMVC中,通過組件接受所有請求,調用其他組件
A 前端控制器
B 處理器映射器
C 處理器適配器
D 視圖解析器
答案
1=>D 2=>A
SpringMVC封裝參數_簡單數據類型
在Servlet中我們通過request.getParameter(name)
獲取請求參數。該方式存在兩個問題:
- 請求參數較多時會出現代碼冗余。
- 與容器緊耦合。
而SpringMVC支持參數注入的方式用于獲取請求數據,即將請求參數直接封裝到方法的參數當中。用法如下:
-
編寫控制器方法
// 封裝為簡單數據類型類型參數@RequestMapping("/c1/param1")public void simpleParam(String username,int age){System.out.println(username);System.out.println(age);} -
訪問該方法時,請求參數名和方法參數名相同,即可完成自動封裝。
http://localhost:8080/c1/param1?username=bz&age=10
實時效果反饋
1. 在SpringMVC中,接受簡單類型參數時,請求參數名和相同即可自動封裝
A 類名
B 屬性名
C 方法名
D 方法參數名
答案
1=>D
SpringMVC封裝參數_簡單對象
SpringMVC支持將參數直接封裝為對象,寫法如下:
-
編寫實體類
public class Student {private int id;private String name;private String sex;// 省略getter/setter/tostring }
-
編寫控制器方法
// 封裝為簡單對象類型參數 @RequestMapping("/c1/param2") public void objParam(Student student){System.out.println(student); }
-
訪問該方法時,請求參數名和對象參數的屬性名相同,即可完成自動封裝。
http://localhost:8080/c1/param2?id=1&name=bz&sex=female
SpringMVC封裝參數_關聯對象
SpringMVC還可以將請求參數封裝為關聯對象,即對象的屬性也是一個對象。寫法如下:
-
編寫實體類
public class Student {private int id;private String name;private String sex;private Address address; // 地址對象// 省略getter/setter/tostring }public class Address {private String info; //地址信息private String postcode; //郵編// 省略getter/setter/tostring }
-
編寫控制器方法
// 獲取關聯對象類型參數 @RequestMapping("/c1/param3") public void objParam2(Student student){ System.out.println(student); }
-
訪問該方法時,請求參數名和方法參數的屬性名相同,即可完成自動封裝。
http://localhost:8080/c1/param3?id=1&name=bz&sex=female&address.info=beijing&address.postcode=030000
我們也可以使用表單發送帶有參數的請求:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html><head><title>表單提交</title></head><body><form action="/c1/param3" method="post">id:<input name="id">姓名:<input name="name">性別:<input name="sex">住址:<input name="address.info">郵編:<input name="address.postcode"><input type="submit"></form></body> </html>
實時效果反饋
1. 在SpringMVC中,接受對象類型參數時,請求參數名和相同即可自動封裝
A 方法參數名
B 方法對象參數的屬性名
C 方法名
D 類名
答案
1=>B
SpringMVC封裝參數_List集合
SpringMVC支持將請求參數封裝為List或Map集合,寫法如下:
封裝為簡單數據類型集合
-
編寫控制器方法(封裝為簡單數據類型集合的話,參數前必須添加@RequestParam注解)
// 封裝為簡單數據類型集合,參數前必須添加@RequestParam注解 @RequestMapping("/c1/param4") public void listParam(@RequestParam List<String> users){ System.out.println(users); }
該方式也可以封裝為簡單數據類型數組:
@RequestMapping("/c1/param5") public void listParam2(@RequestParam String[] users){ System.out.println(users[0]); System.out.println(users[1]); }
-
請求的參數寫法
http://localhost:8080/c1/param4?users=bj&users=sxt
封裝為對象類型集合
SpringMVC不支持將請求參數封裝為對象類型的List集合,但可以封裝到有List屬性的對象中。
-
編寫實體類
public class AddressList {private List<Address> address; // 地址集合// 省略getter/setter/tostring }
-
編寫控制器方法
// 對象中包含集合屬性 @RequestMapping("/c1/param6") public void listParam3(AddressList addressList){System.out.println(addressList); }
-
請求的參數寫法
http://localhost:8080/c1/param6?address[0].info=bj&address[0].postcode=100010&address[1].info=sh&address[1].postcode=100011
新版Tomcat中,URL中的方括號必須編碼,
[
使用%5B
代替,]
使用%5D
代替,所以URL的路徑寫法如下:http://localhost:8080/c1/param6?address%5B0%5D.info=bj&address%5B0%5D.postcode=100010&address%5B1%5D.info=sh&address%5B1%5D.postcode=100011
實時效果反饋
1. 在SpringMVC中,接受簡單數據類型List參數,必須在方法參數前加
A @RequestParam
B @Param
C @Value
D @List
2. SpringMVC不支持封裝對象類型的List參數,但可以封裝
A 包含List的數組
B 包含List的Map集合
C 包含List的Collection集合
D 有List屬性的對象
答案
1=>A 2=>D
SpringMVC封裝參數_Map集合
同樣,SpringMVC要想把參數封裝到Map集合中,需要封裝到有Map屬性的對象中。
-
編寫實體類
public class AddressMap {private Map<String,Address> address;// 省略getter/setter/tostring }
-
編寫控制器方法
// 對象中包含map屬性 @RequestMapping("/c1/param7") public void mapParam3(AddressMap addressMap){System.out.println(addressMap.getAddress()); }