1

デザインに関する質問があります:)

複数のサーブレットが必要ですが、毎回新しい名前で新しいサーブレットを構成してHttpServletを拡張したくありません。私は、実際にリクエストを処理しているさまざまな特定のクラスにさまざまなパラメータをディスパッチする汎用サーブレットを用意することを考えていました。

例:これらの2つの呼び出しは、同じ汎用サーブレットによって処理されますが、異なるサービス(クラス)にディスパッチされます。

/ serviceservlet?action = action1&param1 = test1&param2 = test2 / serviceservlet?action = action2&param21 = test

これはさまざまな方法で行うことができ、どのデザインを使用するかわかりません。私が今持っているのは、ブートストラップにguiceを使用していて、次のようになります。

@Singleton public class ServiceServlet extends HttpServlet {

private static final String PARAM_ACTION = "action";
private final Service1 service1; // Service1 is an interface
private final Service2 service2; // Service2 is another interface

@Inject
public ServiceServlet(final Service1 service1) {
    this.service1 = service1;
}

@Inject
public ServiceServlet(final Service2 service2) {
    this.service2 = service2;
}

@Override
public void doPost(final HttpServletRequest request, final HttpServletResponse response) {
    String action = ServletUtils.getStringParameter(request, PARAM_ACTION);

    if ("action1".equals(action)) {
    ... check that the parameters are correct before executing the below to have typesafety
        service1.process(request.getParameter("param1"), request.getParameter("param2"));
    } else if ("action2".equals(action)) {
        ... check that the parameters are correct before executing the below to have typesafety
        service2.process(request.getParameter("param21"));
    }
}

}

原則として、より一般的な方法でサービスを処理し、後で新しいサービスをできるだけ簡単に追加できるようにしたいのですが、型安全性を失いたくありません。最善の戦略は何だと思いますか?

/ Br joynes

4

1 に答える 1

1

現在、Webプログラマーはこの種のコードを自分で作成していません。これらは、Struts、JSF、Spring(Javaプログラマーの場合)などのWebフレームワークを使用して、リクエストのディスパッチ、リクエストからリクエストを実装するクラスへのマッピングの洗練された実装を提供します。そして、はるかに。

ただし、本当に「自分でロール」したい場合は、まず、サーブレット内でifステートメントを使用しないことをお勧めします。リクエストURIをサービスクラスにマップするマップ(つまり、HashMap)を使用する必要があります。サーブレットの初期化では、マップにサービスクラスのインスタンスを設定する必要があります。サーブレット内にメソッドgetServiceClass()を追加します。このメソッドは、HttpServiceRequestからURIとACTIONSを取得し、サービスクラスを検索します。さらに良いことに、パラメーターを要求するのではなく、URIにサービスクラスをマップする必要があります。myapp/serviceXはServiceX.classにマップします。executeメソッドを使用してサービスインターフェイスServiceを定義し、サーブレットからexecuteメソッドを呼び出します。

要約する
と、1)サーブレットが初期化するときに、リクエストURIのマップをサービスクラスにロードします。
2)サーブレットとサービスクラス間のサービスインターフェイスを定義します。
3)サーブレットから、リクエストからURI(URIの関連部分)を取得し、対応するサービスを検索して、その実行メソッド(または任意の名前)を呼び出します。

于 2009-07-24T19:21:37.470 に答える