學習SpringMVC必知必會(2)~走近Spring MVC

一樂樂發表於2022-03-24

一、Spring 基本介紹

1.什麼是 Spring MVC?

  • SpringMVC 是 Spring-Frame 框架的子集(Spring-Frame包含了Spring MVC)MVC 框架,(類比javaWeb)它解決 WEB 開發中常見的問題(引數接收檔案上傳表單驗證、國際化等等),而且使用簡單,與 Spring 無縫整合。

  • 支援 RESTful 風格的 URL 請求 ,非常容易與其他檢視技術整合,如 Velocity、FreeMarker。 採用了鬆散耦合可插拔元件結構,比其他 MVC 框架更具擴充套件性和靈活性。

  • Spring3.0 後全面超越 Struts2,成為最優秀的 MVC 框架 (更安全,效能更好,更簡單)。


2.Spring WebFlux

  • Spring WebFlux 是 Spring 另一個 Web 框架,基於非同步非阻塞的。
  • SpringMVC 是同步阻塞的 IO 模型,資源浪費相對來說比較嚴重,當我們在處理一個比較耗時的任務時, 比如上傳檔案,伺服器的執行緒一直在等待接收檔案,而 Spring WebFlux 可以做到非同步非阻塞。

✿ SpringMVC 是單例的,提高效能:

SpringMVC 是單例的, 基於方法設計;是單例的,避免執行緒安全問題,不定義成員變數、不使用成員變數

尤其是需要共享資料的變數,作為區域性變數,不要作為共享欄位。

  • servlet 單例,一般不使用成員變數,不安全,除非是要共享資料,才作為成員變數。



二、Spring 基本使用

▷ 基於xml配置

0.建立web專案

1、依賴[細節版本一致性]:

  • commons-logging-1.2.jar
  • servlet-api.jar
  • spring-aop-5.2.8.RELEASE.jar
  • spring-beans-5.2.8.RELEASE.jar
  • spring-context-5.2.8.RELEASE.jar
  • spring-core-5.2.8.RELEASE.jar
  • spring-expression-5.2.8.RELEASE.jar
  • spring-web-5.2.8.RELEASE.jar
  • spring-webmvc-5.2.8.RELEASE.jar

2、配置前端控制器

	<!-- 配置前端控制器 -->
	<servlet>
		<servlet-name>SpringMVC</servlet-name>	
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 初始化引數,告訴DispatcherServlet去哪裡找mvc配置檔案 -->
		<!-- 
			預設是去WEB-INF 目錄中尋找
			預設尋找的檔名是<servlet-name>元素的文字內容-servlet.xml
		 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:mvc.xml</param-value>
		</init-param>
		<!-- 在Tomcat啟動的時就初始化SpringMVC容器 -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>SpringMVC</servlet-name>	
		<url-pattern>/</url-pattern>
	</servlet-mapping>

3、開發一個處理器類 HelloController,實現介面Controller,覆蓋handlerRequest方法

//處理器---目的是處理請求【具體包含要跳轉的介面和共享的資料】
public class HelloController implements Controller{
    //處理請求
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println("hello...");
		//封裝模型(共享資料)和檢視(跳轉的介面)
		ModelAndView mv = new ModelAndView();
		//設定檢視名稱
		mv.setViewName("/WEB-INF/views/welcome.jsp");
		//設定共享資料
		mv.addObject("msg", "你好,easyMVC");
		return mv;
	}
}

4、配置MVC框架[mvc.xml]:

  • 配置處理器對映器:BeanNameUrlHandlerMapping [目的是尋找匹配的處理器]
  • 配置處理器介面卡:SimpleControllerHandlerAdapter [目的是呼叫處理器的handlerRequest方法]
  • 配置檢視解析器:InternalResourceViewResolver [目的是處理檢視,使之支援jsp、jstl]
  • 配置處理器:HelloController [我們自己開發的處理類]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 1:處理器對映器 -->
    <!-- 目的:選擇哪個處理器(Controller)來處理當前請求
    	BeanNameUrlHandlerMapping: 根據請求的url去選擇對應的bean【根據bean的id/name 進行匹配】  舉例:/hello 去匹配id/name 為/hello 的bean
     -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    <!-- 2:處理器介面卡 -->
    <!-- 目的:呼叫處理器(Controller)的處理請求方法
    	1)所有哦的介面卡 實現HandlerAdapter介面
    	2)處理器(Controller) 類必須實現org.springframework.web.servlet.mvc.Controller介面
     -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
    <!-- 3:檢視解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
    
    <!-- 4:處理器 -->
    <bean id="/hello" class="com.shan.hello.HelloController"/>
</beans> 

總結,站在開發者角度:

1、配置前端控制器

2、配置框架提供的: 處理器對映器、處理器介面卡、檢視解析器

3、需要開發:

1)先開發Controller處理器,再配置
2)開發jsp等檢視



三、SpringMVC執行流程

image



四、SpringMVC 核心元件分析:

1、前端控制器 DispatcherServlet(不需開發),由框架提供,在 web.xml 中配置

  • 作用:接收請求,響應結果,相當於轉發器,中央處理器。

2、處理器對映器 HandlerMapping(不需開發),由框架提供。

  • 作用:匹配處理器,根據請求的 url 查詢 Handler(處理器),可以通過 XML 和註解方式來對映。

3、處理器介面卡 HandlerAdapter(不需開發),由框架提供。

  • 作用:按照特定規則(HandlerAdapter 要求的規則)去執行 Handler

4、處理器 Handler(也稱之為 Controller,需要開發)

  • 注意:編寫 Handler 時按照 HandlerAdapter 的要求去做[實現Controller介面,重寫handlerRequest方法],這樣介面卡才可以去正確執行 Handler。
  • 作用:相當於Servlet,接受使用者請求資訊,呼叫業務方法處理請求,控制介面跳轉,也稱之為後端控制器。

5、檢視解析器 ViewResolver(不需開發),由框架提供

  • 作用:進行檢視解析,把邏輯檢視名解析成真正的物理檢視。
  • SpringMVC 框架支援多種 View 檢視技術,包括:JstlView、FreemarkerView、pdfView 等。

6、檢視 View(需要開發)

  • 作用:把資料展現給使用者的頁面 View 是一個介面,實現類支援不同的 View 技術(jsp、freemarker、pdf 等).



五、 debug的方式閱讀springmvc 的執行流程的思路:


1、傳送請求-》前端控制器,所以第一步是到前端控制器,看前端控制器的什麼呢?---service方法【理由:前端控制器是基於servlet,可以把它的職責看成servlet的職責,所以核心方法-service】----快捷鍵ctr+o,搜尋service方法,發現沒有----》父類中查詢service方法,在service方法第一步打個斷點

2、開始debug:按正常流程走,先啟動tomcat伺服器,然後在瀏覽器傳送請求-》

https://www.cnblogs.com/shan333/p/15983643.html



六、使用註解開發

1、使用xml配置springMVC的缺點:

① 配置繁瑣

② Controller 必須實現Controller介面,只有一個處理器請求的方法,若是要處理多個請求,得開發多個Controller

■ 企業中用得最多的方式:註解開發


2、註解開發步驟:

(1)貼標籤:@Controller、@RequestMapping("hello")

(2)第三方註解驅動(賦予註解功能):

  • 先配置名稱空間(約束內容) 某某.xsd

      <!-- IoC註解解析器 -->  
      <context:component-scan base-package="com.shan"/>
      <!-- MVC註解解析器 -->
      <mvc:annotation-driven/>
    

■ springmvc 的配置:處理器的對映器、處理器的介面卡、檢視解析器 在jar包:spring-webmvc.jar包下的檔案 DispatcherServlet.properties 中有相應的配置了。


■ MVC註解解析器: <mvc:annotation-driven/> :會自動去註冊RequestMappingHandlerMapping,RequestMappingHandlerAdapter,ExceptionHandlerExceptionResolver 三個bean。

除此之外,SpringMVC中幾乎所有的註解,都需要該註解解析器來解析:

  • 支援型別轉換ConversionService
  • @NumberFormat,DateTimeFormate註解
  • @Validdate JSR303 校驗
  • @RequestBody @ResponseBody 等等。



3、RequestMapping註解詳解:

  • 用來處理請求地址url對映的註解,可以貼在類上和方法上。

    貼在類上:表示類中的所有請求方法的url都必須把類上的url地址作為父路徑。

■ 窄化路徑對映:

image

■ RequestMapping 的子註解(常用):

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

■ RequestMapping 的六大屬性講解:

image


① value 和 method

value: 和 path 是一樣的,指定請求的url。

method:指定請求方式的型別,請求方式的型別:GET\POST\HEAD\PUT\PATCH\DELETE\OPTIONS\TRACE

② 指定請求和響應的mediaType

consumes:指定請求內容格式, 例如:Content-Type=application/json

produces: 指定響應內容格式,例如:application/json;charset=UTF-8

③ params 和 headers:

params:指定request中必須包含某些引數值,包含該方法才處理

headers:指定request中必須包含指定的header,包含才能處理



4、前端控制器的url-pattern 配置:

  • 靜態資源:圖片、html、css、js等

第一種方式:*.擴充名,比如 *.do 古老的方式,不會導致靜態資原始檔被攔截問題,但是不支援restfull編碼風格。

第二種方式:/,支援restfull 風格,但是會導致靜態資原始檔被攔截,解決問題--

第三種方式:/* ,是錯誤的,可以請到Controller方法,但是跳轉到jsp時會被攔截,jsp不能正常顯示。


■ 解釋和解決第二種方式 /

  • 解釋:因為tomcat中處理靜態資源的servlet叫default,而default的對映路徑就是/

    啟動專案的時候:

    ​ 1)啟動tomcat,載入tomcat的web.xml檔案

    ​ 2)啟動專案,載入專案的web.xml檔案

    ​ 專案中的web.xml所對映的/會覆蓋tomcat中web.xml配置的對映規則。


  • 常用)解決1:在springmvc的框架配置中新增:

    <!-- 處理靜態資原始檔請求 -->
    <mvc:default-servlet-handler/>
    

    原理:將springmvc上下文[環境] 中定義的一個DefaultServletHttpRequestHandler,對所有經過前端控制器的請求做篩選和盤查,

​ 若是發現沒有經過對映請求,則交給tomcat預設的servlet來處理。(將靜態資源由springmvc交回給servlet來處理)


  • springboot常用)解決2:springmvc 自己來處理資原始檔,而且還附加了很多功能:

    在SpringBoot中:

    ​ 允許把靜態資源放在任何地方,比如WEB-INF裡面,resoures目錄,設定把JS等靜態檔案打包放在jar中,也能找到.
    ​ 都可以通過Location去指定靜態資源路徑,location是Resouce型別,可以使用字首,如classpath:.
    ​ mapping表示對映路徑.

    • **: 包含所有的子集目錄
    <!-- 資源對映 --> 
    <mvc:resources location="/" mapping="/**"/>
    



如果本文對你有幫助的話記得給一樂點個贊哦,感謝!

相關文章