【问题标题】:How to trace all methods run by a Struts2 Web Application? [closed]如何跟踪 Struts2 Web 应用程序运行的所有方法? [关闭]
【发布时间】:2012-12-25 18:31:54
【问题描述】:

我需要对其他开发人员编写的 Java-EE Struts2 Web 应用程序进行一些更改。

由于我不确切知道它是如何工作的,我想映射在每个请求上调用的所有操作和方法,以便在更改之前更好地了解 Web 应用程序工作流程。

有没有办法实现这个目标?

【问题讨论】:

    标签: java eclipse debugging struts2 struts


    【解决方案1】:

    正如我从你的问题中得到的,你可以尝试这样使用。

    如果您找到了动作类和execute(),那么这对您来说可能很容易,在调试模式下运行应用程序并从execute() 函数的开头开始调试。按F6 逐行调试它,如果您看到任何新函数然后进入函数内部按F5 或手动转到函数在那里放置新断点然后按F6 转到该函数。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      采用以下一种(或多种)方法:

      1. 查看您的struts.xml,了解Configuration Elements(尤其是Actionsmethods)是如何映射的,以及如何在编译时重现应用程序的行为。

      2. Write an Interceptor记录(或保存在某处)堆栈中传递的所有操作和方法的名称,从请求中读取它们;

      3. 实现Preparable Interface 并在prepare() 方法中执行请求日志记录;

      4. 通过动态获取类名和方法名

        Thread.currentThread().getStackTrace()[level].getMethodName();
        

        根据你应用程序的结构,你可以选择把调用放在“某处”这一行,以记录所有调用的类名和方法。

        我建议你this implementation,为你解决深度级别问题:

        public class Utilities {
            public static String getCurrentMethod() {
                return getCurrentMethodNameFromThread(0);
            }
        
            public static String getCallingMethodName() {
                return getCurrentMethodNameFromThread(1);
            }
        
            private static String getCurrentMethodNameFromThread(int stackLevel) {
                /*
                 * 0 - dumpThreads
                 * 1 - getStackTrace
                 * 2 - thisMethod => getCurrentMethodNameFromThread
                 * 3 - callingMethod => method calling thisMethod 
                 * 4 - method calling callingMethod
                 */
                StackTraceElement 
                    stackTraceElement = 
                        Thread.currentThread().getStackTrace()[4 + stackLevel];
        
                String className = stackTraceElement.getClassName();
                String methodName = stackTraceElement.getMethodName();
        
                return className + "." + methodName;
            }
        }
        

      【讨论】:

      • @zzzz ,您能否在meta.stackexchange.com/questions/189115/… 解释您对这个问题和答案的投票删除和虚假编辑?谢谢
      • 人们倾向于这样做...... ;) 答案很好,至少比接受的要好。
      【解决方案3】:

      所有方法?!还是只是您的应用程序中的那些?

      最快、最简单的解决方案(无论如何对我来说)是使用 AOP 来检测您应用的所有代码,记录所有条目,并可能退出。 IMO 这将超出您的实际需求,尽管这是您所要求的。一旦你有了这个输出,你就可以开始把它缩小到更现实的东西。

      (您实际上可以用它玩一些有趣的游戏,包括创建序列图。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多