上篇我們以[登錄為例](http://blog.csdn.net/lovesummerforever/article/details/17348871)講解了struts配置,實現了使用struts框架進行登錄的示例。一些名詞已經在腦海中飄蕩了。
**ActionServlet**:struts的控制器,負責截取URL或分發。提供Model(模型層)和View(視圖層)使用,因此可將它看作是模型和視圖之間的中介。
**ActionForm**:用于封裝用戶的請求參數,而請求參數是通過JSP頁面的表單域傳遞過來的。
**Action**:用戶請求和和業務邏輯的橋梁,每個Action作為業務邏輯的代理,可以調用業務邏輯。
一些問題是有必要再次提起的。
**使用基本的MVC和使用struts框架區別,使用struts好處在哪里?**
我們知道我們不適用框架的時候,在MVC中典型的控制器是servlet,servlet可以獲取參數和邏輯模型的調用和轉向功能。而struts對它做了封裝,為什么要進行封裝?當我們請求到一個servlet,我們在這個servlet中取得參數、調用業務邏輯、轉向,我們在servlet中寫死了轉向頁面,當我們想要換一個轉向頁面的時候就需要改動代碼了,改動代碼后還要重新進行編譯。
而且從表單中傳遞過來的數據全是字符串形式,我們還需要根據實際的需求把字符串轉換為我們需要的類型,如果很多地方需要轉換,并且每次使用每次都要進行轉換,有沒有一種機制,把表單中的字符串拿過來自動轉換為相應的類型呢?不需要我們再進行手動轉換呢?
基于上述的不便,轉向不靈活,表單中的字符串每次都要進行轉換等一系列的原因,struts把這些做了封裝。提取出重復的操作,轉向信息放到了配置文件中,這樣更加靈活了。
在上述問題中,闡述了struts對表單的封裝,在web應用程序開發過程中,開發人員需要大量的時間來處理表單問題,有的時候是通過表單提交一些新的問題,有的是通過表單修改數據,所有這些表單在處的處理在傳統web開發中是非常復雜的。本篇重點說說struts中的表單處理器ActionForm。
**ActionForm**
**問題的提出**
在傳統的web應用程序開發中,繁雜的表單處理給開發工作人員帶來了巨大的困難,在傳統的開發語言中,沒有組建可以自動收集用戶輸入的表單內容,開發人員不得不在程序中手動提取表單的值。例如在表單中有這樣的一個文本輸入域:<inputtype=”text” name=”password”> 要在程序中取得這個文本輸入域的值,只能用這樣的方法:request.getParameter(“password”);這樣的處理方法在表單比較小的時候是可以使用的,但是當表單輸入項較多的時候就不得不大量重復類似上面的處理。
**問題的解決**
在Struts中就是使用ActionForm來解決這個問題,對于每一個用戶的表單,需要提供一個ActionForm,這個ActionForm自動把客戶提交的表單保存在這個ActionForm中,然后把這個ActionForm傳遞給Action,從而在Action中可以通過這個ActionForm取出用戶信息,然后根據這些信息完成對應的業務邏輯處理。
例如在Struts中用struts的html標簽表述成下述形式:
<html:text property=”password”/>
在這種情況下表單提交后,struts框架會自動把表單中的這個輸入項賦值到ActionForm中的password屬性中,從而把表單中的內容保存在ActionForm中,整個過程由struts自動完成,不需要開發人員干涉。我們在創建ActionForm時要遵循以下規范:
(1)每個ActionForm都要繼承org.apache.struts.action.ActionForm類,而且需要為每一個表單提供一個ActionForm。
(2)ActionForm中每個屬性要與表單中的輸入項一一對應。
(3)AcitonForm每個屬性都要提供的getter方法和setter方法。Struts框架就是通過這些方法來保存表單的值,然后在Action中通過這些方法取得表單的值。
(4)如果表單需要驗證,就需要在ActionForm中提供validate方法,這個方法中提供對表單的具體驗證邏輯。這個方法不僅實現了數據驗證同時實現了數據緩沖的作用,在validate方法中驗證用戶提交表單的有效性,當表單驗證失敗時會自動返回用戶輸入頁面,這時候用戶輸入的值都保存在ActionForm中,返回頁面時struts框架會取出AcitonForm中的數據并輸出到對應的用戶輸入項中,保證了用戶開始輸入的表單信息。
**問題的提出**
以上所說的是靜態ActionForm,當我們為每個表單都創建一個AcitonForm的時候,會導致ActionForm數量過多。每個ActionForm過強的聚合性也會使代碼難以維護和重用。怎么樣不用去創建過多的ActionForm?而且當提交表單的屬性名字相同時,不用再重復創建AcitonForm(例如登錄和注冊)?
**問題的解決**
Struts中可以使用動態ActionForm來解決上述問題。動態ActionForm不需要創建自己的ActionForm,需要在創建自己Action的時候直接把execute方法中傳遞過來的form對象轉化為DynaActionForm。
我們需要更改struts-config.xml中form-beans配置:
~~~
<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer"/>
</form-bean>
</form-beans>
~~~
Action中使用get方法取得表單中的值。
~~~
/**
* 測試動態ActionForm.
* @author summer
*
*/
public classDynaActionFormTestAction extends Action {
@Override
publicActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequestrequest, HttpServletResponse response)
throwsException {
DynaActionFormdaf = (DynaActionForm)form;
//取出map中key值為name,value為類名.
Stringusername = (String)daf.get("username");
Integerage = (Integer)daf.get("age");
System.out.println("username"+username);
System.out.println("username"+age);
returnmapping.findForward("success");
}
}
~~~
靜態ActionForm方式,使用get/set方法,而動態ActionForm方式,使用map的getkey方式,其中key就是標簽name的值。
使用動態ActionForm優點:若更改表單和ActionForm時不需要重新編譯,而靜態的需要更改靜態的ActionForm.java文件,必須重新編譯。缺點:靜態返回的是對應的值,動態ActionForm返回的是對象,我們還要把這個對象進行強制轉換。
下一篇[MVC向struts MVC框架演變過程](http://blog.csdn.net/lovesummerforever/article/details/18963959)
- 前言
- Struts旅程(一)Struts簡介和原理
- struts旅程(二)Struts登錄示例
- Struts旅程(三)Struts表單處理器ActionForm(靜態動態)
- Struts旅程(四)MVC向struts MVC框架演變過程
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(六)Struts頁面轉發控制ActionForward和ActionMapping
- Hibernate旅程(一)Hibernate架構概述
- Hibernate旅程(二)Hibernate實例
- Hibernate旅程(三)Hibernate持久化對象的三個狀態
- Hibernate旅程(四)Hibernate對數據庫刪除、查找、更新操作
- Hibernate旅程(五)Hibernate映射--基本類映射和對象關系映射
- Hibernate旅程(六)Hibernate映射--繼承映射
- Hibernate旅程(七)Hibernate緩存機制--一級緩存
- Hibernate旅程(八)Hibernate緩存機制--二級緩存
- Hibernate旅程(九)Hibernate緩存機制--查詢緩存
- Spring旅程(一)為什么使用Spring
- Spring旅程(二)非Spring向Spring過渡-- Spring IOC容器的使用
- Spring旅程(三) AOP--Spring AOP容器基礎
- Spring旅程(四) AOP--Spring AOP實例
- SSH旅程(五)Spring運用到Hibernate中
- SSH旅程(六)Spring和struts結合(方案一)