2011-01-21 14 views
1

EclipseでSpring Webアプリケーションを作成しています。 WEB-INFには、myapp-servlet.xmlファイルのサーブレットマッピングを与えるweb.xmlファイルがあります。Spring Webアプリケーション - ページコントローラからビジネス層にアクセスする方法

myapp-servlet.xmlには、ページコントローラ用のBeanがあります。私はSpring DispatcherServletがこれらのBeanを独自のApplicationContextからインスタンス化すると推測します。プロジェクトをサーバーとして実行すると、「hello hello hello」というindex.jspファイルが表示されます。

私は、このindex.jspファイルに投稿データを送信する送信ボタンを置いていたと推測しています。私のページコントローラにHTTPリクエストが通知されます。 しかし、ページ・コントローラーの残りのアプリケーション(ビジネス・レイヤー)とどのように対話できますか?私はLDAPディレクトリルックアップアプリケーションを作成しています。ユーザーが名前を入力すると、メールを返信します。したがって、ユーザーが名前を入力して送信を押すと、LDAPビジネスレイヤーと通信したいと考えています。これどうやってするの?

これを行う方法の1つは、自分のビジネスオブジェクトをmyapp-servlet.xmlファイルのページコントローラにプロパティとして追加することです。しかし、これはビジネスレイヤーとコントローラーを自分の好みに合わせてあまりにも多く統合しているようです。つまり、すべてのコントローラーにビジネスオブジェクトのプロパティが必要です。

これを行う方法のもう一つの方法は、すべてのコントローラがXMLのプロパティとしてリストアップした一種のファクトリを作成することです。このファクトリを通じて、コントローラはビ​​ジネスオブジェクトにアクセスできます。工場は2つの層の間のインターフェースです。

これらはいずれもカスタムアイデアであり、私はあらかじめ作成された解決策があると考えます。すでにこれについて行く方法はありますか? (ビジネス層とWeb /ページコントローラ層の統合?)また、上記で概説したように、カスタムソリューションを作成するのはプログラマに任されていますか?

おかげで、(そして長い質問には申し訳ありません - それ故に太字)

+0

あなたはSpringのpetclinicチュートリアルを見ましたか?機能面では基本的には基本的ですが、これらの配線やアーキテクチャ上の質問にはうまく対応します。 SVN、https://src.springframework.org/svn/spring-samplesから最新のものを入手できます – Fil

答えて

3

お使いのコントローラが何らかの形であなたのビジネスオブジェクトへの参照を保持する必要が
KTM。 Springを完全に利用するには、それらの依存関係をコントローラに注入する必要があります。

特に、これらのビジネスオブジェクトがインターフェイスを実装していて、コントローラがそのインターフェイスについてしか認識していない場合、これは密結合ではありません。あなたは工場なしで私たちとのサービス・インターフェースについて知っておく必要がありますよう

依存性の注入は、工場の必要性を排除します。

SomeBusinessServiceInterface service = businessFactory.getBusinessService(); 

しかし、このようにそれについて考える:あなたが何らかの形で、いくつかのサービスの参照を取得する必要があります(低結合のためにそのサービスインターフェイスを使用して)、キャッシュする必要があります - それをインスタンス変数として格納します。とにかくそれを持っているので、セッターを提供しても、あなたのウェブとビジネス層はすでに存在しているものよりも結びついていません。

セッターが不自然に思える(そして時にはそうである)場合、コンストラクターインジェクションを使用して古典的なオブジェクト集合として実装します。

アプリケーションコンテキストコンフィグレーションに関して、Springでは、web.xml内のContextLoaderListenerを使用して定義されたWebアプリケーション全体のアプリケーションコンテキストを定義できます。これは通常、すべてのビジネスBean定義が存在する場所です。 -servlet.xmlアプリケーションコンテキストはサーブレットにバインドされており、通常はコンテキストが自動的にすべての-servletの親となるため、Beanをルートコンテキストで参照してMVCの内容を含める必要があります。xml(したがって、すべてのBeanがサーブレットに表示されます)。

+0

ありがとう!しかし、何がプラグに火花を入れているのですか?非ウェブアプリケーションでは、static void mainです。 Webアプリケーションでは、アプリケーションはTCPセッションの開始時に開始されますか?最初のHTTPリクエストですべてのBeanがインスタンス化され、後続のHTTPリクエストがコントローラに送られますか?自動的にインスタンス化される唯一のBeanは、htmページに対応する唯一のBeanです。そのため、Beanを使用してビジネスBeanを参照(つまりインスタンス化)する必要があります。 – ktm5124

+0

アプリケーションのコンテキスト設定に関しては、私の答えを編集できます(それについては忘れてしまいました)。 –

+0

ありがとう! xxxxxxx – ktm5124

関連する問題