struts的工作流程搞得我很头疼,什么时候用.jsp什么时候用.do,form的生命周期设置成request还是session,reset、validate都怎么做,jsp中表单的实例化过程,这些问题纠缠在一起,比偶像剧还纠结。
简单说下我自己的理解吧:
struts的工作是一个path,也就是一条通路,从jsp页面的表单到actionform,再到action,最后回到jsp页面。看一个最简单的通路配置:
- <form-bean name="HelloForm" type="HelloForm"/>
- <action path="/hello" type="HelloAction" name="HelloForm" scope = "request">
- <forward name="success" path="/ok.jsp"/>
- <forward name="error" path="/error.jsp"/>
- </action>
这个通路的名字叫/hello,使用这个通路可以选择以一个jsp页面的表单为起点,也可以直接杀入通路。
先看前一种情况,一个jsp页面上有个表单:
- <html:form action="/hello">
- <p>username<html:text property="username"></html:text></p>
- <p>password<html:password property="password"></html:password></p>
- <html:submit/>
- </html:form>
该表单对应的通路为/hello,因此,提交表单时便会将表单塞入通路,并做一系列动作。前面已经说过ActionForm和Action的基本概念,表单中的项都是ActionForm的属性,并且ActionForm中要实现每个属性的setter/getter方法。
jsp页面打开时,就会实例化ActionForm(如果配置了attribute属性,会首先寻找是否已存在叫该名称的实例,如否则重新实例化一个),此时调用reset方法,用户提交表单时,这个表单随着request被提交到Action中,表单中没有包含的actionForm属性就按照实例化后的值提交到Action。Action调用自己的execute函数做一些事情之后再决定下一步跳转到那个jsp页面,同时可以通过attribute/parameter等等方式给这些页面传一些数据,以便显示。这是最简单的情况,有时如果ActionForm是带有验证功能的ValidatorForm,提交表单时就会进行验证,这一点具体参考struts的Validator插件。另外Action也可以带有分派功能,如DispatchAction或者LookupDispatchAction,此时就会根据传入的参数决定调用哪个execute函数,这里也不仔细说了。如果再跳回提交前的表单,根据action配置的生命周期不同,会出现不同的情况。如果配置成page,那么actionForm会重新初始化,如果是request,那么只要没有重定向到其他页面,actionForm实例还在,所以各属性值就还是上次提交的值,如果是session,那么不管怎么折腾,只要不清空缓存,actionForm实例会一直存在,属性的值也一直保留。
以上这个是一种最常规的思路,当然也有很多时候不需要用户提交表单就直接进入通路,比如Action根据session中的用户名从数据库取出数据,传给jsp页面显示。此时可以通过通路名.do这个地址调用通路,如该例子里面hello.do这一地址就指向通路。这时也会实例化一个ActionForm,但是其中就不包含任何用户的输入,直接按照实例化时的默认值提交到Action(此时ActionForm没有什么意义,当然Action也没有必要用它了,甚至可以不配置ActionForm),Action根据session或者parameter传递过来的参数做一些事,再转到某个页面。
我想我阐述的思路还不是太清楚,大家可以结合其他的文章以及实践再慢慢理解,本文必定不是一篇优秀的教程,只希望其中的只言片语能帮助大家理解。
这篇文章将ActionForm的生命周期比较详尽
阅读(1264) | 评论(0) | 转发(0) |