2009-08-23 7 views
3

結果が返ってJSPがレンダリングされた後で、アクションの結果をキャプチャできるかどうかは疑問でした。私は全体の結果(HTMLを生成)を取ってmemcachedにプッシュできるようにしたいので、Nginx経由でアプリケーションサーバにぶつかって渡すことができます。何か案は?Struts2インターセプター*後の* JSPのレンダリング - どのように?

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

答えて

0

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

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

+0

で完全な説明を掲載します: 「の場合最終的なResultオブジェクトが実行される前に作業する必要があります... " これは、JSPがレンダリングされていないことを意味します。アクションの結果がJSPをピックアップしてレンダリングした後で、*生成された* HTML全体にアクセスする必要があります。 はこの考えてみましょう: は クライアント - >リクエスト - >派遣 - >アクション - >結果 - > JSPはレンダリング - > HTML - 私が欲しい>クライアント : クライアント - >リクエスト - >派遣 - >アクション - >結果 - > JSPレンダリング - > HTML - > ***マイコード*** - >クライアント – Hisham

0

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

memキャッシュされた例外をスローして、memキャッシュにロードすることを示すことができます。あなたのインターセプタコードがあなたのインターセプタのintercept()メソッド内

try { 
    return invocation.invoke(); 
} catch (MemCachedException mce) { 
    // Your code to upload to MemCache. 
} finally { 
    // blah blah clean up. 
} 
0

を読むことができる、ActionInvocationパラメータは、(あなたがintercept()方法でinvocation.invoke()を呼び出す前。すなわち)アクションの実行前にnullを返すgetResult()方法があり、その後Resultの実装が含まれています。そのオブジェクトは、必要なデータにアクセスするための何らかの方法を提供するはずですが、実際に使用されるクラスによって異なります。

も参照してください。my somewhat related questionも参照してください。

0

こんにちは私はすでにあなたが答えを見つけたかもしれないと答えるのはかなり遅いと知っていますが、他の人にとっては私が答えを投稿しています。 あなたがやっていることに非常に似ていることの1つは、sitemeshフィルタによって行われます。 はい、フィルタはStruts2フィルタの前後にありますので、簡単に入力と出力を混乱させることができます。 しかし、strutsはJSP/freemarker/velocityを評価し、ユーザーに渡される最終的なhtmlを生成します。 JSPは内部的にサーブレットが呼び出されますが、org.apache.struts2.views.freemarker.FreemarkerResult classをチェックアウトすると、実際にはtemplate.process(model, writer);に生成されたHTMLが表示されるため、少しトリッキーです。この作家は実際にはServletActionContext.getResponse().getWriter()です。

ここでhtmlを取得するには、 が必要です。 toString()を動作させるには、ResponseWrapperを使用する必要があります。これは、フィルタで結果htmlを取得するのと同じ方法です。 Programming Customized Requests and Responsesを参照してください。

struts 2で生成されたhtmlを修正するためのリストです。これはテストされていませんが、以前のカスタムテンプレートエンジンで作成したコードから抽出されています。私にインターセプト()、すなわち、その実行の前に、またはドキュメントによると、言って、PreResultListenerを追加することができますで、私はおそらくあなたが指摘してきた何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 

    } 

}   
関連する問題