posts - 70,comments - 408,trackbacks - 0

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

          1)     HTML文檔

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

          3)     JavaScripet和stylesheet

          4)     多媒體文件

          5)     消息資源(Resource Bundle)

          6)     ActionForm Bean

          ActionForm屬于一種Bean,什么是Bean呢?是可重用的平臺獨立的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具有表單驗證的功能.由于ActionForm類使用了ServletAPI,因此不提倡直接把ActionForm傳遞給模型,而是應(yīng)該在控制層把它的數(shù)據(jù)重新組裝到自定義的DTO中,在把它傳遞給模型層.在配置文件中<action>元素的scope屬性設(shè)置ActionForm的范圍默認(rèn)是session.Action的生命周期如下:

          1)     控制器接收到請求

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

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

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

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

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

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

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

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

          <form-beans>

             <form-bean name=”loginForm”

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

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

          <form-property name=”username” type=”java.lang.String”/>

          <form-property name=”password” type=”java.lang.String”/>

          </form-bean>

          </form-beans>

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

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

          public Object get(String name)

          public void set(Strig name,Object value)

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

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

          1)     HTML表單中定義<html;hidden properyt=”page”/>隱藏字段來標(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)行驗證.

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

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

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

          2)提倡使用Validator框架來驗證動態(tài)的ActionForm.這樣可以避免用編程的方法來實現(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ù)代表屬性的名稱.

          寫的手好累呵呵,希望看過的朋友能給點評價,如果有響應(yīng)的錯誤請大家多多指教.(網(wǎng)友們的支持,是我繼續(xù)寫技術(shù)文章的動力!)

          posted on 2005-10-26 13:58 我心依舊 閱讀(3047) 評論(8)  編輯  收藏

          FeedBack:
          # re: Struts視圖組件(原創(chuàng))
          2005-10-26 16:47 | redvale
          不錯,說的蠻詳細(xì)的  回復(fù)  更多評論
            
          # re: Struts視圖組件(原創(chuàng))
          2006-02-22 15:29 | ychyl@yeah.net
          我現(xiàn)在有個問題, 就是ActionForm中只要是int型或者Integer的屬性, 沒有值時總是初始化為0, 我希望沒有值, 則跟對象一樣, 初始化為null, 你知道怎么辦嗎?  回復(fù)  更多評論
            
          # re: Struts視圖組件(原創(chuàng))
          2006-08-09 13:23 | 衙內(nèi)乖乖
          我是初學(xué)者,文章很不錯,收藏啦~~
          希望你再接再厲寫出更好的文章~~  回復(fù)  更多評論
            
          # re: Struts視圖組件(原創(chuàng))
          2006-08-31 09:57 | 周利軍
          public Object get(String name)  回復(fù)  更多評論
            
          # re: Struts視圖組件(原創(chuàng))
          2006-08-31 09:59 | 周利軍
          寫得很好,支持
            回復(fù)  更多評論
            
          # re: Struts視圖組件(原創(chuàng))
          2006-09-20 17:32 | 甜蜜的豆沙包
          請教一下:為什么會有Cannot find bean org.apache.struts.taglib.html.BEAN in any scope異常?
          我的"struts-config.xml"如下:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

          <struts-config>
          <data-sources />
          <form-beans >
          <form-bean name="setVoteForm" dynamic="true" type="org.apache.struts.action.DynaActionForm" >
          <form-property name="topicName" type="java.lang.String"/>
          <form-property name="itermNumber" type="java.lang.String"/>
          <form-property name="iterContent" type="java.lang.String"/>
          </form-bean>
          </form-beans>

          <global-exceptions />
          <global-forwards />
          <action-mappings >
          <action
          validate="false"
          input="/form/SetVote.jsp"
          name="setVoteForm"
          path="/setVote"
          scope="request"
          type="cn.cbsw.vote.settingvote.controller.SetVoteAction" />
          </action-mappings>

          <message-resources parameter="cn.cbsw.vote.struts.ApplicationResources" />
          </struts-config>


            回復(fù)  更多評論
            
          # re: Struts視圖組件(原創(chuàng))
          2007-09-12 15:55 | Java_oracle
          想識恨晚  回復(fù)  更多評論
            
          # re: Struts視圖組件(原創(chuàng))
          2007-12-16 09:37 | 朱仔
          寫得很好,每天都期待你的新作品。  回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 孟津县| 大安市| 屏边| 沧州市| 高陵县| 神木县| 东山县| 太仆寺旗| 铜川市| 忻州市| 绥阳县| 苏尼特右旗| 长顺县| 昌图县| 洪洞县| 江西省| 柳林县| 林西县| 东山县| 焦作市| 开阳县| 忻城县| 子长县| 梁河县| 大渡口区| 禄丰县| 雅安市| 吉安县| 尤溪县| 襄城县| 东兰县| 麻城市| 明水县| 屯留县| 道孚县| 河南省| 阿拉尔市| 稻城县| 芷江| 汤原县| 黄陵县|