【原創】Struts1.x系列教程(14):動態Form
本文為原創,如需轉載,請註明作者和出處,謝謝!
一、動態Form簡介
雖然ActionForm功能強大,但有些時候使用起來有些麻煩。如每建立一個使用者錄入介面(JSP頁面),就得建立一個ActionForm子類來和這個頁面對應。當然,我們可以採用巢狀屬性從一定程度上彌補這個問題。但是在建立新的使用者錄入介面時,仍不可避免地要建立新的ActionForm子類。
在Struts1.2.6及以後的Struts版本中提供了一種動態Form的技術。使得不用再建立新的ActionForm就可以封裝使用者提交的資料。實際上,這種技術將定義ActionForm子類的工作變成了編寫XML檔案的工作。
每定義一個動態Form,就要在struts-config.xml中加一個
在本章的最後還會介紹一個LazyValidatorForm類,通過這個類甚至可以不定義動態Form的屬性就可以使用動態Form。這將大大簡化開發人員的工作量。
二、宣告動態Form
宣告一個動態Form非常簡單,只需要在struts- config.xml的對於動態Form來說,Form的型別必須是org.apache.struts.action.DynaActionForm或其子類。宣告一個動態Form的程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> <form-bean name="dynamicForm" type="org.apache.struts.action.DynaActionForm">
<!-- 宣告一個簡單屬性 -->
<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>
三、動態Form的屬性型別
下面列出了動態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
實際上,上面的資料型別就是Java中提供了簡單資料型別。它們用在動態Form中和在Java中代表的資料型別是完全一樣的。我們還可以使用
對於索引屬性的型別來說,可以是陣列,也可以是java.util.List介面的類(如ArrayList)。我們還可以為動態Form的屬性指定實現java.util.Map介面的類作為資料型別(也就是對映屬性)。但遺憾的是,如果使用動態Form,就無法使用泛型進行自動型別轉換了。
四、訪問動態Form
我們可以使用DynaActionForm類的getter方法來讀取動態Form中的屬性值。DynaActionForm類的getter方法有三個過載形式,分別用來讀取簡單屬性、索引屬性和對映屬性。這三個getter方法的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public Object get(String name) ; // 讀取簡單屬性
public Object get(String name, int index) ; // 讀取索引屬性
public Object get(String name, String key); // 讀取對映屬性
下面的程式碼演示瞭如何通過getter方法獲得動態Form的屬性值:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->DynaActionForm dForm = (DynaActionForm)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[]型別的屬性值,這兩個方法的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public String getString(String name) ;
public String[] getStrings(String name) ;
下面的程式碼演示瞭如何通過getString和getStrings方法獲得動態Form的屬性值:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String name = dForm.getString(“name”); // 相當於String name = (String)dForm.get("name");
String[] hobbies = dForm.getStrings(“hobbies”); // 相當於String[] hobbies = (String[])dForm.get(“hobbies”);
在使用getString和getStrings方法時應注意,這兩個方法只能讀取String或String[]型別的屬性,讀取其他型別的屬性將會丟擲異常。
五、一個動態Form的例子
我們在這一部分來實現一個完整的動態Form的例子,在這個例子中的動態Form有四個屬性,三個是簡單資料型別,一個是陣列型別。完成這個例子需要如下四步:【第1步】配置動態Form.
開啟struts-config.xml,在
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><form-bean name="dynamicForm" type="org.apache.struts.action.DynaActionForm">
<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類負責從動態Form中獲得屬性值,並輸出到客戶端瀏覽器。在
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> package chapter6.action;
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");
// 獲得陣列型別欄位值的陣列長度
int hobbyCount = ((String[]) dForm.get("hobby")).length;
PrintWriter out = response.getWriter();
out.println("name: " + name + "");
out.println("age: " + age + "");
out.println("salary: " + salary + "");
for (int i = 0; i < hobbyCount; i++)
out.println("hobby" + (i + 1) + ": " + dForm.get("hobby", i) + "");
}
catch (Exception e)
{
}
return null;
}
}
【第3步】配置Struts
Action
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> <action name="dynamicForm" path="/dynamic" scope="request" type="action.DynamicAction" />
【第4步】編寫使用者錄入資料的JSP頁面
在Web根目錄中建立一個dynamic.jsp檔案,程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> @ page pageEncoding="GBK"%>
@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>測試動態Formtitle>
<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
六、驗證動態Form
有兩種方法可以驗證動態Form:
1. 在DynaActionForm的子類中覆蓋validate方法。
2. 如果要使用Validator框架來驗證動態Form,需要用DynaActionForm的子類org.apache.struts.validator. DynaValidatorForm或其子類來作為動態Form的型別。
在使用DynaValidatorForm的了類時,要想 使用Validator框架的驗證機制,需要在DynaValidatorForm子類的validate方法的開始位置使用 super.validate()語句來呼叫DynaValidatorForm中的validate方法。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-558306/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】Struts1.x系列教程(6):Bean標籤庫Bean
- 【原創】Struts1.x系列教程(7):Logic標籤庫
- 【原創】Struts1.x系列教程(8):上傳單個檔案
- 【原創】Struts1.x系列教程(2):簡單的資料驗證
- 【原創】Struts1.x系列教程(4):標籤庫概述與安裝
- 【原創】Struts1.x系列教程(17):包含和轉入Web資源Web
- 【原創】Struts1.x系列教程(18):使用DispatchAction類呼叫多個Action方法
- 【原創】Struts1.x系列教程(1)-B:用MyEclipse開發第一個Struts程式Eclipse
- 【原創】Struts1.x系列教程(12):Validator驗證框架的內建標準驗證框架
- 【原創】Struts1.x系列教程(15):使用DownloadAction類統計檔案下載次數
- formly-form 動態表單ORM
- 【原創】Oracle的動態監聽註冊Oracle
- 【原創】ORACLE 資料分析和動態取樣Oracle
- powerDesigner使用教程【原創】
- 使用form-create動態生成vue元件ORMVue元件
- 用struts 怎樣動態指定form元素ORM
- Git 系列教程(14)- 遠端分支Git
- vue中怎麼動態生成form表單VueORM
- pb通過類名稱動態構建類物件(原創)物件
- Struct FORM ACTION 無法解決動態賦值?StructORM賦值
- 【原創】中華通訊錄 pj教程
- network spy eval 1.6破解教程【原創】
- [原創] Linux ptrace詳細分析系列(一)Linux
- 【原創】【自制系列】自制stack型別(泛型)型別泛型
- 趨勢: 騰訊官方資料披露2014移動創業生態創業
- Docker系列教程14-Docker資料持久化Docker持久化
- oracle 啟動篇總結(原創)Oracle
- [原創]淺談勝新系列軟體的破解
- Django教程(三) Django表單FormDjangoORM
- 創意動態桌布:Dynamic Wallpaper 中文
- AngularJS教程九—— 動態表格AngularJS
- MVC 5 + EF6 入門完整教程14 -- 動態生成麵包屑導航MVC
- Java基礎系列-靜態代理和動態代理Java
- rails中使用form.select建立動態的下拉選單薦AIORM
- python自動化測試-原創Python
- 【原創】激動人心的Exadata初探
- 【黑金ZYNQ7000系列原創視訊教程】02.視訊介面——hdmi編碼輸出實驗
- Orbeon form 的安裝和使用教程ORBORM