Java下Struts框架中的ActionForm类详解

 更新时间:2020年07月23日 15:02:26   作者:qq1312583369  
这篇文章主要介绍了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类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合MongoDB的实现代码

    SpringBoot整合MongoDB的实现代码

    自己本科时候一直使用的是Mysql,目前的课题组使用的是MongoDB,因此就花了一部分时间整理了一下,实现springboot与MongoDB的整合,并且实现基本的增删改查操作,从头到尾给出一个完整的案例。
    2021-05-05
  • Java简单实现动态代理模式过程解析

    Java简单实现动态代理模式过程解析

    这篇文章主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java使用BIO和NIO进行文件操作对比代码示例

    Java使用BIO和NIO进行文件操作对比代码示例

    这篇文章主要介绍了Java使用BIO和NIO进行文件操作对比代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java Thread.currentThread().getName() 和 this.getName()区别详解

    Java Thread.currentThread().getName() 和 this.getName()区别详

    本文主要介绍了Thread.currentThread().getName() 和 this.getName()区别详解,TestThread testThread = new TestThread();
    2022-02-02
  • java8新特性之Optional的深入解析

    java8新特性之Optional的深入解析

    这篇文章主要给大家介绍了关于java8新特性之Optional的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Spring事务框架之TransactionStatus源码解析

    Spring事务框架之TransactionStatus源码解析

    这篇文章主要为大家介绍了Spring事务框架之TransactionStatus源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 如何使用会话Cookie和Java实现JWT身份验证

    如何使用会话Cookie和Java实现JWT身份验证

    这篇文章主要介绍了如何使用会话Cookie和Java实现JWT身份验证,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • 关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明

    关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明

    这篇文章主要介绍了关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • java上界通配符(? extends Type)的使用

    java上界通配符(? extends Type)的使用

    在Java中,? extends Type是一个上界通配符,本文主要介绍了java上界通配符(? extends Type)的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • java判断对象中某个属性是否为空方法代码

    java判断对象中某个属性是否为空方法代码

    这篇文章主要给大家介绍了关于java判断对象中某个属性是否为空的相关资料,最近遇到后台接收值的时候,需要对接收对象进行非空校验,需要的朋友可以参考下
    2023-07-07

最新评论