云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Struts2性能问题的最终解决方法

Posted on 2008-09-02 21:02 云自无心水自闲 阅读(5429) 评论(5)  编辑  收藏 所属分类: Java心得体会Struts2

通过上两篇文章的研究,
详见:
我的struts2项目性能调优三步曲:http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html
我的struts2项目性能调优三步曲(续):http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html
得出的结论是:影响Struts2性能的原因在于Ognl的Value Stack的性能不佳。那么如果解决呢:


* 我首先尝试使用JSF。
一开始选择JSF的原因主要是:
1、Stuts2自己提供了JSF的Plugin
2、JSF是Sun作为标准提出,而且已经通过的。从Google的趋势搜索上也可以看出,搜索JSF的人在增多。
3、JSF作为一种以组件为基础的Web Framework有其独到之处,其内建的和其他许多开源的组件使用起来相当方便、强大。当然,对于不同的应用来说也有不利之处(后面会提到),但是如果能够坚持长期使用,逐渐积累组件库的话,JSF是一个很好的选择。
4、JSF的文档(或者说是书籍)还是比较多的。


经过测试使用后,发现其性能与Struts2相比确实提升不少。但是后来遇到了一个问题,所以最后还是放弃了JSF。这个问题是关于JSF的DataTable的,JSF提供的DataTable其实使用起来很方便,可定制化程度也不错,只是刚好缺少了我所希望的功能(也可能是我不知道如何实现)。我的应用中的DataTable是一个动态的结果集,也就是说输出的列是不能预先确定的,而DataTable却要求先声明好所有的DataColumn,我不知道如何解决这个问题。所以最后放弃了JSF。


* 我的第二个选择是FreeMarker
选择FreeMarker的原因是:
1、FreeMarker是Struts2缺少的模板引擎,Struts2的标签大部分是使用FreeMarker的,使用FreeMarker的话,连Plugin都省去了。
2、FreeMarker相对比较轻量级、因为他本身只是一个模板引擎,与JSF这样一个大而全的WebFramework相对,轻巧多了。
3、FreeMarker的学习起来非常容易,只要把他网站上的Document过一遍,基本上就OK了。
4、FreeMarker虽然体积小,功能还是相当强的,I18N,Converter之类的东西基本都全了,至少我所需要的功能全有。
5、FreeMarker相当灵活,他不象JSF把底层的东西封装了以后,暴露出一些属性可以设置,如果你需要的属性不能设置,你就没有办法了。在FreeMarker你直接操作最底层的东西,拥有很大的灵活性。当然,牺牲了一些方便性,比如,要用FreeMarker生成一个下拉框,就需要较多的工作量了。


测试之后,使用FreeMarker的性能很不错,在大数据量操作的情况下,至少一个数量级的性能提升。

主要原因是freeMarker的值直接从action中取得的,所以避开了ognl的stack value.


* 我的最终结论,如果要在Struts2中,展示或者操作大量数据,强烈推荐使用FreeMarker。





评论

# re: Struts2性能问题的最终解决方法  回复  更多评论   

2008-09-02 21:45 by 蓝剑
不太明白,怎样不用Ognl的Value Stack而使用Freemarker?能详细说说吗?

# re: Struts2性能问题的最终解决方法[未登录]  回复  更多评论   

2008-09-03 08:54 by jones
JSF的DataTable可以通过binding属性直接绑定到backing bean中实现后台完全控制DataTable

# re: Struts2性能问题的最终解决方法[未登录]  回复  更多评论   

2008-09-03 09:51 by 大王
为什么不用JSP?

# re: Struts2性能问题的最终解决方法  回复  更多评论   

2008-09-03 14:21 by usherlight
在struts.xml中,跳转页面的属性设置为freeMarker
<result name="success" type="freemarker">success.ftl</result>
这样,结果页面由freeMarker来负责render, 关键点是:freeMarker的值是可以直接从action中取得的,所以避开了ognl的stack value.

# re: Struts2性能问题的最终解决方法  回复  更多评论   

2008-09-04 09:15 by 云自无心水自闲
@jones
谢谢分享你的经验

只有注册用户登录后才能发表评论。


网站导航: