ActionForm详解

ActionForm详解使用 ActionForm 把表单数据单独封装起来 而且提供了自动的数据验证 简化了代码的编写 给我们带来了极大的方便 但是 ActionForm 也存在一些明显的不足 1 如果 ActionForm 对应的 HTML 表单添加或删除一些属性 ActionForm 类就可能需要修改并重新编译 所以如果 HTML 表单是动态的 那么 ActionForm 就无能为力了 2 ActionForm 增加了

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

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

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

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

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

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

 

还是边看实例边说吧!

 

JSP

[html] 
view plain
copy
print
?

  1. <%@ page language=“java” contentType=“text/html; charset=GB18030”  
  2.     pageEncoding=“GB18030”%>  
  3. >  
  4. <html>  
  5.     <head>  
  6.         <meta http-equiv=“Content-Type” content=“text/html; charset=GB18030”>  
  7.         <title>Insert title here
    title>  
  8.     
    head>  
  9.     <body>  
  10.         <h1>  
  11.             测试动态ActionForm  
  12.         
    h1>  
  13.         <form action=“TestAction.do” method=“post”>  
  14.             username:  
  15.             <input type=“text” name=“name” />  
  16.             <br />  
  17.             age:  
  18.             <input type=“text” name=“age” />  
  19.             <br />  
  20.             <input type=“submit” value=“提交” />  
  21.         
    form>  
  22.     
    body>  

  23. html>  

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

[html] 
view plain
copy
print
?


  1. xml version=“1.0” encoding=“ISO-8859-1” ?>  
  2.   
  3.           “-//Apache Software Foundation//DTD Struts Configuration 1.2//EN”  
  4.           “http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd”>  
  5.   
  6. <struts-config>  
  7.     <form-beans>  
  8.         <form-bean name=“dynamicForm” type=“org.apache.struts.action.DynaActionForm”>  
  9.             <form-property name=“name” type=“java.lang.String” />  
  10.             <form-property name=“age” type=“java.lang.Integer” />  
  11.         
    form-bean>  
  12.     
    form-beans>  
  13.     <action-mappings>  
  14.         <action path=“/TestAction” type=“com.jialin.TestAction” name=“dynamicForm”  
  15.             scope=“request”>  
  16.             <forward name=“showResult” path=“/ShowResult.jsp” />  
  17.         
    action>  
  18.     
    action-mappings>  

  19. struts-config>  

 

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

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

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

 

Action

[java] 
view plain
copy
print
?

  1. package com.jialin;  
  2.   
  3.   
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6.   
  7. import org.apache.struts.action.Action;  
  8. import org.apache.struts.action.ActionForm;  
  9. import org.apache.struts.action.ActionForward;  
  10. import org.apache.struts.action.ActionMapping;  
  11. import org.apache.struts.action.DynaActionForm;  
  12.   
  13. public class TestAction extends Action {  
  14.   
  15.     @Override  
  16.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  17.             HttpServletRequest request, HttpServletResponse response)  
  18.             throws Exception {  
  19.         DynaActionForm daf=(DynaActionForm)form;  
  20.         String name=daf.getString(“name”);  
  21.         Integer age = (Integer)daf.get(“age”);  
  22.         System.out.println(“name=” + name);  
  23.         System.out.println(“age=” + age);  
  24.           
  25.         return mapping.findForward(“showResult”);  
  26.     }  
  27.       
  28. }  

动态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能让我们很清晰的了解表单数据信息,数据和对数据的操作是分离的,更容易让人理解。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209770.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:27
下一篇 2026年3月19日 上午8:28


相关推荐

  • Java_万年历(简单)

    Java_万年历(简单)1、方法,需要一个年份,一个月份。然后在控制台输出日历2、MainTest测试类3、运行结果:有帮助,就点个推荐吧,让更多人看到

    2022年7月2日
    23
  • filetype all java试卷_java认证考试试题及答案

    filetype all java试卷_java认证考试试题及答案java认证考试试题及答案故答案为C。12.Whatistheresultafterthefollowingcodeexecutes?1shorts=0x00FD;2byteb=(byte)s;3System.out.println(b);Select1correctanswer:A.Compiletimeerrorinline1B.Comp…

    2022年7月8日
    27
  • 用户态与内核态之间切换详解[通俗易懂]

    用户态与内核态之间切换详解[通俗易懂]用户态切换到内核态CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0.每个线程都对应着一个用户栈和内核栈,分别用来执行用户方法和内核方法。用户方法就是普通的操作。内核方法就是访问磁盘、内存分配、网卡、声卡等敏感操作。当用户尝试调用内核方法的时候,就会发生用户态切换到内核态的转变。切换流程:1、每个线程都对应这一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。2、因为从用户态切换到内核态时,需要将用户态.

    2025年12月16日
    5
  • 浅谈Java异常及其编译时异常和运行时异常的区别[通俗易懂]

    浅谈Java异常及其编译时异常和运行时异常的区别[通俗易懂]异常是程序编码和运行时经常发生的事件,了解异常有助于我们提高代码质量,增强系统的健壮性,这里总结一下载Java编程中,编译时异常和运行异常时的区别,并列举几种常见的异常,以供参考学习。

    2026年4月18日
    6
  • jdbctemplate查询为空报错_java空指针异常举例

    jdbctemplate查询为空报错_java空指针异常举例问题是在:Dao类是不能直接new出来的必须是通过ApplicationContextapplicationContext=newClassPathXMLApplicationContext(“springmvc.xml”)erDaodao=(UserDao)ac.getBean(“UserDaoId得到类UserDao的实例化从而JdbcTemplate的值才能获…

    2025年6月23日
    8
  • 串口db9接口定义_db9串口定义及颜色

    串口db9接口定义_db9串口定义及颜色这个接头都是以公头为准,所有接头还是以公头去记.RS-232端(DB9公头/针型)引脚定义2:RXD3:TXD5:GND1/4/6:内部相链接7/8:内部相链接1.RS-232端(D

    2022年8月6日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号