要想明确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对象存放在数据库中