struts1 工作流程

1 容器启动后,会加载ActionServlet,然后从struts-config.xml配置文件中读取信息,把信息存放到配置对象中

(例如Action的信息放在ActionMapping对象中,每一个action信息都对应一个<action>标签,通过该标签进行信息的配置,在内存中,每一个<action>都对应一个org.apache.struts.action.ActionMapping的实例)。

(ActionSevlet是struts1的核心组件,继承了HttpServlet类,主要负责接收http请求,然后根据struts-config.xml文件中的信息,把请求转发给相应的action对象,如果该action对象不存在,则会先创建该action对象,反之直接使用该对象。从这点说,struts1存在线程安全问题,当多条线程使用该action对象进行操作,如果存在实例变量或静态全局变量,会发现变量值并不是预期结果)。


2 当ActionServlet接收到一个http请求后,会在struts-config.xml检索和请求对应的ActionMapping实例,如果没有,返回请求无效。



3 如果ActionForm实例不存在,创建一个,将客户提交的表单数据存放在ActionForm对象中。


4 根据配置信息决定是否需要表单的验证,如果需要,执行ActionForm中的validata()方法。


5 如果validate()返回null 或 不包含ActionMessage的ActionError对象,表示表单验证成功(如果包含ActionMessage,则表单验证失败,此时ActionServlet将请求转发给包含用户提交表单的jsp,不会创建Action对象,调用其excute()方法)。


6 ActionServlet根据ActionMaping实例中的映射信息,将请求转发给相应的Action。如果该Action实例不存在,先创建,然后调用Action()的excute()方法。


7 Action的excute()返回一个ActionForwrd对象,Actionservlet把客户的请求转发给ActionForward对象指向的jsp组件。


8 ActionForward指向的jsp组件生成动态网页,返回给客户。