0

私の Web アプリケーションには、コントローラーとして機能する 2 つのサーブレットがあります。1 つのサーブレットは Web 要求の処理に使用され、別のサーブレットは AJAX 要求の処理に使用されます。

//This servlet manages web requests, and forwards to JSP to display data
WebController extends HttpServlet: 

// This servlet manages AJAX requests. And returns JSON to user
AJAXController extends HttpServlet: This servlet manages 

web.xmlの場合、次のマッピングが定義されています。

<servlet>
  <servlet-name>WebController</servlet-name>
  <servlet-class>com.frontend.WebController</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>WebController</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>

  <servlet-name>AJAXController</servlet-name>
  <servlet-class>com.AJAXController</servlet-class>
  <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>AJAXController</servlet-name>
  <url-pattern>*.xhr</url-pattern>
</servlet-mapping>

WebControllerしたがって、 の前にロードすることがわかりますAJAXController
init()方法ではwebController、すべての初期化タスクを行います。

loading the database driver
initializing the configuration
and other stuff that I need for my web application

起動時のロードにより、AJAX 要求がサーバーに到達する前に Web アプリが初期化され、データベースに確実にアクセスできるようになります。

ただし、Web アプリケーションを 1 つのサーブレットで初期化するという考えは好きではありません。別のサーブレットを呼び出しInitServletて、コードをWebControllerの init メソッドからInitServletinit()メソッドに移動することを考えています。

質問

  1. それは良い考えですか?この問題を解決する他のアプローチはありますか?
  2. initサーブレットの唯一の目的がWebアプリケーションを初期化することであり、そのため、どのURLにもマップされるべきではないことを考えると、私のサーブレットマッピングはどのように見えるべきですか

私はHttpServletResponse.SC_FORBIDDEN彼らdoPost()doGet()方法で送信します。しかし、可能であれば、このサーブレットを何にもマップしないでください。

4

2 に答える 2

-1

必ずしも悪い考えではないと思います。web.xml で最初にロードするように初期化サーバーを定義するだけです。エントリに関する限り、もちろん、サーブレット クラスと起動時の負荷を定義する必要があります。

初期化コードを実装された init メソッドに入れます。doGet doPost メソッドを空のままにして、呼び出されても何も起こらないようにします。init メソッドは、サーブレットがロードされるときに 1 回だけ呼び出されます。

私が見る唯一の問題は、これがクラスター化された一連のアプリケーションサーバーのコンテキストで実行されており、真にシングルトンのリソース (接続プールなど) がある場合ですが、その場合、アプリケーションのアプリケーション構成を通じてこれらを初期化できます。サーバ。アプリケーションの起動時およびサーブレットがロードされる前に初期化されます。

于 2013-04-24T22:29:31.900 に答える