SprigMVC—理解MVC及快速入門
說明:
傳統MVC——>JSPModel2——>Front Controller + Application Controller + Page Controller + Context 三種模式是JavaWeb設計模式的逐漸適配和演進。本文分別講述了這三種模式,作為了解即可。SpringMVC正是采用了第三種設計模式。
MVC
說明
MVC是Xerox PARC在20世紀80年代為編程語言SmallTalk發明的一種軟件設計模式。
MVC是一種設計模式,它強制性地把應用程序的數據展示、數據處理和流程控制分開。
MVC將應用程序分成3個核心模塊:模型、視圖、控制器,他們相互聯結又分別擔當不同的任務,如圖示所示。
圖示
理解
☐ 模型:數據模型,提供要展示的數據,因此包含數據和行為,可以認為是JavaBean,一個模型可以為多個視圖提供數據。
☐ 視圖:負責模型的展示,一般就是我們見到的用戶界面,客戶想要看到的東西。
☐ 控制器:控制器負責應用的流程控制,所謂流程控制就是接受用戶請求,委托給模型進場處理,后獲取模型數據交由視圖展示。
JSPModel2
說明
在早期的Web應用中,JSP負責處理業務邏輯、控制網頁流程並創建HTML頁面。基本上JSP包攬的所有的模塊,這無疑造成了不少的困擾:
比如:
☐可維護性差
☐調試困難
☐ HTML與Java程序代碼強耦合在一起
☐ 內嵌的流程控制邏輯,要理解應用程序的邏輯必須瀏覽所有的JSP頁面。
為了解決這些問題,SUN公司先后制定了兩種設計模式,分別為Model1和Model2。雖然Model1在一定程序上實現了MVC中的視圖和模型,但是他的運用並不理想,知道Model2的出現才改變了這種局面。
Model2中用JSP技術實現了視圖的功能、用Servlet技術實現了控制器的功能、用JavaBean技術實現了模型的功能。
圖解
Front Controller + Application Controller + Page Controller + Context
說明
前端控制器+應用控制器+頁面控制器(也有稱其為動作)+上下文,也是一種WebMVC模型,只是責任更加明確,SpringMVC正是這種模式。
運行流程圖
職責
Front Controller:前端控制器,負責為表現層提供統一訪問點,從而避免Model2中出現的重復的控制邏輯(由前端控制器統一回調相應的功能方法,如前邊的根據submitFlag=login轉調login方法);並且可以為多個請求提供共用的邏輯(如准備上下文等等),將選擇具體視圖和具體的功能處理(如login里邊封裝請求參數到模型,並調用業務邏輯對象)分離。
Application Controller:應用控制器,前端控制器分離選擇具體視圖和具體的功能處理之后,需要有人來管理,應用控制器就是用來選擇具體視圖技術(視圖的管理)和具體的功能處理(頁面控制器/命令對象/動作管理),一種策略設計模式的應用,可以很容易的切換視圖/頁面控制器,相互不產生影響。
Page Controller(Command):頁面控制器/動作/處理器:功能處理代碼,收集參數、封裝參數到模型,轉調業務對象處理模型,返回邏輯視圖名交給前端控制器(和具體的視圖技術解耦),由前端控制器委托給應用控制器選擇具體的視圖來展示,可以是命令設計模式的實現。頁面控制器也被稱為處理器或動作。
Context:上下文,還記得Model2中為視圖准備要展示的模型數據嗎,我們直接放在request中(Servlet API相關),有了上下文之后,我們就可以將相關數據放置在上下文,從而與協議無關(如Servlet API)的訪問/設置模型數據,一般通過ThreadLocal模式實現。
HelloWorld
0.說明
現在我們以前了解了MVC編程模型,接下來我們實際地編寫一個SpringMVC入門實例,我們現在還不能解所有的技術細節,但是在接下來的博客一定會有相關解釋。
1.加入Jar包
說明:
點擊鏈接(http://projects.spring.io/spring-framework/)進入官方網站,頁面右側選擇4.0版本進行下載,下載完畢后添加以上Jar包到Java環境變量中。
2.配置Web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置DispatcherServlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化參數:作用是配置SpringMVC配置文件的位置和名稱-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcherServlet-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
說明:
DispatcherServlet是前端控制器設計模式的實現,提供了Spring Web MVC的集中訪問點。
與其它web MVC框架一樣,Spring的web MVC框架是一個請求驅動的web框架,其設計圍繞一個中心的servlet進行, 它能將請求分發給控制器,並提供其它功能幫助web應用開發。然而,Spring的DispatcherServlet 所做的不僅僅是這些,它和Spring的IoC容器完全集成在一起,從而允許你使用Spring的其它功能。
請求處理流程:
3.加入SpringMVC的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置自動掃描的包-->
<context:component-scan base-package="handles"/>
<!--配置視圖解析器:如何把handle方法返回值解析為實際的物理視圖-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
說明:
視圖解析器用來解析視圖。如上視圖解析器配置有前綴和后綴兩個屬性,這樣一來,view路徑將會縮短。
4.創建請求處理器類(編寫控制器)
說明:
這里我們使用了注解@Controller ,可以表明了該類作為一個控制器,而不需要你擴展任何控制器基類或者引用ServletAPI。當然,如果需要還是可以引用特定Servlet功能。注解@Controller的基本目標是擔任所注解的類的原型的角色,指明它的職責。
所注解的控制器Bean可以被顯示定義。@Controller也允許自動偵測。要實現隊所注解的控制器的自動偵測,必須要像配置中加入組件掃描的部分的語句。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="org.springframework.samples.petclinic.web"/> <!-- ... --> </beans>
5.編寫JSP頁面(編寫視圖)
/WEB-INF/views/success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Hello,World!
</body>
</html>
6.簡單說明及測試
控制器return返回了視圖的名稱,我們在SpringMVC 中設置了如何解析處理器返回值為視圖。
所以當我們訪問/helloworld后我們會被處理器跳轉到success.jsp頁面。