1. 程式人生 > >(簡單易懂詳細)使用Spring MVC搭建Hello world

(簡單易懂詳細)使用Spring MVC搭建Hello world

Spring MVC 服務流程圖

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便可以驗證輸出了 輸出 Hello World