欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的Web MVC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年09月04日 10:32:25   投稿:mrr  
MVC模型是一種架構(gòu)型的模式,本身不引入新功能,只是幫助我們將開(kāi)發(fā)的結(jié)構(gòu)組織的更加合理,使展示與模型分離、流程控制邏輯、業(yè)務(wù)邏輯調(diào)用與展示邏輯分離

Web開(kāi)發(fā)中的請(qǐng)求-響應(yīng)模型:

在Web世界里,具體步驟如下:

1、Web瀏覽器(如IE)發(fā)起請(qǐng)求。

2、Web服務(wù)器(如Tomcat)接收請(qǐng)求,處理請(qǐng)求(比如用戶(hù)新增,則將把用戶(hù)保存一下),最后產(chǎn)生響應(yīng)(一般為html)。

3、web服務(wù)器處理完成后,返回內(nèi)容給web客戶(hù)端(一般就是我們的瀏覽器),客戶(hù)端對(duì)接收的內(nèi)容進(jìn)行處理(如web瀏覽器將會(huì)對(duì)接收到的html內(nèi)容進(jìn)行渲染以展示給客戶(hù))。

因此,在Web世界里:

都是Web客戶(hù)端發(fā)起請(qǐng)求,Web服務(wù)器接收、處理并產(chǎn)生響應(yīng)。

一般Web服務(wù)器是不能主動(dòng)通知Web客戶(hù)端更新內(nèi)容。雖然現(xiàn)在有些技術(shù)如服務(wù)器推(如Comet)、還有現(xiàn)在的HTML5websocket可以實(shí)現(xiàn)Web服務(wù)器主動(dòng)通知Web客戶(hù)端。

到此我們了解了在web開(kāi)發(fā)時(shí)的請(qǐng)求/響應(yīng)模型,接下來(lái)我們看一下標(biāo)準(zhǔn)的MVC模型是什么。

標(biāo)準(zhǔn)MVC模型概述

MVC模型:是一種架構(gòu)型的模式,本身不引入新功能,只是幫助我們將開(kāi)發(fā)的結(jié)構(gòu)組織的更加合理,使展示與模型分離、流程控制邏輯、業(yè)務(wù)邏輯調(diào)用與展示邏輯分離。如圖1-2

圖1-2

首先讓我們了解下MVC(Model-View-Controller)三元組的概念:

Model(模型):數(shù)據(jù)模型,提供要展示的數(shù)據(jù),因此包含數(shù)據(jù)和行為,可以認(rèn)為是領(lǐng)域模型或JavaBean組件(包含數(shù)據(jù)和行為),不過(guò)現(xiàn)在一般都分離開(kāi)來(lái):ValueObject(數(shù)據(jù))和服務(wù)層(行為)。也就是模型提供了模型數(shù)據(jù)查詢(xún)和模型數(shù)據(jù)的狀態(tài)更新等功能,包括數(shù)據(jù)和業(yè)務(wù)。

View(視圖):負(fù)責(zé)進(jìn)行模型的展示,一般就是我們見(jiàn)到的用戶(hù)界面,客戶(hù)想看到的東西。

Controller(控制器):接收用戶(hù)請(qǐng)求,委托給模型進(jìn)行處理(狀態(tài)改變),處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負(fù)責(zé)展示。也就是說(shuō)控制器做了個(gè)調(diào)度員的工作,。

從圖1-1我們還看到,在標(biāo)準(zhǔn)的MVC中模型能主動(dòng)推數(shù)據(jù)給視圖進(jìn)行更新(觀(guān)察者設(shè)計(jì)模式,在模型上注冊(cè)視圖,當(dāng)模型更新時(shí)自動(dòng)更新視圖),但在Web開(kāi)發(fā)中模型是無(wú)法主動(dòng)推給視圖(無(wú)法主動(dòng)更新用戶(hù)界面),因?yàn)樵赪eb開(kāi)發(fā)是請(qǐng)求-響應(yīng)模型。

那接下來(lái)我們看一下在Web里MVC是什么樣子,我們稱(chēng)其為WebMVC來(lái)區(qū)別標(biāo)準(zhǔn)的MVC。

WebMVC概述

模型-視圖-控制器概念和標(biāo)準(zhǔn)MVC概念一樣,請(qǐng)參考1.2,我們?cè)倏匆幌耊ebMVC標(biāo)準(zhǔn)架構(gòu),如圖1-3:

如圖1-3

在WebMVC模式下,模型無(wú)法主動(dòng)推數(shù)據(jù)給視圖,如果用戶(hù)想要視圖更新,需要再發(fā)送一次請(qǐng)求(即請(qǐng)求-響應(yīng)模型)。

概念差不多了,我們接下來(lái)了解下Web端開(kāi)發(fā)的發(fā)展歷程,和使用代碼來(lái)演示一下WebMVC是如何實(shí)現(xiàn)的,還有為什么要使用MVC這個(gè)模式呢?

Web端開(kāi)發(fā)發(fā)展歷程

此處我們只是簡(jiǎn)單的敘述比較核心的歷程,如圖1-4

圖1-4

CGI:(CommonGatewayInterface)公共網(wǎng)關(guān)接口,一種在web服務(wù)端使用的腳本技術(shù),使用C或Perl語(yǔ)言編寫(xiě),用于接收web用戶(hù)請(qǐng)求并處理,最后動(dòng)態(tài)產(chǎn)生響應(yīng)給用戶(hù),但每次請(qǐng)求將產(chǎn)生一個(gè)進(jìn)程,重量級(jí)。

Servlet:一種JavaEEweb組件技術(shù),是一種在服務(wù)器端執(zhí)行的web組件,用于接收web用戶(hù)請(qǐng)求并處理,最后動(dòng)態(tài)產(chǎn)生響應(yīng)給用戶(hù)。但每次請(qǐng)求只產(chǎn)生一個(gè)線(xiàn)程(而且有線(xiàn)程池),輕量級(jí)。而且能利用許多JavaEE技術(shù)(如JDBC等)。本質(zhì)就是在java代碼里面輸出html流。但表現(xiàn)邏輯、控制邏輯、業(yè)務(wù)邏輯調(diào)用混雜。如圖1-5

圖1-5

如圖1-5,這種做法是絕對(duì)不可取的,控制邏輯、表現(xiàn)代碼、業(yè)務(wù)邏輯對(duì)象調(diào)用混雜在一起,最大的問(wèn)題是直接在Java代碼里面輸出Html,這樣前端開(kāi)發(fā)人員無(wú)法進(jìn)行頁(yè)面風(fēng)格等的設(shè)計(jì)與修改,即使修改也是很麻煩,因此實(shí)際項(xiàng)目這種做法不可取。

JSP:(JavaServerPage):一種在服務(wù)器端執(zhí)行的web組件,是一種運(yùn)行在標(biāo)準(zhǔn)的HTML頁(yè)面中嵌入腳本語(yǔ)言(現(xiàn)在只支持Java)的模板頁(yè)面技術(shù)。本質(zhì)就是在html代碼中嵌入java代碼。JSP最終還是會(huì)被編譯為Servlet,只不過(guò)比純Servlet開(kāi)發(fā)頁(yè)面更簡(jiǎn)單、方便。但表現(xiàn)邏輯、控制邏輯、業(yè)務(wù)邏輯調(diào)用還是混雜。如圖1-6

圖1-6

如圖1-6,這種做法也是絕對(duì)不可取的,控制邏輯、表現(xiàn)代碼、業(yè)務(wù)邏輯對(duì)象調(diào)用混雜在一起,但比直接在servlet里輸出html要好一點(diǎn),前端開(kāi)發(fā)人員可以進(jìn)行簡(jiǎn)單的頁(yè)面風(fēng)格等的設(shè)計(jì)與修改(但如果嵌入的java腳本太多也是很難修改的),因此實(shí)際項(xiàng)目這種做法不可取。

JSP本質(zhì)還是Servlet,最終在運(yùn)行時(shí)會(huì)生成一個(gè)Servlet(如tomcat,將在tomcat\work\Catalina\web應(yīng)用名\org\apache\jsp下生成),但這種使得寫(xiě)html簡(jiǎn)單點(diǎn),但仍是控制邏輯、表現(xiàn)代碼、業(yè)務(wù)邏輯對(duì)象調(diào)用混雜在一起。

Model1:可以認(rèn)為是JSP的增強(qiáng)版,可以認(rèn)為是jsp+javabean如圖1-7

特點(diǎn):使用jsp:useBean標(biāo)準(zhǔn)動(dòng)作,自動(dòng)將請(qǐng)求參數(shù)封裝為JavaBean組件;還必須使用java腳本執(zhí)行控制邏輯。

圖1-7

此處我們可以看出,使用jsp:useBean標(biāo)準(zhǔn)動(dòng)作可以簡(jiǎn)化javabean的獲取/創(chuàng)建,及將請(qǐng)求參數(shù)封裝到j(luò)avabean,再看一下Model1架構(gòu),如圖1-8。

圖1-8Model1架構(gòu)

Model1架構(gòu)中,JSP負(fù)責(zé)控制邏輯、表現(xiàn)邏輯、業(yè)務(wù)對(duì)象(javabean)的調(diào)用,只是比純JSP簡(jiǎn)化了獲取請(qǐng)求參數(shù)和封裝請(qǐng)求參數(shù)。同樣是不好的,在項(xiàng)目中應(yīng)該嚴(yán)禁使用(或最多再demo里使用)。

Model2:在JavaEE世界里,它可以認(rèn)為就是WebMVC模型

Model2架構(gòu)其實(shí)可以認(rèn)為就是我們所說(shuō)的WebMVC模型,只是控制器采用Servlet、模型采用JavaBean、視圖采用JSP,如圖1-9

圖1-9Model2架構(gòu)

具體代碼事例如下:

從Model2架構(gòu)可以看出,視圖和模型分離了,控制邏輯和展示邏輯分離了。

但我們也看到嚴(yán)重的缺點(diǎn):

控制器:

1.控制邏輯可能比較復(fù)雜,其實(shí)我們可以按照規(guī)約,如請(qǐng)求參數(shù)submitFlag=toAdd,我們其實(shí)可以直接調(diào)用toAdd方法,2.來(lái)簡(jiǎn)化控制邏輯;而且每個(gè)模塊基本需要一個(gè)控制器,造成控制邏輯可能很復(fù)雜;

3.請(qǐng)求參數(shù)到模型的封裝比較麻煩,如果能交給框架來(lái)做這件事情,我們可以從中得到解放;

4.選擇下一個(gè)視圖,嚴(yán)重依賴(lài)ServletAPI,這樣很難或基本不可能更換視圖;

5.給視圖傳輸要展示的模型數(shù)據(jù),使用ServletAPI,更換視圖技術(shù)也要一起更換,很麻煩。

1模型:

此處模型使用JavaBean,可能造成JavaBean組件類(lèi)很龐大,一般現(xiàn)在項(xiàng)目都是采用三層架構(gòu),而不采用JavaBean。

視圖

現(xiàn)在被綁定在JSP,很難更換視圖,比如Velocity、FreeMarker;比如我要支持Excel、PDF視圖等等。

服務(wù)到工作者:FrontController+ApplicationController+PageController+Context

即,前端控制器+應(yīng)用控制器+頁(yè)面控制器(也有稱(chēng)其為動(dòng)作)+上下文,也是WebMVC,只是責(zé)任更加明確如圖1-10:

圖1-10

運(yùn)行流程如下:

職責(zé):

FrontController:前端控制器,負(fù)責(zé)為表現(xiàn)層提供統(tǒng)一訪(fǎng)問(wèn)點(diǎn),從而避免Model2中出現(xiàn)的重復(fù)的控制邏輯(由前端控制器統(tǒng)一回調(diào)相應(yīng)的功能方法,如前邊的根據(jù)submitFlag=login轉(zhuǎn)調(diào)login方法);并且可以為多個(gè)請(qǐng)求提供共用的邏輯(如準(zhǔn)備上下文等等),將選擇具體視圖和具體的功能處理(如login里邊封裝請(qǐng)求參數(shù)到模型,并調(diào)用業(yè)務(wù)邏輯對(duì)象)分離。

ApplicationController:應(yīng)用控制器,前端控制器分離選擇具體視圖和具體的功能處理之后,需要有人來(lái)管理,應(yīng)用控制器就是用來(lái)選擇具體視圖技術(shù)(視圖的管理)和具體的功能處理(頁(yè)面控制器/命令對(duì)象/動(dòng)作管理),一種策略設(shè)計(jì)模式的應(yīng)用,可以很容易的切換視圖/頁(yè)面控制器,相互不產(chǎn)生影響。

PageController(Command):頁(yè)面控制器/動(dòng)作/處理器:功能處理代碼,收集參數(shù)、封裝參數(shù)到模型,轉(zhuǎn)調(diào)業(yè)務(wù)對(duì)象處理模型,返回邏輯視圖名交給前端控制器(和具體的視圖技術(shù)解耦),由前端控制器委托給應(yīng)用控制器選擇具體的視圖來(lái)展示,可以是命令設(shè)計(jì)模式的實(shí)現(xiàn)。頁(yè)面控制器也被稱(chēng)為處理器或動(dòng)作。

Context:上下文,還記得Model2中為視圖準(zhǔn)備要展示的模型數(shù)據(jù)嗎,我們直接放在request中(ServletAPI相關(guān)),有了上下文之后,我們就可以將相關(guān)數(shù)據(jù)放置在上下文,從而與協(xié)議無(wú)關(guān)(如ServletAPI)的訪(fǎng)問(wèn)/設(shè)置模型數(shù)據(jù),一般通過(guò)ThreadLocal模式實(shí)現(xiàn)。

到此,我們回顧了整個(gè)web開(kāi)發(fā)架構(gòu)的發(fā)展歷程,可能不同的web層框架在細(xì)節(jié)處理方面不同,但的目的是一樣的:

干凈的web表現(xiàn)層:

模型和視圖的分離;

控制器中的控制邏輯與功能處理分離(收集并封裝參數(shù)到模型對(duì)象、業(yè)務(wù)對(duì)象調(diào)用);

控制器中的視圖選擇與具體視圖技術(shù)分離。

輕薄的web表現(xiàn)層:

做的事情越少越好,薄薄的,不應(yīng)該包含無(wú)關(guān)代碼;

只負(fù)責(zé)收集并組織參數(shù)到模型對(duì)象,啟動(dòng)業(yè)務(wù)對(duì)象的調(diào)用;

控制器只返回邏輯視圖名并由相應(yīng)的應(yīng)用控制器來(lái)選擇具體使用的視圖策略;

盡量少使用框架特定API,保證容易測(cè)試。

相關(guān)文章

  • Java中Swing類(lèi)實(shí)例講解

    Java中Swing類(lèi)實(shí)例講解

    這篇文章主要介紹了Java中Swing類(lèi)實(shí)例講解,文中用代碼實(shí)例講解的很清楚,有需要的同學(xué)可以研究下
    2021-02-02
  • mybatis 加載配置文件的方法(兩種方式)

    mybatis 加載配置文件的方法(兩種方式)

    這篇文章主要介紹了mybatis 加載配置文件的方法,通過(guò)實(shí)例代碼給大家介紹了mybatis 加載配置文件的兩種方式,需要的朋友可以參考下
    2017-12-12
  • Java使用openOffice對(duì)于word的轉(zhuǎn)換及遇到的問(wèn)題解決

    Java使用openOffice對(duì)于word的轉(zhuǎn)換及遇到的問(wèn)題解決

    開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)使用java將office系列文檔轉(zhuǎn)換為PDF, 一般都使用微軟提供的openoffice+jodconverter 實(shí)現(xiàn)轉(zhuǎn)換文檔,下面這篇文章主要給大家介紹了關(guān)于Java通過(guò)openOffice對(duì)于word的轉(zhuǎn)換及遇到問(wèn)題的解決方法,需要的朋友可以參考下
    2018-09-09
  • SpringBoot MongoDB詳細(xì)使用教程

    SpringBoot MongoDB詳細(xì)使用教程

    這篇文章主要介紹了SpringBoot整合Mongodb實(shí)現(xiàn)簡(jiǎn)單的增刪查改,MongoDB是一個(gè)以分布式數(shù)據(jù)庫(kù)為核心的數(shù)據(jù)庫(kù),因此高可用性、橫向擴(kuò)展和地理分布是內(nèi)置的,并且易于使用。況且,MongoDB是免費(fèi)的,開(kāi)源的,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • 深入解析kafka 架構(gòu)原理

    深入解析kafka 架構(gòu)原理

    Kafka使用領(lǐng)域非常廣泛,在大數(shù)據(jù)時(shí)代kafka使用真香,LinkedIn、Microsoft和Netflix每天都用Kafka處理萬(wàn)億級(jí)的信息。本文就讓我們一起來(lái)大白話(huà)kafka的架構(gòu)原理,感興趣的朋友一起看看吧
    2021-11-11
  • Spring中的DefaultResourceLoader使用方法解讀

    Spring中的DefaultResourceLoader使用方法解讀

    這篇文章主要介紹了Spring中的DefaultResourceLoader使用方法解讀,DefaultResourceLoader是spring提供的一個(gè)默認(rèn)的資源加載器,DefaultResourceLoader實(shí)現(xiàn)了ResourceLoader接口,提供了基本的資源加載能力,需要的朋友可以參考下
    2024-02-02
  • java8如何根據(jù)某一屬性條件快速篩選list中的集合

    java8如何根據(jù)某一屬性條件快速篩選list中的集合

    這篇文章主要介紹了java8如何根據(jù)某一屬性條件快速篩選list中的集合,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring data jpa @Query update的坑及解決

    Spring data jpa @Query update的坑及解決

    這篇文章主要介紹了Spring data jpa @Query update的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 淺談Java線(xiàn)程間通信之wait/notify

    淺談Java線(xiàn)程間通信之wait/notify

    下面小編就為大家?guī)?lái)一篇淺談Java線(xiàn)程間通信之wait/notify。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • java內(nèi)存溢出示例(堆溢出、棧溢出)

    java內(nèi)存溢出示例(堆溢出、棧溢出)

    這篇文章主要介紹了java內(nèi)存溢出示例(堆溢出、棧溢出),需要的朋友可以參考下
    2014-04-04

最新評(píng)論