3

私は単純なJavaアプリケーションを開発中です。ログインビューのコントローラは、2番目のビューを作成する必要があり、ユーザは、ログインした後、現在、あなたがログインしている一度私は2つのビュー、ログインのための1つの中に、別のを持っている。コントローラは新しいビューを作成しますか?

をだから私の質問は、ありますか?

問題は、最初のコントローラは2番目のビューのすべての依存関係を知っておく必要がある

...

編集:これはない Webアプリケーションです。

+0

Javaタグが追加されました。 –

答えて

1

オブジェクトがクラスをインスタンス化する必要があるが、クラスのインスタンス化の詳細に依存しないようにするには、ファクトリを(you've suggested)挿入します。

私はインターフェイスを使いたいので、私は自分の依存関係のさまざまな実装を差し込むことができます。ここでは例です:

public class RealLoginController implements LoginController { 
    private LoginViewFactory viewFactory; 

    public LoginController(LoginViewFactory viewFactory) { 
     this.viewFactory = viewFactory; 
    } 

    public ModelAndView handleRequest(HttpServletRequest request, 
             HttpServletResponse response) { 
     if (isLoggedIn()) { 
      return viewFactory.createLoggedInView(); 
     } else { 
      return viewFactory.createLoggedOutView(); 
     } 
    } 

    // ... 
} 

public class RealLoggedInView implements LoginView { 
    // Implementation for rendering stuff 
} 

public class RealLoggedOutView implements LoginView { 
    // Implementation for rendering stuff 
} 


public interface LoginViewFactory { 
    public LoginView createLoggedInView(); 
    public LoginView createLoggedInView(); 
} 


public class RealLoginViewFactory implements LoginViewFactory { 
    private FooModel fooEngine; 
    private BarConfig barConfig; 

    public RealLoginViewFactory(FooModel fooLayer, BarConfig barConfig) { 
     this.fooEngine = fooEngine; 
     this.barConfig = barConfig; 
    } 

    public LoginView createLoggedInView() { 
     if (fooEngine.hasBaz()) { 
      return new RealLoginView(barCongig.getQux()); 
     } else { 
      return new RealLoginView(barCongig.getQux(), 
            fooEngine.getBaz()); 
     } 
    } 

    public LoginView createLoggedOutView() { 
     // ... 
    } 
} 

public class RealLoginController implements LoginController { 
    private LoginViewFactory viewFactory; 

    public LoginController(LoginViewFactory viewFactory) { 
     this.viewFactory = viewFactory; 
    } 

    public ModelAndView handleRequest(HttpServletRequest request, 
             HttpServletResponse response) { 
     if (isLoggedIn()) { 
      return viewFactory.createLoggedInView(); 
     } else { 
      return viewFactory.createLoggedOutView(); 
     } 
    } 

    // ... 
} 

あなたは、あなたが好きな景色を眺めながら、コントローラを使用することができます。

public class LoginControllerTest { 
    public void testSomething() { 
     // ... 
     controller = new RealLoginController(fakeViewFactory); 
     assertHasTag("td#row1", controller.getRenderedStuff()); 
     // ... 
    } 
} 

あなたは、複雑なインスタンス化を必要としない場合は、(bpappa suggestsとして)問題を回避できる可能性がありロジックとフレームワークは、あなたの名前による依存関係を取得する方法を知っています。

0

これはSpring MVCでですか?

あなたは、handleRequestメソッドの最後に、のModelAndViewオブジェクトが返され、注釈なしSpring MVCの2.5以下を使用している場合。これには、ビュー情報(リダイレクトビューのようにビュー自体であっても、ビューの名前であれ)が含まれます。あなたは条件付きでいくつかのロジックに基づいて別のビューを返すことができます。例えば ​​- これはしかし、新しいプロジェクトで、あなたは、Java 1.5へのアクセス権を持っているなら、あなたはあなたが好きなフリック返すことができるので、

handleRequest(HttpServletRequest request, HttpServletResponse response) { 
    // get user from session 
    if (user.isLoggedIn()) 
     return new ModelAndView("loggedInView"); 
    else 
     return new ModelAndView("notLoggedInView"); 
} 

、私の代わりに、annotations-based Spring MVCを使用することをお勧めします。

+0

申し訳ありません。それはWebアプリケーションではありません。 – subb

0

私は工場がトリックを行うかもしれないと思う:

public class LoginViewFactory 
{ 
    private depA; 
    private depB; 

    public LoginViewFactory(dependencyA, dependencyB) 
    { 
     depA = dependencyA; 
     depB = dependencyB; 
    } 

    LoginView create() 
    { 
     return new LoginView(depA, depB); 
    } 
} 


//and then pass this factory to my controller 
new Controller(new LoginViewFactory(new A(), new B()); 

あなたはどう思いますか?

0

あなたはSpringと同じアプローチを取って、コントローラにビュー名を返させるべきです。 次に、ビュー名に基づいてビューを作成する別のクラスを処理します。

0

あなたの最初の「ビュー」(ログインページ)は、通常は最初のアクセス可能なページになるため、静的ページと見なすことができると思います。

しかし、そこにあなたのウェブアプリでいくつかの他のページがあり、あなたが実際にログインページにユーザーを誘導するコントローラA(DispatchControllerのようなもの)を持っていると言うと仮定します。

このページが送信されたら、通常(ログイン成功した場合)2番目のビューページへのユーザーは(ページにログインして)指示する別のコントローラ(LoginControllerを言う)

だから、一番下の行があるのでしょう私には2つのコントローラーが必要で、それぞれが異なる責任を持っているようです。

1

私はLoginControllerは全くSecondViewを作成すべきだと思ういけません。ユーザーがログインすると、LoginControllerは、ログインが成功したイベントを起動し、それを気にするコントローラーは、適切な処置をとる必要があります。

あなたが理想的なコントローラーにビューを注入したいDIを使用している場合。その未回答することを残しても、あなたがあなたの最後の文で何を意味するか

かなりわかりません。

+0

さて、2番目のビューのコンストラクタにモデルが必要であるとします。このビューを作成するオブジェクト(ここではコントローラ)は、ビューの依存関係を継承してこのモデルを知る必要があります。 – subb

0

あなたのログインがフォームPOST(それでなければならない)の場合は、ログインが成功した後にホームページにリダイレクトします。

これは、ユーザーがログイン後にホームページでリフレッシュすると、POSTを再送信するという警告メッセージがブラウザに表示されないようにするためです。
ホームページからリンクをクリックして[戻る]ボタンをクリックしても同じことが適用されます。

春には、この構文でこれを行うことができます。

return new ModelAndView(new RedirectView(homepage, true), model); 

「ホームページ」のパラメータは、あなたの春の設定で構成され、パラメータとして注入されるだろう - それはあなたのサイトのホームページに相対URLでなければなりません。

ホームページコントローラをリダイレクトしているので、これは依存関係の問題を処理するためです。

関連する問題