Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎

          WebSite ConnecTionS

          西北工業(yè)大學(xué) Offer收割機(jī)
          Java開源大全 Matrix - 與 Java 共舞
          Java World Kingnet國家網(wǎng)絡(luò)醫(yī)院

          常用鏈接

          隨筆檔案

          文章分類

          積分與排名

          • 積分 - 255973
          • 排名 - 221

          最新評論

          閱讀排行榜

          評論排行榜

          Struts框架的視圖負(fù)責(zé)為客戶端提供動(dòng)態(tài)的網(wǎng)頁內(nèi)容.主要是由JSP網(wǎng)頁構(gòu)成.還提供了Struts客戶化標(biāo)簽和ActionForm Bean,這些組件提供對國際化,接收用戶表單輸入的數(shù)據(jù),表單驗(yàn)證和錯(cuò)誤處理等功能.視圖是模型的外在表現(xiàn)形式,用戶通過視圖來了解模型的狀態(tài),同一個(gè)模型可以有多種視圖.框架中視圖由JSP組件構(gòu)成,除此之外還包括以下組件:

          1)     HTML文檔

          2)     JSP客戶化標(biāo)簽

          3)     JavaScripet和stylesheet

          4)     多媒體文件

          5)     消息資源(Resource Bundle)

          6)     ActionForm Bean

          ActionForm屬于一種Bean,什么是Bean呢?是可重用的平臺獨(dú)立的JAVA組件,JavaBean

          支持屬性,事件,方法和持久化.Struts框架僅僅利用了JavaBean的一小部分特性.Bean和普通的JAVA類很相似,不過它應(yīng)該遵守以下的規(guī)范:

          1)     必須提供不帶參數(shù)的構(gòu)造方法

          2)     Bean的所有屬性提供公共的get/set方法

          3)     對于boolean類型的屬性要提供isXXX()方法,那么該方法返回Boolean類型的屬性

          4)     對于數(shù)組類型的屬性,應(yīng)該提供getXXX(int index)和setXXX(index,value)方法來讀取和設(shè)置數(shù)組元素.

          Struts利用JavaBean來創(chuàng)建數(shù)據(jù)傳輸對象,Data Transfer Object簡稱DTO,用于不同的層之間傳遞數(shù)據(jù).

          ActionForm是Struts框架提供的DTO,用于在視圖層和控制器之間傳遞HTML表單數(shù)據(jù),控制層可以從ActionForm中讀取用于輸入的表單數(shù)據(jù),也可以把來自模型的數(shù)據(jù)保存到ActionForm中,然后返回給視圖.ActionForm具有表單驗(yàn)證的功能.由于ActionForm類使用了ServletAPI,因此不提倡直接把ActionForm傳遞給模型,而是應(yīng)該在控制層把它的數(shù)據(jù)重新組裝到自定義的DTO中,在把它傳遞給模型層.在配置文件中元素的scope屬性設(shè)置ActionForm的范圍默認(rèn)是session.Action的生命周期如下:

          1)     控制器接收到請求

          2)     request或者session范圍內(nèi)取出ActionForm的實(shí)例,沒有就新建一個(gè)

          3)     調(diào)用Form的reset()方法

          4)     ActionForm實(shí)例保存到request或者session范圍中

          5)     把用戶輸入的表單數(shù)據(jù)裝到ActionForm中

          6)     如果validate屬性是true則調(diào)用validate方法

          7)     驗(yàn)證成功就把ActionForm實(shí)例以參數(shù)傳遞給Action的execute方法,如果失敗把請求轉(zhuǎn)發(fā)給的input屬性指定的Web組件(大多JSP),ActionForm依然保存在request或者session范圍內(nèi).

          Struts框架的ActionForm類是抽象類,必須在應(yīng)用中創(chuàng)建它的子類,來捕獲具體的HTML表單數(shù)據(jù).其中的屬性和表單的屬性一一對應(yīng).如果配置文件中元素的name屬性和元素的name屬性匹配,元素中的的validate屬性為true.的時(shí)候.validate方法會(huì)被調(diào)用,基類的返回值是null,如果擴(kuò)展了ActionForm類,那么應(yīng)該覆蓋validate方法,這個(gè)方法主要負(fù)責(zé)檢驗(yàn)格式和語法,而不負(fù)責(zé)檢查數(shù)據(jù)是否符合業(yè)務(wù)邏輯.對于一個(gè)請求控制器首先調(diào)用的是ActionForm的reset()方法,然后在把用戶輸入的表單數(shù)據(jù)組裝到ActionFrom中.這個(gè)方法負(fù)責(zé)恢復(fù)屬性的默認(rèn)值,例如把boolean類型的屬性設(shè)置成true或者false,把字符串設(shè)置為null或者某個(gè)初始值.感覺如果ActionForm在request范圍內(nèi),那么對于每個(gè)新的請求都會(huì)創(chuàng)建新的ActionForm實(shí)例,當(dāng)新的實(shí)例創(chuàng)建后,它的屬性就是默認(rèn)值,所以在寫reset()方法就沒什么意義了.如果是在session范圍內(nèi),一個(gè)實(shí)例可以接收多次請求,那么reset()方法就非常有用了!如果是從request或者session范圍中取出Form的值,可以用例如Form f=(Form)session.getAttribute(“Form”)的方法取出.這時(shí)Form的名字就是共享對象中的一個(gè)key不過如果是在Action的execute()方法中就很簡單了,可以Form f=(Form)Form這樣來獲取一個(gè)Form也可以通過其中的具體的get方法來獲取具體的屬性,注意一定要轉(zhuǎn)換類型.有的時(shí)候,由于表單的數(shù)量太多,無法在同一個(gè)頁面顯示,可以把他們拆分成多個(gè)表單,分多個(gè)頁面顯示.在這種情況下,即可以為每一個(gè)表單創(chuàng)建一個(gè)單獨(dú)的ActionForm,也可以只創(chuàng)建一個(gè),和多個(gè)表單對應(yīng).

          下面研討以下如何使用動(dòng)態(tài)的ActionForm,在Struts框架中,ActionForm對象用來包裝HTML表單數(shù)據(jù),并能夠動(dòng)態(tài)返回用于顯示給用戶的數(shù)據(jù).自己寫的Form必須符合JavaBean的規(guī)范,繼承ActionForm同時(shí)可以選擇的重寫reset()和validate()方法.雖然ActionForm簡化了Web開發(fā),但是對于大型的項(xiàng)目如果HTML表單改變對應(yīng)的ActionForm也一定要修改,所以Strust1.1對此做出了修改引入了動(dòng)態(tài)的DynaActionForm類.它支持載配置文件中完成ActionForm的全部配置,沒必要寫額外的程序來創(chuàng)建具體的ActionForm類,配置動(dòng)態(tài)的方法是在配置文件中一個(gè)元素.如下:

            

          type=”org.apache.struts.action.DynaActionForm”

          //上面是指定DynaActionForm類,名字是loginForm

          元素的子元素來設(shè)置動(dòng)態(tài)的ActionForm屬性.name指定屬性的名稱,type指定屬性的類型.ActionForm的類型表單的類型.如果要設(shè)置JAVA的基本類型,在配置的時(shí)候應(yīng)該用相應(yīng)的包裝類型來替換,例如int的包裝類型就是Integer.動(dòng)態(tài)的Form類DynaActionForm提供了initialize()方法,它把調(diào)但所有的屬性都恢復(fù)為默認(rèn)值.表單屬性默認(rèn)值由元素的子元素的initial屬性來決定.如果沒設(shè)置,則表單的默認(rèn)屬性由其JAVA類型來自動(dòng)決定.例如對象類型的默認(rèn)就是null.整型是0.Boolean是false.如果希望Struts每次把表單數(shù)據(jù)組裝到動(dòng)態(tài)的ActionForm之前,先把所有的屬性恢復(fù)為默認(rèn)值,可以定義一個(gè)DynaActionForm的子類,然后覆蓋reset()方法,在其中調(diào)用initalize()方法就OK了.

          Action類和JSP都可以訪問動(dòng)態(tài)的ActionForm類,使用方法與標(biāo)準(zhǔn)的Form大致相同.有一點(diǎn)區(qū)別就是如果使用標(biāo)準(zhǔn)的Form類,用get和set方法就可以,而DynaActionForm是把所有的屬性保存在一個(gè)Map類對象中.訪問的方法如下:

          public Object get(String name)

          public void set(Strig name,Object value)

          DynaActionForm基類的validate()方法沒有提供任何默認(rèn)的驗(yàn)證行為,可以定義擴(kuò)展它的子類,然后覆蓋validate()方法,但是以編程的方法來驗(yàn)證動(dòng)態(tài)的ActionForm違背了Struts框架提供的機(jī)制.幸運(yùn)的是,可以采用另一種機(jī)制.Validator框架來完成驗(yàn)證,如果想了解Validator驗(yàn)證框架,不要急繼續(xù)關(guān)注我的Blog,我還會(huì)漫漫道來.

          今天側(cè)重研討了構(gòu)成Struts視圖組件的ActionForm,因?yàn)樗浅V匾?必須徹底的了解它算能真正的學(xué)會(huì)Struts,它可以存放在session和request范圍內(nèi).下面說一些開發(fā)技巧希望能對關(guān)注我的Blog的朋友們,在如后的開發(fā)中有所幫助.

          1)     HTML表單中定義隱藏字段來標(biāo)示當(dāng)前頁面

          2)     ActionForm中定義page屬性,它和表單中的隱藏字段page對應(yīng)

          3)     ActionForm的reset()方法中,只能把當(dāng)前表單相關(guān)的屬性值恢復(fù)默認(rèn)值.

          4)     ActionFomr的validate()方法中,只能對當(dāng)前表單的相關(guān)屬性進(jìn)行驗(yàn)證.

          5)     在配置ActionForm和Actin的映射的時(shí)候,應(yīng)該把ActionForm的范圍設(shè)為session

          Struts框架還引入了DynaActionForm類,是動(dòng)態(tài)創(chuàng)建ActionForm的類,要注意的如下:

          1) 子元素是用來配置動(dòng)態(tài)Form的.type屬性指定ActionForm的屬性的類型.如果是JAVA基本類型,則用JAVA包裝類型.

          2)提倡使用Validator框架來驗(yàn)證動(dòng)態(tài)的ActionForm.這樣可以避免用編程的方法來實(shí)現(xiàn)validate()方法.

          3)通常不需要擴(kuò)展DynaActionForm類,如果需要提供屬性的復(fù)位功能,則擴(kuò)展此類,然后重寫reset方法中去調(diào)用initialize()方法進(jìn)行復(fù)位,通常ActionForm在Session范圍內(nèi)使用此方法.

          4)如果訪問DynaActionForm的屬性,應(yīng)該調(diào)用以下方法:

            public Object(String name)

            public void set(String name,Object value)

            name參數(shù)代表屬性的名稱.

          posted on 2005-10-27 17:31 Sung 閱讀(862) 評論(0)  編輯  收藏 所屬分類: Struts
          主站蜘蛛池模板: 永春县| 临湘市| 饶阳县| 石城县| 文水县| 香河县| 淮滨县| 桑日县| 山阴县| 和政县| 巴里| 濉溪县| 乾安县| 安乡县| 老河口市| 和田市| 沙雅县| 古浪县| 平罗县| 时尚| 会理县| 建宁县| 宁城县| 游戏| 湘乡市| 密云县| 隆回县| 清水河县| 曲靖市| 本溪市| 宜川县| 桓台县| 达尔| 鹤山市| 洮南市| 巨野县| 萨嘎县| 泸西县| 巴马| 陇南市| 阿坝|