Struts 2标签库里的debug标签以及Struts 2提供的Debugging拦截器大大简化了Web应用程序的调试工作,Profiling拦截器可以分析应用程序中的性能瓶颈。
使用debug标签获取调试信息
debug标签的用途是显示ValueStack栈和其他对象的内容,它非常易用,只需要在需要调试的页面插入如下语句:
示例:
index.jsp
<body>
    <s:debug></s:debug>
</body>
在浏览器中输入:http://localhost:8081/DebugAndProfiling/index.jsp,获得如下页面:

点击"[Debug]",会获得如下界面

可以看到获取了各种栈对象和ContextMap里的对象。这些信息可以帮助我们快速排查Web应用程序里的潜在隐患。
使用Debugging拦截器获取调试信息
      Debugging拦截器是默认拦截器栈defaultStack的一员,若引用了默认拦截器栈,则不需要特意去引用。使用该拦截器可以使我们查看ValueStack和其他一些对象内容。触发这个拦截器的方法是在用来触发某个动作的URL地址栏里添加debug=xml或者debug=console参数。
  debug=xml参数将会导致产生一个XML文件,它包含ValueStack和其他一些对象的值:
示例:
input.jsp
<body>
    <s:form action="debug.action?debug=xml">
        <s:textfield name="username" label="Enter your name"></s:textfield>
        <s:submit value="submit"></s:submit>
    </s:form>
</body>
struts.xml
<struts>
    <constant name="struts.devMode" value="true"></constant>
    <package name="debugAndProfilingPackage" extends="struts-default">
        <action name="debug" class="struts2.action.DebugAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>
struts.devMode的默认值为false,需要将其修改为true,才可以使该功能生效。
动作类:
public class DebugAction extends ActionSupport {
    private static final long serialVersionUID = -1345567815879866335L;
    private String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    
    @Override
    public String execute()
    {
        return SUCCESS;
    }
}index.jsp
<body>
    <s:property value="username"/>,Welcome
</body>
在浏览器中输入:http://localhost:8081/DebugAndProfiling/input.jsp,获得如下页面:

点击"submit"按钮,查看结果:

可以看到,ValueStack和其他对象的信息。debug=console的设置与xml一致,只是好像IE不支持console选项。
使用Profiling拦截器分析应用程序的性能
      Struts 2自带的性能分析功能可以帮助我们找出应用程序里的瓶颈。该功能是由com.opensymphony.xwork2.util.profiling.UtilTimerStack类提供的支持,让Struts 2可以跟踪记录它的过滤器调度程序、每一个拦截器、每个动作和每个结果的执行用时情况。Profiling拦截器可以帮助我们激活性能分析功能。
  激活Profiling拦截器与激活Debugging拦截器相似,也是在某个动作的URL地址里加上profiling=true或profiling=yes请求参数。还必须将struts.devMode属性设置为true才能使用这个功能,否则设置不会生效。
示例:
修改上面例子的struts.xml文件
<struts>
    <constant name="struts.devMode" value="true"></constant>
    <package name="debugAndProfilingPackage" extends="struts-default">
        <action name="debug" class="struts2.action.DebugAction">
            <interceptor-ref name="profiling"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>    
        
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>
因为profiling拦截器不属于defaultStack拦截器栈,需要特别引用,还需要注意Profiling拦截器所处的的位置,决定了它分析性能的范围。
修改input.jsp
<body>
    <s:form action="debug.action?profiling=true">
        <s:textfield name="username" label="Enter your name"></s:textfield>
        <s:submit value="submit"></s:submit>
    </s:form>
</body>
其他不用修改,在浏览器输入: http://localhost:8081/DebugAndProfiling/input.jsp,获得如下页面:

点击"submit"按钮,查看结果:

      该结果是在我的IDE(MyEclipse9.0)的控制台页面获取的.可以看到我们设置的Profiling拦截器生效了,它打印出了每一个流程所花费的时间。每一行代表一个活动。每行最左边的数字是截止到即将触发这个活动时已经耗用的时间。