Java開發大型互聯網Spring MVC項目實戰之Spring MVC原理剖析

編程語言 Java XML WebApp 圖靈學院 圖靈學院 2017-11-02

引言

Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裡面。Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊。使用 Spring 可插入的 MVC 架構,從而在使用Spring進行WEB開發時,可以選擇使用Spring的SpringMVC框架或集成其他MVC開發框架,如Struts1,Struts2等。

什麼是 Spring MVC

Spring MVC 屬於 SpringFrameWork 的後續產品,已經融合在 Spring Web Flow 裡面,是一個強大靈活的 Web 框架。Spring MVC 提供了一個 DispatcherServlet 作為前端控制器來分配請求。通過策略接口,Spring 框架是高度可配置的。Spring MVC 還包含多種視圖技術,如 Java Server Pages(JSP)、Velocity、Tiles、iText 和 POI 等。Spring MVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製。Spring MVC 框架主要由 DispatcherServlet、處理器映射器、處理器適配器、處理器(控制器)、視圖解析器、視圖組成。

Spring MVC備用配置

通過繼承AbstractAnnotationConfigDispatcherServletInitializer來快速地對Spring MVC進行了設置。該類假設你想要一個基礎的DispatcherServlet和ContextLoaderListener設置,並且通過Java而不是XML文件來配置Spring。

儘管這樣配置對大多數Spring應用都是適用的,但是總有意外,比如你想要除了DispatcherServlet之外的servlet和filter,或者你想對DispatcherServlet做一些進一步的配置,再或者,你想在Servlet3.0之前的版本上部署應用,那麼你就要使用傳統的web.xml文件對DispatcherServlet進行配置了。

幸運的是,在(garden-variety)普通的AbstractAnnotationConfigDispatcherServletInitializer不適用於你的需求時,還有其他的一些方式供你使用。下面,我們就開始如何定製化的配置DispatcherServlet吧。

Spring MVC實戰

配置DispatcherServlet(定義web.xml)

在webapp/WEB-INF文件夾下(若不存在WEB-INF文件夾則創建)下創建web。xml文件,文件配置如下:

<web-app xmlns="//java.sun.com/xml/ns/javaee"

xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

//java.sun.com/xml/ns/javaee

//java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0">

<display-name>Spring MVC Application</display-name>

<servlet>

<servlet-name>HelloWeb</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>HelloWeb</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

</web-app>

如上所示,我們使用<servlet>標籤配置DispatcherServlet並且使用<servlet-name>標籤為該servlet命名為HelloWeb。接下來我們使用<servlet-mapping>標籤為該servlet配置映射關係,如上所示,所有路徑以/開始的都會被名為HelloWeb的servlet進行處理。

定義HelloWeb-servlet.xml文件

我們在web.xml文件裡定義了名為HelloWeb的servlet,Spring MVC框架啟動是會初始化該Servlet,默認情況下框架使用[servlet-name]-servlet.xml的文件格式查找該servlet的配置信息。為簡便起見,我們使用該約束方式創建HelloWeb-servlet.xml並配置,該文件內容如下:

<beans xmlns="//www.springframework.org/schema/beans"

xmlns:context="//www.springframework.org/schema/context"

xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

//www.springframework.org/schema/beans

//www.springframework.org/schema/beans/spring-beans-3.0.xsd

//www.springframework.org/schema/context

//www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.liangwei.learning" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsp/" />

<property name="suffix" value=".jsp" />

</bean>

</beans>

如上所示,該配置文件與以前學習到的Spring配置文件相同,這裡值得一提的是,Spring 3.0 增加了@Controller等註解,使得我們可以直接使用註解的方式進行定義配置控制器,而Spring MVC也提供一種配置方式,使得Spring MVC在加載時自動掃描所有有@Controller和@RequestMapping註解的類,並將其註冊為控制器(bean)。我們使用該配置<context:component-scan base-package="com.liangwei.learning" />,並制定base-package,框架會自動在該包名下掃描並註冊控制器。

除上述配置外,我們需要配置為該Servlet配置ViewResolver,這裡我們使用InternalResourceViewResolver,並且配置前綴為/WEB-INF/jsp/,後綴為.jsp,這樣當控制器返回一個hello的String類型實例時,框架會將其解析為/WEB-INF/jsp/hello.jsp,然後查找該視圖文件並使用渲染器渲染視圖。

定義控制器(HelloController)

前面我們定義了Servlet並且完成了其配置工作,接下來我們定義一個控制器:HelloController:

@Controller

@RequestMapping("/hello")

public class HelloController {

@RequestMapping(method = RequestMethod.GET)

public String printHello(ModelMap model) {

model.addAttribute("message", "Hello Spring MVC Framework!");

return "hello";

}

}

如上所示,我們使用@Controller註解註解HelloController,由於我們前面已經配置了<context:component-scan>標籤,框架會自動掃描並註冊控制器。我們使用@RequestMapping註解並設置"/hello"值,這是的所有的請求路徑為/hello的請求被分發到該控制器。這裡我們將@RequestMapping路徑設置在類上,當然我們也可以將該註解設置在具體方法上,我們會在後面的文章講解它們之間的區別。我們的控制器類提供了printHello方法,該方法簽名擁有一個ModelMap類型參數,並且返回String類型值。該方法使用@RequestMapping(method = RequestMethod.GET)設置只接受GET方法。這樣的配置使得我們的控制器會接受/hello路徑的GET請求。

定義視圖文件hello.jsp

我們配置好了Servlet,且定義了控制器,接下來我們需要配置視圖文件hello.jsp

<%@ page contentType="text/html; charset=UTF-8" %>

<html>

<head>

<title>Hello World</title>

</head>

<body>

<h2>${message}</h2>

</body>

</html>

該文件存儲在/WEB-INF/jsp路徑下,命名為hello.jsp:這跟我們前面的HelloWeb-servlet.xml的配置有關。該文件為簡單的JSP視圖文件,它會從模型中獲取名為message的信息,並交給渲染器進行渲染。以上我們就完成了Hello Spring MVC項目的開發和配置工作。

SpringMVC運行原理

(1) Http請求:客戶端請求提交到DispatcherServlet。

(2) 尋找處理器:由DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller。

(3) 調用處理器:DispatcherServlet將請求提交到Controller。

(4)(5)調用業務處理和返回結果:Controller調用業務邏輯處理後,返回ModelAndView。

(6)(7)處理視圖映射並返回模型: DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖。

(8) Http響應:視圖負責將結果顯示到客戶端。

3.SpringMVC接口解釋

(1)DispatcherServlet接口:

Spring提供的前端控制器,所有的請求都有經過它來統一分發。在DispatcherServlet將請求分發給Spring Controller之前,需要藉助於Spring提供的HandlerMapping定位到具體的Controller。

(2)HandlerMapping接口:

能夠完成客戶請求到Controller映射。

(3)Controller接口:

需要為併發用戶處理上述請求,因此實現Controller接口時,必須保證線程安全並且可重用。

Controller將處理用戶請求,這和Struts Action扮演的角色是一致的。一旦Controller處理完用戶請求,則返回ModelAndView對象給DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和視圖(View)。

從宏觀角度考慮,DispatcherServlet是整個Web應用的控制器;從微觀考慮,Controller是單個Http請求處理過程中的控制器,而ModelAndView是Http請求過程中返回的模型(Model)和視圖(View)。

(4)ViewResolver接口:

Spring提供的視圖解析器(ViewResolver)在Web應用中查找View對象,從而將相應結果渲染給客戶。

4.DispatcherServlet:

是整個Spring MVC的核心。它負責接收HTTP請求組織協調Spring MVC的各個組成部分。其主要工作有以下三項:

(1)截獲符合特定格式的URL請求。

(2)初始化DispatcherServlet上下文對應WebApplicationContext,並將其與業務層、持久化層的WebApplicationContext建立關聯。

(3)初始化Spring MVC的各個組成組件,並裝配到DispatcherServlet中。

總結

以 上就是我對Java開發大型互聯網Spring MVC項目實戰之Spring MVC原理剖析問題及其優化總結,分享給大家,希望大家知道什麼是Java開發大型互聯網Spring MVC項目實戰之Spring MVC原理剖析問題及其優化。覺得收穫的話可以點個關注收藏轉發一波喔,謝謝大佬們支持!

  • 1、多寫多敲代碼,好的代碼與紮實的基礎知識一定是實踐出來的

  • 2、可以去百度搜索騰訊課堂圖靈學院的視頻來學習一下java架構實戰案例,還挺不錯的。

  • 最後,每一位讀到這裡的網友,感謝你們能耐心地看完。希望在成為一名更優秀的Java程序員的道路上,我們可以一起學習、一起進步!都能贏取白富美,走向架構師的人生巔峰!

  • 3丶想了解學習以上課程內容可加群:469717771 驗證碼頭條(06 必過)歡迎大家的加入喲!

Java開發大型互聯網Spring MVC項目實戰之Spring MVC原理剖析

相關推薦

推薦中...