Struts下ActionForm的生命周期

ActionForm 的产生有两种情况。

            1.于用户请求带有该 ActionForm 对应的 Form 表单的Jsp时,并且在session 中没有该 ActionForm 类型的对象。

            2.提交数据到该ActionForm 对应的 Action 时,并且在session 中没有该 ActionForm 类型的对象。

  

  第一种情况下,当用户请求一个带有 Form 表单的Jsp。服务器会根据 Form 生成对应的 ActionForm 对象。然后调用它里面 getter ,为各个输入框符值(这也是为什么可以根据 ActionForm 里各属性的初识值,来控制各个输入框的初始值)。在这一次 Http 请求 结束后,也就是发送完这个 Jsp 之后,该ActionForm 对象消亡。


  第二种情况下,用户提交一个表单到 Action ,服务器会生成对应的 ActionForm 对象,然后调用它里面的 setter ,根据提交过来的值为 ActionForm 对象的各个属性赋值。该ActionForm 对象供处理业务逻辑时调用(在 Action 里 excute 函数里通过ActionForm 对象的 getter 来取值)。

  

  默认情况下,ActionForm 的范围为 request 。也就是说在一次 Http 请求之后(一次请求Jsp页面,或者一次提交表单),ActionForm 就消亡。再下一次请求时,服务器会再生成一个新的 ActionForm 对象。


  然而用户有时的多次请求(或者说多次提交),需要关联到上几次请求的数据。例如,在注册时,在第一个页面填写基本信息,第二个页面填写隐私信息,他们的表单共用一个 ActionForm 。很显然,ActionForm 的范围为 request 时,第一次提交之后生成的 ActionForm 对象有基本信息,而第二次提交之后,服务器生成的新的 ActionForm 并不会再有第一次提交的基本信息。也就是说,两次提交生成两个 ActionForm  对象。两个 ActionForm 分别只有各自的提交信息。这样需要两次的业务逻辑处理,才不至于丢失数据。也就是说第一提交写一次数据库,第二次提交再写一次数据库。

  解决方案,将 ActionForm 的范围扩大至 session。当 session 中存在请求时所需要生成的 ActionForm 对象,那么服务器就会复用该对象,而不是再去生成一个 ActionForm 对象。这样,前几次请求的数据都依然保存在 ActionForm 中。

  

  实例:在第一个页面填写基本信息,第二个页面填写隐私信息,他们的表单共用一个 ActionForm 并将其保存在 session 中。

  reg.jsp:

  1.              <html:form action="/toReg2">  
  2.     account : <html:text property="account"/><html:errors property="account"/><br/>  
  3.     password : <html:password property="password"/><html:errors property="password"/><br/>  
  4.     <html:submit value="toReg2"/><html:cancel/>  
  5. </html:form>  

reg2.jsp:


  1.               <html:form action="/reg">  
  2.     phone : <html:text property="phone"/><html:errors property="phone"/><br/>  
  3.     address : <html:text property="address"/><html:errors property="address"/><br/>  
  4.     <html:submit/><html:cancel/>  
  5. </html:form>  

struts-config.xml:
  1. <form-beans >  
  2.     <form-bean name="regForm" type="com.zet.struts.form.RegForm" />  
  3.   
  4.   </form-beans>  
  5.   
  6.   <global-exceptions />  
  7.   <global-forwards />  
  8.   <action-mappings >  
  9.     <action name="regForm" forward="/reg2.jsp" path="/toReg2" scope="session">  
  10.     </action>  
  11.     <action name="regForm" path="/reg" type="com.zet.struts.action.RegAction">  
  12.   </action>  


  用户通过reg.jsp 第一次提交,服务器生成 regFrom 对象,并将其保存在 session 中。当用户通过reg1.jsp 第二次提交时,会先查找 session 里是否有 regFrom  对象,有救复用该对象。保留了第一次提交的数据(不会再次调用 setter),而第二次提交的数据调用 setter。然后 Action 处理业务逻辑时,用到的 regFrom  就有第一次和第二次提交的数据了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值