Java下Struts框架中的ActionForm类详解

ActionForm的应用

(1) 、创建一个form类必须继承四个父类中的一个。比如继承ActionForm。

(2) 、一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应

例如、

一个表单为:

<form>
 <input type="text" name="username"></input>
 <input type="password" name="password"></input>
 <input type="text" name="email"></input>
</form>

一个与之对应的form类

public class UserForm extends ActionForm{
 private String username;
 private String password;
 private String email;

//下面省略getter和setter方法

 }

一个引用该form的appAction

<form-beans>
 <form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/test" type="action.TestAction" name="userForm" attribute="uf" scope="request"></action>
</action-mappings>

3.在引用了form-bean的action中name属性的值就是form-bean中name的值

4.这个userForm默认会被放在session中,使用scope可以指定存储该form对象的地方,自然attribute就是用来给存放在该范围中的form对象起的别名,如果不设置attribute该范围中的form对象起的别名,如果不设置attribute属性那么attribute默认的就使用name的值

2.原理跟普通HTML表单使用Form的工作原理大同小异,不同在于ActionServlet对struts-config进行解析时,当解析到某个action中存在一个属性name,那么ActionServlet中的RequestProcessor就会根据该name的值找到对应的form-bean然后创建一个对应的form类实例,放在我们定义的存储范围中,当表单提交到该action对应的appAction之前也就是到达FC的时候,FC会做以下事情

1.根据路径找到对应的内存中存放着的配置对象中的action
2.根据action中的attribute属性,从session中得到一个对应的form实例
3.该form实例调用reset方法对自己进行清空
4.用表单中的值去填充该form实例
5.如果要该form要进行验证那么就该form就会调用validate方法按照我们规定的验证规则进行验证

(三)、struts表单使用Form的工作原理

1.利用struts的HTML标签库定义的HTML元素其实是服务器端的java代码,java代码是编译型代码而HTML则是解释型代码,所以在使用struts的HTML标签库定义的HTML元素要更加的严谨,只要某个元素甚至是某个属性没有定义对,那么编译就不能通过从而抛出异常,例如在使用struts的HTML标签库定义表单的时候action属性是在编译的时就要被确定的如果action属性所定义的提交路径是空或者是错误,那么服务器在编译的时候就会抛出500的异常,而不像普通HTML表单action属性是在提交的时候才确定的

2.原理跟普通HTML表单使用Form的工作原理大同小异,不同在于当服务器对form表单进行编译的时候会向action所指定的地址发一个请求,看是否正确,所以这个时候其实就已经提交了一次表单,当表单到达FC的时候跟上面做的几件事情中就第三件不同,不同在于表单和form中的值都将互相填充,

这就是struts对表单的回添机制

Example:

表单为:

//先导入struts的html标签库

<html:form action="test.do" method="post">

 <html:text property="username"></html:text>

 <html:text property="salary"></html:text>

 中文<html:multibox property="lang" value="zh"></html:multibox>

 英文<html:multibox property="lang" value="en"></html:multibox>

 俄语<html:multibox property="lang" value="ey"></html:multibox> 

<html:submit value="click me">

</html:submit>

</html:form>

form类为:

public class UserForm extends ActionForm{

 private String username;
private double salary=1000.00;
 private String[] lang; 

 //省略getter和setter方法

  }

配置文件为:

<form-beans>
 <form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
 <action path="/test" type="action.TestAction" name="userForm" attribute="uf">
 <forward name="success" path="/show.do"></forward>
 </action>
 <action path="/show" type="action.ShowAction" >
 <forward name="success" path="/test.do"></forward>
 </action>
</action-mappings>

经验:

1.显示页面之前服务器会向text.do发送一次请求,该请求也就是提交表

2.当上面的请求到FC的时候会用form中的值去填充这个表单然后回显给用户所以用户看到的页面显示结果是salary文本框中有一个值为1000

3.当用户再次提交表单,请求到达FC的时候服务器会首先检查你所提交的表单元素的值跟session中这个form与之对应的属性的值是否相同,如果相同就直接利用该form去填充表单,如果不相同就先把提交的表单元素的值赋给form中与之对应的属性再利用form去填充表单

4.该实例有一个问题,就是当用户第一次选择了两种语言,然后提交,第二次用户一种语言都没选,然后提交,这时候回显的结果出人意料,复选框中的值既然是第一次用户所选择的值,

原因是,复选框有一个特性,如果用户什么都不选择,那么提交表单的时候就不提交复选框,如果我们使用get请求提交的话就能明显的看到这种情况表单提交的属性只有username和salary两个,这两个元素即使没有值也会提交,就因为这一点,当表单到达FC的时候,服务器只看到提交的两个表单元素username和salary,然后检查form中的属性也只会检查username和salary两个,而不会检查lang,如果表单中的username和salary与form中与之对应的username和salary属性不一样,那么就先把表单中的username和salary值赋给form中的username和salary属性,然后利用form去填充表单,如果一样,那么就利用原来的form去填充表单,在这两种情况下form中的lang属性都将不会被检查更不用提改变,所以lang用的还是上一次的值,自然回显的时候form中的复选框的值就是上一次的值

5.解决这一问题可以有两种办法,在提交表单以后就把session中的form对象给删除掉,每一次提交都新创建一个form对象也就是在页面的末尾加一个<%session.removeAttribute("uf")%>
第二种解决办法是在UserForm中覆盖父类的reset方法,该reset方法将在form填充之前做,这样我们就能在reset中把我们想要复位的属性先复位

(四)、Form与实体对象之间的关系

有的时候我们为了方便会把取到的form中的值直接拷贝到实体对象中去然后把实体对象再存储到数据库中,这样给我们的编程带来了很多的方便,但前提是实体对象中需要拷贝的属性,form中要拷贝过去的属性,与form对应的表单元素他们三者必须一一对应.

这样我们就可以把表单中的值得到封装到form中然后再把form中与实体对象中属性相同的值拷贝到实体对象中

Example:

entity:

public class User{

 private String name;
 private String password;
 private double salary;
 private String address;

 //省略getter和setter方法

}

form:

public class UserForm{

 private String name;
 private String password;
 private String salary;

 //省略getter和setter方法

}

表单:

<form>

 <input type="text" name="name"></input>
 <input type="password" name="password"></input>
 <input type="text" name="salary"></input>

</form>

1.把表单中的值赋值给UserForm

2.把UserForm中的值拷贝到User对象中:
//下面这条语句是在action的某个方法中做的所以form直接可以用
BeanUtils.copyProperties(user,form);

3.将user对象存放在数据库中

到此这篇关于Java下Struts框架中的ActionForm类详解的文章就介绍到这了,更多相关Java Struts框架 ActionForm类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java的Struts框架中Action的编写与拦截器的使用方法

    Struts2 Action/动作 动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能力.首先,操作从请求数据的传输中起着重要的作用,通过向视图,无论是一个JSP或其它类型的结果.二,动作必须协助的框架,在确定结果应该渲染视图,在响应该请求将被退回. 创建动作: 在Struts2的动作,唯一的要求是必须有一个无参数的方法返回String或结果的对象

  • Java的Struts框架中配置国际化的资源存储的要点解析

    1.资源文件命名 国际化资源文件命名格式如下: basename_language_country.properties basename_language.properties basename.properties 其中basename为资源文件的基本名称,language和country必须是java支持的语言和国家.获取java支持的语言和国家代码如下: Locale[] locales = Locale.getAvailableLocales(); for(Locale locale:

  • 深入解析Java的Struts框架中的控制器DispatchAction

    Struts中的表单处理器为ActionForm,而struts中的控制器主要是Action,以及DispatchAction控制器等. Action 在struts中,所有的用户都会经过ActionServlet的处理,而实际的工作是交给Action对象来处理的,ActionServlet可以从配置文件中创建ActionMapping对象,从ActionMapping对象中找到对应使用的Action,然后将用户请求转交给Action. 对Struts一个ActionMapping只能生成一个A

  • 详解Java的Struts框架中注释的用法

    要开始在你的项目中使用注释,确保WebContent/WEB-INF/lib文件夹中的jar文件包括以下: struts2-convention-plugin-x.y.z.jar asm-x.y.jar antlr-x.y.z.jar commons-fileupload-x.y.z.jar commons-io-x.y.z.jar commons-lang-x.y.jar commons-logging-x.y.z.jar commons-logging-api-x.y.jar freemar

  • 详解Java的Struts框架以及相关的MVC设计理念

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/JSP技术,实现了基于JavaEEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品. Struts发展历史 Struts是作为ApacheJakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServerPages.servlet.标签库以及面

  • Java的Struts框架中append标签与generator标签的使用

    append 标签: 这些append标签需要两个或两个以上的列表作为参数,并追加它们放在一起,如下图所示: <s:append var="myAppendIterator"> <s:param value="%{myList1}" /> <s:param value="%{myList2}" /> <s:param value="%{myList3}" /> </s:ap

  • 简单说明Java的Struts框架中merge标签的使用方法

    merge标签合并标记需要两个或两个以上的列表作为参数,并把它们合并在一起,如下所示: <s:merge var="myMergedIterator"> <s:param value="%{myList1}" /> <s:param value="%{myList2}" /> <s:param value="%{myList3}" /> </s:merge> <

  • Java的Struts框架中登陆功能的实现和表单处理器的使用

    实现Struts登录 1.jar包拷贝 首先是建立java web项目,之后打开我们我们下载好strtus框架,Struts-1.2.9-bin文件夹和struts-1.2.9.src源文件文件夹.在bin文件夹中的lib文件中拷贝struts的jar包,拷贝到我们自己项目struts_login –>lib文件夹下. 2.web.xml文件配置 找到Struts-1.2.9-bin中Struts-1.2.9-bin-->webapps下的struts实例struts-blank中的strut

  • 总结Java的Struts框架的异常处理方法

    Struts提供了一个更简单的方式来处理未捕获的异常,并将用户重定向到一个专门的错误页面.您可以轻松地Struts配置到不同的异常有不同的错误页面. Struts的异常处理所使用的"exception"拦截容易."exception"拦截器作为默认的栈的一部分,所以不必做任何额外的配置.它可为准备使用的盒.让我们看到了一个简单的Hello World示例进行一些修改在HelloWorldAction.java文件.在这里,我们特意推出了一个空指针异常在我们Hello

  • Java下Struts框架中的ActionForm类详解

    ActionForm的应用 (1) .创建一个form类必须继承四个父类中的一个.比如继承ActionForm. (2) .一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应 例如. 一个表单为: <form> <input type="text" name="username"></input> <input type="password" name="passwor

  • 基于Java中的StringTokenizer类详解(推荐)

    StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是"空格"."制表符('\t')"."换行符('\n')"."回车符('\r')". StringTokenizer(String str,String delim)

  • JAVA中的Configuration类详解

    本文主要研究的是Java中的Configuration类的用法,涉及maven自动加载,pom.xml配置和简单的Java代码,具体如下. properties文件是Java平台默认的配置文件格式,其优点是格式清晰,简单易懂,使用commons-configuration读取properties文件也比较简单,代码如下: 基本用法: 1.加载jar包,我使用maven自动加载,pom.xml配置如下: <dependency> <groupId>commons-configurat

  • Java结构型设计模式中代理模式示例详解

    目录 代理模式 分类 主要角色 作用 静态代理与动态代理的区别 静态代理的基本使用 创建抽象主题 创建真实主题 创建代理主题 客户端调用 JDK动态代理的基本使用 创建抽象主题 创建真实主题 创建代理主题 客户端调用 小优化 CGLIB动态代理的基本使用 创建抽象主题 创建真实主题 创建代理主题 客户端调用 小优化 CGLIB与JDK动态代理区别 1.执行条件 2.实现机制 3.性能 代理模式 代理模式(Proxy Pattern)属于结构型模式. 它是指为其他对象提供一种代理以控制对这个对象的

  • Java集合之Map接口与实现类详解

    目录 初识Map Map中常用方法 HashMap LinkedHashMap TreeMap HashMap和TreeMap的比较 Hashtable 集合中元素的遍历 iterator接口中的方法 Enumeration接口中的方法 初识Map Map接口没有从Collection接口继承,Map接口用于维护“键-值”对数据,这个“键-值”对就是Map中的元素,Map提供“键(Key)”到“值(value)”的映射,一个Map中键值必须是唯一的,不能有重复的键,因为Map中的“键-值”对元素

  • Java Big Number操作BigInteger及BigDecimal类详解

    目录 BigInteger类 构造函数 类方法 BigDecimal类 BigInteger类 java.math.BigInteger 类的使用场景是大整数操作.它提供类似所有Java的基本整数运算符和java.lang.Math中的所有相关的方法的操作,如+.-.*./.%.&.|.mod.>>.<<,以及min().max()等等. 只不过它操作的整数都是极其大的,为科学计算提供了很大的便利.比如下面的代码就是计算20000000000000000000 * 3000

  • Java结构型设计模式中建造者模式示例详解

    目录 建造者模式 概述 角色 优缺点 应用场景 基本使用 创建产品类 创建建造者类 使用 链式写法 创建产品类与建造者类 使用 建造者模式 概述 建造者模式(Builder Pattern)属于创建型模式. 它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 简而言之:建造者模式就是使用多个简单的对象一步一步构建成一个复杂的对象. 建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定.如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分

  • JavaScript知识点总结(十一)之js中的Object类详解

    JavaScript中的Object对象,是JS中所有对象的基类,也就是说JS中的所有对象都是由Object对象衍生的.Object对象主要用于将任意数据封装成对象形式. 一.Object类介绍 Object类是所有JavaScript类的基类(父类),提供了一种创建自定义对象的简单方式,不再需要程序员定义构造函数. 二.Object类主要属性 1.constructor:对象的构造函数. 2.prototype:获得类的prototype对象,static性质. 三.Object类主要方法 1

  • C/C++中虚基类详解及其作用介绍

    目录 概述 多重继承的问题 虚基类 初始化 例子 总结 概述 虚基类 (virtual base class) 是用关键字 virtual 声明继承的父类. 多重继承的问题 N 类: class N { public: int a; void display(){ cout << "A::a=" << a <<endl; } }; A 类: class A : public N { public: int a1; }; B 类: class B :

  • Flask框架中的session设置详解

    目录 Flask中的session session设置 关于session的设置 cookies中的session session序列化机制 session反序列化机制 session的使用和验证 Flask中的session session设置 Flask除请求对象之外,还有一个 session 对象. 它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥. 我们知道,在django中的session

随机推荐