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

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

Struts框架之構(gòu)建Model組件

2019-11-17 06:19:34
字體:
供稿:網(wǎng)友

  Model就是在對(duì)用戶請(qǐng)求的整個(gè)控制過程中,真正處理用戶請(qǐng)求并保存處理結(jié)果的對(duì)象,在整個(gè)過程中,我們一般利用javaBean來把一些信息保存起來以便在各個(gè)對(duì)象之間傳遞。因?yàn)樵诳蚣苤校琈odel對(duì)象是真處理商業(yè)邏輯功能的對(duì)象,因此也就是框架中應(yīng)用需求實(shí)現(xiàn)相關(guān)性最大的的部分。在Struts的實(shí)現(xiàn)里,Model的具體表現(xiàn)形式就是ActionForm對(duì)象和與其對(duì)應(yīng)的Action對(duì)象了。對(duì)用戶提交表單的數(shù)據(jù)進(jìn)行校驗(yàn),甚至對(duì)數(shù)據(jù)進(jìn)行預(yù)處理都能在ActionForm中完成。通常的應(yīng)用中,一般是一個(gè)Model對(duì)象和一個(gè)請(qǐng)求頁(yè)面對(duì)應(yīng)的關(guān)系,但也可以一個(gè)Model對(duì)象對(duì)應(yīng)多個(gè)頁(yè)面請(qǐng)求。假如struts-config.xml配置文件沒有指定一個(gè)Model對(duì)象對(duì)應(yīng)的Action,那么控制器將直接把(通過Model對(duì)象完成數(shù)據(jù)封裝的)請(qǐng)求轉(zhuǎn)到一個(gè)View對(duì)象。下圖表示的是Model layer 的層次結(jié)構(gòu)。
  
  在Struts中Model以一個(gè)或多個(gè)java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請(qǐng)求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關(guān)信息,并做出相關(guān)的處理,一般是調(diào)用JavaBean或EJB等。
  
  許多需求文檔將構(gòu)建Web應(yīng)用的焦點(diǎn)集中在視圖上。我們必須確保每一個(gè)提交的請(qǐng)求都在模型視圖中都已經(jīng)被定義。通常,開發(fā)者在模型組件中關(guān)注于開發(fā)JavaBean類以實(shí)現(xiàn)所有的功能需求。 應(yīng)用應(yīng)該準(zhǔn)確的使用哪些beans,根據(jù)其需求不同而差異巨大,但是,在經(jīng)過區(qū)分后通常都能分被為若干個(gè)類別。
  
  創(chuàng)建Model 組件
  1、JavaBeans
  
  在一個(gè)Web基礎(chǔ)的應(yīng)用中,能使用許多不同的"屬性(attributes)"集合來保存(和訪問)JavaBeans。 每個(gè)集合都有它自己不同的生命周期和beans存儲(chǔ)在哪里的可見度。 同時(shí),beans通過 作用域 來定義生命周期和可見度規(guī)則。 在JavaServer Pages (jsp)規(guī)范中定義了作用域選擇使用以下幾項(xiàng)(在括號(hào)中是servlet API中的等價(jià)概念定義)。
  
  page :Beans只會(huì)在一個(gè)JSP頁(yè)中可見,只在當(dāng)前的請(qǐng)求周期中存在。 (在 service 方法中的本地變量)
  
  request : Beans只會(huì)在一個(gè)JSP頁(yè)中可見,與page相同或servlet包含本頁(yè),或轉(zhuǎn)發(fā)到本頁(yè)。 (Request屬性)
  
  session :Beans能被所有的JSP頁(yè)和servlet通過特定的用戶session來使用, 它可以跨越一個(gè)或多個(gè)請(qǐng)求。 (Session屬性)
  
  application :Beans能被Web應(yīng)用中的所有JSP頁(yè)和servlets來使用。 (Servlet context屬性)
  我們需要記住的是在一個(gè)web應(yīng)用中JSP頁(yè)面和servlet會(huì)共享bean集合的設(shè)置。 例如在一個(gè)servlet中將一個(gè)bean存儲(chǔ)到attribute中如下:
  
  MyStudy Mystudy = new MyStudy(...);
  request.setAttribute("cart", MyStudy);
  
  在這個(gè)servlet將請(qǐng)求轉(zhuǎn)發(fā)給一個(gè)JSP頁(yè)面后,我們馬上可以使用標(biāo)準(zhǔn)的動(dòng)作標(biāo)簽(tag)來看到相應(yīng)的值:
  
  < jsp:useBean id="cart" scope="request" class="com.mycompany.MyApp.MyStudy"/ >
  
  2、ActionForm Beans
  
  在 actionform beans頻繁地有屬性相當(dāng)于屬性在我們的model beans的時(shí)候,那form beans它們自己應(yīng)該考慮成為一個(gè)控制器組件。 同樣地,他們能在模型和視圖層之間傳遞資料。
  
  Struts框架通常假定我們?cè)谖覀兊膽?yīng)用中已經(jīng)為輸入定義一個(gè) ActionForm beans(簡(jiǎn)而言之,一個(gè)擴(kuò)展自 ActionForm 類的Java類)。 ActionForm beans有時(shí)僅僅調(diào)用表單beans(form beans)。 這可能會(huì)是一個(gè)細(xì)粒度的對(duì)像,它讓每個(gè)表單對(duì)應(yīng)一個(gè)bean,還有就是一個(gè)bean服務(wù)于若干個(gè)表單甚至全部應(yīng)用形成粗粒度的情況。
  
  假如在我們的Struts配置文件中定義了bean,Struts的controller servlet在調(diào)用適當(dāng)?shù)?Action 方法前將自動(dòng)為我們提供如下服務(wù):
  
  使用適當(dāng)?shù)囊ψ謾z查在用戶適當(dāng)?shù)淖饔糜颍╮equest或session)中是否有適當(dāng)類的bean的一個(gè)實(shí)例。
  假如沒有這樣的實(shí)例可用,則自動(dòng)建立一個(gè)新的bean實(shí)例并將期加入到適當(dāng)?shù)淖饔糜蛑校╮equest或session)。
  
  對(duì)于每個(gè)請(qǐng)求參數(shù)通過其名稱來對(duì)應(yīng)到bean的一個(gè)屬性(PRoperty)上,并調(diào)用相應(yīng)的setter方法來設(shè)置屬性值。 這個(gè)方法類似于標(biāo)準(zhǔn)JSP中以以通配符"*"來使用 < jsp:setProperty > 標(biāo)記。
  更新后的 ActionForm bean被傳遞給 Action 類[ org.apache.struts.Action ] 的 execute 方法, 以使這些值能被我們的系統(tǒng)狀態(tài)和業(yè)務(wù)邏輯bean來使用。
  
  我們應(yīng)該注重一個(gè)"表單(form)"在這里并不是必須對(duì)應(yīng)于用戶界面中一個(gè)單獨(dú)的JSP頁(yè)面。 在很多應(yīng)用程序中一個(gè)"表單"(從用戶的觀點(diǎn))延伸至多個(gè)頁(yè)面也是很平常的。 想想看,例如,在新程序的安裝時(shí)所使用的導(dǎo)航程序的用戶界面。 Struts鼓勵(lì)我們定義一個(gè)包含所有字段屬性的單獨(dú)的 ActionForm bean, 而不用管這些字段實(shí)際顯示于哪個(gè)頁(yè)面上。同樣的,同一表單的不同頁(yè)面應(yīng)提交到相同的Action類。 假如我們遵照這個(gè)建議,在大多數(shù)情況下,頁(yè)面設(shè)計(jì)者可以重新組織不同頁(yè)面中的字段而不需要改變處理邏輯。
  
  一個(gè)小的應(yīng)用也許只需要一個(gè)ActionForm來為所有的輸入表單提供服務(wù)。 其它應(yīng)用可以為每個(gè)大的子系統(tǒng)來分別使用一個(gè)ActionForm。 還有一些人可能更喜歡為每一個(gè)輸入表單或工作流分別使用不同的ActionForm類。 真正如何使用ActionForm完全在于我們,框架自身并不在意的。
  
  ActionForm 接口本身不需要非凡的實(shí)現(xiàn)方法。它是用來標(biāo)識(shí)這些特定的beans在整個(gè)體系結(jié)構(gòu)中的作用。典型情況下,一個(gè) ActionForm bean只包括屬性的get方法和set方法,沒有商業(yè)邏輯。
  
  通常在一個(gè) ActionForm bean中只有很少的輸入驗(yàn)證邏輯。這樣的beans存在的主要理由是保存用戶為相關(guān)的表單所輸入的大部分近期值,這樣同樣的頁(yè)面可以被重建,伴隨有一組出錯(cuò)信息,這樣用戶僅僅需要糾正錯(cuò)誤的字段。用戶輸入的驗(yàn)證應(yīng)該在 Action 類中執(zhí)行(假如是很簡(jiǎn)單的話),或者在適當(dāng)?shù)纳虡I(yè)邏輯beans中執(zhí)行。
  
  為每個(gè)表單中出現(xiàn)的字段定義一個(gè)屬性(用相關(guān)的getXxx()和setXxx()方法)。字段名和屬性名必須按照J(rèn)avaBeans的約定相匹配。例如,一個(gè)名為 username 的輸入字段將引起 setUsername() 方法被調(diào)用。
  
  下面是ActionForm類的具體描述:
  
  ActionForm類
  框架假設(shè)用戶在應(yīng)用程序中為每個(gè)表單都創(chuàng)建了一個(gè)ActionForm bean,對(duì)于每個(gè)在struts-config.xml文件中定義的bean,框架在調(diào)用Action類的perform()方法之前會(huì)進(jìn)行以下操作:
  
  1、在相關(guān)聯(lián)的要害字下,它檢查用于適當(dāng)類的bean實(shí)例的用戶會(huì)話,假如在會(huì)話中沒有可用的bean,它就會(huì)自動(dòng)創(chuàng)建一個(gè)新的bean并添加到用戶的會(huì)話中。
  
  2、對(duì)于請(qǐng)求中每個(gè)與bean屬性名稱對(duì)應(yīng)的參數(shù),Action調(diào)用相應(yīng)的設(shè)置方法。
  
  3、當(dāng)Action perform()被調(diào)用時(shí),最新的ActionForm bean傳送給它,參數(shù)值就可以立即使用了。
  
  ActionForm類擴(kuò)展org.apache.struts.action.ActionForm類,程序開發(fā)人員創(chuàng)建的bean能夠包含額外的屬性,而且ActionServlet可能使用反射(答應(yīng)從已加載的對(duì)象中回收信息)訪問它。
  
  ActionForm類提供了另一種處理錯(cuò)誤的手段,提供兩個(gè)方法:
  
  Public ActionErrors validate(ActionMappin mapping,ServletRequest request)
  Public ActionErrors validate(ActionMappin mapping,HttpServletRequest request)
  
  我們應(yīng)該在自己的bean里覆蓋validate()方法,并在配置文件里設(shè)置<action>元素的validate為true。在ActionServlet調(diào)用Action類前,它會(huì)調(diào)用validate(),假如返回的ActionErrors不是null,則ActinForm會(huì)根據(jù)錯(cuò)誤要害字將ActionErrors存儲(chǔ)在請(qǐng)求屬性列表中。
  
  假如返回的不是null,而且長(zhǎng)度大于0,則根據(jù)錯(cuò)誤要害字將實(shí)例存儲(chǔ)在請(qǐng)求的屬性列表中,然后ActionServlet將響應(yīng)轉(zhuǎn)發(fā)到配置文件<action>元素的input屬性所指向的目標(biāo)。
  
  假如需要執(zhí)行特定的數(shù)據(jù)有效性檢查,最好在Action類中進(jìn)行這個(gè)操作,而不是在ActionForm類中進(jìn)行。
  
  方法reset()可將bean的屬性恢復(fù)到默認(rèn)值:
  
  public void reset(ActionMapping mapping,HttpServletRequest request)
  public void reset(ActionMapping mapping,ServletRequest request)
  
  典型的ActionFrom bean只有屬性的設(shè)置與讀取方法(getXXX),而沒有實(shí)現(xiàn)事務(wù)邏輯的方法。只有簡(jiǎn)單的輸入檢查邏輯,使用的目的是為了存儲(chǔ)用戶在相關(guān)表單中輸入的最新數(shù)據(jù),以便可以將同一網(wǎng)頁(yè)進(jìn)行再生,同時(shí)提供一組錯(cuò)誤信息,這樣就可以讓用戶修改不正確的輸入數(shù)據(jù)。而真正對(duì)數(shù)據(jù)有效性進(jìn)行檢查的是Action類或適當(dāng)?shù)氖聞?wù)邏輯bean。
  
  3、系統(tǒng)狀態(tài)Beans
  
  系統(tǒng)的實(shí)際狀態(tài)通常表示為一組一個(gè)或多個(gè)JavaBean類,其屬性定義了當(dāng)前的狀態(tài)。 例如,在一個(gè)購(gòu)物車系統(tǒng)中,將包括一個(gè)表示購(gòu)物車的bean,這個(gè)bean為每個(gè)購(gòu)物者所維護(hù), 它包括了購(gòu)物者所選擇購(gòu)買的物品條目。 另外,系統(tǒng)也包括保存用戶信息(包括他們的信用卡和送貨地址)、可獲得的條目和當(dāng)前庫(kù)存水平這些不同的bean。
  
  對(duì)于小規(guī)模系統(tǒng),或是對(duì)于不需要長(zhǎng)時(shí)間保存的狀態(tài)信息,一組系統(tǒng)狀態(tài)bean可以包含 所有系統(tǒng)曾經(jīng)經(jīng)歷的特定細(xì)節(jié)的信息。 或者經(jīng)常是,系統(tǒng)狀態(tài)bean會(huì)表示永久保存在一些外部數(shù)據(jù)庫(kù)中的信息(例如 CustomerBean 對(duì)象對(duì)應(yīng)于CUSTOMERS表中特定的一行數(shù)據(jù)), 在需要時(shí)從服務(wù)器的內(nèi)存中創(chuàng)建或清除。Entity Enterprise JavaBeans也是用于這種用途的。
  
  4、商業(yè)邏輯Beans
  
  我們應(yīng)該把

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桐庐县| 福贡县| 万州区| 郴州市| 临沭县| 普洱| 鄂托克旗| 襄垣县| 木兰县| 墨脱县| 冕宁县| 新民市| 邛崃市| 溧水县| 新建县| 丹棱县| 芒康县| 沙田区| 尚义县| 阜平县| 威海市| 连城县| 泰安市| 东明县| 丰县| 武川县| 健康| 内江市| 广丰县| 介休市| 西充县| 冀州市| 无棣县| 万源市| 静宁县| 浙江省| 郎溪县| 朝阳市| 吕梁市| 青川县| 大兴区|