* 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

回到顶部