作者:yarshray
關(guān)鍵字: Java J2EE MVC JSP Servlet MVC Struts
內容簡(jiǎn)介:
MVC設計模式成為了目前十分流行的一種設計方法.它是一種軟件的設計方法模式.并且被大量的開(kāi)發(fā)和實(shí)踐所證明.因此本文通過(guò)介紹Struts框架這種已經(jīng)實(shí)現了MVC模式的軟件構件框架了討論該模式的優(yōu)勢和如何投入到軟件開(kāi)發(fā)中去.
本文內容注重理論和實(shí)踐相結合,比較系統的從多層設計方式到分布式軟件開(kāi)發(fā)中所用到的技術(shù),從而切入目前Sun公司退出的J2EE框架模型,然后更加該框架討論了與之相關(guān)的技術(shù),包括JSP,Servlet,用戶(hù)定義標簽等相關(guān)主題,然后討論其優(yōu)勢和缺陷,最后引出文章的主題,Struts框架,該框架通過(guò)實(shí)現MVC設計模式從而改變了以往的設計方法,使得開(kāi)發(fā)一套基于J2EE框架的應用程序十分具有廣泛的適應性和極高的效率.
名人名言:
──牛頓
──泰勒
引言:
現階段軟件開(kāi)發(fā)已經(jīng)進(jìn)入了面向對象,組件化,分布應用的階段.Sun 公司推出的Java2 Enterprise Edition(J2EE)平臺已經(jīng)日趨成熟.并得到了廣泛的應用.J2EE中所定義的Web容器中的WEB組件也成為了目前開(kāi)發(fā)WEB應用主要工具和手段.JavaServer Page (JSP)技術(shù),幾乎是每一個(gè)JAVA WEB應用開(kāi)發(fā)的必須開(kāi)發(fā)組件.
目前的Web容器也是繁花似錦,一些免費的開(kāi)源的組織也加入到這項運動(dòng)中來(lái)了.如Apache軟件組織提供的Tomcat就是一個(gè)非常優(yōu)秀的Web容器,這也推動(dòng)了Java的Web應用的發(fā)展.隨著(zhù)Java的Web技術(shù)的成熟和市場(chǎng)的巨大需求.越來(lái)越多的開(kāi)發(fā)人員都開(kāi)始使用一些已經(jīng)被開(kāi)發(fā)所認同的開(kāi)發(fā)框架了.而現在軟件開(kāi)發(fā)的思想觀(guān)念已經(jīng)不是”我們是否要使用軟件框架” 而是說(shuō) ”使用什么軟件開(kāi)發(fā)框架”.
因此,選用優(yōu)秀的開(kāi)發(fā)框架是作為一個(gè)軟件開(kāi)發(fā)人員所必須的.Jakarta-Struts是由Apache軟件組織提供的一套開(kāi)發(fā)源代碼的項目,它實(shí)現了模型---視圖---控制器(Model---View---Controller) MVC 設計模式.其廣泛的適應性和高度的擴展能力加上對生產(chǎn)效率的極大提高成為了目前Java的Web開(kāi)發(fā)所逐步認可的標準.
當然,作為我們這些開(kāi)發(fā)人員也同樣是一種挑戰,我必須要理解這些新的觀(guān)念和認識并接受這一開(kāi)發(fā)模式的帶來(lái)的優(yōu)勢,這需要我們對理論的理解和大量的開(kāi)發(fā)實(shí)踐.
Java WEB應用程序介紹
Java Web應用就是通過(guò)在Web容器上開(kāi)發(fā)和部署Java的Web組件來(lái)構建應用的工作.其包括的技術(shù)主要是Java Server Page 和 Servlet 技術(shù).此外開(kāi)發(fā)一個(gè)完整的Java的Web應用還包括以下一些技術(shù):
l JavaBean組件技術(shù)
l EJB組件技術(shù)
l 用戶(hù)自定義標記庫
l XML標簽語(yǔ)言
l J2EE相關(guān)容器
圖 1 Java Web 應用的技術(shù)結構
Servlet控制器組件技術(shù)
Servlet在一個(gè)典型的Web應用中擔任的重要角色就是Servlet非常適合做Web頁(yè)面之間的消息轉發(fā)器.因為Servlet是一個(gè)被Web容器動(dòng)態(tài)加載的組件模塊,它并不十分適合做用戶(hù)的界面表示,而當Web用戶(hù)發(fā)出請求的時(shí)候Servlet組件可以通過(guò)Servlet容器來(lái)捕獲這個(gè)請求消息,這樣它可以調用模型組件來(lái)出來(lái)這個(gè)消息.
圖 2 Servlet 的處理流程
當客戶(hù)程序(如: 瀏覽器)首先向Servlet容器發(fā)出Web請求,服務(wù)器接受到請求以后會(huì )調用相應的Servlet組件來(lái)執行相應的程序來(lái)完成這個(gè)請求,然后Servlet組件吧處理結果交給Servlet容器,再由Servlet容器把請求回復給客戶(hù)程序.這也是一個(gè)典型的web應用的執行過(guò)程.Java的Servlet技術(shù)提供了一組用戶(hù)的編程接口為開(kāi)發(fā)人員定義了相關(guān)的類(lèi).
Servlet Api中以下幾個(gè)比較重點(diǎn)的類(lèi)決定了Servlet的處理流程:
l HttpServlet :該類(lèi)提供了用戶(hù)擴展的能力,用戶(hù)通過(guò)繼承該類(lèi)編寫(xiě)Servlet組件.主要填寫(xiě)Http方法(如: doPost doGet)完成服務(wù).
l HttpServletRequest: 該類(lèi)提供了接受用戶(hù)請求數據的能力,該類(lèi)通常是由Web容器在一次客戶(hù)請求服務(wù)中創(chuàng )建的.Servlet可以通過(guò)該對象訪(fǎng)問(wèn)到請求時(shí)用戶(hù)的請求數據.
l HttpServletResponse: 該類(lèi)用于生成執行后的相應結果.該類(lèi)也是由Web容器在服務(wù)中創(chuàng )建的.
l HttpSession: 該了同類(lèi)處理客戶(hù)的會(huì )話(huà)跟蹤.
l ServletContext: Servlet容器為每個(gè)Web 應用模塊都提供了一個(gè)環(huán)境來(lái)保持該應用模塊的狀態(tài).這組狀態(tài)是該模塊中所有Web組件可以訪(fǎng)問(wèn)到的共享信息.
以上對Servlet組件有了一個(gè)大體的介紹,如果要深入了解有關(guān)Servlet的技術(shù)可以訪(fǎng)問(wèn)站點(diǎn): http://www.servlet.com .那里會(huì )有詳細的介紹.
JSP組件技術(shù)
JSP組件技術(shù)是對傳統靜態(tài)Web頁(yè)面(HTML)的擴展,使得傳統的靜態(tài)頁(yè)面可以加入Java的程序代碼,以提供程序編輯產(chǎn)生頁(yè)面的效果.并且該組件技術(shù)也運行的J2EE Web容器上的組件技術(shù).
JSP的本質(zhì)實(shí)際就是Servlet組件技術(shù),只是JSP技術(shù)更利于用來(lái)做用戶(hù)的表示界面.
圖3 Web容器初次執行瀏覽器請求處理JSP的過(guò)程
JSP頁(yè)面在初次接受到用戶(hù)的請求的時(shí)候,首先Web容器會(huì )翻譯JSP腳本文件,然后生成Servlet源代碼,在把Servlet源代碼編譯成java的ByteCode 生成Class文件.然后同Servlet的執行過(guò)程一樣處理頁(yè)面流程.
如果讀者想更進(jìn)一步了解Jsp技術(shù),可以http://java.sun.com/products/jsp/ 該站點(diǎn)可以獲得更多幫助.
JavaBean組件在Web應用程序的作用
JavaBean 是一種符合特定規范的Java類(lèi).在JavaBean中定義了以系列屬性和方法.我們通??梢园褬I(yè)務(wù)對模型和業(yè)務(wù)流程模型封裝在JavaBean中,簡(jiǎn)單的說(shuō)JavaBean很適合在Web應用中充當模型組件的角色.
JSP標準標簽中已經(jīng)定義了一組對JavaBean支持的標簽.并定義了JavaBean對象在執行過(guò)程中的生命周期.包括 page ,request,session 和 application 四種范圍.并提供了對JavaBean訪(fǎng)問(wèn)時(shí)的屬性支持.
如果要詳細了解有關(guān)JavaBean,讀者可以參考 http://java.sun.com/products/javabeans 站點(diǎn)提供了非常詳細的介紹.
用戶(hù)定義標簽
JSP中的用戶(hù)定義標簽為開(kāi)發(fā)者提供了很好界面和功能擴展能力.它支持用戶(hù)可以在JSP頁(yè)面中定義相應的業(yè)務(wù)標記.通常這些標記繼承自TagSupport類(lèi).并通過(guò)重寫(xiě)TagSupport類(lèi)的相關(guān)方法來(lái)擴展功能.
在Struts中,Struts框架定義了一組用戶(hù)標簽.其主要包括:
l Bean標簽,用來(lái)支持JavaBean的訪(fǎng)問(wèn)
l HTML標簽 用來(lái)支持HTML界面元素的創(chuàng )建和訪(fǎng)問(wèn)
l Logic標簽 用來(lái)支持邏輯執行
l Neted標簽和Tiles標簽 用來(lái)支持界面表示
EJB組件技術(shù)
Enterprise Java Bean 簡(jiǎn)稱(chēng) EJB 是一套基于標準的分布式對象組件技術(shù).它是CORBA和 RMI的服務(wù)器端Java組件.EJB技術(shù)和JavaBean技術(shù)一樣在企業(yè)開(kāi)發(fā)中處理業(yè)務(wù)邏輯.他們的區別在于EJB組件是分布式的必須運行EJB容器中.而JavaBean組件是運行在調用方內存的組件.
EJB定義了基本用來(lái)處理業(yè)務(wù)流程邏輯的會(huì )話(huà)Bean和用來(lái)維護業(yè)務(wù)持久狀態(tài)的實(shí)體Bean.以及處理基于消息驅動(dòng)的消息Bean.
EJB組件所以運行的EJB容器,為EJB組件維護了安全性,事務(wù)性,持久性,并行性,等多種服務(wù).并提供了開(kāi)發(fā),部署,運行等環(huán)境的支持.
讀者可以訪(fǎng)問(wèn) http://java.sun.com/products/ejb/index.html 中深入學(xué)習這些技術(shù).
XML標記語(yǔ)言
XML標記語(yǔ)言可以用來(lái)定義用戶(hù)自己的標記.XML在WEB服務(wù)中使用的非常廣泛.如SOAP協(xié)議就是由XML定義的.XML可以定義非常通用化并利于被應用程序處理的信息結構.
在Struts框架中XML起到了黏合劑的作用,可以用來(lái)配置Struts框架中的各組件的組成框架.
讀者可以通過(guò)訪(fǎng)問(wèn) http://www.w3schools.com/xml/default.asp 獲得更多的學(xué)習資料.
J2EE相關(guān)容器
現階段任何一個(gè)分布開(kāi)發(fā)都離不開(kāi)服務(wù)器.對于Web開(kāi)發(fā)則時(shí)Web服務(wù)器,Web服務(wù)器通常用來(lái)處理Http請求和回復工作,并提供了安全性,事務(wù)性,多任務(wù)并行性.現代Web容器還提供了可編程的用戶(hù)接口.而分布式開(kāi)發(fā)中應用程序的邏輯部分通常放在應用程序的中間件服務(wù)器上.EJB容器就是這樣一個(gè)中間件服務(wù)器.該服務(wù)器提供了對EJB組件的運行環(huán)境的支持.并提供對RMI—IIOP等遠程對象調用協(xié)議的支持,使得開(kāi)發(fā)EJB組件這里中間件比較容易.使得開(kāi)發(fā)人員更多的關(guān)心的是業(yè)務(wù)邏輯問(wèn)題.
目前比較流行的開(kāi)源的Web服務(wù)器主要是Apache軟件組織的Tomcat服務(wù)器.Tomcat不僅是一個(gè)優(yōu)秀的Web服務(wù)器更是一個(gè)十分便捷的Servlet/JSP容器.而開(kāi)源的EJB容器比較有代表的當數JBoss 它是由JBoss軟件組織開(kāi)發(fā)的,其性能穩定可靠,并有著(zhù)非常高效的執行速度.
MVC設計模式概述
一般而言,一個(gè)計算機程序包括其輸入,處理,和輸出.而MVC設計模式把輸入,處理和輸出部分獨立成為了獨立的程序部分.并在系統運行時(shí)將其結合,這樣使得開(kāi)發(fā)的耦合度很低.而.
圖 4 MVC設計模型
視圖,在軟件中通常是用戶(hù)交互的界面.它用來(lái)表示數據和提交用戶(hù)對軟件的請求.
模型,用來(lái)處理軟件的要涉及的業(yè)務(wù)范圍,主要是業(yè)務(wù)數據模型和業(yè)務(wù)邏輯模型.
控制器,用來(lái)接受用戶(hù)的請求并調用模型中的處理過(guò)程,然后選擇相應的視圖.
Java的Web應用中MVC的設計模式運用十分多.JSP Model2 體系結構就是結合了JSP,Servlet和JavaBean技術(shù)的MVC模式的實(shí)現.
圖 5 JSP Model2 模型
Struts框架概述
隨著(zhù)軟件開(kāi)發(fā)日漸成熟,軟件工程師們也變得逐漸成熟起來(lái),我們開(kāi)始首先設計軟件框架結構,這樣在開(kāi)發(fā)階段我們才會(huì )井然有序的進(jìn)行.而對于現代軟件開(kāi)發(fā)對軟件的開(kāi)發(fā)周期要求越來(lái)越迅速,所以如果要自己開(kāi)發(fā)一套框架已經(jīng)不太現實(shí)了.所以我們必須要選擇已經(jīng)成熟的軟件框架了.
而Struts對于Java的Web開(kāi)發(fā)而言就是一個(gè)不錯的選擇.Struts框架實(shí)質(zhì)就是JSP Model2模型的實(shí)現.

圖 6 Struts 實(shí)現的MVC框架
1.視圖
視圖是通過(guò)一組JSP程序實(shí)現的.這些JSP程序中不能包含業(yè)務(wù)邏輯,也不能包括模型的信息.模型的信息是通過(guò)控制器傳遞的.在Struts中ActionForm 也被看成是視圖的一部分.它其他更新視圖,以及視圖查詢(xún)模型狀態(tài)的橋梁.
2.模型
模型是程序的狀態(tài)表示,其狀態(tài)包括,消息中傳遞的狀態(tài),以及共享狀態(tài)或一次回話(huà)中的狀態(tài),以及持久狀態(tài).而操作這些狀態(tài)的流程也同樣包括在模型中.這些模型也就是業(yè)務(wù)的總體運作流程和數據.
3.控制器
控制器部分由ActionServlet和Action來(lái)實(shí)現.ActionServlet也就是Struts框架用來(lái)和Web容器交互的接口.該類(lèi)是Struts框架的核心組件.ActionServlet繼承了HttpServlet類(lèi).它在MVC模型中扮演中央控制器的角色.當Web容器一接收到客戶(hù)請求就會(huì )交割ActionServlet該類(lèi)更加struts-config.xml文件的配置信息選擇合適Action來(lái)處理請求.并傳遞請求過(guò)程中的數據,這些數據是通過(guò)ActionForm傳遞的.Action本身也并不包含業(yè)務(wù)邏輯的處理代碼.它只是負責調用業(yè)務(wù)的處理代碼的.
調用這些代碼的方法在execute()方法中.該方法在調用業(yè)務(wù)處理以后會(huì )放回一個(gè)ActionForward對象來(lái)選擇對應的視圖.一般而言我們的Action必須直接或間接的繼承該類(lèi).然后重寫(xiě)excecute()方法以完成我們自己的處理消息.
4.Struts的配置文件 struts-config.xml
該文件實(shí)質(zhì)是一個(gè)控制器和視圖的黏合劑,控制器之所以能夠選擇對應的視圖,以及視圖能夠通過(guò)對應的控制器查詢(xún)到模型中的數據都是依賴(lài)該文件.該文件是一個(gè)XML文件.在該配置文件中每Action都對應一個(gè)<Action>標簽用來(lái)映射Action類(lèi)的信息.
從軟件的需求分析與設計談起
實(shí)現一個(gè)完整的基于Struts的WEB應用
總結:
Java的Web應用中使用到的技術(shù)非常多,也相對比較復雜.因此開(kāi)發(fā)中開(kāi)發(fā)人員所負責的技術(shù)方面也會(huì )相對較多,所以我們必須考慮到個(gè)人的特長(cháng)對開(kāi)發(fā)工作進(jìn)行合理分配,這就需要我們在軟件的設計階段考慮清楚.而MVC這種設計模式能夠很好的把業(yè)務(wù)數據模型和業(yè)務(wù)處理模型獨立出來(lái),這樣開(kāi)發(fā)出獨立的系統組件,以便于在開(kāi)發(fā)視圖階段能夠很好的保持數據的一致性.而在處理視圖和模型之間的關(guān)系時(shí)控制器成為了兩者的紐帶,這樣使得軟件項目可以成為一個(gè)系統化的工程.
而Struts框架在Java的Web應用中就起到了這個(gè)作用.這樣使得開(kāi)發(fā)階段能夠很好的利用該框架完成開(kāi)發(fā)項目,我們可以選擇合適的模型組件如我們可以使用JavaBean技術(shù)來(lái)完成業(yè)務(wù)模型和數據模型的接口,而數據庫則可以充當數據模型來(lái)保持業(yè)務(wù)階段的持久狀態(tài).JSP和Struts為我們提供的一組標簽這可以完成頁(yè)面的表示和頁(yè)面的邏輯等功能使得我們有了豐富的視圖功能.并且Struts提供了ActionForm為視圖可以和事件進(jìn)行數據交換接口提供了良好的通道使得在處理Action事件時(shí)候可以通過(guò)ActionForm從視圖中取得數據.而兩者之間的橋梁就是Struts-config.xml文件該XML文件可以配置兩者之間的聯(lián)系.這使得接口之間有著(zhù)極高的靈活性和伸縮性.而在Action中我們有可以調用和包含模型組件的功能.這樣使得開(kāi)發(fā)非常具有效率和可擴展能力.
Struts框架事實(shí)上已經(jīng)被很多軟件項目所應用,所以足見(jiàn)其適用性時(shí)非??煽康?/span>.這里也希望通過(guò)該問(wèn)的介紹能夠使得讀者對Struts框架有一個(gè)足夠的了解.
參考資料:
<<精通Struts基于MVC的Java Web 設計與開(kāi)發(fā)>> 作者: 孫衛琴
<<JSP 2.0 技術(shù)參考手冊>> 作者: 林上杰 林康司
<<J2EE 技術(shù)內幕>> 作者: (美)Joseph J.Bambara Paul R.Allen等 譯者: 劉堃 等
聯(lián)系客服