【正文】
此外,一個(gè)標(biāo)準(zhǔn) JSP 標(biāo)記庫(kù)即將出現(xiàn)。Sun 正在盡力將新的變化反映到 JSP/servlet 體系結(jié)構(gòu)中,正如他們對(duì) Java 語(yǔ)言和 API 所作的更改一樣。 Struts 的前景在這個(gè)軟件開(kāi)發(fā)的新時(shí)代,一切都變得很快。隨著變化的不斷加入,這有時(shí)會(huì)令人很沮喪。 復(fù)雜性 在將問(wèn)題分為幾個(gè)部分的同時(shí)也引入了復(fù)雜性。我建議您在遇到問(wèn)題時(shí)訪問(wèn) Struts 用戶(hù)郵件列表的歸檔資料。僅憑這一點(diǎn)遠(yuǎn)不能解決您的全部安裝問(wèn)題,除非使用 Tomcat 。 無(wú)論您決定使用哪種類(lèi)型的框架,您都應(yīng)該了解您要在其中部署和維護(hù)該框架的環(huán)境。我會(huì)聽(tīng)到這樣的話,“既然我可以用 VBScript 直接編寫(xiě) COM 對(duì)象,為什么還要等 COM 開(kāi)發(fā)人員來(lái)創(chuàng)建它呢?”通過(guò)使用標(biāo)記庫(kù),Struts 有助于限制 JSP 文件中所需的 Java 代碼的數(shù)量。在 ASP 開(kāi)發(fā)中,您應(yīng)該創(chuàng)建 COM 對(duì)象,然后編寫(xiě)少量的 ASP 腳本將這些 COM 對(duì)象聯(lián)系起來(lái)。最重要的是,如果讓網(wǎng)頁(yè)設(shè)計(jì)人員使用一點(diǎn) Java,他將使用大量的 Java。在開(kāi)發(fā)網(wǎng)頁(yè)的過(guò)程中,我們是否應(yīng)該讓網(wǎng)頁(yè)設(shè)計(jì)人員訪問(wèn) Java 代碼?某些框架(如 Velocity)說(shuō)不應(yīng)該,但它提供了另一種 Web 開(kāi)發(fā)語(yǔ)言讓我們學(xué)習(xí)。 在過(guò)去的 6 個(gè)月中,我目睹 Struts 庫(kù)從 90K 增大到 270K 以上。Struts 與 Struts 相比變化極大。 仍處于發(fā)展初期Struts 開(kāi)發(fā)仍處于初級(jí)階段。問(wèn)題越來(lái)越復(fù)雜,并且需要越來(lái)越多的管理。 管理問(wèn)題空間 分治是解決問(wèn)題并使問(wèn)題可管理的極好方法。 MVC 實(shí)現(xiàn)樣例 如果您希望創(chuàng)建您自己的 MVC 實(shí)現(xiàn),則 Struts 可增加您的見(jiàn)識(shí)。許多人都可以進(jìn)行很好的代碼檢查。 標(biāo)記庫(kù) 為什么要另發(fā)明一種輪子,或標(biāo)記庫(kù)呢?如果您在庫(kù)中找不到您所要的標(biāo)記,那就自己定義吧。這個(gè)特性能很好地集成到基于 JSP 的開(kāi)發(fā)工具中,這些工具允許用標(biāo)記編寫(xiě)代碼。 Struts 的優(yōu)點(diǎn)這樣就使 Action 可訪問(wèn)用于控制流程的信息。(您可能尚未注意到這一點(diǎn),以 s結(jié)尾的類(lèi)就是容器) ActionMapping 包含有關(guān)特定事件如何映射到特定 Action 的信息。 確定 Controller 調(diào)用哪個(gè) Action 類(lèi)。圖4. Command (ActionServlet) 與 Model (Action) 之間的關(guān)系的 UML 圖ActionMapping 類(lèi) 輸入事件通常是在 HTTP 請(qǐng)求表單中發(fā)生的,servlet 容器將 HTTP 請(qǐng)求轉(zhuǎn)換為 HttpServletRequest 。 ActionErrors 是 ActionError 類(lèi)的容器,View 可以使用標(biāo)記訪問(wèn)這些類(lèi)。) Error 類(lèi) UML 圖(圖 3)還包括 ActionError 和 ActionErrors 。 Action 開(kāi)始為一個(gè)接口,后來(lái)卻變成了一個(gè)類(lèi)。通過(guò)擴(kuò)展 Action ,我們使得我們的業(yè)務(wù)接口與 Struts 業(yè)務(wù)接口保持兼容。本例中的客戶(hù)機(jī)是 ActionServlet ,它對(duì)我們的具體業(yè)務(wù)類(lèi)接口一無(wú)所知。Adapter 使類(lèi)能夠協(xié)同工作,如果沒(méi)有 Adapter,則這些類(lèi)會(huì)因?yàn)椴患嫒莸慕涌诙鵁o(wú)法協(xié)同工作。 考慮 Action 類(lèi)的另一種方式是 Adapter 設(shè)計(jì)模式。 Action 類(lèi)應(yīng)該控制應(yīng)用程序的流程,而不應(yīng)該控制應(yīng)用程序的邏輯。當(dāng)事件進(jìn)展到這一步時(shí),輸入表單數(shù)據(jù)(或 HTML 表單數(shù)據(jù))已被從請(qǐng)求流中提取出來(lái)并轉(zhuǎn)移到 ActionForm 類(lèi)中。 ActionServlet (Command) 使用 perform() 方法將參數(shù)化的類(lèi)傳遞給 ActionForm 。 Action 類(lèi)的用途是將 HttpServletRequest 轉(zhuǎn)換為業(yè)務(wù)邏輯。 UserActionForm 可跨多頁(yè)進(jìn)行映射,以執(zhí)行諸如向?qū)е?lèi)的操作。 可將多個(gè)請(qǐng)求映射到 UserActionForm 。 文件控制 HTML 表單請(qǐng)求與 ActionForm 之間的映射關(guān)系。 可在會(huì)話級(jí)維護(hù) UserActionForm 。在 UserAction 類(lèi)中進(jìn)行狀態(tài)驗(yàn)證可能更好。 注: 這并不總是明智之舉。 沒(méi)有太多討厭的 () 調(diào)用。 Struts 框架將執(zhí)行以下操作: 當(dāng)我說(shuō) 輸入表單模型 時(shí),是指 ActionForm 表示的是由 HTML 表單設(shè)置或更新的一般意義上的數(shù)據(jù)。 ActionForm 類(lèi) ActionForm 維護(hù) Web 應(yīng)用程序的會(huì)話狀態(tài)。 Java 開(kāi)發(fā)人員也不必在更改流程以后重新編譯代碼。 網(wǎng)頁(yè)設(shè)計(jì)人員不必費(fèi)力地閱讀 Java 代碼來(lái)理解應(yīng)用程序的流程。這使得人們更容易查看和理解它,尤其是對(duì)于大型應(yīng)用程序而言。這種方法有幾個(gè)優(yōu)點(diǎn): 在創(chuàng)建 Web 項(xiàng)目時(shí),您將擴(kuò)展 Action 和 ActionForm 來(lái)解決特定的問(wèn)題。 ActionServlet (Command) 創(chuàng)建并使用 Action 、 ActionForm 和 ActionForward 。時(shí)代變了,但方法依舊。Struts 的控制器是將事件(事件通常是 HTTP post)映射到類(lèi)的一個(gè) servlet。函數(shù)指針數(shù)組曾經(jīng)是用 C 語(yǔ)言進(jìn)行結(jié)構(gòu)化編程的很好方法。 ActionForm) 之間的關(guān)系的 UML 圖ActionServlet 類(lèi) 您還記得函數(shù)映射的日子嗎?在那時(shí),您會(huì)將某些輸入事件映射到一個(gè)函數(shù)指針上。圖3顯示了 ActionServlet (Controller)、 ActionForm (Form State) 和 Action (Model Wrapper) 之間的最簡(jiǎn)關(guān)系。標(biāo)記是使 Struts 有別于其他框架(如 Velocity)的因素之一。l View(視圖)視圖就是一個(gè) JSP 文件。ActionForm bean 在會(huì)話級(jí)或請(qǐng)求級(jí)表示模型的狀態(tài),而不是在持久級(jí)。l Model(模型)的狀態(tài)模型表示應(yīng)用程序的狀態(tài)。l 業(yè)務(wù)邏輯業(yè)務(wù)邏輯更新模型的狀態(tài),并幫助控制應(yīng)用程序的流程。就 Struts 而言,控制器是以 servlet 實(shí)現(xiàn)的一個(gè)命令設(shè)計(jì)模式。Web 容器將用一個(gè) HTTP 響應(yīng)作出響應(yīng)。圖2顯示了 Struts 的一個(gè)概覽。圖1. MVC Model 2Struts,MVC 2 的一種實(shí)現(xiàn)Struts 是一組相互協(xié)作的類(lèi)、servlet 和 JSP 標(biāo)記,它們組成一個(gè)可重用的 MVC 2 設(shè)計(jì)。 對(duì)于 Web,需要修改標(biāo)準(zhǔn)的 MVC 形式。 這種方法有幾個(gè)缺點(diǎn):另一個(gè)重大變化是實(shí)現(xiàn)視圖所用的技術(shù)與實(shí)現(xiàn)模型或控制器的技術(shù)不同。這種無(wú)狀態(tài)行為使得模型很難將更改通知視圖。它創(chuàng)建并設(shè)置模型。當(dāng)更改模型時(shí),視圖應(yīng)得到通知。視圖可以訪問(wèn)模型的讀方法,但不能訪問(wèn)寫(xiě)方法。 l View(視圖)視圖提供模型的表示。有時(shí)它包含的唯一功能就是狀態(tài)。MVC 通過(guò)將問(wèn)題分為三個(gè)類(lèi)別來(lái)幫助解決單一模塊方法所遇到的某些問(wèn)題:l Model(模型)模型包含應(yīng)用程序的核心功能。我們還得處理驗(yàn)證、流程控制和更新應(yīng)用程序的狀態(tài)等問(wèn)題。盡管您可能永遠(yuǎn)不會(huì)用 Struts 實(shí)現(xiàn)一個(gè)系統(tǒng),但了解一下 Struts 或許使您能將其中的一些思想用于您以后的 Servlet 的 JSP 實(shí)現(xiàn)中。MVC 減弱了業(yè)務(wù)邏輯接口和數(shù)據(jù)接口之間的耦合。如果您開(kāi)發(fā)過(guò)大型 Web 應(yīng)用程序,您就理解 變化 這個(gè)詞的含義。設(shè)計(jì)漂亮的網(wǎng)站需要做大量的工作,大多數(shù) Java 開(kāi)發(fā)人員更注重創(chuàng)建優(yōu)美的對(duì)象接口,而不是用戶(hù)界面。但是,小學(xué)生的網(wǎng)頁(yè)和專(zhuān)業(yè)開(kāi)發(fā)的網(wǎng)站有質(zhì)的區(qū)別。盡管您可能永遠(yuǎn)不會(huì)用 Struts 實(shí)現(xiàn)一個(gè)系統(tǒng),但您可以將其中的一些思想用于您以后的 servlet 和 JSP 網(wǎng)頁(yè)的實(shí)現(xiàn)中。 ComplexitySeparating the problem into parts introduces plexity. There is no question that some education will have to go on to understand Struts. With the constant changes occurring, this can be frustrating at times. Future of StrutsThings change rapidly in this new age of software development. In less than 5 years, we have seen things go from cgi/perl, to ISAPI/NSAPI, to ASP with VB, and now Java and J2EE. Sun is working hard to adapt changes to the JSP/servlet architecture, just as they have in the past with the Java language and API. You can obtain drafts of the new JSP and Servlet specifications from the Sun Web site. Additionally, a standard tag library for JSP files is appearing.Struts——MVC 的一種開(kāi)放源碼實(shí)現(xiàn)本文介紹Struts,它是使用 servlet 和 JavaServer Pages 技術(shù)的一種 ModelViewController 實(shí)現(xiàn)。 Limited scopeStruts is a Webbased MVC solution that is meant be implemented with HTML, JSP files, and servlets. ChangeThe framework is undergoing a rapid amount of change.