隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          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-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>

          三、動態(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-11name屬性的默認值為“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) ;   // 讀取簡單屬性
            public Object get(String name, int index) ;  // 讀取索引屬性
            public Object get(String name, String key);  // 讀取映射屬性
             
              下面的代碼演示了如何通過getter方法獲得動態(tài)Form的屬性值:

          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還提供了getStringgetString方法,分別用來讀取StringString[]類型的屬性值,這兩個方法的定義如下:

          public String getString(String name) ;  
          public String[] getStrings(String name) ;

              下面的代碼演示了如何通過getStringgetStrings方法獲得動態(tài)Form的屬性值:

          String name = dForm.getString(“name”);  // 相當于String name = (String)dForm.get("name");
          String[] hobbies = dForm.getStrings(“hobbies”);  // 相當于String[] hobbies = (String[])dForm.get(“hobbies”);

              在使用getStringgetStrings方法時應注意,這兩個方法只能讀取StringString[]類型的屬性,讀取其他類型的屬性將會拋出異常。  

          五、一個動態(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-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類負責從動態(tài)Form中獲得屬性值,并輸出到客戶端瀏覽器。在<samples工程目錄>"src"action目錄中建立一個DynamicAction.java文件,代碼如下:

            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");
                        
          // 獲得數(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     

              打開struts-config.xml文件,在<action-mappings>元素中加入如下的內(nèi)容:
            <action name="dynamicForm" path="/dynamic" scope="request" type="action.DynamicAction" />

          【第
          4步】
          編寫用戶錄入數(shù)據(jù)的JSP頁面

              在Web根目錄中建立一個dynamic.jsp文件,代碼如下:
            <%@ page pageEncoding="GBK"%>
            
          <%@ 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" />&nbsp;&nbsp;<p>
                   年  齡:
          <html:text property="age" />&nbsp;&nbsp;<p>
                   工  資:
          <html:text property="salary" />&nbsp;&nbsp;<p>
                   愛好1:
          <html:text property="hobby"  value=""/>&nbsp;&nbsp;<p>
                   愛好2:
          <html:text property="hobby" value=""/>&nbsp;&nbsp;<p>
                   愛好3:
          <html:text property="hobby" value=""/>&nbsp;&nbsp;<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開發(fā)完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-02-16 17:22 銀河使者 閱讀(4636) 評論(4)  編輯  收藏 所屬分類: javaweb 原創(chuàng)struts1.x

          評論

          # re: Struts1.x系列教程(14):動態(tài)Form  回復  更多評論   

          在使用DynaValidatorForm的了類時,要想使用Validator框架的驗證機制,需要在DynaValidatorForm子類的validate方法的開始位置使用 super.validate()語句來調(diào)用DynaValidatorForm中的validate方法。
          DynaValidatorForm子類不用自己寫吧,super.validate()是自動調(diào)用的吧。請樓主指教!
          2009-03-06 14:21 | cyqnba

          # re: Struts1.x系列教程(14):動態(tài)Form  回復  更多評論   

          @cyqnba
          需要自己寫哦
          2009-03-06 14:47 | 銀河使者

          # re: Struts1.x系列教程(14):動態(tài)Form[未登錄]  回復  更多評論   

          寶藏,樓主,我轉了,支持你,太感謝你了
          2009-05-01 16:41 | tony

          # re: Struts1.x系列教程(14):動態(tài)Form  回復  更多評論   

          thank you so much
          2013-03-27 18:37 | kong_kong_er
          主站蜘蛛池模板: 金昌市| 保亭| 迁安市| 新疆| 广州市| 浑源县| 台北市| 韩城市| 凤凰县| 龙江县| 额尔古纳市| 蕉岭县| 龙海市| 类乌齐县| 江门市| 岐山县| 澜沧| 敦化市| 兰州市| 泾源县| 寿阳县| 桐庐县| 修文县| 凭祥市| 衡山县| 遵义县| 新邵县| 启东市| 和龙市| 原平市| 册亨县| 兴业县| 青州市| 武穴市| 东丽区| 临汾市| 连城县| 资讯 | 顺义区| 孟州市| 沂源县|