0

JSPで作成されたフォームがあります。ここには、「承認、拒否、保存、キャンセル」という複数のボタンがあります。送信ごとに、コントロールは単一のコントローラー(サーブレット)に移動し、そこでこの送信を::として処理します。

String methodName = (String) request.getParameter("methodName");
if(methodName.trim.toLower().equals("approve")) 
{
  approve_Claim(parameters);
}
else if(methodName.trim.toLower().equals("reject")) 
{
  reject_Claim(parameters);
}
else if(methodName.trim.toLower().equals("save")) 
{
  save_Claim(parameters);
}
else if(methodName.trim.toLower().equals("cancel")) 
{
  cancel_Claim(parameters);
}

これらの複数のifを削除する方法はありますか、提案してください

4

4 に答える 4

3

methodName.trim().toLower()基本的に、パラメータを受け取るある種の「クレームアクション」へのマッピングが必要なようです。次のようなインターフェイスを作成します。

interface ClaimAction
{
    void execute(Parameters parameters);
}

CancelClaimAction次に、などのクラスを使用してこれを実装します。次に、などへのマッピング「承認」をApproveClaimAction作成します。次に:Map<String, ClaimAction>ApproveClaimAction

String actionName = methodName.trim().toLower(Locale.US));
ClaimAction action = CLAIM_ACTION_MAPPING.get(actionName);
if (action != null)
{
    action.execute(parameters);
}
else
{
    // Error case, presumably.
}

列挙型を使用してこれを行うこともできますが、これらの各クラスには十分な作業があり、それらを分離して個別にテストする価値があると思います。

于 2012-06-26T05:52:26.103 に答える
1

私の頭に浮かぶいくつかの選択肢は、switchステートメントです。

  1. パラメータで文字列の代わりに整数を渡し、サーブレットでintに解析してから、この整数でswitchcaseを使用します。
  2. Java 7を使用している場合は、文字列よりもswitchcaseを使用してください。
  3. Java6ではこの文字列の列挙型を取得し、それらを切り替えます-古いバージョンの場合、Java 5まで(列挙型はJava 5で導入されているため、Jon skeetによって言及されています)
于 2012-06-26T05:49:57.757 に答える
0

トリガーされたアクションに関する比較は、どこかで行う必要があります。この場所からこのロジックを削除するには、次のようなものを使用します。

public void handleRequest(HttpServletRequest request, String action){}

しかし、私が言ったように、検証はあなたのコードのどこかに来なければなりません...。

于 2012-06-26T05:54:02.543 に答える
0

最初の提案は、アプローチ自体を再考できることです。多くのMVCフレームワーク(struts、struts2、spring MVC、playフレームワークなど)があり、実際のコードを非常にシンプルでクリーンに保つためのすべての処理部分を実行します。


独自の実装を使用する特定の目的があると仮定すると、これにはJavaリフレクションを使用できることをお勧めします。

String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName).invoke(this);

ここで行う必要があるのは、methodNamesを実際のJavaメソッドと同じに保つことです。

パラメータを渡すには、次のようにします-

String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName, Paramter.class).invoke(this, parameters);
于 2012-06-26T06:04:56.703 に答える