2.4 Struts2的工作流程
当接收到一个httprequest。Interceptor做一些拦截或者初始的工作。当外部的
httpservletrequest到来时。初始到了servlet容器 传递给一个标准的过滤器链。
ActionContextCleanUp这个在集成插件方面非常有用。调用FilterDispatecher会去查找相应的ActionMapper。如果找到了相应的ActionMapper它将会将控制权限交给
ActionProxy。ActionProxy将会通过ConfigurationManager来查找配置struts.xml。下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)。一旦action返回,会查找相应的Result。Result类型可以是 jsp或者freeMark 等。这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)。响应的返回是通过我们在web.xml中配置的过滤器。如果
ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理。如果
ActionContextCleanUp不使用,则将会去清理sreadlocals[5]。
2.5 Struts2与Struts1的区别
2.5.1Action类
Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类
编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制
的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象[6]。 2.5.2线程模式
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来
处理所有的请求。单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际
上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
2.5.3Servlet 依赖
Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest