国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

用XSLT 和 XML改進(jìn)Struts

2019-11-18 12:49:15
字體:
供稿:網(wǎng)友

  摘要
  Struts是一個優(yōu)秀的java Web開發(fā)框架。Struts是Apache項(xiàng)目之一,現(xiàn)在Struts已經(jīng)在Java開發(fā)團(tuán)體中得到了廣泛的支持。在這篇文章中Julien Mercay 和Gilbert Bouzeid將向我們介紹Struts的處理流程、描繪Struts框架,最后提出了Model 2x。Model 2x用xml/XSLT替換掉了原來的表現(xiàn)層中的jsp頁面。Model 2x通過這種方式更加明晰地劃分了業(yè)務(wù)邏輯層和表現(xiàn)層。
  
  正文
  自從Servlet API發(fā)布以來,Java開發(fā)人員使用了不同的技術(shù)來開發(fā)Web應(yīng)用程序。Web開發(fā)人員已經(jīng)熟悉到了Model 2的優(yōu)點(diǎn)。Model 2 指的是基于MVC模式的WEB開發(fā)框架。Model 2能把應(yīng)用邏輯層和表現(xiàn)層較好地區(qū)分開來。Struts構(gòu)建在Model 2 之上,它向Java開發(fā)人員提供了一個普通的控制器Servlet,還有集中式的資源配置、資源治理以及錯誤處理等功能。
  
  這篇文章中我們引入了Model 2x。Model 2x可以將邏輯層和表現(xiàn)層更好地分離。我們先介紹Model 1和Model 2,然后講述一下Struts是如何實(shí)現(xiàn)MVC架構(gòu)的,最后向讀者展示一下如何通過XML、XSLT來對現(xiàn)存的模式加以改進(jìn)。
  
  Model 1
  理解Model 1是十分重要的,假如不熟悉Model 1將很難理解我們在文章中介紹的其他幾個架構(gòu)。Model 1的基礎(chǔ)是JSP文件。JSP從Http請求中取得參數(shù),調(diào)用所需的業(yè)務(wù)邏輯,處理Http對話,然后生成Html頁面。
  一個完整的Model 1項(xiàng)目包括一組JSP文件(這些文件大部分都是彼此獨(dú)立的)、一組所需的Java類和其他組件。一些早期的Web開發(fā)技術(shù)比如aspphp都使用類似的模式來開發(fā)的。
  
  Model 1主要也許是唯一的優(yōu)勢就是簡單。Model 1中業(yè)務(wù)邏輯和顯示邏輯混合在JSP頁面中沒有進(jìn)行抽象和分離,所以在進(jìn)行快速和小規(guī)模的應(yīng)用開發(fā)時,有非常大的優(yōu)勢的。但用Model 1 開發(fā)復(fù)雜的項(xiàng)目的開發(fā)時,將不可避免地導(dǎo)致項(xiàng)目治理的困難。
  
  Model 2, MVC, and Struts/JSP
  
 用XSLT 和 XML改進(jìn)Struts(圖一)

  
圖1

  
  圖1說明的是MVC架構(gòu)中的三個部分,以及它們在Struts/JSP中的實(shí)現(xiàn)。
  控制器(Controller):Struts的最主要的部件就是一個普通的控制器Servlet。控制器是每一個發(fā)送到Struts的Http請求的入口點(diǎn)。控制器把所有的請求經(jīng)解釋后分發(fā)action。這些action是Struts Action類的子類。由開發(fā)人員負(fù)責(zé)實(shí)現(xiàn)它們。控制器也會自動的把Http請求中的參數(shù)加入到Form bean中。Action負(fù)責(zé)實(shí)現(xiàn)核心的業(yè)務(wù)邏輯,比如做EJB調(diào)用,通過Java Bean訪問模型(model)。在Struts中可以通過定義一個XML文件來描述請求URI、具體業(yè)務(wù)邏輯處理、代表客戶提供的數(shù)據(jù)的Form組件三者之間的映射關(guān)系。控制器的就是通過這個XML文件來定義的。
  
  模型(Model):
  Java beans就是模型的代表。這些bean分成3類:
  窗體Bean(Form Bean)對象用來包裝HTML表單數(shù)據(jù),當(dāng)然也包括通過URL請求傳遞過來的數(shù)據(jù)。舉例來說,一個登陸頁面可能有兩個屬性(PRoperty)login和passWord。Form Bean由Struts的ActionForm類擴(kuò)展而來。
  請求Bean(Request Bean)擁有用來生成HTML頁面的所需的信息。例如在一個表現(xiàn)銀行賬戶狀態(tài)的頁面中,請求Bean就應(yīng)該有賬戶相關(guān)信息以及近期的交易記錄等等。
  會話Bean(session Bean)擁有同一用戶在不同Http請求間共享的對話信息。
  
  視圖(View):
  Struts控制器會把Http請求轉(zhuǎn)發(fā)到作為MVC視圖的JSP文件。這個JSP文件可以訪問窗體Bean、請求Bean、會話Bean,生成結(jié)果文檔(通常是一個HTML文檔),并發(fā)送到客戶端。Struts提供了四組JSP標(biāo)志庫。
   HTML:用來生成HTML標(biāo)志,非凡是用來自模型的數(shù)據(jù)填寫HTML表單。
   Bean: 操作Bean。
   Logic: 根據(jù)Bean值實(shí)現(xiàn)邏輯結(jié)構(gòu)。
   Template:處理頁面模板
  通過Struts標(biāo)志的使用,你可以避免在視圖中使用任何的Java代碼。
  
  Struts/JSP 缺點(diǎn)
  雖然Struts/JSP較之其他模式有許多優(yōu)勢,但它也存在著一些缺點(diǎn)和不足:
  程序員可以把應(yīng)用邏輯放入JSP。碰到問題時,開發(fā)人員可以很快地加以修改,經(jīng)驗(yàn)表明這實(shí)際上是陷阱。程序結(jié)構(gòu)很輕易變得復(fù)雜和難于治理。
  
  JSP不能很好地支持XML,也就不能保證生成的結(jié)果文檔(XML或HTML文檔)將會是100%“格式良好”(Well-Formed)。
  
  開發(fā)人員需要學(xué)習(xí)如何使用Struts的標(biāo)志庫。事實(shí)上要理解這些Struts的標(biāo)志庫,非凡是Bean和HTML標(biāo)志庫的確要花費(fèi)比較長的時間。
  
  你不能在視圖中用JSP來實(shí)現(xiàn)處理管道(processing pipeline)。只能做些簡單的include和forward,這樣很明顯就會限制了視圖的靈活性。例如,對布局計和風(fēng)格的分離就會比較困難。
  
  對JSP頁面的任何修改都會導(dǎo)致JSP的重新編譯,這樣是非常耗費(fèi)時間的。
  
  上述問題的解決方法必須要具備以下要求:
  限制視圖對模式和一些定義明確的上下文環(huán)境信息的可見程度,比如項(xiàng)目資源的可見程度就應(yīng)該受到控制。
  強(qiáng)制使用格式良好的XML和HTML
  能夠?qū)υ诂F(xiàn)存的語言或API起到杠桿作用
  降低對視圖不同部分分離的難度,比如布局和風(fēng)格的分離。
  縮短開發(fā)周期
  我們相信我們接下來討論的這個基于未加修改的Struts和XSLT的輕型框架可以滿足上述的要求。我們把這個新的架構(gòu)叫做Model 2x
  
  Model 2x架構(gòu)概觀
  Model 2x是 Struts和XSLT結(jié)合的產(chǎn)物。Model 2x基在視圖部分用XSLT和最后會被串行化成XML文件的Bean替代了原來Struts視圖部分的JSP文件,但原封不動地保留Struts的Controller和Model部分。
  
  XSLT定義
  作為一種W3C的正式標(biāo)準(zhǔn),XSLT是用來對XML文檔進(jìn)行轉(zhuǎn)化的一種語言。它是XSL(可擴(kuò)展樣式表語言)的一部分。XPath是用作對XML文檔各部分進(jìn)行定位的語言。在XSL樣式中,我們可以利用XPath表達(dá)式以一種緊湊而高效的形式選取XML文檔的一部分進(jìn)行處理。
  
  XSL/FO也是XSL的規(guī)范的一部分,用來描述顯示給讀者的頁面外觀。XSL/FO主要的一個應(yīng)用就是生成PDF文檔。
  
  XSLT和Struts的合成
  把Struts和XSLT結(jié)合在一起的方法一是在JSP頁面中執(zhí)行XSLT轉(zhuǎn)換。我們可以用標(biāo)志庫來實(shí)現(xiàn)這一功能,比如你可以使用Jakarta項(xiàng)目中的一個XSL標(biāo)志庫項(xiàng)目來實(shí)現(xiàn)。假如使用這種方式,那么在JSP頁面中生成的是應(yīng)該是XML而不是原來的HTML。借助XSLT樣式表,XML轉(zhuǎn)化成HTML或其他格式。然而這種方式需要對Struts本身加以修改。
  
  生成HTML最通常的方式是由Struts的HTML標(biāo)簽庫來生成,但這類標(biāo)志庫與XML并不兼容,也就不能和XSLT結(jié)合起來使用。當(dāng)然可以對HTML標(biāo)志庫加以修改讓其輸出XHTML,這并不困難,但這就要修改現(xiàn)有的Struts 1.0 代碼。
  此外,這一解決方案需要在四個不同的地方開發(fā):Action 類(控制器)、模型Bean、JSP頁面、XSLT樣式表(視圖)。JSP與標(biāo)簽庫的作用也只限于把模式Bean轉(zhuǎn)化成一個XML文檔。
  
  第二種方法就是我們提出的Model 2x。這種方法會自動執(zhí)行這一任務(wù),而且把JSP頁面從我們的解決方案中刪除了。圖2向我們很好地展示了Model 2x設(shè)計的核心構(gòu)成。
  
 用XSLT 和 XML改進(jìn)Struts(圖二)

  
圖2

  
  我們從圖2中可以看出來,Model 2x處理流程的最初部分和Struts的類似。請求被發(fā)送到Struts的控制器,然后又被分派給各自的業(yè)務(wù)邏輯處理單元(Action類的子類)。控制器創(chuàng)建ActionForm對象。請求的參數(shù)都保存到這個ActionForm對象中。Action類的子類生成結(jié)果Bean(Result Bean),然后把這些Bean交給視圖來顯示。
  
  Model 2x和Struts處理流程不同的地方在于:Model 2x中用一個XSL Servlet配合XSLT樣式表實(shí)現(xiàn)了原來在Struts中由JSP實(shí)現(xiàn)的視圖部分。這個XSL Servlet首先根據(jù)Bean和上下文環(huán)境生成XML文檔,然后調(diào)用XSLT進(jìn)行轉(zhuǎn)換。接下來我們會具體地講述這個過程。由于我們可以把一個請求提交給任何一個已經(jīng)在Struts配置文件中注冊的URL,所以在這個過程中不用對Struts做任何的修改。
  
  XML文檔的生成
  把一個對象轉(zhuǎn)換到一個Stream的過程我們稱之為串行化。在Java 1.1中引入了java.io.Serializable接口和相關(guān)的API。二進(jìn)制串行化可以把一個Java對象轉(zhuǎn)化到二進(jìn)制流,在網(wǎng)絡(luò)上傳輸或是保存到文件中。相比之下,XML串行化是把一個Java對象樹轉(zhuǎn)化到文本型的XML流中。
  
  許多開放源代碼的軟件包,譬如Castor都可以用來執(zhí)行XML串行化。在我們文章中提到的Model 2x案例中我們自行設(shè)計了一個簡單的XML串行化方案。這個方案中假設(shè)Bean的所有屬性是Java的基本類型或者java.util.Colleciton的子類。
  
  這個方案會遞歸地對窗體Bean(Form Bean)、請求Bean(Request Bean)和Session bean進(jìn)行自省,創(chuàng)建一個DOM樹。同時,也串行化了資源和Struts配置數(shù)據(jù)也就是上下文環(huán)境信息。圖3說明了這個過程
  
用XSLT 和 XML改進(jìn)Struts(圖三)

  
圖3 XML/XSL 工作流程

  
  XSLT處理
  在這個Model 2x案例中,XSLT轉(zhuǎn)換只限于樣式表對XML流的轉(zhuǎn)換。為了提高性能XSLServlet會對這個樣式表進(jìn)行了緩存處理。XML流著由Struts的處理流程生成。你可以通過提供連續(xù)轉(zhuǎn)化或者使用更高級的配置來改進(jìn)這個簡單的架構(gòu)。Cocoon中你就可以看到這兩種方式的使用。Cocoon框架使用XML和XSLT構(gòu)建服務(wù)器端的應(yīng)用程序。Cocoon基于管道(Pipeline)的架構(gòu)使其能夠更輕易對內(nèi)容和邏輯的加以分離、與大量不同的數(shù)據(jù)源交互也很方便。通過XSLT,Cocoon的輸出可以與不同的設(shè)備兼容,比如HTML、WAP等等。
  圖3顯示的是XSLT的處理流程。下面

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 融水| 邵阳县| 潞城市| 南华县| 叶城县| 惠来县| 金堂县| 盖州市| 安顺市| 高碑店市| 玉林市| 台北市| 赞皇县| 永丰县| 青川县| 湘乡市| 荆州市| 四平市| 华亭县| 桂平市| 朝阳市| 兰溪市| 女性| 江门市| 桃江县| 横山县| 冀州市| 巴青县| 平山县| 新干县| 淳安县| 福安市| 乐陵市| 英山县| 筠连县| 青田县| 和政县| 株洲县| 黄石市| 水富县| 抚宁县|