28

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

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

それで、あなたの経験は何ですか、何が最も効果的ですか?

4

3 に答える 3

12

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

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

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

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

于 2008-11-07T13:56:03.797 に答える
10

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

多くのページを作成し始めると、http 要求とその URL を処理するクラスを宣言/管理する (web.xml に関して) よりユーザーフレンドリーな方法があるため、このアプローチが最適に機能します。例 (再び mvc を春):

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

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

于 2008-11-07T15:48:40.853 に答える
3

場合によります。

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

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

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

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

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

于 2008-11-07T16:39:28.740 に答える