* JSP呈现后的Struts2拦截器*如何?
我想知道在结果返回并呈现JSP后是否可以捕获操作的结果。我希望能够获得整个结果(生成的HTML)并将其推送到memcached中,以便我可以通过Nginx将它带入应用程序服务器。有任何想法吗?* JSP呈现后的Struts2拦截器*如何?
PS:我知道我可以在执行操作后但在结果返回并呈现JSP之前运行拦截器,但在呈现JSP之后不能运行拦截器。
回答:
阅读这篇文章 - http://struts.apache.org/2.0.6/docs/interceptors.html
摘要:当您请求映射到一个 “动作” 后, 框架调用Action对象的资源 。 但是,在执行动作之前, 的调用可以被另一个对象拦截 。执行动作 后,可能会再次截获调用 。不出所料,我们 称这些对象为“拦截器”。
回答:
我还没有找到一种方法来做到这一点的struts2,你最好打赌它创建一个servlet过滤器,并让它修改OutputStream。
http://onjava.com/pub/a/onjava/2003/11/19/filters.html
回答:
问:你如何确定如果视图已经产生?您是否设置了请求标头或某种标志来确定视图是否已生成?
您可以尝试抛出一个MemCachedException来指示是时候加载到一个mem缓存中了。你的拦截器的代码可以读
try { return invocation.invoke();
} catch (MemCachedException mce) {
// Your code to upload to MemCache.
} finally {
// blah blah clean up.
}
回答:
在你的拦截器的intercept()
法,ActionInvocation
参数具有getResult()
方法,行动执行前返回null
(即你在intercept()
方法调用invocation.invoke()
前),并包含Result
实现之后。该对象应该给你一些方法来访问你需要的数据,但是如何完成可能取决于实际使用的类。
另请参阅my somewhat related question以及我在发现后发布的答案。
回答:
嘿,我知道现在很晚回答你可能已经找到答案,但是对于其他人的好处我发布了答案。 与你正在做的非常相似的一件事是通过sitemesh过滤器完成的。 是的,过滤器来自Struts2过滤器本身之前和之后,所以你可以很容易地混淆输入和输出。 但struts的确评估JSP/freemarker /速度并生成传递给用户的最终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 - 这与在过滤器中获取结果html的方法相同。参见-Programming Customized Requests and Responses。
在struts 2中修改生成的html的列表。这未经测试,但是它是从我之前为自定义模板引擎编写的代码中提取的。我可能会发布完整描述。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
}
}
以上是 * JSP呈现后的Struts2拦截器*如何? 的全部内容, 来源链接: utcz.com/qa/260656.html