我正在尝试记录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反射有很多原因:主要是性能。
答案 0 :(得分:1)
只有反射才有效。
在视图层之前,操作本身被推送到值堆栈。
S2标记(以及通过请求包装器的JSP EL)使用OGNL从值栈中检索值。 OGNL使用反射。例如,${errorMessage}
正在使用反射来从值堆栈顶部的动作中检索值。
这些值不是单独存在的,它们“嵌入”放置在值堆栈中的对象。
您需要获取值堆栈和操作,迭代堆栈内容,并通过反射检索所有可公开访问的值(方法和道具)以获取堆栈和可访问的内容。 (我不记得其余的堆栈内容是否已在操作中可用,或者稍后是否添加了更多内容。这也没有考虑任何其他可能修改堆栈预览的机制。)
这是S2调试标记在视图层上的作用;你可以改用它。