Struts框架之構建Model組件
|
一、概述
Model就是在對用戶請求的整個控制過程中,真正處理用戶請求并保存處理結果的對象,在整個過程中,我們一般利用JavaBean來把一些信息保存起來以便在各個對象之間傳遞。因為在框架中,Model對象是真正處理商業邏輯功能的對象,因此也就是框架中應用需求實現相關性最大的部分。 在Struts的實現里,Model的具體表現形式就是ActionForm對象和與其對應的Action對象了。對用戶提交表單的數據進行校驗,甚至對數據進行預處理都能在ActionForm中完成。通常的應用中,一般是一個Model對象和一個請求頁面對應的關系,但也可以一個Model對象對應多個頁面請求。如果struts-config.xml配置文件沒有指定一個Model對象對應的Action,那么控制器將直接把(通過Model對象完成數據封裝的)請求轉到一個View對象。下圖表示的是Model layer 的層次結構。

在Struts中Model以一個或多個java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關信息,并做出相關的處理,一般是調用JavaBean或EJB等。
許多需求文檔將構建Web應用的焦點集中在視圖上。我們必須確保每一個提交的請求都在模型視圖中都已經被定義。通常,開發者在模型組件中關注于開發JavaBean類以實現所有的功能需求。 應用應該準確的使用哪些beans,根據其需求不同而差異巨大,但是,在經過區分后通常都能分被為若干個類別。
二、創建Model 組件
1、JavaBeans
在一個Web基礎的應用中,能使用許多不同的"屬性(attributes)"集合來保存(和訪問)JavaBeans。 每個集合都有它自己不同的生命周期和beans存儲在哪里的可見度。 同時,beans通過 作用域 來定義生命周期和可見度規則。 在JavaServer Pages (JSP)規范中定義了作用域選擇使用以下幾項(在括號中是servlet API中的等價概念定義)。
page :Beans只會在一個JSP頁中可見,只在當前的請求周期中存在。 (在 service 方法中的本地變量)
request : Beans只會在一個JSP頁中可見,與page相同或servlet包含本頁,或轉發到本頁。 (Request屬性)
session :Beans能被所有的JSP頁和servlet通過特定的用戶session來使用, 它可以跨越一個或多個請求。 (Session屬性)
application :Beans能被Web應用中的所有JSP頁和servlets來使用。 (Servlet context屬性)
我們需要記住的是在一個web應用中JSP頁面和servlet會共享bean集合的設置。 例如在一個servlet中將一個bean存儲到attribute中如下:
| MyStudy Mystudy = new MyStudy(...); request.setAttribute("cart", MyStudy); |
在這個servlet將請求轉發給一個JSP頁面后,我們馬上可以使用標準的動作標簽(tag)來看到相應的值:
| < jsp:useBean id="cart" scope="request" class="com.mycompany.MyApp.MyStudy"/ > |
2、ActionForm Beans
在 actionform beans頻繁地有屬性相當于屬性在我們的model beans的時候,那form beans它們自己應該考慮成為一個控制器組件。 同樣地,他們能在模型和視圖層之間傳遞資料。
Struts框架通常假定我們在我們的應用中已經為輸入定義一個 ActionForm beans(簡而言之,一個擴展自 ActionForm 類的Java類)。 ActionForm beans有時僅僅調用表單beans(form beans)。 這可能會是一個細粒度的對像,它讓每個表單對應一個bean,還有就是一個bean服務于若干個表單甚至全部應用形成粗粒度的情況。
如果在我們的Struts配置文件中定義了bean,Struts的controller servlet在調用適當的 Action 方法前將自動為我們提供如下服務:
使用適當的關鍵字檢查在用戶適當的作用域(request或session)中是否有適當類的bean的一個實例。
如果沒有這樣的實例可用,則自動建立一個新的bean實例并將期加入到適當的作用域中(request或session)。
對于每個請求參數通過其名稱來對應到bean的一個屬性(property)上,并調用相應的setter方法來設置屬性值。 這個方法類似于標準JSP中以以通配符"*"來使用 < jsp:setProperty > 標記。
更新后的 ActionForm bean被傳遞給 Action 類[ org.apache.struts.Action ] 的 execute 方法, 以使這些值能被我們的系統狀態和業務邏輯bean來使用。