2015-01-13 9 views
7

私のVaadin 7アプリ内から現在のServletContextにアクセスするにはどうすればよいですか?Vaadin 7アプリ内から `ServletContext`にアクセスするには?

は、私は私のVaadinアプリのいくつかのグローバル状態を管理するためにServletContextオブジェクトのsetAttributegetAttributeremoveAttribute、およびgetAttributeNamesメソッドを使用します。

また、これらの方法をVaadinアプリに使用することは不適切ですので、説明してください。

+0

関連する質問:[私のVaadin Webアプリケーションの起動と停止のフック?](http://stackoverflow.com/q/36588743/642706) –

答えて

20

TL; DR

VaadinServlet.getCurrent().getServletContext() 

VaadinServlet

VaadinServletクラスはgetServletContextメソッドを継承します。

VaadinServletオブジェクトを取得するには、静的クラスメソッドgetCurrentを呼び出します。

は、あなたのVaadinアプリ内のどこでもほとんどからは、このような何かを:
は、バックグラウンドスレッドでは動作しません

ServletContext servletContext = VaadinServlet.getCurrent().getServletContext(); 

CAVEAT。起動したスレッドでは、このコマンドはNULLを返します。

その他の場合(バックグラウンドスレッドが別の方法で開始されたなど)、現在のサーブレットは自動的には定義されません。

@WebListenerServletContextListener)ところで

は、あなたは、このようなグローバルな状態を処理する可能性があるとき、コンテナ内のWebアプリケーションが展開する(起動)。

インターフェイスを実装しているクラスに@WebListener注釈を付けてVaadinウェブアプリケーションのデプロイメントを行うことができます。そのインターフェイスの両方のメソッドcontextInitializedcontextDestroyedServletContextEventに渡され、ServletContextオブジェクトにアクセスするには、getServletContextを呼び出します。

@WebListener ("Context listener for doing something or other.") 
public class MyContextListener implements ServletContextListener 
{ 

    // Vaadin app deploying/launching. 
    @Override 
    public void contextInitialized (ServletContextEvent contextEvent) 
    { 
     ServletContext context = contextEvent.getServletContext(); 
     context.setAttribute(…) ; 
     // … 
    } 

    // Vaadin app un-deploying/shutting down. 
    @Override 
    public void contextDestroyed (ServletContextEvent contextEvent) 
    { 
     ServletContext context = contextEvent.getServletContext(); 
     // … 
    } 

} 

このフックはVaadinサーブレット(またはあなたのWebアプリで、他のサーブレット/フィルタ)を実行する前に、あなたのVaadinアプリが初期化されているの一部として呼び出されます。 contextInitializedメソッドのドキュメントを引用するには:

Webアプリケーションの初期化プロセスが開始されているという通知を受け取ります。 Webアプリケーション内のフィルタまたはサーブレットが初期化される前に、すべてのServletContextListenerにコンテキストの初期化が通知されます。

関連する問題