top
Loading...
Struts用戶指南


1. 介紹

1.1 Model-View-Controller (MVC) 設計模式

FIXME - 需要一個對該模式一般性的介紹。(譯注:可以參考機械工業出版社的《設計模式》。)

1.2 將MVC概念映射到Struts組件中

Struts 的體系結構實現了Model-View-Controller設計模式的概念,它將這些概念映射到web應用程序的組件和概念中.

這一體系結構中每個主要的組件都將在下面做詳細的討論。

1.3 Model: 系統狀態和商業邏輯JavaBeans

基于MVC的系統中的 Model 部分可以細分為兩個概念 -- 系統的內部狀態, 能夠改變狀態的行為。用語法術語來說,我們可以把狀態信息當作名詞(事物),把行為當作動詞(事物狀態的改變)。

通常說來,你的應用程序將系統內部的狀態表示為一組一個或多個的JavaBeans,使用屬性(properties)來表示狀態的細節。依賴于你的應用程序的復雜度,這些beans可以是自包含的(以某種方式知道怎樣永久地保存它們的狀態信息),或者可以是正面的(facades),知道當被請求時怎樣從外部數據源(例如數據庫)中取得信息。Entity EJBs通常也用來表示內部狀態。

大型應用程序經常將系統可能的商業邏輯行為表示為可以被維護狀態信息的beans調用的方法。舉個例子,你有一個為每個當前用戶保存在session中的購物車bean,里面是表示當前用戶決定購買物品的屬性。這個bean有一個checkOut()方法用來驗證用戶的信用卡,將定單發給庫房以選擇貨品和出貨。別的系統分別地表示同樣的行為,或許使用Session EJBs。

在一些小型應用程序中,同樣的行為又可能嵌入到作為Controller一部分的 Action 類中。這在邏輯非常簡單或者并不想要在其它環境中重用這些商業邏輯時是恰當的。Struts框架支持所有這些方法,但建議將商業邏輯(“做什么”)和 Action 類(“決定做什么”)分離開。

1.4 View: JSP頁面和表示組件

基于Struts的應用程序中的 View 部分通常使用JSP技術來構建。JSP頁面包含稱為“模版文本”的靜態HTML(或XML)文本,加上插入的基于對特殊行為標記解釋的動態內容。JSP環境包括了其用途由JSP規范來描述的一套標準的行為標記,例如 <jsp:useBean> 。另外,還有一個用來定義你自己標記的標準機制,這些自定義的標記組織在“定制標記庫”中。

Struts包括了一個廣闊的便于創建用戶界面,并且充分國際化的定制標記庫,與作為系統 Model 部分一部分的ActionForm beans美妙地相互配合。這些標記的使用將在后面做詳細討論。

除了JSP頁面和其包含的行為及定制標記,商業對象經常需要能夠基于它們在被請求時的當前狀態將自己處理成HTML(或XML)。從這些對象處理過的輸出可以很容易地使用 <jsp:include> 標準行為標記包括在結果的JSP頁面中。

1.5 Controller: ActionServlet和ActionMapping

應用程序的 Controller 部分集中于從客戶端接收請求(典型情況下是一個運行瀏覽器的用戶),決定執行什么商業邏輯功能,然后將產生下一步用戶界面的責任委派給一個適當的View組件。在Struts中,controller的基本組件是一個 ActionServlet 類的servlet。這個servlet通過定義一組映射(由Java接口 ActionMapping 描述)來配置。每個映射定義一個與所請求的URI相匹配的路徑和一個 Action 類(一個實現 Action 接口的類)完整的類名,這個類負責執行預期的商業邏輯,然后將控制分派給適當的View組件來創建響應。

Struts也支持使用包含有運行框架所必需的標準屬性之外的附加屬性的 ActionMapping 類的能力。這允許你保存特定于你的應用程序的附加信息,同時仍可利用框架其余的特性。另外,Struts允許你定義控制將重定向到的邏輯名,這樣一個行為方法可以請求“主菜單”頁面(舉例),而不需要知道相應的JSP頁面的實際名字是什么。這個功能極大地幫助你分離控制邏輯(下一步做什么)和顯示邏輯(相應的頁面的名稱是什么)。

2. 創建Model組件

2.1 概述

你用到的應用程序的需求文檔很可能集中于創建用戶界面。然而你應該保證每個提交的請求所需要的處理也要被清楚的定義。通常說來,Model 組件的開發者集中于創建支持所有功能需求的JavaBeans類。一個特殊應用要求的beans的精確特性依賴于具體需求變化會非常的大,但是它們通常可以分成下面討論的幾種類型。然而,首先對“范圍”概念做一個簡短的回顧是有用的,因為它與beans有關。

2.2 JavaBeans和范圍

在一個基于web的應用程序中,JavaBeans可以被保存在(并從中訪問)一些不同“屬性”的集合中。每一個集合都有集合生存期和所保存的beans可見度的不同的規則。總的說來,定義生存期和可見度的這些規則被叫做這些beans的 范圍 。JSP規范中使用以下術語定義可選的范圍(在圓括號中定義servlet API中的等價物):

page - 在一個單獨的JSP頁面中可見的Beans,生存期限于當前請求。(service()方法中的局部變量)

request - 在一個單獨的JSP頁面中可見的Beans,也包括所有包含于這個頁面或從這個頁面重定向到的頁面或servlet。(Request屬性)

session - 參與一個特定的用戶session的所有的JSP和servlet都可見的Beans,跨越一個或多個請求。(Session屬性)

application - 一個web應用程序的所有JSP頁面和servlet都可見的Beans。(Servlet context屬性)

記住同一個web應用程序的JSP頁面和servlets共享同樣一組bean集合是很重要的。例如,一個bean作為一個request屬性保存在一個servlet中,就象這樣:

MyCart mycart = new MyCart(...);

request.setAttribute("cart", mycart);

將立即被這個servlet重定向到的一個JSP頁面使用一個標準的行為標記看到,就象這樣:

<jsp:useBean id="cart" scope="request"

class="com.mycompany.MyApp.MyCart"/>

2.3 ActionForm Beans

Struts框架通常假定你已經為每一個你的應用程序中請求的輸入創建了一個 ActionForm bean(即一個實現了 ActionForm 接口的類)。如果你在你的 ActionMapping 配置文件中定義了這樣的beans(見“創建Controller組件”),Struts的controller servlet在調用適當的 Action 方法前將自動為你執行如下的服務:

用適當的關鍵字檢查用戶的session中是否有適當的類的bean的一個實例。

如果沒有這樣的session范圍的bean,自動建立一個新的bean并添加到用戶的session中。

對每個名字對應于bean中的一個屬性的請求參數,調用相應的set方法。這個操作類似于當你以通配符“*”選擇所有屬性使用標準的JSP行為標記 <jsp:setProperty> 。

更新的ActionForm bean在被調用時將被傳遞給Acton類的perform()方法,以使這些值能夠立即生效。
當你在寫你的ActionForm beans時,記住以下的原則:

ActionForm 接口本身不需要特殊的實現方法。它是用來標識這些特定的beans在整個體系結構中的作用。典型情況下,一個ActionForm bean只包括屬性的get方法和set方法,沒有商業邏輯。

通常在一個ActionForm bean中只有很少的輸入驗證邏輯。這樣的beans存在的主要理由是保存用戶為相關的表單所輸入的大部分近期值 -- 甚至在錯誤被檢測到時 -- 這樣同樣的頁面可以被重建,伴隨有一組出錯信息,這樣用戶僅僅需要糾正錯誤的字段。用戶輸入的驗證應該在 Action 類中執行(如果是很簡單的話),或者在適當的商業邏輯beans中執行。

為每個表單中出現的字段定義一個屬性(用相關的getXxx()和setXxx()方法)。字段名和屬性名必須按照JavaBeans的約定相匹配。例如,一個名為 username 的輸入字段將引起 setUsername() 方法被調用。

你應該注意一個“表單”在這里討論時的意義并不必須對應于用戶界面中的一個單獨的JSP頁面。在很多應用程序中一個“表單”(從用戶的觀點)延伸至多個頁面也是很平常的。想想看,例如,通常在安裝新的應用程序時使用的導航安裝程序的用戶界面。Struts鼓勵你定義一個包含所有字段屬性的單獨的ActionForm bean。不管字段實際上是顯示在哪個頁面上。同樣的,同一表單的不同的頁面應該提交到相同的Action類。如果你遵照這個建議,在大多數情況下,頁面設計者可以重新組織不同頁面中的字段而不需要改變處理邏輯。

2.4 系統狀態Beans

系統的實際狀態通常表示為一組一個或多個的JavaBeans類,其屬性定義當前狀態。例如,一個購物車系統包括一個表示購物車的bean,這個bean為每個單獨的購物者維護,這個bean中包括(在其它事物之中)一組購物者當前選擇購買的項目。分別地,系統也包括保存用戶信息(包括他們的信用卡和送貨地址)、可獲得項目的目錄和它們當前庫存水平的不同的beans。

對于小規模的系統,或者對于不需要長時間保存的狀態信息,一組系統狀態beans可以包含所有系統曾經經歷的特定細節的信息。或者經常是,系統狀態beans表示永久保存在一些外部數據庫中的信息(例如CustomerBean對象對應于表 CUSTOMERS 中的特定的一行),在需要時從服務器的內存中創建或清除。在大規模應用程序中,Entity EJBs也用于這種用途。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗