1

HttpServletを継承する私のwebappのコントローラクラスを作成しました。web.xmlでHttpServletを初期化する方法

public abstract class BaseController extends HttpServlet { 
protected ClientsProvider clientsProvider; 

@Override 
public void init() throws ServletException { 
    clientsProvider = (ClientsProvider) getServletContext().getAttribute(
     "clientsProvider"); 
    if (clientsProvider == null) { 
     clientsProvider = new ClientsProvider(); 
     getServletContext().setAttribute("clientsProvider", clientsProvider); 
    } 
    super.init(); 
} 

CommonsProviderは、私がこのプロジェクトで使用したすべてのクライアントを初期化した別のクラスです。

ここで、このようなinit()コードをここに記述するのではなく、init()作業を行うためにweb.xmlを使用します。このように:

<servlet> 
    <servlet-name>BaseController</servlet-name> 
    <servlet-class>myproject.controller.BaseController</servlet-class> 
    <load-on-startup>1</load-on-startup> 

    <context-param> 
     <param-name>clientsProvider</param-name> 
     <param-value>clientsProvider</param-value> 
    </context-param> 
</servlet> 

param値が設定されていないため、上記のコードは機能しません。私がparam-valueで必要とするのは、新しいClientsProvider()オブジェクトです。この場合、web.xmlでinit()を実行することはできますか?ありがとう!

+1

web.xmlでその宣言を行うことはできませんが、そのようなクロスカッティングに関するライフサイクルリスナーまたはフィルタを使用できます。 DIフレームワークも同じメカニズムを使用します。 – eckes

答えて

1

起動時にClientProviderのインスタンスが存在しないため、web.xmlでこれを行うことはできません。 Spring FrameworkのようなDIコンテナを使用してそのようにすることができます。フレームワークを使用したくない場合は、完全修飾クラス名をStringとして渡し、サーブレットでClass.forName(...)を使用します。

<context-param> 
    <param-name>clientsProvider</param-name> 
    <param-value>your.package.ClientsProvider</param-value> 
    <!--<param-value>your.package.AnotherClientsProvider</param-value>--> 
</context-param> 
関連する問題