使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便。

但是,ActionForm也存在一些明显的不足:

1、如果ActionForm对应的HTML表单添加或删除一些属性,ActionForm类就可能需要修改并重新编译;所以如果HTML表单是动态的,那么ActionForm就无能为力了;

2、ActionForm增加了项目中类的数量!

3、对于安全性要求不高的系统,ActionForm的数据验证并不常用,我们一般都在js中验证了

面对这些缺点,Struts引入了动态actionform概念,动态ActionForm使得用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DyanActionForm类及其子类实现了动态ActionForm.

还是边看实例边说吧!

JSP

<%@ page language="java" contentType="text/html; charset=GB18030"pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>Insert title here</title></head><body><h1>测试动态ActionForm</h1><form action="TestAction.do" method="post">username:<input type="text" name="name" /><br />age:<input type="text" name="age" /><br /><input type="submit" value="提交" /></form></body>
</html>

配置文件

DyanActionForm类扩展了 ActionForm类。动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,无须编写任何额外的JAVA代码。使用动态 form, 没有对应的类,所以,如果需要扩展属性,只需要再次配置文件中添加一个属性就可以了

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE struts-config PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN""http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"><struts-config><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.Integer" /></form-bean></form-beans><action-mappings><action path="/TestAction" type="com.jialin.TestAction" name="dynamicForm"scope="request"><forward name="showResult" path="/ShowResult.jsp" /></action></action-mappings>
</struts-config>

那么,在这个 action 里面,如何实现对动态 form 的调用 ? 同普通的ActionForm一样,Action类和JSP都可以访问动态ActionForm,而访问方式也基本一致。访问动态ActionForm与访问普通的ActionForm的最大区别在于对属性的访问方式不同。

我们传递的是 DynaActionForm, 所以,在调用的时候,我们就要把 form 强制转换成 DynaActionForm 对象。

在标准的ActionForm中,针对每一个属性都提供了getter和setter方法来读取和设置属性,而DynaActionForm把所有的属性保存在一个Map 对象中,因此访问DyanActionForm中的属性与访问Map对象中的方法类似。

Action

package com.jialin;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;public class TestAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {DynaActionForm daf=(DynaActionForm)form;String name=daf.getString("name");Integer age = (Integer)daf.get("age");System.out.println("name=" + name);System.out.println("age=" + age);return mapping.findForward("showResult");}}

动态ActionForm的表单验证问题。DynaActionForm类的validate()方法没有提供任何默认的验证行为。可以通过定义扩展DynaActionForm类的子类,然后覆盖validate()方法,但是以编程方式来验证动态ActionForm并不是一种理想的办法。动态ActionForm的验证应该使用Struts的Validator验证插件。Validator插件允许采用特定的配置文件为动态的ActionForm配置验证规则,如检查必须的输入域,日期时间等。但这些验证我们一般都在客户端js中完成。

动态Action同样有它的缺点:

1、配置文件会增加,非常容易写错,而且错误不易发现。今天测试的时候,我就是把java.lang.String 写成了java.long.String 在Action中拿到的form就是null,找了老半天才解决。所以采用动态action调试比较麻烦。

2、静态ActionForm能让我们很清晰的了解表单数据信息,数据和对数据的操作是分离的,更容易让人理解。

呵呵,有利就有弊,平衡就好。

下篇继续……

一口一口吃掉Struts(六)——动态ActionForm相关推荐

  1. 计算机网络技术动态路由配置,计算机网络实验六动态路由的配置

    计算机网络实验六动态路由的配置 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 计算机网络原理实验报告 实验六 动态路由的配置 系 ...

  2. WPF案例 (六) 动态切换UI布局

    原文:WPF案例 (六) 动态切换UI布局 这个Wpf示例对同一个界面支持以ListView或者CardView的布局方式呈现界面,使用控件ItemsControl绑定数据源,使用DataTempla ...

  3. android 串口转usb,方口并口打印线

    我们在第一次安装使用打印机时候,可能不清楚打印线怎么使用,下面教大家如何使用方口并口打印线以及USB转9针串口线. 一.方口并口打印线设置教程 1:检测打印线 将打印线先连接好,鼠标右键点击计算机-设 ...

  4. 常见国家S口-O口规范与CID标准一览

    常见国家S口-O口规范与CID标准一览(本文为内部资料,为转载) 目录 1............................................................... ...

  5. POE交换机分类有哪些?4口/8口/16口/24口千兆POE交换机有哪些选择?

    POE交换机分类有哪些?4口/8口/16口/24口千兆POE交换机有哪些选择? POE供电技术凭借简化用电设备的部署,以及节能.安全.可靠等优势,成为安防监控.无线覆盖以及智能电网等场景的宠儿.在安防 ...

  6. 计算机网络实验ripv2配置,实验六 动态路由协议RIP初步配置

    <实验六 动态路由协议RIP初步配置>由会员分享,可在线阅读,更多相关<实验六 动态路由协议RIP初步配置(11页珍藏版)>请在人人文库网上搜索. 1.南昌大学实验报告学生姓名 ...

  7. SW3518全协议OPPO闪充、支持QC-A+C-PD 口任意口快充输出车充IC

    深圳市展嵘电子有限公司 有需要的上帝可联系小陈:136-6225-3950 : 3412-1522-98 支持 PD 的多快充协议双口充电解决方案 概述 SW3518 是一款高集成度的多快充协议双口充 ...

  8. Struts 中的ActionForm

    Struts 中定义了一些JavaBeans,主要是以ActionForm为父类扩展开来的,如下图: ① org.apache.struts.action包中 public abstract clas ...

  9. 一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别

    最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...

  10. 串口与COM口 USB口、TTL、RS-232、RS-485区别 释疑

    Point: 1.串口.COM口是指的物理接口形式(硬件),COM口简称是串口.而TTL.RS-232.RS-485是指的电平标准(电信号). 2.接设备的时候,一般只接GND RX TX.不会接Vc ...

最新文章

  1. 线程状态以及sleep yield wait join方法
  2. 在MATLAB function中可变的变量数据类型
  3. java白色_java-将精灵颜色更改为白色
  4. John's trip(POJ1041+欧拉回路+打印路径)
  5. pytorch学习笔记(7):RNN和LSTM实现分类和回归
  6. Android学习系列(34)--App应用之发布各广告平台版本
  7. 数据存储的问题(1)
  8. Android学习笔记---常用技巧(图片的旋转)
  9. SpringApplication#run⽅法第5步,打印banner(四)
  10. c语言入门经典(第5版)pdf
  11. PDF文档只能读,不能修改和复制怎么办?
  12. 二、NPP/VIIRS夜间灯光数据校正之投影变换、裁剪、重采样
  13. JMeter详细使用手册
  14. 微信 商户号证书申请 微信支付系统部署
  15. 若依vue版菜单点不开 Error: Cannot find module ‘@/views/system/user/index‘
  16. 《还珠格格》《大宅门》取景地将被拍卖:3.6亿起拍
  17. Win10笔记本开启热点让手机上网
  18. matlab 函数输出 向量,matlab中的函数返回向量
  19. 基于深度学习的图像隐写分析综述 阅读
  20. 文件系统层次结构标准和Linux上下载源代码配置编译安装

热门文章

  1. 有Pytz时区列表吗?
  2. Java Bubble Sort 冒泡排序图解
  3. BoundsChecker下载
  4. ceph最低配置和硬件推荐
  5. Android播放器框架分析之AwesomePlayer
  6. 景观专业设计师必备SketchUp插件合集,你都用过吗?
  7. matlab灵敏度分析绘图——道路最大通行能力
  8. 锁定计算机的软件,易通电脑锁(控制上网时间必备软件)
  9. 华为p50预计售价鸿蒙是什么,华为p50预计售价多少_华为p50售价预估
  10. 计算机网络与信息安全公务员,计算机网络技术专业考公务员有些职位?