一.初識三層架構(gòu):
在講解springMVC之前庄吼,先來了解一下什么是三層架構(gòu)丘喻。我們的開發(fā)架構(gòu)一般都是基于兩種形式屡立,一種是C/S架構(gòu)(客戶端/服務(wù)器)褂痰,另一種是B/S架構(gòu)(瀏覽器服務(wù)器)亩进。在javaEE開發(fā)中,幾乎都基于B/S架構(gòu)缩歪。在B/S架構(gòu)中归薛,標(biāo)準(zhǔn)的三層架構(gòu)分為:表現(xiàn)層、業(yè)務(wù)層匪蝙、持久層主籍。
表現(xiàn)層(web層):負(fù)責(zé)接收客戶端請求,向客戶端響應(yīng)結(jié)果逛球,通城г客戶端使用http協(xié)議請求web層,web層需要接收http請求需忿,完成http響應(yīng)诅炉。而其中又分為展示層和控制層∥堇澹控制層負(fù)責(zé)接收請 ? ? ? ? ? ? ? ? 求涕烧,展示層負(fù)責(zé)結(jié)果的展示。表現(xiàn)層依賴于業(yè)務(wù)層汗洒,接收到客戶端請求一般會調(diào)用業(yè)務(wù)層進(jìn)行業(yè)務(wù)處理议纯。表現(xiàn)層的設(shè)計一般都是用MVC模型。
業(yè)務(wù)層(service層):負(fù)責(zé)業(yè)務(wù)邏輯處理溢谤。web層依賴業(yè)務(wù)層瞻凤,而業(yè)務(wù)層不依賴web層憨攒。在處理業(yè)務(wù)時可能會依賴持久層,如果要對數(shù)據(jù)持久化需要保證事物的一致性阀参。
持久層(dao層):負(fù)責(zé)數(shù)據(jù)持久化肝集,包括數(shù)據(jù)層即數(shù)據(jù)庫和數(shù)據(jù)訪問層。數(shù)據(jù)庫是對數(shù)據(jù)進(jìn)行持久化的載體蛛壳,數(shù)據(jù)訪問層是業(yè)務(wù)層和持久層交互的接口杏瞻,業(yè)務(wù)層需要通過數(shù)據(jù)訪問層將數(shù)據(jù)持 ? ? ? ? ? ? ? ? ? ? ? 久化到數(shù)據(jù)庫中。
二.MVC模型(Model View Controller):
它是模型視圖控制器的縮寫衙荐,一種用于設(shè)計創(chuàng)建Web應(yīng)用程序表現(xiàn)層的模式捞挥。
*Model:指我們的數(shù)據(jù)模型,作用一般用于封裝數(shù)據(jù)忧吟。
*View:指jsp/html砌函。作用一般用于展示數(shù)據(jù)的,通常是依據(jù)模型數(shù)據(jù)創(chuàng)建溜族。
*Controller:是應(yīng)用程序中處理用戶交互的部分讹俊,作用一般用于處理程序的邏輯。比如我們在寫一個登陸校驗時斩祭,除了用js校驗外劣像,服務(wù)器端也應(yīng)該有數(shù)據(jù)準(zhǔn)確性的校驗,當(dāng)校驗失敗時摧玫,由控制器將錯誤頁面展示給我們,成功時绑青,控制器負(fù)責(zé)把數(shù)據(jù)填充到模型诬像,并且調(diào)用業(yè)務(wù)層實現(xiàn)業(yè)務(wù)的需求。
三.springMVC:
1.概述:
springMVC框架是一種基于java的實現(xiàn)MVC設(shè)計模型的請求驅(qū)動類的輕量級Web框架闸婴,類似于struts2框架坏挠。是以請求為驅(qū)動,圍繞servlet設(shè)計邪乍,控制器得到請求降狠,然后通過model模型對象展示請求結(jié)果視圖。屬于SpringFrameWork的后續(xù)產(chǎn)品庇楞,已經(jīng)融合在Spring?Web?Flow里面榜配,Spring框架提供了構(gòu)建 Web應(yīng)用程序的全功能?MVC?模塊,在跟spring整合時不需要什么配置吕晌。還可以通過注解的方式蛋褥,使一個簡單的java類成為處理請求的控制器,支持RESTful 編程風(fēng)格的請求睛驳。
2.springMVC與struts2的比較:
*區(qū)別:
-springMVC的入口是一個servlet即前端控制器烙心,而struts2入口是一個filter過濾器膜廊;
-springMVC是基于方法開發(fā)的,傳遞參數(shù)是通過方法形參淫茵,可以設(shè)計為單例或多例(建議單例)爪瓜。而struts2是基于類設(shè)計的,struts2每次執(zhí)行都會創(chuàng)建一個動作類匙瘪;
-springMVC使用更加簡潔铆铆,同時還支持JSR303(是一套JavaBean參數(shù)校驗的標(biāo)準(zhǔn),其中定義了很多常用的校驗注解)辆苔,處理ajax的請求更加方便算灸;
-struts2采用值棧存儲請求和響應(yīng)的數(shù)據(jù),通過OGNL表達(dá)式存取數(shù)據(jù)驻啤,使頁面的開發(fā)效率相比springMVC更高些菲驴,但執(zhí)行效率并沒有比Jstl好。
*相同點:
-都是表現(xiàn)層框架骑冗,基于MVC模型編寫赊瞬;
-底層都離不開原始ServletAPI;
-處理請求的機制都是一個核心控制器贼涩。
3.優(yōu)缺點:
*優(yōu)點:
-耦合性低巧涧。視圖層和業(yè)務(wù)邏輯層分離,這樣我們可以單獨修改頁面樣式和java邏輯代碼遥倦,而不需要考慮會對其它部分代碼造成影響谤绳;
-分工明確,而且擴展點相當(dāng)靈活袒哥;
-由于命令對象就是一個POJO對象缩筛,無需繼承框架特定API,可以直接作為業(yè)務(wù)對象堡称;
-能和spring其他框架無縫集成瞎抛,是其他web框架所不具備的;
-可維護(hù)性高却紧。分離視圖層和業(yè)務(wù)邏輯層也使得WEB應(yīng)用更易于維護(hù)和修改桐臊;
-強大的JSP標(biāo)簽庫,使JSP編寫更容易晓殊;
-可適配断凶,通過HandlerAdapter 可以支持任意的類作為處理器;
-重用性高挺物。當(dāng)業(yè)務(wù)邏輯和視圖分離后懒浮,不同的jsp頁面可以重用相同的業(yè)務(wù)邏輯代碼。
*缺點:
-結(jié)構(gòu)比較復(fù)雜,不適用于中小型的程序砚著;
-每個層互相調(diào)用次伶,關(guān)系復(fù)雜,給調(diào)試帶來困難
4.簡單案例(編程工具:IDEA):
*創(chuàng)建一個Maven工程 File->new->project->Maven->Creat from archetype->webapp->Next:
? *導(dǎo)入相應(yīng)依賴:
<!-- springMVC -->
<dependency>
? ????<groupId>org.springframework</groupId>
??????<artifactId>spring-webmvc</artifactId>
??????<version>5.2.0.RELEASE</version>
</dependency>
? *創(chuàng)建目錄結(jié)構(gòu):
? *創(chuàng)建springMVC配置文件(resource目錄下):
<!-- 配置創(chuàng)建 spring 容器要掃描的包 -->
??<context:component-scan base-package="cn"></context:component-scan>
??<!-- 配置視圖解析器 -->
??????<property name="prefix"?value="/"></property>
??????<property name="suffix"?value=".jsp"></property>
??</bean>
? *配置springMVC核心控制器(web.xml中):
<servlet>
????<servlet-name>SpringMVCDispatcherServlet</servlet-name>
????<servlet-class>
??????org.springframework.web.servlet.DispatcherServlet
????</servlet-class>
????<!-- 配置初始化參數(shù)稽穆,用于讀取 SpringMVC 的配置文件 -->
????<init-param>
??????<param-name>contextConfigLocation</param-name>
??????<param-value>classpath:springMVC.xml</param-value>
????</init-param>
????<load-on-startup>1</load-on-startup>
??</servlet>
??<servlet-mapping>
????<servlet-name>SpringMVCDispatcherServlet</servlet-name>
????<url-pattern>/</url-pattern>
?</servlet-mapping>
? *在webapp下創(chuàng)建一個jsp頁面(case.jsp)冠王,內(nèi)容為 springMVC測試成功;
*在index.jsp中給一個跳轉(zhuǎn)鏈接為:
1<%@ page contentType="text/html;charset=UTF-8"?language="java"?%><html><body>??? <a href="/springMVCText">springMVC入門案例</a></body></html>
? *編寫控制器并使用注解:
package?cn;
import?org.springframework.stereotype.Controller;
import?org.springframework.web.bind.annotation.RequestMapping;
@Controller
public?class?DemoController {
//@RequestMapping:用于建立請求 URL 和處理請求方法之間的對應(yīng)關(guān)系
????@RequestMapping("/springMVCText")
????public?String springMVCText(){
????????return?"text";
????}
}
? *配置好啟動容器運行舌镶,并顯示在頁面:
一個簡單的入門案例到此就結(jié)束啦柱彻!