5.2 Struts2的体系结构
Struts2的核心体系结构如图5.1所示。用户在Struts2框架下只需编写自己的Action类来处理逻辑、编写JSP页面(或者其他方式)来展示用户界面和在struts.xml中配置映射关系就可以完成基本的业务流程。
1)一个初始的请求被发送到Servlet容器(如Tomcat或其他JSP服务器),这个请求经过一个标准的Filter链,其中包括(可选的)ActionContextCleanUp Filter,如果要在应用程序中整合其他的技术如SiteMesh,可能会需要使用其他的Filter。
2)请求经过FilterDispatcher,在它里面ActionMapper会判断这个请求是否需要调用Action。如果ActionMapper决定应该调用一个Action,FilterDispatcher就把请求委托给ActionProxy。
3)ActionProxy通过Struts2的配置文件管理器读取struts.xml文件里的配置信息。
4)创建一个实现了命令模式的ActionInvocation。这一过程包括在调用action本身之前调用所有的interceptor(before()方法)。
5)一旦action方法返回,ActionInvocation就要查找struts.xml文件中这个action的结果码(结果码是一个字符串如“INPUT”、“SUCCESS”等)所对应的result。
图5.1 Struts2结构图
6)执行这个result。通常情况下result会调用JSP或FreeMarker模板来呈现页面,result也可以是一个action链去交付给另外的action继续处理。当呈现页面时,在模板中可以使用Struts2提供的一些标签。
7)interceptor被再次执行(顺序和开始相反,调用after方法)。
8)请求被返回给web.xml中配置的其他Filter。如果已经设置了ActionContextCleanUp Filter,那么FilterDispatcher就不会清理ThreadLocal中的ActionContext信息。如果没有设置ActionContextCleanUp Filter,FilterDispatcher会清理掉所有的ThreadLocal。