Struts框架的視圖負責為客戶端提供動態的網頁內容.主要是由JSP網頁構成.還提供了Struts客戶化標簽和ActionForm Bean,這些組件提供對國際化,接收用戶表單輸入的數據,表單驗證和錯誤處理等功能.視圖是模型的外在表現形式,用戶通過視圖來了解模型的狀態,同一個模型可以有多種視圖.框架中視圖由JSP組件構成,除此之外還包括以下組件:
1) HTML文檔
2) JSP客戶化標簽
3) JavaScripet和stylesheet
4) 多媒體文件
5) 消息資源(Resource Bundle)
6) ActionForm Bean
ActionForm屬于一種Bean,什么是Bean呢?是可重用的平臺獨立的JAVA組件,JavaBean
支持屬性,事件,方法和持久化.Struts框架僅僅利用了JavaBean的一小部分特性.Bean和普通的JAVA類很相似,不過它應該遵守以下的規范:
1) 必須提供不帶參數的構造方法
2) 為Bean的所有屬性提供公共的get/set方法
3) 對于boolean類型的屬性要提供isXXX()方法,那么該方法返回Boolean類型的屬性
4) 對于數組類型的屬性,應該提供getXXX(int index)和setXXX(index,value)方法來讀取和設置數組元素.
Struts利用JavaBean來創建數據傳輸對象,Data Transfer Object簡稱DTO,用于不同的層之間傳遞數據.
ActionForm是Struts框架提供的DTO,用于在視圖層和控制器之間傳遞HTML表單數據,控制層可以從ActionForm中讀取用于輸入的表單數據,也可以把來自模型的數據保存到ActionForm中,然后返回給視圖.ActionForm具有表單驗證的功能.由于ActionForm類使用了ServletAPI,因此不提倡直接把ActionForm傳遞給模型,而是應該在控制層把它的數據重新組裝到自定義的DTO中,在把它傳遞給模型層.在配置文件中<action>元素的scope屬性設置ActionForm的范圍默認是session.Action的生命周期如下:
1) 控制器接收到請求
2) 從request或者session范圍內取出ActionForm的實例,沒有就新建一個
3) 調用Form的reset()方法
4) 把ActionForm實例保存到request或者session范圍中
5) 把用戶輸入的表單數據裝到ActionForm中
6) 如果validate屬性是true則調用validate方法
7) 驗證成功就把ActionForm實例以參數傳遞給Action的execute方法,如果失敗把請求轉發給<action>的input屬性指定的Web組件(大多JSP),ActionForm依然保存在request或者session范圍內.
Struts框架的ActionForm類是抽象類,必須在應用中創建它的子類,來捕獲具體的HTML表單數據.其中的屬性和表單的屬性一一對應.如果配置文件中<form-bean>元素的name屬性和<action>元素的name屬性匹配,<action>元素中的的validate屬性為true.的時候.validate方法會被調用,基類的返回值是null,如果擴展了ActionForm類,那么應該覆蓋validate方法,這個方法主要負責檢驗格式和語法,而不負責檢查數據是否符合業務邏輯.對于一個請求控制器首先調用的是ActionForm的reset()方法,然后在把用戶輸入的表單數據組裝到ActionFrom中.這個方法負責恢復屬性的默認值,例如把boolean類型的屬性設置成true或者false,把字符串設置為null或者某個初始值.感覺如果ActionForm在request范圍內,那么對于每個新的請求都會創建新的ActionForm實例,當新的實例創建后,它的屬性就是默認值,所以在寫reset()方法就沒什么意義了.如果是在session范圍內,一個實例可以接收多次請求,那么reset()方法就非常有用了!如果是從request或者session范圍中取出Form的值,可以用例如Form f=(Form)session.getAttribute(“Form”)的方法取出.這時Form的名字就是共享對象中的一個key不過如果是在Action的execute()方法中就很簡單了,可以Form f=(Form)Form這樣來獲取一個Form也可以通過其中的具體的get方法來獲取具體的屬性,注意一定要轉換類型.有的時候,由于表單的數量太多,無法在同一個頁面顯示,可以把他們拆分成多個表單,分多個頁面顯示.在這種情況下,即可以為每一個表單創建一個單獨的ActionForm,也可以只創建一個,和多個表單對應.
下面研討以下如何使用動態的ActionForm,在Struts框架中,ActionForm對象用來包裝HTML表單數據,并能夠動態返回用于顯示給用戶的數據.自己寫的Form必須符合JavaBean的規范,繼承ActionForm同時可以選擇的重寫reset()和validate()方法.雖然ActionForm簡化了Web開發,但是對于大型的項目如果HTML表單改變對應的ActionForm也一定要修改,所以Strust1.1對此做出了修改引入了動態的DynaActionForm類.它支持載配置文件中完成ActionForm的全部配置,沒必要寫額外的程序來創建具體的ActionForm類,配置動態的方法是在配置文件中一個<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>來設置動態的ActionForm屬性.name指定屬性的名稱,type指定屬性的類型.ActionForm的類型表單的類型.如果要設置JAVA的基本類型,在配置的時候應該用相應的包裝類型來替換,例如int的包裝類型就是Integer.動態的Form類DynaActionForm提供了initialize()方法,它把調但所有的屬性都恢復為默認值.表單屬性默認值由<form-bean>元素的<form-peoprety>子元素的initial屬性來決定.如果沒設置,則表單的默認屬性由其JAVA類型來自動決定.例如對象類型的默認就是null.整型是0.Boolean是false.如果希望Struts每次把表單數據組裝到動態的ActionForm之前,先把所有的屬性恢復為默認值,可以定義一個DynaActionForm的子類,然后覆蓋reset()方法,在其中調用initalize()方法就OK了.
Action類和JSP都可以訪問動態的ActionForm類,使用方法與標準的Form大致相同.有一點區別就是如果使用標準的Form類,用get和set方法就可以,而DynaActionForm是把所有的屬性保存在一個Map類對象中.訪問的方法如下:
public Object get(String name)
public void set(Strig name,Object value)
DynaActionForm基類的validate()方法沒有提供任何默認的驗證行為,可以定義擴展它的子類,然后覆蓋validate()方法,但是以編程的方法來驗證動態的ActionForm違背了Struts框架提供的機制.幸運的是,可以采用另一種機制.Validator框架來完成驗證,如果想了解Validator驗證框架,不要急繼續關注我的Blog,我還會漫漫道來.
今天側重研討了構成Struts視圖組件的ActionForm,因為它非常重要,必須徹底的了解它算能真正的學會Struts,它可以存放在session和request范圍內.下面說一些開發技巧希望能對關注我的Blog的朋友們,在如后的開發中有所幫助.
1) 在HTML表單中定義<html;hidden properyt=”page”/>隱藏字段來標示當前頁面
2) 在ActionForm中定義page屬性,它和表單中的隱藏字段page對應
3) 在ActionForm的reset()方法中,只能把當前表單相關的屬性值恢復默認值.
4) 在ActionFomr的validate()方法中,只能對當前表單的相關屬性進行驗證.
5) 在配置ActionForm和Actin的映射的時候,應該把ActionForm的范圍設為session
Struts框架還引入了DynaActionForm類,是動態創建ActionForm的類,要注意的如下:
1)<form>的<form-porperty>子元素是用來配置動態Form的.type屬性指定ActionForm的屬性的類型.如果是JAVA基本類型,則用JAVA包裝類型.
2)提倡使用Validator框架來驗證動態的ActionForm.這樣可以避免用編程的方法來實現validate()方法.
3)通常不需要擴展DynaActionForm類,如果需要提供屬性的復位功能,則擴展此類,然后重寫reset方法中去調用initialize()方法進行復位,通常ActionForm在Session范圍內使用此方法.
4)如果訪問DynaActionForm的屬性,應該調用以下方法:
public Object(String name)
public void set(String name,Object value)
name參數代表屬性的名稱.
寫的手好累呵呵,希望看過的朋友能給點評價,如果有響應的錯誤請大家多多指教.(網友們的支持,是我繼續寫技術文章的動力!)
posted on 2005-10-26 13:58
我心依舊 閱讀(3038)
評論(8) 編輯 收藏