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

Spring MVC 核心組件(上)

1. 前言

本節(jié)課將和大家一起聊聊 Spring MVC 中的幾大核心組件,通過對這些組件的了解,你將對 Spring MVC 的工作機(jī)制有更深入的理解,能更容易地編寫 Spring MVC 項(xiàng)目,也能輕松地解決程序運(yùn)行過程的問題。

本節(jié)課程,你將學(xué)習(xí)到:

  • Spring MVC 的核心組件及其功能。對核心組件功能的理解將是本節(jié)的重點(diǎn);
  • Spring MVC 核心組件的配置。

本章節(jié)難點(diǎn)在于理解組件之間的依賴關(guān)系。

Tips: 本主題內(nèi)容分上、下兩個(gè)章節(jié)講解。

2. 組件概述

現(xiàn)代企業(yè)項(xiàng)目,都是基于模塊或組件開發(fā)。Spring MVC 項(xiàng)目也是嚴(yán)格遵循這種約定和規(guī)范。WEB 應(yīng)用程序的交互模式是基于請求與響應(yīng)的。在請求、響應(yīng)過程中,Spring MVC 不是一個(gè)人在戰(zhàn)斗,而是提供了眾多的組件一起協(xié)調(diào)工作。

先請出 Spring MVC 中的 5 大核心組件,并用一句話概括其功能?;靷€(gè)眼熟,具體功能描述及使用方式在后面慢慢展開。

  • 前端控制器: 類似于超市的入口;
  • 用戶控制器: 類似于不同類型的貨品架,為用戶提供具體的商品買賣;
  • 映射器: 類似于超市里的導(dǎo)購員。請問,我要的這個(gè)牌子的辣椒醬在哪里,哦,在這里;
  • 適配器: 統(tǒng)一控制器,讓其有一致對外的接口;
  • 視圖解析器: 找到視圖,并負(fù)責(zé)渲染視圖。

除了這幾大核心組件,還有其它的諸多輔助性組件,當(dāng)使用到時(shí)再逐一介紹。

3. 前端控制器

深入了解前端控制器之前,先拋出一個(gè)問題:控制器是什么?

別被控制器這個(gè)名字嚇住。其實(shí)和原生 Servlet 開發(fā)中開發(fā)者自定義的 Servlet 的功能是一樣的。當(dāng)然,因?yàn)橛?Spring 的加持,使用起來,是非常之輕量級的。

Spring MVC 中的控制器有 2 類:

  • 中央控制器,或叫前端控制器:Spring MVC 框架提供,對所有請求進(jìn)行分流;
  • 用戶控制器,或叫響應(yīng)控制器: 由開發(fā)者實(shí)現(xiàn),用來響應(yīng)用戶的具體請求。如登錄請求、注冊請求……

前端控制器(DispatcherServlet)是 Spring MVC 中最核心的組件,相當(dāng)于整個(gè)程序中的行政、調(diào)度中心。其它的組件都是它的附庸,為前端控制器提供相關(guān)的服務(wù)。

Tips: DispatcherServlet 必須在 Spring MVC 項(xiàng)目啟動(dòng)時(shí)被創(chuàng)建。DispatcherServlet 的純 JAVA 配置請查閱《純 JAVA 搭建 Spring MVC 項(xiàng)目》章節(jié)內(nèi)容。

DispatcherServlet 的基本功能。

3.1 請求分流

瀏覽器向 Spring MVC 程序發(fā)起的所有請求都會(huì)匯流給 DispatcherServlet 組件。再由 DispatcherServlet 分流到具體的用戶控制器;
圖片描述

為什么要對所有請求集中分流?

可以從 2 個(gè)維度理解:

  • 安全性: 如同去拜訪某一個(gè)公司,所有的來訪人員都要經(jīng)由前臺(tái)工作人員登記、確認(rèn)后才會(huì)被引導(dǎo)到具體的會(huì)客室,前臺(tái)可以對來訪人員的身份進(jìn)行初步認(rèn)定和篩選。請求分流的性質(zhì)也是如此,確保只能通過一個(gè)入口進(jìn)入程序;
  • 標(biāo)準(zhǔn)化: 每一個(gè)請求都會(huì)以相同的方式進(jìn)行分流處理。如同造訪公司,如果對每一個(gè)人的來訪有區(qū)別或者說沒有統(tǒng)一的接待標(biāo)準(zhǔn),一定會(huì)產(chǎn)生額外的工作量。統(tǒng)一協(xié)調(diào),標(biāo)準(zhǔn)化項(xiàng)目,可以高度簡化處理流程。

3.2 調(diào)度中心

一次請求、響應(yīng)的完成,需要多個(gè)組件通力合作。如何協(xié)調(diào)各個(gè)組件的工作,保證請求、響應(yīng)過程有條不紊的進(jìn)行,則需要一個(gè)指揮者或說一個(gè)核心靈魂組件。DispatcherServlet 就是每一次請求、響應(yīng)過程中的組織者、調(diào)度者。

Tips: DispatcherServlet 本質(zhì)就是一個(gè)和 Spring MVC 程序一起啟動(dòng)的 Servlet 。在現(xiàn)有的 MVC 框架,如 Struts MVC 中使用過濾器作為前端控制器。

4. 用戶控制器

用戶控制處理器(簡稱用戶控制器或控制器 \ 處理器)提供具體的響應(yīng)用戶請求的邏輯。用戶控制器雖然由用戶自定義編寫,但也需要直接或間接遵循 Spring MVC 的控制器編寫規(guī)范。

Tips: 如果說前端控制器是大門,那么用戶控制器就是具體的洽談部門。

4.1 編寫控制器

Spring MVC 提供了很靈活的用戶控制器編寫方案。

  1. 通過實(shí)現(xiàn) Spring MVC 提供的 org.springframework.web.servlet.mvc.Controller 接口;
public class HelloAction implements org.springframework.web.servlet.mvc.Controller {
   	@Override
   	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
   		System.out.println("Bean URL ");
   		return null;
   	}
}
  1. Spring MVC 支持 POJO (普通 JAVA 類)充當(dāng)控制器。
public class HelloAction  {
   	public String hello() {
   		return "hello";
   	}
}

Tips: 使用 POJO 充當(dāng)用戶控制器,顯然要簡潔很多。這是常見的編寫方案。

4.2 映射控制器

原生 Servlet 開發(fā)中,需要在 web.xml 中注冊、映射 Servlet 后瀏覽器才能請求到。 基于 Spring MVCWEB 項(xiàng)目,用戶如何在瀏覽器中請求到用戶控制器?

使用注解 2 步就可以搞定:

  1. 在類前面添加 @Controller 注解,此注解的作用是通知 Spring MVC 的上下文對象(WebApplicationContext), 控制器的創(chuàng)建交給你了;
@Controller
public class HelloAction  {
    //省略……
}
  1. 在控制器的方法前面添加 @RequestMapping 注解。使用此注解可提供一個(gè)邏輯名向用戶映射此方法。
@RequestMapping("/hello")
public String hello() {
	System.out.pirntln("hello");
	return "hello";
}

難道就這么簡單,是的,要不咱們測試一下:

  • 重新向服務(wù)器發(fā)布 Spring MVC 項(xiàng)目;
  • 打開瀏覽器,輸入 http://localhost:8888/sm-demo/hello 。
    然后,你會(huì)看到:
    圖片描述

Tips: 404 ?頁面資源沒找到,為什么會(huì)是這個(gè)樣子?

哦!那是因?yàn)檫€沒有告訴 Spring MVC 當(dāng)控制器響應(yīng)瀏覽器請求時(shí),如何找到頁面視圖,這是視圖解析器組件的工作。好吧,等會(huì)兒,我們就會(huì)聊到視圖解析器。

Tips: 怎么證明控制器被請求到,很簡單,你將在控制臺(tái)上看到 hello 字符的輸出。

5. 映射器

映射器的作用就是檢查用戶的請求路徑中是否存在對應(yīng)的控制器組件。

Tips: 有點(diǎn)類似于導(dǎo)購員。客戶報(bào)一個(gè)商品名,然后告訴你真正的商品所在位置。

圖片描述

使用 Spring MVC 時(shí),如果開發(fā)者沒有顯示配置映射器,Spring MVC 會(huì)啟動(dòng)默認(rèn)的映射器組件。

DispatcherServlet 所在包的根目錄下有名為 DispatcherServlet.properties 的文件,已經(jīng)配置了很多默認(rèn)組件信息,開發(fā)者不用做任何配置,便能啟動(dòng)這些組件工作。

圖片描述

打開此文件可以看到有 2 種類型的映射器信息:

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

這兩個(gè)映射器分別為哪一種請求尋找控制器了?

回答這個(gè)問題之間,先了解用戶控制器的映射方式。前面提到可使用 @RequestMapping 注解對外映射控制器組件。其實(shí) Spring MVC 還可以使用 @Bean 注解實(shí)現(xiàn)相同的功能 。

先假設(shè)存在如下的控制器:

public class HelloAction {
	public String hello() implements Controller{
		System.out.println("hello");
		return "hello";
	}
}
  • @Bean 注解映射: 打開項(xiàng)目中的 WebConfig 配置類,添加如下代碼;
 @Bean(name = "/hello")
 public HelloAction hello() {
  	return new HelloAction();
  }

Tips: “hello” 前面一定要加上 “/” 。

如果使用 @Bean 注解的方式映射控制器,則用戶控制器需要實(shí)現(xiàn) org.springframework.web.servlet.mvc.Controller 接口, 意味著必須是一個(gè)標(biāo)準(zhǔn)的控制器。

此處的 @Bean 的作用就是告訴 Spring MVC:你要?jiǎng)?chuàng)建它,其名字被當(dāng)成一個(gè)訪問控制器的 URL。

BeanNameUrlHandlerMapping 映射器的功能就是查找有沒有哪一個(gè) Bean 的名字和用戶請求的路徑相匹配。
RequestMappingHandlerMapping 映射器就是查找由 @RequestMapping 注解映射的控制器。

無論使用這 2 種映射器的哪一種,理論上都無需顯示配置。Spring 會(huì)根據(jù)你的請求信息選擇對應(yīng)的映射器。

顯然,使用 @RequestMapping 映射更直接、可觀。所以,RequestMappingHandlerMapping 映射器使用的更多。

6. 小結(jié)

本節(jié)課和大家一起講解了 Spring MVC 中的 前端控制器、用戶控制器、映射器的功能及使用方式 。其它的幾個(gè)核心組件將在下一章節(jié)中和大家一一展開。

一個(gè)完整的 Spring MVC 項(xiàng)目不僅僅只依靠這幾大組件,還有更多的組件在后臺(tái)默默地付出著。隨著學(xué)習(xí)的深入,這些組件也將會(huì)逐步出現(xiàn)在大家面前。