Struts1.x系列教程(14):動態(tài)Form
本文為原創(chuàng),如需轉載,請注明作者和出處,謝謝!
上一篇:Struts1.x系列教程(13):國際化
一、動態(tài)Form簡介
雖然ActionForm功能強大,但有些時候使用起來有些麻煩。如每建立一個用戶錄入界面(JSP頁面),就得建立一個ActionForm子類來和這個頁面對應。當然,我們可以采用嵌套屬性從一定程度上彌補這個問題。但是在建立新的用戶錄入界面時,仍不可避免地要建立新的ActionForm子類。
在Struts1.2.6及以后的Struts版本中提供了一種動態(tài)Form的技術。使得不用再建立新的ActionForm就可以封裝用戶提交的數(shù)據(jù)。實際上,這種技術將定義ActionForm子類的工作變成了編寫XML文件的工作。
每定義一個動態(tài)Form,就要在struts-config.xml中加一個<form-bean>元素,并使用<form-property>子元素來定義動態(tài)Form的屬性。
在本章的最后還會介紹一個LazyValidatorForm類,通過這個類甚至可以不定義動態(tài)Form的屬性就可以使用動態(tài)Form。這將大大簡化開發(fā)人員的工作量。
二、聲明動態(tài)Form
聲明一個動態(tài)Form非常簡單,只需要在struts- config.xml的<form-beans>元素中加入一個<form-bean>子元素,并使用<form- property>元素來定義動態(tài)Form的屬性。我們可以定義的屬性類型有簡單屬性(如String)、索引屬性(如數(shù)組)、映射屬性(如 HashMap)以及嵌套屬性(屬性類型是另一個類)。對于動態(tài)Form來說,F(xiàn)orm的類型必須是org.apache.struts.action.DynaActionForm或其子類。聲明一個動態(tài)Form的代碼如下:
<!-- 聲明一個簡單屬性 -->
<form-property name="simpleProp" type="java.lang.String" initial="bill"/>
<!-- 聲明一個索引屬性 -->
<form-property name="indexedProp" type="java.lang.String[]" />
<!-- 聲明一個映射屬性 -->
<form-property name="mappedProp" type="java.util.HashMap" />
<!-- 聲明一個嵌套屬性 -->
<form-property name="nestedProp" type="com.bean.MyBean" />
</form-bean>
三、動態(tài)Form的屬性類型
下面列出了動態(tài)Form支持的簡單屬性的所有類型:
- java.math.BigDecimal
- java.math.BigInteger
- java.lang.Boolean
- java.lang.Byte
- java.lang.Character
- java.lang.Class
- java.lang.Double
- java.lang.Float
- java.lang.Integer
- java.lang.Long
- java.lang.Short
- java.lang.String
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
實際上,上面的數(shù)據(jù)類型就是Java中提供了簡單數(shù)據(jù)類型。它們用在動態(tài)Form中和在Java中代表的數(shù)據(jù)類型是完全一樣的。我們還可以使用<form-property>元素的initial屬性為動態(tài)Form的簡單屬性指定一個默認值。如在例程6-11中name屬性的默認值為“bill”。
對于索引屬性的類型來說,可以是數(shù)組,也可以是java.util.List接口的類(如ArrayList)。我們還可以為動態(tài)Form的屬性指定實現(xiàn)java.util.Map接口的類作為數(shù)據(jù)類型(也就是映射屬性)。但遺憾的是,如果使用動態(tài)Form,就無法使用泛型進行自動類型轉換了。
四、訪問動態(tài)Form
我們可以使用DynaActionForm類的getter方法來讀取動態(tài)Form中的屬性值。DynaActionForm類的getter方法有三個重載形式,分別用來讀取簡單屬性、索引屬性和映射屬性。這三個getter方法的定義如下:
public Object get(String name, int index) ; // 讀取索引屬性
public Object get(String name, String key); // 讀取映射屬性
下面的代碼演示了如何通過getter方法獲得動態(tài)Form的屬性值:
String name = (String)dForm.get("name");
String[] hobbies = (String[])dForm.get(“hobbies”);
String value1 = (String)dForm.get(“myMap”, “key1”);
除了上述的get方法外,DynaActionForm還提供了getString和getString方法,分別用來讀取String和String[]類型的屬性值,這兩個方法的定義如下:
public String[] getStrings(String name) ;
下面的代碼演示了如何通過getString和getStrings方法獲得動態(tài)Form的屬性值:
String[] hobbies = dForm.getStrings(“hobbies”); // 相當于String[] hobbies = (String[])dForm.get(“hobbies”);
在使用getString和getStrings方法時應注意,這兩個方法只能讀取String或String[]類型的屬性,讀取其他類型的屬性將會拋出異常。
五、一個動態(tài)Form的例子
我們在這一部分來實現(xiàn)一個完整的動態(tài)Form的例子,在這個例子中的動態(tài)Form有四個屬性,三個是簡單數(shù)據(jù)類型,一個是數(shù)組類型。完成這個例子需要如下四步:【第1步】配置動態(tài)Form
打開struts-config.xml,在<form-beans>元素中加入如下的內(nèi)容:
<form-property name="name" type="java.lang.String" />
<form-property name="age" type="java.lang.Short" />
<form-property name="salary" type="java.lang.Float" />
<form-property name="hobby" type="java.lang.String[]" />
</form-bean>
【第2步】編寫Struts
Action類
這個Struts
Action類負責從動態(tài)Form中獲得屬性值,并輸出到客戶端瀏覽器。在<samples工程目錄>"src"action目錄中建立一個DynamicAction.java文件,代碼如下:
import javax.servlet.http.*;
import org.apache.struts.action.*;
import java.io.*;
public class DynamicAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
try
{
DynaActionForm dForm = (DynaActionForm) form;
String name = (String) dForm.get("name");
Short age = (Short) dForm.get("age");
Float salary = (Float) dForm.get("salary");
// 獲得數(shù)組類型字段值的數(shù)組長度
int hobbyCount = ((String[]) dForm.get("hobby")).length;
PrintWriter out = response.getWriter();
out.println("name: " + name + "<p/>");
out.println("age: " + age + "<p/>");
out.println("salary: " + salary + "<p/>");
for (int i = 0; i < hobbyCount; i++)
out.println("hobby" + (i + 1) + ": " + dForm.get("hobby", i) + "<p/>");
}
catch (Exception e)
{
}
return null;
}
}
【第3步】配置Struts
Action
【第4步】編寫用戶錄入數(shù)據(jù)的JSP頁面
在Web根目錄中建立一個dynamic.jsp文件,代碼如下:
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>測試動態(tài)Form</title>
<html:base/>
</head>
<body>
<html:form action="dynamic" >
姓 名:<html:text property="name" /> <p>
年 齡:<html:text property="age" /> <p>
工 資:<html:text property="salary" /> <p>
愛好1:<html:text property="hobby" value=""/> <p>
愛好2:<html:text property="hobby" value=""/> <p>
愛好3:<html:text property="hobby" value=""/> <p>
<html:submit value="提交" />
</html:form>
</body>
</html>
啟動Tomcat后,在IE中輸入如下的URL來測試程序:
http://localhost:8080/samples/dynamic.jsp
六、驗證動態(tài)Form
有兩種方法可以驗證動態(tài)Form:
1. 在DynaActionForm的子類中覆蓋validate方法。
2. 如果要使用Validator框架來驗證動態(tài)Form,需要用DynaActionForm的子類org.apache.struts.validator. DynaValidatorForm或其子類來作為動態(tài)Form的類型。
在使用DynaValidatorForm的了類時,要想 使用Validator框架的驗證機制,需要在DynaValidatorForm子類的validate方法的開始位置使用 super.validate()語句來調(diào)用DynaValidatorForm中的validate方法。下一篇:Struts1.x系列教程(15):使用DownloadAction類統(tǒng)計文件下載次數(shù)
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2009-02-16 17:22 銀河使者 閱讀(4636) 評論(4) 編輯 收藏 所屬分類: java 、web 、 原創(chuàng) 、struts1.x