首页 > 代码库 > ActionForm

ActionForm

鄙人一点struts1.2中ActionForm的理解

初学struts的人我觉得首先应该struts1.2学精,何精,就是明确struts的控制流程以及它核心API的实现原理(比方 Action/DispatchAction/MappingDispatchAction/LookupDispatchAction /ActionForm的实现原理)然后自己会写一个“山寨版”的struts1.2,仅仅有到达这样的程度你才干深刻体会struts1.2的MVC,也 才明你学会了struts1.2,当你再学struts2.0的候会很的easy,那struts1.2的关键就是能 ActionForm,在此我把自己学struts1.2ActionForm的使用及其实现原理出来晒一晒,望各位不要笑,些意

 

ActionForm的
(一)、ActionForm的特性
1.
建一个form须继承于四个父中的一个,要么继ActionForm,要么继ValidatorForm,要么继ValidatorActionForm,要么继
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方法
}
一个引用了
formappAction:
<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
属性那
attribute默的就使用name的
(二)、普通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.
formreset方法自己行清空
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="http://www.mamicode.com/zh"></html:multibox>
 英文<html:multibox property="lang" value="http://www.mamicode.com/en"></html:multibox>
 俄
<html:multibox property="lang" value="http://www.mamicode.com/ey"></html:multibox>
 <html:submit value="http://www.mamicode.com/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中把我想要位的属性先
当然利用第二
是最好的
5.我
能够利用struts的form回添机制行回添操作,回添的机是在form到达面之前,能够在Action中来做也能够在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
象存放在数据

 

ActionForm