首页 > 其他分享 >Struts1.x系列教程(14):动态Form

Struts1.x系列教程(14):动态Form

时间:2023-06-15 11:07:08浏览次数:44  
标签:name Form Struts1 String form 14 动态 属性



上一篇:Struts1.x系列教程(13):国际化
一、动态Form简介

    虽然ActionForm功能强大,但有些时候使用起来有些麻烦。如每建立一个用户录入界面(JSP页面),就得建立一个ActionForm子类来和这个页面对应。当然,我们可以采用嵌套属性从一定程度上弥补这个问题。但是在建立新的用户录入界面时,仍不可避免地要建立新的ActionForm子类。

    在Struts1.2.6及以后的Struts版本中提供了一种动态Form的技术。使得不用再建立新的ActionForm就可以封装用户提交的数据。实际上,这种技术将定义ActionForm子类的工作变成了编写XML文件的工作。

    每定义一个动态Form,就要在struts-config.xml中加一个<form-bean>元素,并使用<form-property>子元素来定义动态Form的属性。

    在本章的最后还会介绍一个LazyValidatorForm类,通过这个类甚至可以不定义动态Form的属性就可以使用动态Form。这将大大简化开发人员的工作量。    

二、声明动态Form

   

声明一个动态Form非常简单,只需要在struts- config.xml的<form-beans>元素中加入一个<form-bean>子元素,并使用<form- property>元素来定义动态Form的属性。我们可以定义的属性类型有简单属性(如String)、索引属性(如数组)、映射属性(如 HashMap)以及嵌套属性(属性类型是另一个类)。

    对于动态Form来说,Form的类型必须是org.apache.struts.action.DynaActionForm或其子类。声明一个动态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 >


三、动态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中代表的数据类型是完全一样的。我们还可以使用<form-property>元素的initial属性为动态Form的简单属性指定一个默认值。如在例程6-11中name属性的默认值为“bill”。

对于索引属性的类型来说,可以是数组,也可以是java.util.List接口的类(如ArrayList)。我们还可以为动态Form的属性指定实现java.util.Map接口的类作为数据类型(也就是映射属性)。但遗憾的是,如果使用动态Form,就无法使用泛型进行自动类型转换了。

四、访问动态Form

    我们可以使用DynaActionForm类的getter方法来读取动态Form中的属性值。DynaActionForm类的getter方法有三个重载形式,分别用来读取简单属性、索引属性和映射属性。这三个getter方法的定义如下:


  public  Object get(String name) ;    //  读取简单属性
   public  Object get(String name,  int  index) ;   //  读取索引属性
  public  Object get(String name, String key);   //  读取映射属性


   


   

下面的代码演示了如何通过getter方法获得动态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还提供了getString和getString方法,分别用来读取String和String[]类型的属性值,这两个方法的定义如下:


public
   String getString(String name) ;  

  public
   String[] getStrings(String name) ;

    下面的代码演示了如何通过getString和getStrings方法获得动态Form的属性值:


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,在<form-beans>元素中加入如下的内容:

< 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中获得属性值,并输出到客户端浏览器。在<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 " );
               //  获得数组类型字段值的数组长度
               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>元素中加入如下的内容:

<
  action 
  name
  ="dynamicForm"
   path
  ="/dynamic"
   scope
  ="request"
   type
  ="action.DynamicAction"
   
  />


【第4步】

编写用户录入数据的 JSP 页面


   

在Web根目录中建立一个dynamic.jsp文件,代码如下:

 <% @ page pageEncoding = " GBK " %>
   <% @ taglib uri = " http://struts.apache.org/tags-html "  prefix = " html " %>
   < html >
     < head >
       < title > 测试动态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

六、验证动态Form

有两种方法可以验证动态Form:

1. 在DynaActionForm的子类中覆盖validate方法。

2. 如果要使用Validator框架来验证动态Form,需要用DynaActionForm的子类org.apache.struts.validator. DynaValidatorForm或其子类来作为动态Form的类型。

   

在使用DynaValidatorForm的了类时,要想 使用Validator框架的验证机制,需要在DynaValidatorForm子类的validate方法的开始位置使用 super.validate()语句来调用DynaValidatorForm中的validate方法

下一篇:

Struts1.x系列教程(15):使用DownloadAction类统计文件下载次数




标签:name,Form,Struts1,String,form,14,动态,属性
From: https://blog.51cto.com/u_16065168/6485308

相关文章

  • Terraform学习
    转自:https://blog.csdn.net/u012562943/category_7644872.html ......
  • 修复 Sqlite "database disk image is malformed"
    Sqlite是用于移动设备的轻量级数据库。Android编译遇到出错异常:databasediskimageismalformed 处理方法为通过对sqlite提供的修复命令建立脚本封装自动处理。修复方法来自网络搜索,年代久远,出处不可考,如找到出处,本文引用改为链接。 1#1.dumpSQL语句2def__d......
  • Luogu P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
    【模板】中国剩余定理(CRT)/曹冲养猪题目描述自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有\(16\)头母猪,如果建了\(3\)个猪圈,剩下......
  • How to Render Django Form Manually
    DealingwithuserinputisaverycommontaskinanyWebapplicationorWebsite.ThestandardwaytodoitisthroughHTMLforms,wheretheuserinputsomedata,submitittotheserver,andthentheserverdoessomethingwithit.Now,thechancesareth......
  • 一个支持WinForms换肤的开源组件
    推荐一个一键换肤的WinForms皮肤组件。项目简介这是一个支持自定义WinForms窗口、控件颜色、禁用状态、动画效果的皮肤组件。支持的组件有:多选框、分割线、按钮、文本框、单选按钮、输入框、Tab控件、右键菜单、列表、进度条。组件只能一键统一更换,不能随意自定义设置主题,有......
  • 成功解决[AssertionError: Input tensor input format are different]
    在使用tensorboardwriter.add_image时writer.add_image('img/fixed_img',denorm(fixed_img.data),0)报如下错误assert(len(tensor.shape)==len(input_format)),"sizeofinputtensorandinputformataredifferent.AssertionError:sizeofinputtensorand......
  • 【实战】霸榜各大医学分割挑战赛的Transformer架构--nnFormer
    文章目录安装下载以及预处理实验数据预处理数据修改源代码错误traintest简介:我们介绍了nnFormer(not-anothertransFormer),一种用于3D医学图像分割的transformer。nnFormer不仅使用了卷积和自注意力的结合,还引入了基于局部和全局体积的自注意机制来学习体积表示。此外,nnFormer......
  • 使用Tansformer分割三维腹部多器官--UNETR实战
    不会transformer没关系,本教程开箱即用。Tina姐总算对transformer下手了,之前觉得难,因为刚开始学序列模型的时候就没学会。然后就一直排斥学transformer。这两周没什么事,加上MONAI有现成的教程,就打算先跑通后,再学理论。然后,顺利的跑通了代码,再学了一周理论,发现它也不过如此嘛,入门还......
  • 6.14
    1.pip永久换源/1 在文件地址栏输入:%APPDATA%回车,快速进入C:\Users\电脑用户\AppData\Roaming文件夹中/2在Roaming文件夹中新建pip文件夹/3 在pip文件夹中新建pip.ini配置文件/4pip文件夹写入:[global]index-url=https://mirrors.aliyun.com/pypi/simple[instal......
  • 2023-6-14
    好几天没有写了,时间过得越长越觉得自己是个被抛弃的人,不幸的事情总是会发生在自己身上,努力又会怎样,残酷的回忆总是会不停不停涌入自己的脑袋,你会喘不上气来 黛林已经不会再回复我了吧,什么东西都已经把我删除了,微信不删是对我最后的仁慈,从头到尾我到底成为了什么样的人呢,开始厌......