第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

純 JAVA 搭建 Spring MVC 項(xiàng)目

1. 前言

Spring MVC 項(xiàng)目可以真正意義上實(shí)現(xiàn)零 XML 配置,注意不是不配置,而是可以不使用 XML 配置。Spring MVC 提供了大量的注解,讓 JAVA 開(kāi)發(fā)者以自己最擅長(zhǎng)的 JAVA 語(yǔ)法編寫(xiě)配置信息。

本節(jié)課程,將向大家介紹如何使用純 JAVA 的方式搭建 Spring MVC 項(xiàng)目,通過(guò)本節(jié)課程,你將學(xué)習(xí)到:

  • 了解搭建 Spring MVC 的流程。這既是本章節(jié)的難點(diǎn)也是重點(diǎn);
  • 了解純 JAVA 配置的重要注解。

2. 前期準(zhǔn)備

欲善其功,必先利其器。使用 Spring MVC 之前,準(zhǔn)備好一系列的工具軟件。

  • 操作系統(tǒng): 可以選擇 WIndowsLiunx 、MAC 。本課程選擇 WIndows 操作系統(tǒng);
  • IDE 工具: 本課程選擇 eclipse。這不是唯一、強(qiáng)制的要求,你可以選擇自己喜歡的開(kāi)發(fā)工具;
  • JAVA JDK : 這個(gè)不用多說(shuō),它是必須的。本文選擇 JDK 1.8+;
  • 服務(wù)器組件: 本文選擇 tomcat 8.X

基于 Spring MVC 的開(kāi)發(fā)本質(zhì)還是編寫(xiě) JAVA 程序,區(qū)別在于 Spring MVC 提供了更高級(jí)層面的 API 組件。所以,開(kāi)發(fā)時(shí)需要在項(xiàng)目中添加 Spring MVC 相關(guān)的 API 包。有 2 種方案可獲取這些 JAR 依賴包:

Tips: 本課程采用 Spring Framework 5.1.13 版本。

  • 使用 Maven 依賴管理功能自動(dòng)添加 Spirng MVC 項(xiàng)目所需要的依賴包。本課程使用此方案。

3. 搭建流程

3.1 新建 maven 項(xiàng)目

  1. eclipse 中新建 Maven 項(xiàng)目;

圖片描述

  1. 選擇 maven 中的 webapp 骨架模板 ,在后續(xù)的對(duì)話框中輸入項(xiàng)目名稱等信息。

圖片描述

3.2 添加依賴包

項(xiàng)目創(chuàng)建成功后,會(huì)發(fā)現(xiàn)項(xiàng)目上有紅色的錯(cuò)誤提示,這個(gè)不用緊張。因?yàn)轫?xiàng)目自動(dòng)創(chuàng)建了一個(gè) jsp 文件,而 jsp 所依賴的 servlet 包我們還沒(méi)有加進(jìn)來(lái)。

打開(kāi)項(xiàng)目中的 pom.xml 文件,在文件中添加項(xiàng)目所需要的依賴 jar 包:

  • javax.servlet-api: servlet 規(guī)范包;
  • spring-context: spring 最基礎(chǔ)、最重要的核心包。Maven 有一個(gè)依賴傳遞功能,會(huì)自動(dòng)添加 spring-context 所依賴的其它包;
  • spring-web: spring 對(duì) web 項(xiàng)目的支持包,這個(gè)不用解釋,肯定不能少;
  • spring-webmvc: 從名字上看,知道它應(yīng)該是主角,Spring MVC 核心包。

完整的依賴信息如下:

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.5</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.1.13.RELEASE</version>
		<scope>compile</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>5.1.13.RELEASE</version>
		<scope>compile</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>5.1.13.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>javax.servlet-api</artifactId>
		<version>4.0.1</version>
		<scope>provided</scope>
	</dependency>
</dependencies>

Maven 會(huì)自動(dòng)從遠(yuǎn)程倉(cāng)庫(kù)下載這些依賴包,項(xiàng)目中也可以看到下載下來(lái)的依賴包:

圖片描述

大家會(huì)看到,除了在 pom.xml 文件中指定的依賴包外,還有其它的包,這個(gè)就是 Maven 的依賴傳遞功能實(shí)現(xiàn)的。好了! 有了這些包后,就可以使用 Spring 提供的 WEB MVC API 了。

3.3 兩個(gè)上下文對(duì)象

Spring 提供了很厲害的 IOC & DI 工廠,這個(gè)工廠對(duì)象在 web 項(xiàng)目中的具體名稱叫 WebApplicationContext,也稱其為上下文對(duì)象,用來(lái)創(chuàng)建 Spring MVC 項(xiàng)目中的各色功能組件。所以,欲使用 Spring MVC,則先要想辦法創(chuàng)建上下文對(duì)象。

Spring 建議 Spring MVC 項(xiàng)目中提供 2 個(gè) WebApplicationContext 對(duì)象:

  • 一個(gè) WebApplicationContext 對(duì)象用來(lái)創(chuàng)建 Spring MVC 相關(guān)的組件,稱其為 Web 上下文對(duì)象 ;
  • 一個(gè)用來(lái)創(chuàng)建程序中其它的具體功能組件(如邏輯組件、數(shù)據(jù)層訪問(wèn)組件……),稱其為 Root (根)上下文對(duì)象 。

圖片描述

兩個(gè)上下文對(duì)象各自負(fù)責(zé)的組件范圍

如果只創(chuàng)建一個(gè) WebApplicationContext 對(duì)象會(huì)產(chǎn)生什么結(jié)果?

如果僅僅是測(cè)試、學(xué)習(xí),從初期來(lái)看,沒(méi)有什么不可。從長(zhǎng)遠(yuǎn)來(lái)看,建議還是聽(tīng)從建議。

Tips: 這兩個(gè) WebApplicationContext對(duì)象存在底層上的差異性。一個(gè)支持事務(wù),另一個(gè)不支持。有各自的職責(zé)。

Spring MVC 提供了一個(gè)叫 DispatcherServlet 的組件(本質(zhì)就是一個(gè) Servlet),此組件用來(lái)作為進(jìn)入程序的唯一入口。是 Spring MVC 項(xiàng)目的“門(mén)神”。

Tips: 可稱 DispatcherServlet 為中央控制器或前端控制器。

好了!現(xiàn)在理一下頭緒:

  • 一定要在整個(gè)項(xiàng)目運(yùn)作之前先讓 DispatcherServlet 組件開(kāi)始工作,DispatcherServlet 除了充當(dāng)門(mén)神外,還會(huì)創(chuàng)建一個(gè)與自己有關(guān)聯(lián)的 WebApplicationContext 工廠對(duì)象,即 Web 上下文對(duì)象;
  • Spring 另提供有名為 ContextLoaderListener 的監(jiān)聽(tīng)器組件,它可以監(jiān)聽(tīng)程序的啟動(dòng)過(guò)程,并在程序啟動(dòng)時(shí)創(chuàng)建另一個(gè) WebApplicationContext 工廠對(duì)象,即 Root 上下文對(duì)象。

3.4 編寫(xiě)配置類

下面,使用純 JAVA 方式為 Spring MVC 的初次運(yùn)行提供必備的配置信息 。

先認(rèn)識(shí)一個(gè)組件,做好思想準(zhǔn)備,這個(gè)組件名字很長(zhǎng),別嚇到你了:AbstractAnnotationConfigDispatcherServletInitializer。名字雖然有點(diǎn)長(zhǎng),但是很體貼,怕你不知道它的作用,名字本身就告訴了你:基于注解的初始化 DispatcherServlet 的抽象組件,簡(jiǎn)單說(shuō)就是一個(gè) WEB 初始化組件,用來(lái)替代 web.xml 的功能。

該動(dòng)手了!構(gòu)建一個(gè)繼承了AbstractAnnotationConfigDispatcherServletInitializer 的類:

package com.mk.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
	@Override
	protected Class<?>[] getRootConfigClasses() {	
		return null;
	}
	@Override
	protected Class<?>[] getServletConfigClasses() {
		return null;
	}
	@Override
	protected String[] getServletMappings() {
		return null;
	}
}

嘿!居然有 3 個(gè)方法強(qiáng)制性要求實(shí)現(xiàn),那么,這 3 個(gè)方法分別是干嘛用的?

WebInitializer 這個(gè)類會(huì)自動(dòng)創(chuàng)建 Spring MVCDispatcherServlet 核心組件,并且創(chuàng)建 2 個(gè) WebApplication 上下文對(duì)象。

Spring 不能白學(xué),是吧,工廠再厲害,你也得告訴它你要?jiǎng)?chuàng)建什么吧。大家還記得這些信息你原來(lái)是放在哪里的嗎?

想起來(lái)了吧,你是放在 XML 文件中的,本文則是放在 JAVA 類中。所以這 3 個(gè)方法中有 2 個(gè)方法是用來(lái)指定這 2 個(gè)上下文對(duì)象分別對(duì)應(yīng)的配置類是誰(shuí)。

知道原因了,立馬準(zhǔn)備好 2 個(gè)配置類。

//web 上下文對(duì)象的配置類
@Configuration
@ComponentScan(basePackages = { "com.mk.web" }, excludeFilters = {
		@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) })
public class RootConfig {
}
// Root 上下文對(duì)象的配置類
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.mk.web.action" })
public class WebConfig {

}

這里有 3 個(gè)注解需要說(shuō)明 一下:

  • @Configuration 注解:說(shuō)明這個(gè)類是配置類;

Tips: 配置類用來(lái)替代 XML 配置文件。

  • @EnableWebMvc 注解: 很好理解,啟動(dòng) Spring MVC 相關(guān)功能;

  • @ComponentScan 注解: 指定上下文對(duì)象各自負(fù)責(zé)的組件所在包。

Tips: Root 配置類中需要排除 Web 配置類負(fù)責(zé)的區(qū)域。

在重新完善 WebInitializer 類之前,說(shuō)明一下,另一個(gè)方法是用來(lái)指定前端控制器可以響應(yīng)的請(qǐng)求地址。OK!讓我們?cè)賮?lái)看看這 3 個(gè)方法本來(lái)應(yīng)該的樣子:

@Override
protected Class<?>[] getRootConfigClasses() {	
	return new Class[] { RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebConfig.class};
}
//接受所有請(qǐng)求
@Override
protected String[] getServletMappings() {
	return new String[] {"/"};
}

3.3 項(xiàng)目測(cè)試

經(jīng)過(guò)這一番折騰后,Spring MVC 項(xiàng)目的基礎(chǔ)架構(gòu)就完成了,把項(xiàng)目部署到服務(wù)器(tomcat)中。查看 tomcat 啟動(dòng)時(shí)的輸出日志中是否存在下面的信息。如果存在,表示 Spring MVC 項(xiàng)目初始化成功。

圖片描述

在瀏覽器的地址欄中輸入:http://localhost:8888/sm-demo/

Tips: 我的端口號(hào)是 8888。

如果瀏覽器中輸出 Hello World ,恭喜,咱們?nèi)〉昧耸褂?Spring MVC 第一階段的成功。

4.視頻演示

5. 小結(jié)

本節(jié)課程和大家一起聊了聊如何使用純 JAVA 的方式搭建 Spring MVC 項(xiàng)目 。

通過(guò)本章節(jié)的學(xué)習(xí),大家一定要記住 DispatcherServlet 這個(gè)核心組件,并要理解 Spring MVC 項(xiàng)目中為什么需要 2 個(gè) WebApplicationContext 一起工作的。并深深地記住 JAVA 配置相關(guān)的幾個(gè)注解。