web-dev-qa-db-ja.com

webappごとに1つまたは複数のサーブレット?

私は知っています、それはwebappに依存します。しかし、通常の場合、あなたは何をしますか:異なるページを提供する1つのサーブレット(コンテンツが変更されるスタンドアロンアプリケーションのように)またはすべてのページに対して単一のサーブレット。

たとえばブログを考えてみましょう。最新のブログエントリを含むスタートページ、1つのブログエントリを表示するための記事ビュー、およびアーカイブがあります。これを3つの異なるサーブレットで実装しますか、それとも関数にディスパッチするサーブレットで実装しますか。 httpヘッダーのように、少なくともかなりの部分が共有されます。

それで、あなたの経験は何ですか、何が最もうまくいきますか?

27
Mnementh

通常、ユースケースごとにサーブレットを作成します。サーブレットは、アプリケーションのコントローラーのように機能します。ユーザーからのインタラクションを特定したら、サーブレットを実装してそのインタラクションを制御します。

つまり、プレーンサーブレット/ JSPを使用してサイトを構築している場合です。 strutsのようなフレームワークを使用している場合は、フロントコントローラーパターンを実装し、すべてのリクエストを受信して​​、ユーザーリクエストの実際のロジックを実装するアクションクラスにこれらのリクエストを転送する単一のサーブレットを使用していることがわかります。これを自分で行うのははるかに困難ですが、それは良い習慣です...多くの人々がこれらのフレームワークを使用する理由です。

つまり、簡単に言うと、各Webアプリケーションはいくつかのユースケースを公開するため、Webアプリケーションごとに多くのサーブレットを作成します。

[編集]質問を読み直すと、ページまたはビューを意味するためにsiteという用語を使用しているように見えます。繰り返しますが、それはそのビューで何が起こっているかに依存します。たとえば、最新のブログエントリを表示するために、データベースからエントリのリストを作成して表示するサーブレットを作成できます。ユーザーがエントリをクリックすると、別のサーブレットがその単一のエントリを取得して表示することができます。主に、各アクションはユースケースであるため、異なるサーブレットです。

11

ほとんどのWebフレームワークは、適切なクラス/コントローラーへのリクエストのルーティングを処理するディスパッチャーサーブレット(例:Spring MVC)を使用します。

たくさんのページを持ち始めたとき、このアプローチは、httpリクエストとそのURLを処理するクラスを宣言/管理する(web.xmlに関して)よりユーザーフレンドリーな方法があるため、最も効果的です。例(再び春のmvc):

@Controller
public class MyController {
 @RequestMapping("/viewPosts")
 public void doViewPosts(HttpRequest r, HttpResponse res) {
  //...
 }
}

さらに、ディスパッチャサーブレットを使用すると、コードフローが一元化されます。

9
Miguel Ping

場合によります。

私の最新のプロジェクトでは、依存性注入方式でインスタンス化されるいくつかのサーブレットのようなオブジェクトに委任する単一のサーブレットを実装しました。たとえば、サーブレット(擬似コード)には次のようなものがあります。

for(Handler handler : handlers) {
    if(handler.handle(request, response)) {
         return;
    }
}

ここで、Handlerはブール値のhandle(request、response)メソッドを持つインターフェースです。ハンドラーはコンテナーから取得します(Springまたはさらに軽量なもの)。

これは、依存性注入が本当に好きで、サーブレットでそれを実現するのが難しいためです。そして、Webコンポーネントの依存性注入を提供するほとんどのフレームワークにはあまり慣れていません。サーブレットのシンプルさが好きです。

これがなければ、トレードオフはありますが、複数のサーブレットを使用します。たくさんの(そしてたくさんの)サーブレットマッピングを備えた巨大なWeb xmlがあるか、非常に複雑なサーブレットがあります(私のd-iアプローチのようなものを使用しない限り)。

3
alex