簡介
SpringMVC
是一種基于Java
實現(xiàn)MVC
模型的輕量級Web
框架。
具有如下優(yōu)點:
- 使用簡單,開發(fā)便捷(相比于
Servlet
)。 - 靈活性強。
SpringMVC
是一種標簽層框架技術。
SpringMVC
是用于進行表現(xiàn)層功能開發(fā)。
快速入門
1. 快速實現(xiàn)
1.1 導入SpringMVC坐標與Servlet坐標
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.20.RELEASE</version>
</dependency>
需要注意的是spring-webmvc
版本5.2.20.RELEASE
對應的jdk
不能太高,1.8
版本的jdk
即可,我試了16
是不匹配的,會出問題。
1.2 創(chuàng)建SpringMVC控制器類(等同于Servlet功能)
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save() {
System.out.println("springmvc save ...");
return "{'module':'springmvc save'}";
}
}
1.3 初始化SpringMVC環(huán)境(同Spring環(huán)境),設定SpringMVC加載對應的bean
@Configuration
@ComponentScan({"com.hao.controller"})
public class SpringMVCConfig {
}
1.4 初始化SpringMVC容器,加載SpringMVC環(huán)境,并設置SpringMVC技術處理的請求
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
// 加載springmvc容器配置
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMVCConfig.class);
return ctx;
}
// 設置哪些請求歸屬springmvc處理
@Override
protected String[] getServletMappings() {
// 所有請求
return new String[]{"/"};
}
// 加載spring容器配置
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
2. 注解分析
2.1 @Controller
類型:類注解。
位置:SpringMVC
控制器類定義上方。
作用:設定SpringMVC
的核心控制器bean
。
例如:
@Controller
public class UserController {
}
2.2 @RequestMapping
類型:方法注解。
位置:SpringMVC
控制器方法定義上方。
作用:設置當前控制器方法請求訪問路徑。
例如:
@RequestMapping("/save")
public void save() {
System.out.println("springmvc save ...");
}
相關屬性:
value
(默認):請求訪問路徑。
2.3 @ResponseBody
類型:方法注解。
位置:SpringMVC
控制器方法定義上方。
作用:設置當前控制器方法響應內容為當前返回值,無需解析。
例如:
@RequestMapping("/save")
@ResponseBody
public String save() {
System.out.println("springmvc save ...");
return "{'module':'springmvc save'}";
}
3. 1+N 特點
3.1 一次性工作
- 創(chuàng)建工程,設置服務器,加載工程。
- 導入坐標。
- 創(chuàng)建
web
容器啟動類,加載SpringMVC
配置,并設置SpringMVC
請求攔截路徑。 -
SpringMVC
核心配置類(設置配置類,掃描controller
包,加載Controller
控制器bean
)。
3.2 多次工作
- 定義處理請求的控制器類。
- 定義處理請求的控制器方法,并配置映射路徑(
@RequestMapping
)與返回json
數(shù)據(jù)(@ResponseBody
)。
4. Servlet容器啟動的配置類解析
AbstractDispatcherServletInitializer
類是SpringMVC
提供的快速初始化Web3.0
容器的抽象類。
AbstractDispatcherServletInitializer
提供了三個接口方法供用戶實現(xiàn)。
4.1 createServletApplicationContext()方法
該方法是創(chuàng)建Servlet
容器時,加載SpringMVC
對應的bean
并放入WebApplicationContext
對象范圍中,而WebApplicationContext
的作用范圍為ServletContext
范圍,即整個web
容器范圍。
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMVCConfig.class);
return ctx;
}
4.2 getServletMappings()方法
該方法是設定SpringMVC
對應的請求映射路徑,設置為/
表示攔截所有請求,任意請求都將轉入到SpringMVC
進行處理。
protected String[] getServletMappings() {
return new String[]{"/"};
}
4.3 createRootApplicationContext()方法
該方法是創(chuàng)建Servlet
容器時需要加載Spring
對應的bean
,使用當前方法進行,使用方式同createServletApplicationContext()
。
protected WebApplicationContext createRootApplicationContext() {
return null;
}
5. 工作流程分析
5.1 啟動服務器初始化過程
- 服務器啟動,執(zhí)行
ServletContainerInitConfig
類(自己創(chuàng)建繼承AbstractDispatcherServletInitializer
),初始化web
容器。 - 執(zhí)行
createServletApplicationContext()
方法,創(chuàng)建了WebApplicationContext
對象。 - 加載
SpringMVCConfig
。 - 執(zhí)行
@ComponentScan
加載對應的bean
。 - 加載
UserController
,每個@RequestMapping
的名稱對應一個具體的方法。 - 執(zhí)行
getServletMappings()
方法,定義所有的請求都通過SpringMVC
。
5.2 單次請求過程
- 發(fā)送請求
localhost/save
。 -
web
容器發(fā)現(xiàn)所有請求都經(jīng)過SpringMVC
,將請求交給SpringMVC
處理。 - 解析請求路徑
/save
。 - 由
/save
匹配執(zhí)行對象的方法save()
。 - 執(zhí)行
save()
。 - 檢測到有
@ResponseBody
直接將save()
方法的返回值作為響應體返回給請求方。
6. Spring和SpringMVC相關bean加載控制
SpringMVC
相關bean
主要是表現(xiàn)層bean
。
Spring
控制的bean
主要是業(yè)務bean(Service)
和功能bean(DataSource等)
。
為了開發(fā)中減少相互之間的影響,所以在相應的配置文件掃描路徑中,盡量區(qū)分開來。
SpringMVC
加載的bean
對應的包均在controller
包內,例如com.hao.controller
。
Spring
加載的bean
設定掃描范圍為精準范圍例如com.hao.service
包和com.hao.dao
包,還可以設置大范圍com.hao
,然后排除掉controller
包內的bean
,如下:
@Configuration
@ComponentScan(value = "com.hao",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
這里使用到了注解@ComponentScan
的屬性excludeFilters
來實現(xiàn)加載bean
的過濾,同時還有與之對應的屬性includeFilters
指定bean
的包含,這兩者的含義如下:
excludeFilters
:排除掃描路徑中加載的bean
,需要指定類別(type
)與具體項(classes
)。
includeFilters
:加載指定的bean
,需要指定類別(type
)與具體項(classes
)。
7. Servlet容器啟動的配置類簡化
上邊創(chuàng)建的Servlet
容器啟動的配置類ServletContainersInitConfig
是繼承自AbstractDispatcherServletInitializer
,需要實現(xiàn)三個方法來配置相應的配置,其中關于Spring
和SpringMVC
的配置還需要創(chuàng)建AnnotationConfigWebApplicationContext
對象并且注冊相關配置類,稍微有些繁瑣。SpringMVC
框架對此進行了簡化,只需要繼承自AbstractAnnotationConfigDispatcherServletInitializer
同樣實現(xiàn)三個對應方法來配置,如下:
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
總結
以上就是關于SpringMVC
快速入門詳解的全部內容。
綜上可以很直觀的看到SpringMVC
相比于Servlet
,簡化了很多的代碼量,使用起來也非常的簡單便捷,并且靈活性更強。
如果有什么問題,我們可以一起交流討論解決。
最后,希望可以幫助到有需要的碼友。