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

时间:2016-09-28 08:46:33

标签: jsp java-ee struts2

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

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

例如,我想做类似以下的事情:

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();

我们如何从动作中列出所有输出视图范围对象?

聚苯乙烯。我更喜欢不使用java反射有很多原因:主要是性能。

1 个答案:

答案 0 :(得分:1)

只有反射才有效。

在视图层之前,操作本身被推送到值堆栈。

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

这些值不是单独存在的,它们“嵌入”放置在值堆栈中的对象。

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

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