如何获取所有视图范围的对象?

How to get all view-scope object?

我正在尝试记录 Action 传递给 View 的所有输出视图范围对象(与 JSP 一样)。

我想从操作 本身打印所有这些。我的意思是:在动作执行结束时,就在 'ActionResult' return 语句之前。

例如,我想做如下事情:

public class HelloWorldAction extends ActionSupport
{
    private String errorMessage;

    public String getErrorMessage()
    {
        return this.errorMessage;
    }

    public void setErrorMessage(String errorMessage)
    {
        this.errorMessage = errorMessage;
    }

    public String execute()
    {
        this.setErrorMessage("Error!!!");

        Enumeration keys = ServletActionContext.getResponse().getParameterNames();
        StringBuilder strB5r = new StringBuilder();
        strB5r.append("Response parameters : ");
        while (keys.hasMoreElements())
        {
          String key = (String)keys.nextElement();
          strB5r.append("[").append(key).append(": ").append(ServletActionContext.getResponse().getAttribute(key).toString()).append("]");
        }

        System.out.println(strB5r.toString());

        return Action.SUCCESS;
    }
}

我希望在 cosole 中看到输出为:

Response parameters : [errorMessage : Error!!!]

问题是

ServletActionContext.getResponse().getParameterNames();

不存在,与我们可以处理的请求相反:

ServletActionContext.getRequest().getParameterNames();

我们如何才能列出操作中的所有输出视图范围对象?

Ps。我宁愿不使用 java 反射,原因有很多:主要是性能。

只有反射有效。

在视图层之前,动作本身被压入值堆栈。

S2 标签(和 JSP EL 通过请求包装器)使用 OGNL 从值堆栈中检索值。 OGNL 使用反射。例如,${errorMessage} 正在使用反射从值堆栈顶部的操作中检索值。

值不是单独存在的,它们 "embedded" 在放置在值堆栈上的对象中。

您需要获取值堆栈 操作,迭代堆栈内容,并通过反射检索所有可公开访问的值(方法和道具)以获得堆栈 可访问的内容。 (我不记得堆栈内容的其余部分是否已经在操作中可用,或者以后是否添加了更多内容。这也没有考虑任何其他会修改堆栈预览的机制。)

这就是S2调试标签在视图层的作用;你可以改用它。