私はSpring MVCを初めて使用するので、質問は些細なものに見えるかもしれません。
私はajax経由で送信されるログインフォームを持っており、代わりにコントローラーからModelAndView(ユーザーの既存の連絡先リストを表示)を受け取ります。これを使用して、既存のコンテンツを上書きします-既存のログインフォームHTML成功したとき。モデルオブジェクトには、フォームにエラーがあった場合に入力される検証エラーのリストが含まれています。
検証フォームにエラーがある場合、それをログインフォームに表示したい。それを実装するにはどうすればよいですか-サーバーからHTMLの代わりにJSONを送信し、jQueryテンプレートを使用してクライアントでページを構築する必要があります-または、コントローラーがModelAndViewを返した場合でもこれを実現できますか
ログインJSPと連絡先JSPを1つにまとめ、応答に基づいて非表示/再表示することを検討しました。ただし、これはクライアントに送信されるペイロードを増やすだけなので、私はこれを行いたくありません。
これは非常に一般的な問題だと思うので、これを処理するためのベストプラクティス/設計アプローチがすでにあるはずです。
いくつかの理由により、クライアントにJSONのみを送信することには意味があります。
クライアントとサーバー間のトラフィックが少ない。いくつかの複雑なフォームを検証する場合、複数のフィールドでエラーを示す必要があります。これらのフィールドが強調表示された完全にレンダリングされたフォームを送信する代わりに、フィールド名と修正候補を含むJSONのみを送信できます(注意:UXの観点から、ユーザーにどのように間違っているかだけでなく、修正方法を伝える方が良いでしょう)。
コードの重複をレンダリングしないでください。クライアント側の検証がある場合は、クライアント側で検証エラーがレンダリングされます。アプリケーションの動作と表示の一貫性を保つには、すべてのレンダリングコードを1か所に配置することをお勧めします。クライアント側の検証により、サーバーではなくクライアント上で検証されることになります。
クライアント側でUIをレンダリングできない場合もあります。たとえば、ユーザーがJavaScriptを無効にしたり、非標準のクライアントソフトウェアを使用している場合などです。そのようなユーザーの数は非常に少なく、開発リソースの制約を考慮して、このオーディエンスを無視することもできます。そうでない場合は、サーバー側のレンダリングフォールバックを行う一般的なアプローチ(Angular2フレームワークに実装されています)があり、サーバー上で基本的に同じレンダリングコードを実行して静的HTMLをクライアントに返します。私のアドバイスは、より単純なソリューションに固執し、他の目標を達成したらサーバー側のフォールバックについて考えることです。
サーバーからHTMLの代わりにJSONを送信し、jQueryテンプレートを使用してクライアントでページを構築する必要があります-または、コントローラーがModelAndViewを返した場合でもこれを実現できますか?
いいえ、それは車輪を再発明することになるでしょう。この方法で作業するためのフレームワークはすでに存在します。ただし、Spring MVCが提案する種類のアプリケーションとは多少互換性がありません。
Spring MVCは、この方法で実装されるようには設計されていません。
ログインJSPと連絡先JSPを1つにまとめ、応答に基づいて非表示/再表示することを検討しました
フロントエンドの設計の観点からは、それはひどい考えです。もう一度、あなたはすでに他のフレームワークによって解決されている何かを解決しようとしています。そしてSpring MVCによって提案されたアプリケーション設計を打ち負かそうとしています。
ここで私が目にする主な問題は、あなたがフレームワークを誤用したことです。
Spring MVCアプリケーションは、サーバーがアプリケーションとサーバーとクライアントの両方の状態を制御するWebアプリケーションのグループに分類されます。
簡単にまとめると、クライアントはサーバーによって「コンパイル」(生成)され、最終的な状態でクライアントに提供されます。ブラウザーはコンテンツをそのままレンダリングし、ユーザーの操作を待ちます。
Spring MVCがアプリケーション全体の状態を制御するには、サーバーがリクエストをサーバーに送信して、サーバーが新しい状態を計算し、表現(主にHTMLドキュメントとしてのビュー)をブラウザーに返すようにする必要があります。
これはナビゲーションにも適用されます。ナビゲートするたびに、アプリケーションの状態を変更するため、リクエストとページの再読み込みが行われます。
とはいえ、質問に戻ると、実装は上記の設計を打ち負かしており、したがって、実行しようとするほとんどすべての処理が複雑になっています。
Spring MVCアプリケーションでは、JQueryとAJAXは別の役割を果たします。これらは、ページの小さなセクションの更新など、ある程度のダイナミズムをビューに提供するために使用されます。ページネーション、動的リスト、コンボ、ルックアップ、視覚効果、バックグラウンドプロセスなど。ごくわずかな(または気付かない)変更のためにサーバーがページ全体を書き換えたり更新したりする機能。経験の観点。
これは非常に一般的な問題だと思うので、これを処理するためのベストプラクティス/設計アプローチがすでにあるはずです。
はい、10-15年前です。 AJAXとJQuery(後))がWebアプリケーションの市場に革命を起こしたとき、これら2つは一種の神経症を引き起こし、多くの人々が陽気なWebアプリケーションを開発するようになりました。JavaScriptライブラリ(およびブラウザ)最近ほど洗練されていませんでした。
幸いなことに、これらのテクノロジーは市場のトレンドとニーズに従って進化してきました。多かれ少なかれ、分離されたWebクライアントの許可に向けて。
要約すると、私は2つの可能な解決策を提案します:
Spring MVCの実装を続けますが、JQueryとAJAXを使用しているので、今は使用しないでください。Springがサーバー側で実行する必要があることを、JQueryがクライアント側で実行してはならないものとします。
Spring WebでSpring MVCを変更します。 @Controllersを@RestControllersに置き換え、サーバーからビューを取得し、サーバーを統計なしにし、バックエンドとは別にフロントエンドを実装します。
上記のオプションに関係なく、重要なことは、ツールを適切に使用することです。または言い換えれば、各問題に適切なツールを選択することです。