我想知道在结果返回并呈现JSP之后是否可以捕获操作的结果。我希望能够获取整个结果(生成的HTML)并将其推送到memcached中,这样我就可以通过Nginx将其带到应用程序服务器上。有什么想法吗?
PS:我知道我可以在动作执行之后但在结果返回并且呈现JSP之前运行拦截器,但是在呈现JSP之后不能运行拦截器。
答案 0 :(得分:1)
我还没有找到在struts2中执行此操作的方法,最好用它创建一个servlet Filter并让它修改OutputStream。
答案 1 :(得分:0)
阅读本文 - http://struts.apache.org/2.0.6/docs/interceptors.html
摘要:请求资源时 映射到“动作”, framework调用Action对象。 但是,在Action执行之前, 调用可以被拦截 另一个对象。行动结束后 执行,调用可能是 又被拦截了。不出所料,我们 将这些对象称为“拦截器”。
答案 2 :(得分:0)
问题:如何确定视图是否已生成?您是否设置了请求标头或某种标志以确定是否已生成视图?
您可以尝试抛出MemCachedException来指示是时候加载到mem缓存中了。您的拦截器代码可以读取
try {
return invocation.invoke();
} catch (MemCachedException mce) {
// Your code to upload to MemCache.
} finally {
// blah blah clean up.
}
答案 3 :(得分:0)
在拦截器的intercept()
方法中,ActionInvocation
参数有一个getResult()
方法,在Action执行之前返回null
(即在您调用invocation.invoke()
之前intercept()
方法)并且之后包含Result
的实现。该对象应该为您提供一些访问所需数据的方法,但是如何完成此操作可能取决于实际使用的类。
另见my somewhat related question以及我在弄清楚之后发布的答案。
答案 4 :(得分:0)
嘿,我知道现在很晚才回答你可能已经找到了答案,但是为了让其他人受益我会发布答案。
与您正在做的事情非常相似的一件事是由sitemesh过滤器完成的。
是的,过滤器出现在Struts2过滤器本身之前和之后,因此您可以轻松地混淆输入和输出。
但struts会评估 JSP / freemarker / velocity 并生成传递给用户的最终html。 JSP有点三聚,因为在内部调用了一个servlet但是检查org.apache.struts2.views.freemarker.FreemarkerResult class
,你可以看到在template.process(model, writer);
中生成的实际html。这位作家实际上是ServletActionContext.getResponse().getWriter()
;
现在要获取所有你需要做的HTML
ServletActionContext.getResponse().getWriter().toString() //This does not work out of box
。要使toString()起作用,您需要使用 ResponseWrapper - 这与在Filters中获取结果html的方法相同。见 - Programming Customized Requests and Responses。
列出在struts中修改生成的html 2.这个没有经过测试,但它是从我之前为自定义模板引擎编写的代码中提取的。我可能会在Custom template engine for struts2
中发布完整的说明public class DecoratorInterceptor implements Interceptor {
public String intercept(ActionInvocation invocation) throws Exception {
final ActionContext context = invocation.getInvocationContext ();
HttpServletResponse responseParent = (HttpServletResponse)
context.get(ServletActionContext.HTTP_RESPONSE);
CharResponseWrapper wrapper = new CharResponseWrapper(responseParent);
ServletActionContext.setResponse(wrapper);
//Actual Action called
String result = invocation.invoke();
String htmlReturned = wrapper.toString();
//play with htmlReturned ...
String modifiedhtml = pushintoMemCache(htmlReturned );
CharArrayWriter car = new CharArrayWriter();
car.write(modifiedhtml );
PrintWriter out = responseParent.getWriter();
out.write(car.toString());
out.flush();
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
}