首先我们看一下网上的讨论:
1、影响Struts2性能的原因在于Ognl的Value Stack的性能不佳
http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html
http://struts.apache.org/2.x/docs/performance-tuning.html
http://cwiki.apache.org/WW/performance-tuning.html
http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html
意思就是更换模板引擎
2、struts2框架性能很好, 但struts2的标签性能太差了。 要避免使用 struts2标签。
Struts2 由于采用了 值栈、OGNL表达式、struts2标签库等,会导致性能下降,很严重的下降。如 果避免或减少使用这些,性能还是很好的。
Struts2的 多层拦截器、 多实例action性能都很好,并不是 导致性能问题的原因。 (这个其实和 jvm关于新生代有关系,一个频繁的NEW对象,并不会造成效率问题。)
参数传递确实存在共存的问题。@Scope("prototype")可以解决一部分。剩下的,如果在一个类中有多个Action,又有多个参数,可能会 有A Action需要用到的参数A 而B Action不需要,而A、B Action都有操作A参数的能力,这是存在的问题。所以,Action的组织方式需要好好考虑,在一个Controller中配置的Action尽量 REST化,每个Controller只解决一个资源的相关操作,不要把不相干的操作混合到一起。这样参数共享问题应该就是一个资源在不同状态下值的表现 形式地异化。
对于线程安全问题的处理
struts2采用的是ThreadLocal模式,针对每次请求都创建一个Action和当前线程进行绑定
而SpringMVC是方法级别的,请求参数什么的在方法的参数上;
因而不存在线程安全问题,我觉得这点设计算是一个亮点吧
3、http://m.oschina.net/blog/50604 也是强调ongl的问题
struts2与springMVC选择依据:
1、公司内部技术积累
2、开发效率
3、代码质量(组件本身、及普通程序员写出的质量,当然, 这个更多的是靠公司设计理念)
4、技术资料完备性
5、运行效率的解决方案(倾向于对效率有比较好的解决方案的)
struts1和struts2的不同点
struts1实例化action是单例的,struts2不是单例,每次需要重新new一个action。
struts1的form是单独的,所以感觉不出来,其实是单例的,也正是form单独所以允许单例。struts2的form是和action 在一起,如果是单利的话form数据就存在缓存了。
spring可以控制实例化action是否单例,如果action交给spring实例化的话默认是单例的,如果加上scope="prototype"属性就可以重新实例化