Struts2的原理跟AOP一致,可在方法执行前后完成额外的操作。当Web容器接收到一个请求时,它会将此请求传递给一个标准的过滤器链,包括ActionContextCleanUp过滤器以及其他的过滤器(如集成SiteMeth的插件);接下来就会调用核心过滤器FilterDispatcher,然后调用ActionMapper,而ActionMapper提供了在请求和Action直接的映射,它会根据请求的URl区查找是否存在对应的Action调用请求,如果有,则返回一个描述Action映射的ActionMapping对象,如果没有则返回null,而ActionMapping保存了Action的映射信息。接下来FilterDispatcher将控制器转交给在XWork和真正Action之间充当代理的ActionProxy(而在执行Action中因为使用ActionProxy而并非使用真正的Action,所以可以在Action执行前后执行额外的操作),ActionProxy调用配置管理器(ConfigurationManager)从Struts2核心配置文件中读取配置信息,然后创建ActionInvocation对象,ActionInvocation通过调用invoke()方法开始执行Action,在Action执行之前执行所有配置的拦截器,拦截器执行完毕执行Action,在Action中执行具体的方法,调用业务逻辑代码返回字符串,然后进入配置文件找到对应的Result并执行,Result会调用模板(如JSP)来呈现页面。之后拦截器会被再次执行,顺序和Action执行之前相反,最后响应。
以上内容纯属个人观点,有些地方可能有理解瑕疵,欢迎各位大神指教修正。