結果が返され、JSPがレンダリングされた後、アクションの結果をキャプチャできるかどうか疑問に思いました。結果全体(生成されたHTML)を取得してmemcachedにプッシュできるようにしたいので、アプリケーションサーバーにアクセスせずにNginx経由で結果を取得できます。何か案は?
PS:アクションの実行後、結果が返され、JSPがレンダリングされる前にインターセプターを実行できることはわかっていますが、JSPがレンダリングされた後は実行できません。
結果が返され、JSPがレンダリングされた後、アクションの結果をキャプチャできるかどうか疑問に思いました。結果全体(生成されたHTML)を取得してmemcachedにプッシュできるようにしたいので、アプリケーションサーバーにアクセスせずにNginx経由で結果を取得できます。何か案は?
PS:アクションの実行後、結果が返され、JSPがレンダリングされる前にインターセプターを実行できることはわかっていますが、JSPがレンダリングされた後は実行できません。
すでに答えを見つけているかもしれませんが、他の人が恩恵を受けるために、私は答えを投稿しています。あなたがやっていることと非常に似ていることの 1 つは、サイトメッシュ フィルターによって行われます。はい、フィルターは Struts2 フィルター自体の前後にあるため、入力と出力を簡単にいじることができます。しかし、struts はJSP/freemarker/velocityを評価し、ユーザーに渡される最終的な html を生成します。内部でサーブレットが呼び出されるため、JSP は少しトリッキーですが、チェックアウトする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
}
}
struts2 内でこれを行う方法が見つかりませんでした。サーブレット Filter を作成し、OutputStream を変更することをお勧めします。
インターセプターのintercept()
メソッド内で、ActionInvocation
パラメーターには、アクションの実行前(つまり、メソッドを呼び出す前)getResult()
に戻るメソッドがあり、その後の実装が含まれています。そのオブジェクトは、必要なデータにアクセスするための何らかの方法を提供するはずですが、これがどのように行われるかは、おそらく実際に使用されるクラスによって異なります。null
invocation.invoke()
intercept()
Result
私のやや関連性のある質問と、それを理解した後に投稿した回答も参照してください。
この記事を読む-http://struts.apache.org/2.0.6/docs/interceptors.html
概要:「アクション」にマップするリソースをリクエストすると、フレームワークはActionオブジェクトを呼び出します。ただし、アクションが実行される前に、呼び出しが別のオブジェクトによってインターセプトされる可能性があります。アクションが実行された後、呼び出しが再びインターセプトされる可能性があります。当然のことながら、これらのオブジェクトを「インターセプター」と呼びます。
質問:ビューが生成されたかどうかをどのように判断しますか?ビューが生成されたかどうかを判断するために、リクエストヘッダーまたはある種のフラグを設定しますか?
MemCachedExceptionをスローして、memキャッシュにロードする時間であることを示すことができます。インターセプターコードは
try {
return invocation.invoke();
} catch (MemCachedException mce) {
// Your code to upload to MemCache.
} finally {
// blah blah clean up.
}