SpringMVC是Spring家族的一員,Spring是將現在開(kāi)發(fā)中流行的組件進(jìn)行組合而成的一個(gè)框架!它用在基于MVC的表現層開(kāi)發(fā),類(lèi)似于struts2框架
這里寫(xiě)圖片描述
我們在之前已經(jīng)學(xué)過(guò)了Struts2這么一個(gè)基于MVC的框架....那么我們已經(jīng)學(xué)會(huì )了Struts2,為啥要要學(xué)習SpringMVC呢???
下面我們來(lái)看一下Struts2不足之處:
有漏洞【詳細可以去搜索】
運行速度較慢【比SpringMVC要慢】
配置的內容較多【需要使用Struts.xml文件】
比較重量級
基于這么一些原因,并且業(yè)內現在SpringMVC已經(jīng)逐漸把Struts2給替代了...因此我們學(xué)習SpringMVC一方面能夠讓我們跟上業(yè)界的潮流框架,一方面SpringMVC確實(shí)是非常好用!
可以這么說(shuō),Struts2能做的東西,SpringMVC也能夠做....
在Struts2中,我們的開(kāi)發(fā)特點(diǎn)是這樣的:
Action類(lèi)繼承著(zhù)ActionSupport類(lèi)【如果要使用Struts2提供的額外功能,就要繼承它】
Action業(yè)務(wù)方法總是返回一個(gè)字符串,再由Struts2內部通過(guò)我們手寫(xiě)的Struts.xml配置文件去跳轉到對應的view
Action類(lèi)是多例的,接收Web傳遞過(guò)來(lái)的參數需要使用實(shí)例變量來(lái)記住,通常我們都會(huì )寫(xiě)上set和get方法
Struts2的工作流程
這里寫(xiě)圖片描述
Struts2接收到request請求
將請求轉向我們的過(guò)濾分批器進(jìn)行過(guò)濾
讀取Struts2對應的配置文件
經(jīng)過(guò)默認的攔截器之后創(chuàng )建對應的Action【多例】
執行完業(yè)務(wù)方法就返回給response對象
導入開(kāi)發(fā)包
前6個(gè)是Spring的核心功能包【IOC】,第7個(gè)是關(guān)于web的包,第8個(gè)是SpringMVC包
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.asm-3.0.5.RELEASE.jar
commons-logging.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
編寫(xiě)Action
Action實(shí)現Controller接口
我們只要實(shí)現handleRequest方法即可,該方法已經(jīng)說(shuō)了request和response對象給我們用了。這是我們非常熟悉的request和response對象。然而該方法返回的是ModelAndView這么一個(gè)對象,這是和Struts2不同的。Struts2返回的是字符串,而SpringMVC返回的是ModelAndView
ModelAndView其實(shí)他就是將我們的視圖路徑和數據封裝起來(lái)而已【我們想要跳轉到哪,把什么數據存到request域中,設置這個(gè)對象的屬性就行了】。
注冊核心控制器
在Struts2中,我們想要使用Struts2的功能,那么就得在web.xml文件中配置過(guò)濾器。而我們使用SpringMVC的話(huà),我們是在web.xml中配置核心控制器
創(chuàng )建SpringMVC控制器
我們在hello.xml配置文件中把SpringMVC的控制器創(chuàng )建出來(lái)
訪(fǎng)問(wèn)
當我們在瀏覽器訪(fǎng)問(wèn)http://localhost:8080/hello.action的時(shí)候,Spring會(huì )讀取到我們的訪(fǎng)問(wèn)路徑,然后對比一下我們的配置文件中是否有配置/hello.action,如果有。那么就交由對應的Action類(lèi)來(lái)進(jìn)行處理。Action類(lèi)的業(yè)務(wù)方法將其請求輸出到hello.jsp頁(yè)面上。
這里寫(xiě)圖片描述
這里寫(xiě)圖片描述
用戶(hù)發(fā)送請求
請求交由核心控制器處理
核心控制器找到映射器,映射器看看請求路徑是什么
核心控制器再找到適配器,看看有哪些類(lèi)實(shí)現了Controller接口或者對應的bean對象
將帶過(guò)來(lái)的數據進(jìn)行轉換,格式化等等操作
找到我們的控制器Action,處理完業(yè)務(wù)之后返回一個(gè)ModelAndView對象
最后通過(guò)視圖解析器來(lái)對ModelAndView進(jìn)行解析
跳轉到對應的JSP/html頁(yè)面
上面的工作流程中,我們是沒(méi)有講過(guò)映射器,適配器,視圖解析器這樣的東西的。但是SpringMVC的環(huán)境還是被我們搭建起來(lái)了。
下面就由我來(lái)一個(gè)一個(gè)來(lái)介紹他們是有什么用的!
映射器
我們在web.xml中配置規定只要是.action為后綴的請求都是會(huì )經(jīng)過(guò)SpringMVC的核心Servlet。
當我們接收到請求的時(shí)候,我們發(fā)現是hello.action,是會(huì )經(jīng)過(guò)我們的核心Servlet的,那么核心Servlet就會(huì )去找有沒(méi)有專(zhuān)門(mén)的Action類(lèi)來(lái)處理hello.action請求的。
也就是說(shuō):映射器就是用于處理“什么樣的請求提交給Action”處理?!灸J可省略的】.....
其實(shí)我們在快速入門(mén)的例子已經(jīng)配置了:name屬性就是規定了hello.action到HelloAction控制器中處理!
映射器默認的值是這樣的:
當然了,上面我們在創(chuàng )建控制器的時(shí)候【也就是HelloAction】可以不使用name屬性來(lái)指定路徑,可以使用我們的映射器來(lái)配置。如以下的代碼:
當我們需要多個(gè)請求路徑都交由helloAction控制器來(lái)處理的話(huà),我們只要添加prop標簽就行了!
這里寫(xiě)圖片描述
適配器
當我們映射器找到對應的Action來(lái)處理請求的時(shí)候,核心控制器會(huì )讓適配器去找該類(lèi)是否實(shí)現了Controller接口?!灸J可省略的】
也就是說(shuō):適配器就是去找實(shí)現了Controller接口的類(lèi)
視圖解析器
我們把結果封裝到ModelAndView以后,SpringMVC會(huì )使用視圖解析器來(lái)對ModelAndView進(jìn)行解析?!灸J可省略的】
也有一種情況是不能省略的。我們在快速入門(mén)的例子中,將結果封裝到ModelAndView中,用的是絕對真實(shí)路徑!如果我們用的是邏輯路徑,那么就必須對其配置,否則SpringMVC是找不到對應的路徑的。
那什么是邏輯路徑呢???我們在Struts2中,返回的是'success'這樣的字符串,從而跳轉到success.jsp這樣的頁(yè)面上。我們就可以把'success'稱(chēng)作為邏輯路徑。
在A(yíng)ction中返回hello,hello是一個(gè)邏輯路徑。需要我們使用視圖解析器把邏輯路基補全
如果不使用視圖解析器的話(huà),那么就會(huì )找不到頁(yè)面:

這里寫(xiě)圖片描述
因此,我們需要配置視圖解析器
ParameterizableViewController
我們在之前使用Struts2的時(shí)候,如果僅僅要跳轉到某個(gè)WEB-INF/JSP頁(yè)面,也要寫(xiě)業(yè)務(wù)方法。而業(yè)務(wù)方法也僅僅是返回一個(gè)簡(jiǎn)單的字符串。
如下的代碼:
在SpringMVC中,如果僅僅是跳轉到某個(gè)視圖上,我們可以省略該Action和業(yè)務(wù)方法。配置的Action只要繼承著(zhù)ParameterizableViewController這個(gè)類(lèi)就行了!

這里寫(xiě)圖片描述
2017年9月26日15:57:45 現在看來(lái), 好像還是在方法上寫(xiě)更好。我覺(jué)得統一管理起來(lái)會(huì )更加方便
AbstractCommandController
到目前為止,我們都沒(méi)有將SpringMVC是怎么接收web端傳遞過(guò)來(lái)的參數的。
我們在Struts2中,只要在A(yíng)ction類(lèi)上寫(xiě)對應的成員變量,給出對應的set和get方法。那么Struts2就會(huì )幫我們把參數封裝到對應的成員變量中,是非常方便的。
那么我們在SpringMVC中是怎么獲取參數的呢????我們是將Action繼承AbstractCommandController這么一個(gè)類(lèi)的。
在講解該控制器之前,首先我們要明白SpringMVC控制器一個(gè)與Struts2不同的地方:SpringMVC的控制器是單例的,Struts2的控制器是多例的!
也就是說(shuō):Struts2收集變量是定義成員變量來(lái)進(jìn)行接收,而SpringMVC作為單例的,是不可能使用成員變量來(lái)進(jìn)行接收的【因為會(huì )有多個(gè)用戶(hù)訪(fǎng)問(wèn),就會(huì )出現數據不合理性】!
那么SpringMVC作為單例的,他只能通過(guò)方法的參數來(lái)進(jìn)行接收對應的參數!只有方法才能保證不同的用戶(hù)對應不同的數據!
實(shí)體
實(shí)體的屬性要和web頁(yè)面上的name提交過(guò)來(lái)的名稱(chēng)是一致的。這和Struts2是一樣的!
提交參數的JSP
配置Action處理請求
Action接收參數
效果:

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述
Struts2和SpringMVC存值的區別:

聯(lián)系客服