-4

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

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

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

4

3 回答 3

6

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

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

  2. 编写一个拦截器记录(或保存在某处)堆栈中传递的所有操作和方法的名称,从请求中读取它们;

  3. 实现Preparable 接口并在方法内执行请求日志记录prepare()

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

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

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

    我建议你这个实现,它为你解决了深度级别的问题:

    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;
        }
    }
    
于 2013-01-11T09:09:15.473 回答
1

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

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

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

于 2013-01-11T13:20:00.033 回答
-1

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

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

希望对你有帮助

于 2013-01-11T07:53:26.063 回答