首页 > 代码库 > Struts中ActionForm小结

Struts中ActionForm小结

要想明白struts的控制流程以及它核心API的实现原理(比如 Action/DispatchAction/ActionForm的实现原理),玩转struts1.2的关键就是能够玩转 ActionForm。

ActionForm的应用
1、——ActionForm的特性
1.创建一个form类必须继承于四个父类中的一个,比如ActionForm、ValidatorForm。
2.一个form类中的每一个属性都将和页面中form表单中的每一个表单元素一一对应
Example:
一个表单为:
<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;
  private String address;
  
  //下面省略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对象的地方

 

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实例

 

 

3、——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对象存放在数据库中