web-dev-qa-db-ja.com

Spring MVC-AJAXを使用して検証エラーを処理する

私はSpring MVCを初めて使用するので、質問は些細なものに見えるかもしれません。

私はajax経由で送信されるログインフォームを持っており、代わりにコントローラーからModelAndView(ユーザーの既存の連絡先リストを表示)を受け取ります。これを使用して、既存のコンテンツを上書きします-既存のログインフォームHTML成功したとき。モデルオブジェクトには、フォームにエラーがあった場合に入力される検証エラーのリストが含まれています。

検証フォームにエラーがある場合、それをログインフォームに表示したい。それを実装するにはどうすればよいですか-サーバーからHTMLの代わりにJSONを送信し、jQueryテンプレートを使用してクライアントでページを構築する必要があります-または、コントローラーがModelAndViewを返した場合でもこれを実現できますか

ログインJSPと連絡先JSPを1つにまとめ、応答に基づいて非表示/再表示することを検討しました。ただし、これはクライアントに送信されるペイロードを増やすだけなので、私はこれを行いたくありません。

これは非常に一般的な問題だと思うので、これを処理するためのベストプラクティス/設計アプローチがすでにあるはずです。

4
Abhigyan Mehra

いくつかの理由により、クライアントにJSONのみを送信することには意味があります。

  1. クライアントとサーバー間のトラフィックが少ない。いくつかの複雑なフォームを検証する場合、複数のフィールドでエラーを示す必要があります。これらのフィールドが強調表示された完全にレンダリングされたフォームを送信する代わりに、フィールド名と修正候補を含むJSONのみを送信できます(注意:UXの観点から、ユーザーにどのように間違っているかだけでなく、修正方法を伝える方が良いでしょう)。

  2. コードの重複をレンダリングしないでください。クライアント側の検証がある場合は、クライアント側で検証エラーがレンダリングされます。アプリケーションの動作と表示の一貫性を保つには、すべてのレンダリングコードを1か所に配置することをお勧めします。クライアント側の検証により、サーバーではなくクライアント上で検証されることになります。

クライアント側でUIをレンダリングできない場合もあります。たとえば、ユーザーがJavaScriptを無効にしたり、非標準のクライアントソフトウェアを使用している場合などです。そのようなユーザーの数は非常に少なく、開発リソースの制約を考慮して、このオーディエンスを無視することもできます。そうでない場合は、サーバー側のレンダリングフォールバックを行う一般的なアプローチ(Angular2フレームワークに実装されています)があり、サーバー上で基本的に同じレンダリングコードを実行して静的HTMLをクライアントに返します。私のアドバイスは、より単純なソリューションに固執し、他の目標を達成したらサーバー側のフォールバックについて考えることです。

1
Ivan Gammel

サーバーから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つの可能な解決策を提案します:

  1. Spring MVCの実装を続けますが、JQueryとAJAXを使用しているので、今は使用しないでください。Springがサーバー側で実行する必要があることを、JQueryがクライアント側で実行してはならないものとします。

  2. Spring WebでSpring MVCを変更します。 @Controllersを@RestControllersに置き換え、サーバーからビューを取得し、サーバーを統計なしにし、バックエンドとは別にフロントエンドを実装します。

上記のオプションに関係なく、重要なことは、ツールを適切に使用することです。または言い換えれば、各問題に適切なツールを選択することです。

0
Laiv