1. 程式人生 > >【Spring篇02】對於SpringMVC核心原理的理解 & @Controller和@RequestMapping註解

【Spring篇02】對於SpringMVC核心原理的理解 & @Controller和@RequestMapping註解

之前在【Web篇08】中提到,SpringMVC的核心就是優化了B/S結構(瀏覽器-伺服器),簡化了Servlet的建立;

瀏覽器可以查詢的路徑:WebContent目錄下的jsp檔案,一般在這個目錄下建立個index.jps作為首頁
伺服器可以查詢的路徑:WEB-INF目錄下的jsp檔案;

初學Web時,瀏覽器傳送動態請求的響應過程如下:

  1. 瀏覽器首先通過url,查詢到WebContent目錄下的首頁index.jsp頁面,將其響應給瀏覽器後;
  2. 使用者點選超連結等訪問動態頁面,再次傳送請求,這一次請求需要傳送給TomCat伺服器;
  3. 再由TomCat發給特定的Servlet,
    (一個url對應一個index.jsp檔案,在這個檔案中,通過href=“Servlet”,指定一個特定的Servlet,來處理該url請求);
  4. 這個特定的Servlet去WEB-INF目錄下,查詢寫好的jsp檔案,將其響應給瀏覽器;
  5. 瀏覽器接收jsp檔案,顯示頁面,完成動態請求的響應。

這個模式的弊端是,一個url需要對應一個Servlet,再由Servlet進行轉發和重定向處理;這樣不同的頁面我們就需要在src目錄下new不同的Servlet,並且每一個Servlet都需要重寫程式碼;

那麼有沒有一種方式可以簡化這個流程呢?

★ SpringMVC就是為簡化這個流程而設計的!

★ 通過SpringMVC的設計模式,有效地把不同的Servlet轉化成了同一個java檔案下的@Controller註解類中不同的@RequestMapping註解方法,一個註解方法相當於一個Servlet伺服器,簡化了流程。

MVC,即model模型(service層和Dao層)、view檢視(jsp頁面)、controller控制器(Servlet);
一個典型的SpringMVC工程如下圖所示:
在這裡插入圖片描述

~~下面依據瀏覽器傳送url請求的邏輯順序,整理各檔案的含義和流程思路如下:

1. index.jsp
首頁檔案,其中有一個超連結,
其中==${pageContext.request.contextPath}==,指絕對路徑,即等同於http://localhost:8080/SpringMVC02-wx,
後面的/hello,hello是對映
即,瀏覽器接收響應index.jsp後,點選超連結,再次傳送請求,通過該絕對路徑去找,當前Web工程SpringMVC02-wx,下的hello對映;

<a href="${pageContext.request.contextPath }/hello">Hello SpringMVC</a>

2. pom.xml
<dependency各種依賴的配置檔案,作用是基於GAV路徑匯入jar包,
SpringMVC中需要匯入的jar包有context的jar包和spring-webmvc的jar包;

3. web.xml
配置DispatcherServlet(前端控制器),並且指定配置SpringMVC的配置檔案的路徑是springmvc.xml;
這樣DispatcherServlet就會將url請求,去找具有相同對映的伺服器處理;

4. SpringMVCHandler.java
在當前類上加[email protected]註解==,表明該類作為一個控制器,等同於Servlet伺服器;
在類中寫一個有String型別返回值的方法,對方法加註解@RequestMapping("/hello");
@RequestMapping是一個用來處理請求地址url對映的註解,hello是其對映與上面jsp頁面超連結中的hello對映相對應

5. springmvc.xml
首先設定,要自動掃描的包的路徑,com.atguigu.springmvc,掃描包中的java檔案,將java檔案建立物件,放置在IOC容器中,以後需要的時候再呼叫;
然後配置,檢視解析器InternalResourceViewResolver,在其中設定字首prefix為/WEB-INF/views
字尾suffix為.jsp;

6. 在SpringMVCHandler.java檔案中,@Controller註解類等同於Servlet,處理url請求,找到對映同樣為hello的@RequestMapping註解方法中的返回值"success";

7. 然後與springmvc.xml中的字首字尾拼接,得到/WEB-INF/views/success.jsp,即url為通過伺服器查詢WEB-INF目錄下的views目錄中的success.jsp頁面;

8. 最終將success.jsp頁面響應給瀏覽器。

~~最後,整理一下上面url傳送動態請求(對映為hello)後的過程:

首先,web.xml中的前端控制器DispatcherServlet,將不同的url,通過index.jsp超連結中的對映hello,去找SpringMVCHandler.java中@Controller註解類(等同於Servlet)下,對映同樣為hello的@RequestMapping註解方法;

然後,通過註解方法的String型別返回值"success",與springmvc.xml中的字首、字尾拼接,得到查詢路徑,即/WEB-INF/views/success.jsp;

最終,將寫好的success.jsp檔案響應給瀏覽器;