私は単純なJavaアプリケーションを開発中です。ログインビューのコントローラは、2番目のビューを作成する必要があり、ユーザは、ログインした後、現在、あなたがログインしている一度私は2つのビュー、ログインのための1つの中に、別のを持っている。コントローラは新しいビューを作成しますか?
をだから私の質問は、ありますか?
問題は、最初のコントローラは2番目のビューのすべての依存関係を知っておく必要がある...
編集:これはない Webアプリケーションです。
私は単純なJavaアプリケーションを開発中です。ログインビューのコントローラは、2番目のビューを作成する必要があり、ユーザは、ログインした後、現在、あなたがログインしている一度私は2つのビュー、ログインのための1つの中に、別のを持っている。コントローラは新しいビューを作成しますか?
をだから私の質問は、ありますか?
問題は、最初のコントローラは2番目のビューのすべての依存関係を知っておく必要がある...
編集:これはない Webアプリケーションです。
オブジェクトがクラスをインスタンス化する必要があるが、クラスのインスタンス化の詳細に依存しないようにするには、ファクトリを(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として)問題を回避できる可能性がありロジックとフレームワークは、あなたの名前による依存関係を取得する方法を知っています。
これは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を使用することをお勧めします。
申し訳ありません。それはWebアプリケーションではありません。 – subb
私は工場がトリックを行うかもしれないと思う:
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());
あなたはどう思いますか?
あなたはSpringと同じアプローチを取って、コントローラにビュー名を返させるべきです。 次に、ビュー名に基づいてビューを作成する別のクラスを処理します。
あなたの最初の「ビュー」(ログインページ)は、通常は最初のアクセス可能なページになるため、静的ページと見なすことができると思います。
しかし、そこにあなたのウェブアプリでいくつかの他のページがあり、あなたが実際にログインページにユーザーを誘導するコントローラA(DispatchControllerのようなもの)を持っていると言うと仮定します。
このページが送信されたら、通常(ログイン成功した場合)2番目のビューページへのユーザーは(ページにログインして)指示する別のコントローラ(LoginControllerを言う)
だから、一番下の行があるのでしょう私には2つのコントローラーが必要で、それぞれが異なる責任を持っているようです。
私はLoginControllerは全くSecondViewを作成すべきだと思ういけません。ユーザーがログインすると、LoginControllerは、ログインが成功したイベントを起動し、それを気にするコントローラーは、適切な処置をとる必要があります。
あなたが理想的なコントローラーにビューを注入したいDIを使用している場合。その未回答することを残しても、あなたがあなたの最後の文で何を意味するか
かなりわかりません。
さて、2番目のビューのコンストラクタにモデルが必要であるとします。このビューを作成するオブジェクト(ここではコントローラ)は、ビューの依存関係を継承してこのモデルを知る必要があります。 – subb
あなたのログインがフォームPOST(それでなければならない)の場合は、ログインが成功した後にホームページにリダイレクトします。
これは、ユーザーがログイン後にホームページでリフレッシュすると、POSTを再送信するという警告メッセージがブラウザに表示されないようにするためです。
ホームページからリンクをクリックして[戻る]ボタンをクリックしても同じことが適用されます。
春には、この構文でこれを行うことができます。
return new ModelAndView(new RedirectView(homepage, true), model);
「ホームページ」のパラメータは、あなたの春の設定で構成され、パラメータとして注入されるだろう - それはあなたのサイトのホームページに相対URLでなければなりません。
ホームページコントローラをリダイレクトしているので、これは依存関係の問題を処理するためです。
Javaタグが追加されました。 –