首先服务器启动时,将加载struts的ActionServlet类,他实际上是一个Servlet,当这个Servlet启动时,从web.xml中读取它的初始化参数,如config等,根据这些参数找到Struts的配置文件,如Struts-config.xml,然后在对Struts-config进行XML数据的对象转化,将配置信息转化为对象以后放入内存.
当一个HTTP协议请求来时,到web.xml文件中去查找应该怎么执行,发现该请求后缀名为.do(可以为其他的),于是让Struts刚刚已经启动过的的ActionServlet来执行,在ActionServlet中根据请求的路径(Path),去配置文件对象中找到和这个请求对应的Action,根据这个Action配置中的Name属性到配置的formbeans对象中找到和这个name对象的ActionForm对象,调用ActionForm对象的reset方法,然后根据客户端传来的参数名称以及值调用ActionForm的setXXX()方法,完成以后假如是要验证(validate=true)的话,那么继续调用ActionForm的validate方法,假如该方法返回的ActionErrors不为null,并且大小(.size())不为空,那么读取Action配置的input属性,得到input属性对应的值,将该请求提交的这个值所对应的页面(request.getRequestDispather("ff.jsp").forward(request,response)),否则调用该Action配置所对应的Action类(由type指定),执行该类的execute方法,该方法返回一个ActionForward,这些ActionForward可以动态生成(new ActionForward("1.jsp")),也可以从配置中得到(mapping.findForward("success")),当从配置文件中得到时,先在该Action配置的局部查找是否有这个ActionForward存在,假如没有然后在struts配置全局查找,得到ActionForward以后,将该ActionForwar返回给Struts的ActionServlet,ActionServlet调用ActionForward的getXXX()(方法名忘了),得到该ActionForward对应的值,如show.jsp,或show.do,然后参看这个Action配置的redirect(是不是这么写的?),假如为真,那么调用response.sendRedirect("show.jsp"),否则调用request.getRequestDispsther("show.jsp"),forward(request,response);,这样便执行完了这个过程.在其中还有好多细节,比如会在path前面自动加上web项目的名称等等!以上的东西是我理解的流程,可能和源码有不符合的地方,但是大概意思就是这!
还有一个问题就是ActionForm和Action什么时候实例话,因为我看见有些时候一个请求实例化一个ActionForm,但是有时又不,好象是使用以前的对象(或是池的概念?),还没来得及看源码