3

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

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

4

5 回答 5

1

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

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

于 2009-09-15T23:10:50.387 回答
1

嘿,我知道现在回答已经很晚了,您可能已经找到了答案,但是为了让其他人受益,我发布了答案。与您正在做的事情非常相似的一件事是通过 sitemesh 过滤器完成的。是的,过滤器出现在 Struts2 过滤器本身之前和之后,因此您可以轻松地弄乱输入和输出。但是 struts 确实评估JSP/freemarker/velocity并生成最终的 html 并传递给用户。JSP 有点棘手,因为在内部调用了一个 servlet,但检查出来org.apache.struts2.views.freemarker.FreemarkerResult class,您可以看到实际的 html 生成在template.process(model, writer);. 这位作家实际上是ServletActionContext.getResponse().getWriter()

现在要获取 html,您需要做的就是 ServletActionContext.getResponse().getWriter().toString() //This does not work out of box. 要使 toString() 工作,您需要使用ResponseWrapper - 这与在过滤器中获取结果 html 的方法相同。请参阅- 对定制的请求和响应进行编程

在 struts 2 中修改生成的 html 的清单。这未经测试,但它是从我之前为自定义模板引擎编写的代码中提取的。我可能会在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

    }

}         
于 2011-01-21T03:10:30.697 回答
0

Read this article - http://struts.apache.org/2.0.6/docs/interceptors.html

SUMMARY:When you request a resource that maps to an "action", the framework invokes the Action object. But, before the Action is executed, the invocation can be intercepted by another object. After the Action executes, the invocation could be intercepted again. Unsurprisingly, we call these objects "Interceptors."

于 2009-08-23T04:58:04.903 回答
0

问题:如何确定视图是否已生成?您是否设置了请求标头或某种标志来确定视图是否已生成?

您可以尝试抛出 MemCachedException 来指示是时候加载到内存缓存中了。您的拦截器代码可以读取

try {
   return invocation.invoke();
} catch (MemCachedException mce) {
   // Your code to upload to MemCache.
} finally {
  // blah blah clean up.
}
于 2010-04-22T18:48:16.610 回答
0

在你的拦截器的intercept()方法中,ActionInvocation参数有一个在 Action 执行之前getResult()返回的方法(即在你调用你的方法之前)并包含之后的实现。该对象应该为您提供一些访问所需数据的方法,但如何完成可能取决于实际使用的类。nullinvocation.invoke()intercept()Result

另请参阅我的一些相关问题以及我在弄清楚后发布的答案。

于 2010-10-11T16:51:12.717 回答