如何在Struts 2中访问OGNL跟踪评估?

时间:2014-06-06 09:28:24

标签: java jsp struts2 struts ognl

我被告知要优化网络应用程序。为此,我使用JProfiler

我注意到很大一部分响应时间都花在了表示层上。特别是,当代码构建HTML代码时。

钻下这个瓶颈,我看到代码与OGNL类/方法有很多关系(近50%的调用)。

我通过删除一些不必要的OGNL语句来调整JSP代码(请参阅下面的详细信息)。我设法获得了200ms。然而,在这个瓶颈中,代码平均花费超过2000毫秒。整体响应时间约为3000毫秒。

OGNL documentation说:

  

从OGNL 2.5.0开始,OgnlContext对象可以自动跟踪表达式的评估。 (...)您可以通过OgnlContext的 lastEvaluation属性访问最后一次评估。

由于我使用Struts 2.3.15.1(OGNL v3.0.6),如何从JSP文件或Action类访问此属性或调用getLastEvaluation的{​​{1}}?


JSP文件

OgnlContext

2 个答案:

答案 0 :(得分:1)

您可以像

一样访问OgnlContext
OgnlContext context = (OgnlContext) ActionContext.getContext().getValueStack().getContext();
context.setTraceEvaluations(true); 
Evaluation evaluation = context.getLastEvaluation();

如何跟踪评估在您在Trace Evaluations

部分中链接的文档中进行了描述

您还可以在实例化上下文之前设置系统属性ognl.traceEvaluations以启用此功能。

答案 1 :(得分:1)

查看您的JSP代码,显而易见的是,罪魁祸首是<s:action>标签:

你在每次迭代上调用两个动作......基于你正在迭代的行数,可能会成为一个严重的问题。

我会尝试重构那个部分;瓶颈的一个重要部分是解释标签,调用动作,通过拦截器堆栈等机制。

如果您可以生成相同的输出,最大限度地减少对操作的调用,则瓶颈会显着降低。

P.S:一个非常小的优化是改变你的s中的布尔和字符串比较的顺序:if,如果要利用短路(布尔比较更快):
<s:if test="#noAnchor!=true && court == nomenclatureCritere">

修改

  

如果没有s:action,效果会更好,但页面需要它们,我不知道如何替换它们

更明确一点,行动应该

  • 执行一个(或几个)逻辑操作;
  • 永远不会被用作助手类。

当您调用popupNomenExist时,您唯一的要求是调用服务器,执行某些操作并接收结果以将其注入JSP中。

有几种方法可以获得该结果,并且调用Action可能是最差的(就性能而言,由于上面列出的原因)。

您可以使用execute()操作的popupNomenExist方法获取代码,并且:

  1. 将其置于您当前操作的方法中,如RomanC链接答案中所述;
  2. 将它放在辅助类的静态方法中;
  3. 在当前操作中预先计算它,并将结果公开为字符串列表;
  4. 等......
  5. 此外,我们无法争辩在你的popupNomenExist的execute()方法中正在执行什么,但我想它有可能被重构防止执行每次迭代共有的某些逻辑部分,将它们分组并在迭代之前作为一种缓存执行。