日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

MVC架構(gòu)在Web應(yīng)用系統(tǒng)的應(yīng)用

出處:黃 偉 發(fā)布于:2011-08-28 09:49:08

 

  和C/S結(jié)構(gòu)相比,B/S結(jié)構(gòu)受限于網(wǎng)絡(luò)帶寬不利于進(jìn)行大數(shù)據(jù)量的統(tǒng)計(jì)分析,網(wǎng)絡(luò)傳輸存在潛在的安全問(wèn)題,還有用戶界面不及C/S結(jié)構(gòu)友好等等,但隨著網(wǎng)絡(luò)帶寬和網(wǎng)絡(luò)應(yīng)用的發(fā)展,加上AJAX技術(shù)的流行,使得現(xiàn)在越來(lái)越多的MIS系統(tǒng)或基于MIS系統(tǒng)的化應(yīng)用系統(tǒng)都開(kāi)始傾向于采用B/S結(jié)構(gòu)進(jìn)行設(shè)計(jì),充分利用B/S結(jié)構(gòu)的優(yōu)點(diǎn)。但是,要充分發(fā)揮Web應(yīng)用的內(nèi)在潛力,挖掘應(yīng)用深度和擴(kuò)大適應(yīng)能力,需要采用先進(jìn)的應(yīng)用架構(gòu)和以實(shí)用為根本準(zhǔn)則,使得系統(tǒng)既能滿足業(yè)務(wù)需求,又能適應(yīng)將來(lái)發(fā)展需要。因此,在開(kāi)發(fā)Web應(yīng)用系統(tǒng)時(shí)需要盡量遵循Web應(yīng)用系統(tǒng)設(shè)計(jì)原則。

  1  MVC描述的軟件模型

  MVC是三個(gè)單詞的縮寫(xiě),分別為: 模型(Model),視圖(View)和控制Controller)。 MVC模式的目的就是實(shí)現(xiàn)Web系統(tǒng)的職能分工。 Model層實(shí)現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通??梢杂肑avaBean或EJB來(lái)實(shí)現(xiàn)。 View層用于與用戶的交互,通常用JSP來(lái)實(shí)現(xiàn)。 Controller層是Model與View之間溝通的橋梁,它可以分派用戶的請(qǐng)求并選擇恰當(dāng)?shù)囊晥D以用于顯示,同時(shí)它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。這三層結(jié)構(gòu)之間的關(guān)系如圖1所示。

  模型層(也稱業(yè)務(wù)層)用于處理程序邏輯。它的任務(wù)是管理應(yīng)用程序域的行為和數(shù)據(jù),響應(yīng)來(lái)自控制層的狀態(tài)指令,把原有數(shù)據(jù)按照業(yè)務(wù)邏輯轉(zhuǎn)換成指定意義的數(shù)據(jù)提供給視圖層顯示。

  視圖層用于把表示模型數(shù)據(jù)、邏輯關(guān)系和狀態(tài)的信息以特定的形式表現(xiàn)在用戶界面上。視圖層的顯示信息來(lái)自模型層,同一個(gè)模型可以對(duì)應(yīng)多個(gè)視圖。

  控制層用于處理用戶與軟件的交互操作。控制層通知模型和視圖做出相應(yīng)的狀態(tài)改變,使模型和視圖協(xié)調(diào)工作。

  2  MVC模式設(shè)計(jì)

  模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個(gè)部件中,模型擁有多的處理任務(wù)。例如它可能用象EJBs和ColdFusion Components這樣的構(gòu)件對(duì)象來(lái)處理數(shù)據(jù)庫(kù)。被模型返回的數(shù)據(jù)是中立的,就是說(shuō)模型與數(shù)據(jù)格式無(wú)關(guān),這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)。由于應(yīng)用于模型的代碼只需寫(xiě)就可以被多個(gè)視圖重用,所以減少了代碼的重復(fù)性。MVC模式把界面表現(xiàn)和邏輯控制語(yǔ)句強(qiáng)制分離,解決了頁(yè)面設(shè)計(jì)和程序開(kāi)發(fā)中的工作交錯(cuò)與沖突,并解決了由于商業(yè)邏輯嵌入造成程序不可重用而且很難維護(hù)的問(wèn)題。

  本文設(shè)計(jì)了一個(gè)基于PHP語(yǔ)言、XML和XSL模板技術(shù)的MVC架構(gòu)的Web應(yīng)用系統(tǒng)。

  2.1 代碼結(jié)構(gòu)

  在系統(tǒng)中每一個(gè)頁(yè)面被定義為一個(gè)Action,控制器中定義了每一個(gè)Action對(duì)應(yīng)的模型和視圖,它們之間的對(duì)應(yīng)關(guān)系如圖2所示。

  表1為系統(tǒng)的基礎(chǔ)代碼結(jié)構(gòu),除少量的靜態(tài)頁(yè)面放在htdocs目錄下外,其余的程序都放在PHP的庫(kù)文件目錄下。

  在這個(gè)代碼結(jié)構(gòu)中,模型、視圖和控制器三部分分別放置在不同目錄中。其中,視圖層包括顯示模板(XSL)和頁(yè)面操作控制(JS)二部分,模型層包括業(yè)務(wù)邏輯處理類庫(kù)(Action Class)、數(shù)據(jù)輸出處理(Action Execute)和PHP基礎(chǔ)類庫(kù)(PHP Class)三部分。因此,在系統(tǒng)中各部分的開(kāi)發(fā)由不同的角色來(lái)完成,角色之間的工作交錯(cuò)和沖突可以減少,使系統(tǒng)程序升級(jí)和維護(hù)的思路也更加明晰。

  2.2 系統(tǒng)實(shí)現(xiàn)

  在系統(tǒng)中,客戶端瀏覽器中呈現(xiàn)的是系統(tǒng)的視圖部分,而模型和控制器則是透明的。當(dāng)Web 服務(wù)器接收到客戶提交的HTTP請(qǐng)求后,交給服務(wù)器中的控制器來(lái)處理。控制器按照請(qǐng)求中的Action信息,從系統(tǒng)配置中提取此Action的映射表,并把此請(qǐng)求映射到相應(yīng)的處理模型;處理模型進(jìn)行業(yè)務(wù)邏輯處理,處理完后返回狀態(tài)更新的請(qǐng)求并將XML格式的數(shù)據(jù)結(jié)果給控制器;控制器根據(jù)結(jié)果選擇相應(yīng)視圖模板并合成視圖返回給客戶。程序架構(gòu)如圖3所示。

  2.2.1 控制層的實(shí)現(xiàn)

  在這個(gè)系統(tǒng)中,控制器主要有以下四個(gè)作用。

 ?。?)根據(jù)Action名稱從數(shù)據(jù)庫(kù)的映射表中找到處理此Action的模型信息、視圖模板和此視圖的用戶操作控制信息。

 ?。?)調(diào)用模型處理Action請(qǐng)求。

  (3)合成業(yè)務(wù)邏輯處理返回的XML格式的數(shù)據(jù)信息和XSL視圖模板為HTML的文件,并返回給客戶端。

 ?。?)在接收到一個(gè)業(yè)務(wù)邏輯處理模型返回的狀態(tài)更新請(qǐng)求后,調(diào)用一個(gè)新的業(yè)務(wù)邏輯處理模型處理此請(qǐng)求。

  控制器主要包括二個(gè)文件:includes/prepend.inc和includes/controller/controller.inc.prepend.inc文件被設(shè)定為自動(dòng)增加在被訪問(wèn)的文件前,因此這個(gè)文件非常適合作為控制器的主文件;Controller.inc中主要是控制器中的處理函數(shù)。這二個(gè)文件的代碼如下。

  prepend.inc

  <?

  include_once(″/action/configure/db.conf″);//數(shù)據(jù)庫(kù)連接對(duì)象

  include_once(″/control/controller.inc″);//控制器

  …

  $actionobj=getaction($action);     //獲得Action信息

  if($actionobj[″model″] !=″″){

  //調(diào)用model處理action請(qǐng)求信息

  include_once($actionobj[″model″]);

  eval(″\$modelobj=execute_″。$actionobj[″action″].″( );″);

  if($modelobj[″type″]==″xmldata″){//返回html

  //輸出xml和xsl合成的html數(shù)據(jù)

  echo xmlpraser($modelobj[″data″],$actionobj[″view″]);

  }else if($modelobj[″type″]==″state″){  //請(qǐng)求更新?tīng)顟B(tài)

  header(″Location:?″。$modelobj[″data″]); //交新模型處理

  exit;

  }

  }else{//直接調(diào)用View輸出}

  ?>

  controller.inc:

  <?

  ****得actionobj的信息****

  function getaction($action){

  global $dbobj,$conn,$result_id;      //數(shù)據(jù)對(duì)象,連接,結(jié)果集

  //從數(shù)據(jù)庫(kù)中檢索action對(duì)象信息

  $sqlstr=″select*from t_action where action=′″。$action.″′″;

  $result_id=$dbobj->exec($conn,$sqlstr);

  if($dbobj->fetch_row($result_id)){

  $actobj[″action″]=$action;

  //action的處理模型名稱

  $actobj[″model″]=$dbobj->result($result_id,″model″);

  //action的視圖模板信息

  $actobj[″view″]=$dbobj->result($result_id,″template″);

  //其他控制參數(shù)

  }else{ … }

  return $actobj;

  }

  //****解析xml和xslt****

  function php_scheme_get_all($Processor,$Schema,$RestUri){

  $url=$Schema .′:′。 $RestUri;

  return file_get_contents($url);

  }

  function xmlpraser($data,$xslpath){

  global $SYS_INCLUDEPATH;

  $parser=xslt_create( );  //初始化解析對(duì)象

  xslt_set_scheme_handlers($parser,array(′get_all′=>

  ′php_sheme_get_all′));      //設(shè)置處理方式

  $parms[″_xml″]=″<?xml version=\″1.0\″ encoding=\″gb2312\

  ″?>″ . $data;             //合成xml格式數(shù)據(jù)

  $parms[″_xsl″]=file_get_contents($SYS_INCLUDEPATH.

  ″\\″ . $xslpath);         //讀取xsl模板文件

  $result.=xslt_process($parser,′arg:/_xml′,′arg:/_xsl′,

  NULL,$parms);        //合成視圖

  xslt_free($parser);    //釋放解析對(duì)象

  return $result;

  }

  ?>

  2.2.2 模型層的實(shí)現(xiàn)

  模型是系統(tǒng)的數(shù)據(jù)。此系統(tǒng)中模型層主要包括三部分內(nèi)容。

  (1)業(yè)務(wù)邏輯處理。業(yè)務(wù)邏輯處理又可以分為二類:一類是抽象出來(lái)的業(yè)務(wù)邏輯,被封裝成一個(gè)個(gè)PHP類;另一類是對(duì)某一具體Action的邏輯處理。

 ?。?)PHP的基礎(chǔ)類庫(kù)。此部分與業(yè)務(wù)邏輯無(wú)關(guān),描述的是對(duì)任何一類的應(yīng)用系統(tǒng)中都要使用的公共函數(shù)類,這些類可以被其他程序調(diào)用。

 ?。?)數(shù)據(jù)輸出處理,把PHP數(shù)據(jù)轉(zhuǎn)換成XML格式輸出。

  按照控制器的定義,每一個(gè)Actionname都要調(diào)用一個(gè)命名為execute_actionname( )的函數(shù),這個(gè)函數(shù)會(huì)返回Action的處理結(jié)果。處理結(jié)果有二種情況:一種是返回XML格式的數(shù)據(jù);一種是返回要求系統(tǒng)更新?tīng)顟B(tài)的狀態(tài)值。一個(gè)典型的模型處理器程序結(jié)構(gòu)如下:

  <include_once(″/action/tool/tools.inc″);  //工具系統(tǒng)的基礎(chǔ)類

  function gettoollist($toolid){       //獲得工具信息

  //指定要獲得的工具信息

  $params=array(″toolname″,″part_no″,″quantity″);

  $toolobj=new toolinfo;         //創(chuàng)建toolinfo類實(shí)例

  $toolstinfo=$toolobj->GetToolListinfo($toolid,$params);

  return $toolsinfo;           //返回工具列表信息

  }

  function getxml($toolsinfo){      //轉(zhuǎn)換工具信息為xml格式

  while(list($id,$toolarray)=each($toolsinfo[″data″])){

  $xmlstr.=″<items>″;

  while(list($key,$value)=each($toolarray)){

  $xmlstr.=″<″ .$key. ″>″。$value.″</″。$key.″>″;

  }

  $xmlstr.=″</items>″;

  }

  return $xmlstr;

  }

  function execute_tool_toollist( ) {    //工具列表action的處理函數(shù)

  $toolinfo=gettoollist($toolid);      //工具信息

  if($toolinfo[″state″]){          //輸出xml格式數(shù)據(jù)

  $rtnobj[″type″]=″xmldata″;

  $rtnobj[″data″]=getxml(($toolinfo);

  }else{                //跳轉(zhuǎn)到錯(cuò)誤處理頁(yè)面

  $rtnobj[″type″]=″state″;

  $rtnobj[″data″]=″e(cuò)rrorhandle″;

  }

  return $rtnobj;

  }

  ?>

  2.2.3 視圖層的實(shí)現(xiàn)

  視圖是一個(gè)虛擬表,其內(nèi)容由查詢定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫(kù)中以存儲(chǔ)的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來(lái)自由定義視圖的查詢所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。對(duì)其中所引用的基礎(chǔ)表來(lái)說(shuō),視圖的作用類似于篩選。定義視圖的篩選可以來(lái)自當(dāng)前或其它數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)表,或者其它視圖。分布式查詢也可用于定義使用多個(gè)異類源數(shù)據(jù)的視圖。此系統(tǒng)即使用了XSL模板技術(shù)。系統(tǒng)中的視圖層包括二部分:一部分是放在/includes/template目錄下的XSL模板;另一部分是放在/htdocs目錄下的js和css文件。,由控制器來(lái)完成合成視圖的任務(wù)。

  2.3 系統(tǒng)適應(yīng)性

  從整個(gè)系統(tǒng)的設(shè)計(jì)結(jié)構(gòu)可以看出,系統(tǒng)的業(yè)務(wù)邏輯和顯示是分離的:首先由網(wǎng)頁(yè)設(shè)計(jì)人員和程序員共同確定需要的數(shù)據(jù)項(xiàng)和Action名稱,在控制器中添加此Action;之后,網(wǎng)頁(yè)設(shè)計(jì)人員設(shè)計(jì)各個(gè)顯示模板;程序人員完成相應(yīng)的模型處理程序。這樣的設(shè)計(jì)方法有利于對(duì)系統(tǒng)的維護(hù)和功能擴(kuò)展。

  在MVC系統(tǒng)中處理用戶需求的思路非常明確。視圖的修改和模型處理的修改基本上是獨(dú)立的,無(wú)論是在系統(tǒng)開(kāi)發(fā)時(shí)期還是在系統(tǒng)維護(hù)時(shí)期,網(wǎng)頁(yè)設(shè)計(jì)人員和程序員都可以更加專注于自己的任務(wù)。系統(tǒng)中的模型可以是自包含的,由于與控制器和視圖相分離,所以很容易改變程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。例如把數(shù)據(jù)庫(kù)從Mysql移植到Oracle上只需改變數(shù)據(jù)庫(kù)連接模型即可;而把界面顯示從HTML改為Flash或WAP只需改變視圖顯示和相應(yīng)控制器即可。一旦正確地實(shí)現(xiàn)了模型,視圖將會(huì)正確地加以顯示。這樣,系統(tǒng)維護(hù)的成本和項(xiàng)目的開(kāi)發(fā)風(fēng)險(xiǎn)都被大大降低。

  3  結(jié)束語(yǔ)

  MVC設(shè)計(jì)思想中的三部分是相互獨(dú)立的,既可以通過(guò)不同的技術(shù)實(shí)現(xiàn),也可以運(yùn)行在不同的基礎(chǔ)平臺(tái)上。隨著更多新技術(shù)的出現(xiàn),還可以創(chuàng)造出更多的應(yīng)用方式。所以MVC設(shè)計(jì)模式的確是一個(gè)創(chuàng)建軟件的途徑。

  本文所描述的只是MVC應(yīng)用系統(tǒng)開(kāi)發(fā)的一個(gè)基礎(chǔ)模式。模型和視圖嚴(yán)格分離的模式相對(duì)混合模式,對(duì)開(kāi)發(fā)和設(shè)計(jì)人員的要求要高一些,但更容易進(jìn)行錯(cuò)誤控制。此外,在實(shí)際的應(yīng)用中,開(kāi)發(fā)者還要結(jié)合各應(yīng)用項(xiàng)目的業(yè)務(wù)需要進(jìn)行詳細(xì)的設(shè)計(jì)規(guī)劃,認(rèn)真考慮應(yīng)用的額外復(fù)雜性。只有把這些想法融進(jìn)到架構(gòu)中,才能增加應(yīng)用的可拓展性。只有把握這一點(diǎn),MVC模式才會(huì)使得應(yīng)用系統(tǒng)更加健壯、更加靈活和更容易擴(kuò)展。

 


  

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買(mǎi)家服務(wù):
賣(mài)家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見(jiàn),您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見(jiàn)一經(jīng)采納,將有感恩紅包奉上哦!