(簡單易懂詳細)使用Spring MVC搭建Hello world
Spring MVC 服務流程圖
Spring MVC元件和流程
首先,在使用Spring MVC之前,我們要明確Spring MVC 是一種基於Servlet的技術,它提供了核心控制器DispatcherServlet和相關元件,而Spring MVC 是圍繞著DispatcherServlet來工作的.
然後,我們來簡單解釋一下上面這個流程圖: ① 使用者發出請求 ② DispatcherServlet 首先通過請求和事先解析好的HandlerMapping配置,找到對應的處理器(Handler),開始準備執行處理器和攔截器組成的執行鏈 ③ 執行處理器我們需要一個對應的環境,這時候就有了一個介面卡(HandlerAdapter),通過這個介面卡來執行步驟②的執行鏈 ④ 執行的處理器(Handler)包括控制器(Controller)的內容和其他增強功能,處理完畢之後,處理器返回模型和檢視(ModelAndView)給核心控制器DispatcherServlet ⑤ 核心控制器DispatcherServlet將對應是檢視資訊傳遞給檢視解析器(ViewResolver),注意,是否需要解析取決於是否使用邏輯檢視,如果是邏輯檢視,檢視解析器就會去解析它,然後把模型渲染到檢視中,最後響應使用者的請求,如果不是邏輯檢視,則不會處理,而直接通過檢視渲染資料.
**
搭建Hello World
** 如果沒有經過一個例項的解釋介紹的話,單純看上面的理論知識是比較抽象難懂的
現在,我們通過搭建Hello World來進一步瞭解Spring MVC 的執行過程 完整的專案目錄如下:
為了防止使用者直接通過URI訪問,一般把JSP檔案放在/WEB-INF目錄下 作為Spring MVC入門,先以XML 配置為例
首先,配置web.xml
<web-app> <display-name>Archetype Created Web Application</display-name> <!-- 配置Spring IoC配置檔案的路徑 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <!-- 配置ContextLoaderListener用以初始化Spring IoC 容器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置DispatcherServlet --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 使得dipatcher 在伺服器啟動時就初始化 --> <load-on-startup>2</load-on-startup> </servlet> <!-- Servlet攔截配置 --> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
解釋一下配置內容 ①系統變數contextConfigLocation:它會告訴Spring MVC其Spring IoC的配置檔案位置,預設為/WEB-INF/applicationContext.xml ②ContextLoaderListener實現介面ServletContextListener,其作用是在Web工程初始化之前,它先完成對Spring IoC容器的初始化,也可以在Web工程關閉知識完成對Spring IoC容器的資源釋放. ③配置核心控制器DispatcherServlet,首先需要配置servlet-name為dispatcher(可自定義名稱),此處有一點需值得注意的地方,這裡的dispatcher需要有一個/WEB-INF/dispatcher-servlet.xml檔案與之對應,即/WEB-INF/servlet-name-servlet.xml,通過load-on-startup來配置在伺服器其中是便初始化它. ④配置DisparcherServlet攔截以後綴"do"結束的請求
其次便是applicationContext.xml,該檔案主要用於裝配Spring Bean,由於只是輸出一個hello world,此處便不作配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
</beans>
接下來便是配置dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
<!-- 使用註解來驅動 -->
<mvc:annotation-driven />
<!-- 定義掃描裝載的包 -->
<context:component-scan base-package="controller"/>
<!-- 定義檢視解析器 -->
<!-- 找到Web工程下/WEB-INF/views資料夾,且檔案結尾為jsp檔案作為對映 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>
</beans>
這裡的配置也比較簡單: ①mvc:annotation-driven/表示使用註解來驅動Spring MVC ②context:component-scan 定義所掃描的包,用以載入對應的控制器和其他一些元件 ③定義檢視解析器InternalResourceViewResolver,這樣檢視就知道去對應的資料夾/WEB-INF/views下載找到對應的JSP 檔案作為檢視響應使用者的請求
然後,開發一個簡單的控制器
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
//該註解表示它是一個控制器
@Controller("MyController")
//表明當請求的URI在/wt下的時候才有該控制器響應
@RequestMapping("/wt")
public class MyController {
//表面URI 是在/index的時候該方法才請求
@RequestMapping("/index")
public ModelAndView index() {
// 模型和檢視
ModelAndView mv = new ModelAndView();
// 檢視邏輯名稱為index
mv.setViewName("index");
// 返回模型和檢視
return mv;
}
}
解釋一下: ①註解@Controller是表面該類為一個控制器,Spring MVC 掃描的時候會把它當做控制器載入進來 ②註解@RequestMapping指定了對應的請求的URI,Spring MVC 會在初始化的時候把這些資訊解析存放起來,於是便有了處理器對映(HandlerMapping),當發生請求的時候,Spring MVC 就會去使用這些資訊去找到對應的控制器Controller來提供服務 ③模型與檢視ModelAndView,在方法中,把檢視的名稱定義為index,而在dispatcher-servlet.xml檔案中,我們配置了字首/WEB-INF/views,字尾.jsp,然後再加上檢視的邏輯名稱index,便有了路徑/WEB-INF/views/index.jsp ④註解@RequestMapping,指定URI 在指定名稱之下才能請求
最後,我們再來看一下index.jsp的程式碼
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring MVC</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
好了,大功告成,現在可以執行tomcat,輸入網址http://localhost:8080/webmvc/wt/index.do便可以驗證輸出了