一、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執行流程
四、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地址作為父路徑。
■ 窄化路徑對映:
■ RequestMapping 的子註解(常用
):
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
■ RequestMapping 的六大屬性講解:
① 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="/**"/>
如果本文對你有幫助的話記得給一樂點個贊哦,感謝!