2

私はいくつかの古い HTTPServlet を含むプロジェクトを持っています。Spring でサーブレットの作成/ライフサイクルを管理する方法が欲しいので、DI のようないくつかのことを行い、Spring/Hibernate 統合を介してデータベース オブジェクトを渡すことができます。

まず、Spring アプリケーション コンテキストを次のようにセットアップしましたweb.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

次に、サーブレットの定義をweb.xml;に入れます。

<servlet>
    <servlet-name>oldHttpServlet</servlet-name> 
    <display-name>oldHttpServlet</display-name>
    <servlet-class>com.package.MyServlet</servlet-class>
</servlet>

私の春application-context.xmlには、次のように bean def を作成したいと思います。

<bean id="oldHttpServlet" class="com.package.MyServlet"></bean>

上記のように、サーブレット内にいくつかのインターフェースを実装し、Spring app-context.xml で上記のように Bean 定義を保持してから、web.xml でサーブレット定義を変更する必要があると思います...よくわかりませんMyServelet.java 側で心配する継承があるため、最も簡単な変更は何ですか。これは次のようになります。

class MyServlet extends MyAbstractServlet{
  void doStuff(){
     //YOu know...
  }
}

そして MyAbstractServlet;

class MyAbstractServlet extends HttpServlet{
  doPost(){
     //Some post implementation here...
  }
}

MyServlet を Spring でラップし、web.xml を介してインスタンス化するのではなく、そこからロードする最良の方法は何ですか?

最良の方法は、SpringsHttpRequestHandlerを使用しHttpRequestHandlerServlet、現在のサーブレットの代わりに web.xml で を使用することだと思います。ただし、myAbstractServlet の既存の doPost() と連携するために HttpRequestHandler インターフェースを実装する方法がわかりません...

4

3 に答える 3

5

サーブレットに依存関係を注入する必要がある場合は、Spring の HttpRequestHandlerServlet を使用します。HttpRequestHandler の実装を作成します (メソッドがあります:

public void handleRequest(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException;

実装する必要があること - これは、doGet / doPost にあるものと同等です。すべての HttpRequestHandler 実装のインスタンスは、Spring で処理するか (アノテーション駆動の構成をセットアップし、@Component などで注釈を付ける)、または XML 構成を使用してそれらの Bean をセットアップする必要があります。

web.xml で、HttpRequestHandlerServlet のマッピングを作成します。サーブレットに HttpRequestHandler と同じ名前を付けると、Spring は HttpRequestHandlerServlet が一致する HttpRequestHandler でリクエストを自動的に処理するようにします。

HttpRequestHandler は Spring Bean であるため、必要なすべてのサービスを Spring に注入させることができます。

それでもサーブレットの代わりに HttpRequestHandler を使用したくない場合は、Spring utils を使用して WebApplicationContext を取得し、そこから「名前ごと」に Bean を取得するなど、いくつかの「プログラミング柔道」だけが残っています。サーブレットは Spring によってインスタンス化されないため、管理できません。サーブレットの基本クラスを作成し、DI を初期化ステップとして自分で管理する必要があります。

コードは次のようになります (サーブレット内)。

WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
CertainBeanClass bean = (CertainBeanClass) webContext.getBean("certainBean");

[編集] 確かに、コメンターの 1 人が示唆したように、もう1 つのオプションがあります。ただし、サーブレットの init メソッドで手動でセットアップする必要があります。これは次のようになります。

public void init(ServletConfig config) {
    super.init(config);
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}

ウィービングを使用してサーブレットで @Configurable アノテーションを使用して運試しすることもできますが、これは機能する場合と機能しない場合があります (Spring コンテキストがセットアップされる前にサーブレットが初期化される可能性があるため、魔法を実行する可能性はまだありません) .

于 2013-01-17T08:33:54.117 に答える
1

サーブレットの理想的な使用法は、コントローラーとして使用する必要があり、基盤となるコンテナーがライフサイクルを管理するため、インスタンスを管理するために Spring は必要ありません。

そのため、DI などのいくつかのことを実行し、Spring/Hibernate 統合を介してデータベース オブジェクトを渡すことができます。

dao/services でサーブレットに依存することは決してありません。サーブレットは、Spring DI コンテキストで管理するのに完全に適したサービスを呼び出す必要があります。

于 2013-01-17T08:17:26.863 に答える
0

SpringBeanAutowiringSupport に関しては、javadoc からメモしてください。

注: ServletContext に明示的にアクセスする方法がある場合は、このクラスを使用するよりもそのような方法を優先してください。WebApplicationContextUtils クラスを使用すると、ServletContext に基づいて Spring ルート Web アプリケーション コンテキストに簡単にアクセスできます。

于 2013-05-06T18:26:58.290 に答える