文章目錄
- 1. SpringMVC 概述
- 2. SpringMVC 入門案例
-
- 2.1 入門案例
- 2.2 入門案例工作流程
- 3. bean 加載控制
- 4. PostMan 工具
1. SpringMVC 概述
SpringMVC 與 Servlet 功能等同,均屬于 Web 層開發技術。SpringMVC 是 Spring 架構的一部分。
對于 SpringMVC,主要學習如下内容:
- SpringMVC 簡介
- 請求與響應
- REST 風格
- SSM 整合(注解版)
- 攔截器
SpringMVC 是處于 Web 層的架構,是以其主要的作用就是用來接收前端發過來的請求和資料然後進行處理,并将處理的結果響應給前端,是以如何處理請求和響應是 SpringMVC 中非常重要的一塊内容。
REST 是一種軟體架構風格,可以降低開發的複雜性,提高系統的可伸縮性,後期的應用也是非常廣泛。
SSM 整合是把咱們所學習的 SpringMVC+Spring+Mybatis 整合在一起來完成業務開發,是對三個架構的綜合應用。
對于 SpringMVC 的學習,最終要達成的目标:
(1) 掌握基于 SpringMVC 擷取請求參數和響應 json 資料操作。
(2) 熟練應用基于 REST 風格的請求路徑設定與參數傳遞。
(3) 能夠根據實際業務建立前後端開發通信協定并進行實作。
(4) 基于 SSM 整合技術開發任意業務子產品功能。
學習 SpringMVC 前,先回顧一下現在 web 程式是如何做的。現在的 web 程式大都基于三層架構來實作:
如上圖,Web 程式通過浏覽器通路頁面,前端頁面使用異步送出的方式發送請求到後端伺服器,後端伺服器采用三層架構——表現層、業務層、資料層進行開發。頁面發送的請求由表現層接收,擷取使用者的請求參數後,将參數傳遞給業務層,再由業務層通路資料層,得到使用者需要通路的資料後,将資料傳回給表現層。表現層拿到資料後,将資料轉換成 json 格式發送給前端頁面,前端頁面接收資料後,解析資料并組織成使用者最終浏覽的頁面資訊交給浏覽器。
初學時,資料層采用的是 jdbc 技術,後來 Mybatis 架構将其取代;表現層采用的是 servlet 技術,現在将要學習的 SpringMVC 架構可以将其取代。
介紹了這麼多,對 SpringMVC 進行一個定義:
SpringMVC 是一種基于Java 實作 MVC 模型的輕量級 Web 架構。
優點:使用簡單、開發便捷(相比于Servlet);靈活性強。
2. SpringMVC 入門案例
2.1 入門案例
(1) 建立項目
建立 Maven 項目。
補全目錄結構,因為使用骨架建立的項目結構不完整,需要手動補全。
(2) 導入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>springmvc01_quickstart</name>
<groupId>com.itheima</groupId>
<artifactId>springmvc01_quickstart</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--導入springmvc與servlet的依賴-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope><!--防止與tomcat插件沖突-->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
<!--tomcat插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port><!--tomcat端口号-->
<path>/</path><!--虛拟目錄-->
</configuration>
</plugin>
</plugins>
</build>
</project>
說明:servlet 的依賴為什麼需要添加
<scope>provided</scope>
?
scope 是 maven 中 jar 包依賴作用範圍的描述,如果不設定預設是在編譯、運作、測試時均有效。
如果運作有效的話就會和 tomcat 中的 servlet-api 包發生沖突,導緻啟動報錯。
provided 代表的是該包隻在編譯和測試時用,運作時無效,直接使用 tomcat 中的,就避免了沖突。
(3) 建立 Controller 類
//使用Controller定義bean
@Controller
public class UserController {
// 目前操作的請求映射路徑:使用者發出哪個請求能調用到這個方法
@RequestMapping("/save")
// 設定目前操作的傳回值類型
// 把傳回的東西整體作為響應的内容給到外面
@ResponseBody//設定目前控制器方法響應内容為目前傳回值,無需解析
// 處理請求的方法
// 傳回值為String:執行完這個方法,要對外傳回json資料
public String save(){
System.out.println("user save ...");
return "{'module':'springmvc'}";
}
}
(4) 建立配置類
@Configuration
//加載 controller 對應的 bean
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
(5) 使用配置類替換 web.xml
将web.xml删除,換成ServletContainersInitConfig
// 定義一個servlet容器啟動的配置類
// 要繼承AbstractDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractDispatcherServletInitializer {
//加載springMVC容器的配置
//tomcat伺服器啟動時,就能加載SpringMVC配置類了
@Override
protected WebApplicationContext createServletApplicationContext() {
//加載springMVC的配置類
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//設定哪些請求由springMVC處理
@Override
protected String[] getServletMappings() {
//所有請求都由springMVC處理
return new String[]{"/"};
}
//加載spring容器配置
//現在隻用springMVC容器,是以這個方法不用管,直接傳回null
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
(6) 配置 tomcat 環境
(7) 運作項目後,用浏覽器通路
idea 控制台也列印出了:user save …
SpringMVC 入門程式開發總結(1+N):
一次性工作
- 建立工程,設定伺服器,加載工程
- 導入依賴
- 建立 web 容器啟動類,加載 SpringMVC 配置,并設定SpringMVC 請求攔截路徑
- SpringMVC 核心配置類(設定配置類,掃描 controller 包,加載 Controller 控制器 bean)
多次工作
- 定義處理請求的控制器類
- 定義處理請求的控制器方法,并配置映射路徑(@RequestMapping)與傳回 json 資料(@ResponseBody)
如:直接在 UserController 中加入如下代碼,就可以擴充功能。
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user delete ...");
return "{'module':'springmvc delete'}";
}
2.2 入門案例工作流程
3. bean 加載控制
SpringMVC 需要加載的 bean:表現層的 bean,也就是 controller 包下的。
Spring 需要加載的bean:
業務 bean(Service)
功能 bean(DataSource、SqlSessionFactoryBean、MapperScannerConfigurer 等)
分析清楚誰該管哪些 bean 以後,要解決的問題就是如何讓 Spring 和 SpringMVC 分開加載各自的 bean。
在 SpringMVC 的配置類 SpringMvcConfig 中使用注解
@ComponentScan
,隻需将掃描範圍設定到 controller,如:
之前在 Spring 的配置類 SpringConfig 中使用注解
@ComponentScan
時,掃描的範圍其實已經包含了 controller,如:
實際上,應該避免 Spring 錯誤地加載到 SpringMVC 的 bean,下面就來解決這個問題。
解決方案有三種:
① Spring 加載 bean 時,設定掃描範圍為精準範圍,例如 service 包、dao 包等(主要用這種)。
@Configuration
@ComponentScan({"com.itheima.service","comitheima.dao"})
public class SpringConfig {
}
注意:dao 包下的類的對象是使用 mybatis 自動代理的方式建立的,這個對象不是我們自己建立出來的,是以寫不寫 com.itheima.dao 都不影響對應 bean 的加載,但是寫上更好(因為不用 mybatis 自動代理時可能會需要)。
② Spring 加載 bean 時,設定掃描範圍為 com.itheima,排除掉 controller 包中的 bean。
@Configuration
//掃描com.itheima下的類,以加載bean
//按注解過濾,過濾掉帶有@Controller注解的類
@ComponentScan(value = "com.itheima",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
- excludeFilters:排除掃描路徑中加載的 bean。
- includeFilters:加載指定的 bean,在現有基礎上追加。
SpringConfig 掃描時,如果某個類上有 @Configuration 注解,那麼這個類也會被掃描,同時它裡面的 bean 也會被加載。
SpringMvcConfig 上就有一個@ComponentScan。雖然 SpringConfig 的掃描過濾掉了 controller 類,但又通過 SpringMvcConfig 把 controller 類給掃描進來了。
解決方案:把 SpringMvcConfig 移出 Spring 配置類的掃描範圍。如:可以将 SpringConfig、SpringMvcConfig 移動到 com 下。
③ 不區分 Spring 與 SpringMVC 的環境,加載到同一個環境中(了解即可)
最後一個問題,有了 Spring 的配置類,要想在 tomcat 伺服器啟動将其加載,我們需要修改 ServletContainersInitConfig。
// 定義一個servlet容器啟動的配置類
// 要繼承AbstractDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractDispatcherServletInitializer {
//加載springMVC容器的配置
//tomcat伺服器啟動時,就能加載SpringMVC配置類了
@Override
protected WebApplicationContext createServletApplicationContext() {
//加載springMVC的配置類
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//設定哪些請求由springMVC處理
@Override
protected String[] getServletMappings() {
//所有請求都由springMVC處理
return new String[]{"/"};
}
//加載spring容器配置
@Override
protected WebApplicationContext createRootApplicationContext() {
//加載spring的配置類
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
}
對于上述的配置方式,Spring 還提供了一種更簡單的配置方式,可以不用再去建立
AnnotationConfigWebApplicationContext 對象,不用手動register 對應的配置類,如何實作?
// 定義一個servlet容器啟動的配置類
// 要繼承AbstractAnnotationConfigDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
//加載Spring配置類
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
//加載SpringMVC配置類
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
//設定哪些請求由springMVC處理
@Override
protected String[] getServletMappings() {
//所有請求都由springMVC處理
return new String[]{"/"};
}
}
4. PostMan 工具
代碼編寫完後要想測試,隻需要打開浏覽器直接輸入位址發送請求即可。發送的是 GET 請求可以直接使用浏覽器,但是如果要發送的是 POST 請求呢?
如果要求發送的是 POST 請求,就得準備頁面,并在頁面上準備 form 表單,測試起來比較麻煩。是以就需要借助一些第三方工具,如 PostMan。
PostMan 是一款網頁調試與發送網頁 HTTP 請求的 Chrome 插件,常用于進行接口測試。
(1) 建立 WorkSpace 工作空間
(2) 工作空間的名稱
(3) 選擇請求方式
(4) 發送請求(相當于在浏覽器發送請求)
資料效果:
頁面效果:
(5) 同樣地,可以向百度發請求:
(6) 儲存目前請求(ctrl+s後)
注意:第一次請求需要建立一個新的目錄,後面就不需要建立新目錄,直接儲存到已經建立好的目錄即可。
對于 PostMan 如果覺得字小不好看,可以使用 ctrl+“=” 調大,ctrl+“-” 調小。