3

結果が返され、JSPがレンダリングされた後、アクションの結果をキャプチャできるかどうか疑問に思いました。結果全体(生成されたHTML)を取得してmemcachedにプッシュできるようにしたいので、アプリケーションサーバーにアクセスせずにNginx経由で結果を取得できます。何か案は?

PS:アクションの実行後、結果が返され、JSPがレンダリングされる前にインターセプターを実行できることはわかっていますが、JSPがレンダリングされた後は実行できません。

4

5 に答える 5

1

すでに答えを見つけているかもしれませんが、他の人が恩恵を受けるために、私は答えを投稿しています。あなたがやっていることと非常に似ていることの 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

    }

}         
于 2011-01-21T03:10:30.697 に答える
1

struts2 内でこれを行う方法が見つかりませんでした。サーブレット Filter を作成し、OutputStream を変更することをお勧めします。

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

于 2009-09-15T23:10:50.387 に答える
0

インターセプターのintercept()メソッド内で、ActionInvocationパラメーターには、アクションの実行前(つまり、メソッドを呼び出す前)getResult()に戻るメソッドがあり、その後の実装が含まれています。そのオブジェクトは、必要なデータにアクセスするための何らかの方法を提供するはずですが、これがどのように行われるかは、おそらく実際に使用されるクラスによって異なります。nullinvocation.invoke()intercept()Result

私のやや関連性のある質問と、それを理解した後に投稿した回答も参照してください。

于 2010-10-11T16:51:12.717 に答える
0

この記事を読む-http://struts.apache.org/2.0.6/docs/interceptors.html

概要:「アクション」にマップするリソースをリクエストすると、フレームワークはActionオブジェクトを呼び出します。ただし、アクションが実行される前に、呼び出しが別のオブジェクトによってインターセプトされる可能性があります。アクションが実行された後、呼び出しが再びインターセプトされる可能性があります。当然のことながら、これらのオブジェクトを「インターセプター」と呼びます。

于 2009-08-23T04:58:04.903 に答える
0

質問:ビューが生成されたかどうかをどのように判断しますか?ビューが生成されたかどうかを判断するために、リクエストヘッダーまたはある種のフラグを設定しますか?

MemCachedExceptionをスローして、memキャッシュにロードする時間であることを示すことができます。インターセプターコードは

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