2012-05-11 9 views
0

私はnetbeans eコマースのチュートリアルに従っており、それらは複数のURLを扱うようにセットアップされたintroduced a ControllerServletです。彼らはこれを行う方法は、大きなif then else if声明持つことが基本的であるしかし複数のURLを扱うコントローラサーブレットの推奨アプローチは何ですか?

String userPath = request.getServletPath(); 

    // if category page is requested 
    if (userPath.equals("/category")) { 
     // TODO: Implement category request 

    // if cart page is requested 
    } else if (userPath.equals("/viewCart")) { 
     // TODO: Implement cart page request 

     userPath = "/cart"; 

    // if checkout page is requested 
    } else if (userPath.equals("/checkout")) { 
     // TODO: Implement checkout page request 

    // if user switches language 
    } else if (userPath.equals("/chooseLanguage")) { 
     // TODO: Implement language request 

    } 

は、単一のサーブレットに複数のURLを処理するこれは本当にお勧めしますか?このアプローチは恐ろしく、管理が難しいようです。

これをきれいに処理する明白な方法がありませんか?

+0

これは本当に恐ろしいことです。本当のまともなフロントコントローラーははるかに複雑です。彼らは明らかに初心者のために簡単にしたいと思った。このチュートリアルでは、別々のサーブレット(サーブレット3.0以降、XML構成を持たない「@ WebServlet」アノテーションでスタンドアロンミニコントローラとしてサーブレットを登録するのは簡単です)を使用しました。この関連する質問/回答もご覧ください:http://stackoverflow.com/questions/3541077/design-patterns-web-based-applications – BalusC

+0

@BalusCありがとうございます。サンプルにURLごとに1つのサーブレットを作成しておく必要があることに同意し、リンクされた回答は問題の解決に関する最初のアイデアを再確認しました。とても有難い。 –

答えて

1

StripesやSpring MVCのようなMVCフレームワークを使用する必要があります。これらのフレームワークでは、特定のURLパターン(* .actionなど)に対するすべてのリクエストを傍受するように単一のサーブレットを設定し、このサーブレットは注釈や命名規則および/または設定に基づいて適切なアクションにディスパッチします。

+0

ありがとうございます。はい、私はSpring MVCを知っています(これはもっと良い方法です)。これはサーブレットを使用するように教えられたコースのためです。プレーンなバニラサーブレットのベストプラクティスが本当に分かりたかったのです。 –

+0

プレーンサーブレットを使用する場合は、URL(またはURLのグループ)ごとにサーブレットを1つ、または独自のMVCフレームワークを再実装します。しかし、すでに数十があるので、私はこのように行くだろう。 –

+0

ありがとうございます。おそらくサードパーティのライブラリに依存するのではなく、特定のURLのハンドラを生成するためのAbstractFactoryを持つ単一のサーブレットを実装しますが、私のコースのレポートでは、このホイールを再開発することはおそらく悪い考えですこれをより簡単にする可能性のあるフレームワークを指摘する。入力いただきありがとうございます。 –

0

ServletFilterを使用して、次のようにweb.xmlを構成して、クライアント要求を適切な宛先コントローラにリダイレクトすることができます。

これは、上のコードスニペットとは異なるユーザーパスの変更を続けます。

この方法を使用すると、要件に基づいて同じ(または複数の)フィルタに複数のURLを送信できます。

<filter> 
    <filter-name>My Filter</filter-name> 
    <filter-class>com.project.my.MYclass</filter-class> 
</filter> 


<filter-mapping> 
    <filter-name>My Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

これは私が現在持っているものとどのように違うのか分かりません。どのURLを扱うかを定義するクラスのアノテーションですが、すべてのURLはクラス内の同じメソッドで処理されていますか?指定されたクラス( 'com.project.my.MYclass')のどのメソッドがフィルター一致時に呼び出されますか –

+0

上記のリンク(またはコードスニペット)の注釈が表示されないので、単純なifとelseの条件ブロックを使用してURLをリダイレクトしました。それがすべての要求と同じクラスであれば、低結合を促進する実装のためのFactoryパターンが必要になるでしょう。 –

関連する問題