2017-02-24 9 views
0

javax.http.servlet.HttpServletクラスを拡張して、私の使用のためにいくつかのメソッドをクラスに追加しました。私のアプリケーション用のすべてのサーブレットはこの新しいクラスを拡張します。メソッドの最初と最後で何らかの作業を実行するために親クラスメソッドをオーバーライドするにはどうすればよいですか?

public class MyCustomServletClass extends HttpServlet{ 

    protected void startWork(){ 
     // do some stuff 
    } 

    protected void finishWork(){ 
     // do more stuff 
    } 

} 

これらの2つの方法は、すべてのHttpServlet要求方法(例えばdoGetメソッド、doPostメソッド、等)の開始/終了時に実行される次のとおり、このクラスの最低限のバージョンがあります。ここで私は私のカスタムMyCustomServletClassを使用して作成することができますサーブレットの単純な例です:

public class SomeServlet extends MyCustomServletClass{ 

    protected void doGet(HttpServletRequest request, HttpServletResponse response){ 
     this.startWork(); 

     // some servlet specific work here 

     this.finishWork(); 
    } 

} 

だから私の質問は、このです:doGetメソッドが自動的にこれらの2つの方法を実行させるために、Javaのいくつかの方法がありますメソッドの開始/終了

私が持っているすべてのサーブレットで、すべてのdoGet、doPostなどでstartWork()およびendWork()を手動で呼び出す必要がないようにするための良い方法を見つけようとしています。私はMyCustomServletClassを拡張し、doGetを実装し、startWork()をバックグラウンドで呼び出し、endWork()をバックグラウンドで呼び出すことができます。

理想的には、MyCustomServletClassを拡張し、私のサーブレットでは、doGetメソッドは、単純に次のようになります。

protected void doGet(HttpServletRequest request, HttpServletResponse response){ 
    // doGet specific work here 
} 

毎回手動で私の2つの親のメソッドを呼び出す必要がなく。

コンストラクタでstartWork()を実行できますが、デストラクタでendWork()を実行するためにサーブレットのライフサイクルを十分に制御できないと思います。

doGetの開始時と終了時にこれら2つのメソッドを自動的に実行する方法はありますか?

+0

'startWork'と' finishWork'の間に抽象関数doWorkを呼び出すことを考えてみましょう。 –

答えて

1

あなたは自動的にあなたのメソッドを呼び出すと、別のオーバーライドメソッドに実装を委任するtemplate methodを使用することができます。

public class MyCustomServletClass extends HttpServlet { 
    @Override 
    protected final void doGet(HttpServletRequest request, HttpServletResponse response) { 
     startWork(); 
     get(); 
     endWork(); 
    } 

    protected void get(HttpServletRequest request, HttpServletResponse response) { 
     // default implementation, should be overridden 
     super.doGet(request, response); 
    } 
} 

doGet()が誤って上書きから実装を防ぐためにfinal宣言されていること。

もう1つの方法として、メソッドをAOPに注入している可能性があります。

0

これは、サーブレットフィルタが対処するように設計されたという事のようなものです:

@WebFilter(servletNames={ "MyCustomServlet", ... }) 
public class WorkWrapperFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     try { 
      startWork(); 
      chain.doFilter(request, response); 
     } finally { 
      finishWork(); 
     } 
    } 

    private void startWork(){ 
     // do some stuff 
    } 

    private void finishWork(){ 
     // do more stuff 
    } 

} 

これは、あなたが完全にそれから切り離された方法で、サーブレット機能に直交している操作を実行することができます。

関連する問題