Struts2 Interceptor *在* JSP之后呈现 - 如何?

时间:2009-08-23 04:33:10

标签: struts2 memcached interceptor

我想知道在结果返回并呈现JSP之后是否可以捕获操作的结果。我希望能够获取整个结果(生成的HTML)并将其推送到memcached中,这样我就可以通过Nginx将其带到应用程序服务器上。有什么想法吗?

PS:我知道我可以在动作执行之后但在结果返回并且呈现JSP之前运行拦截器,但是在呈现JSP之后不能运行拦截器。

5 个答案:

答案 0 :(得分:1)

我还没有找到在struts2中执行此操作的方法,最好用它创建一个servlet Filter并让它修改OutputStream。

http://onjava.com/pub/a/onjava/2003/11/19/filters.html

答案 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

    }

}