web-dev-qa-db-ja.com

パラメータをMVCシステムに渡す適切な方法は何ですか?

Java servlet/jspをMVCコンセプトで学習し、最も単純なMVCアプリケーションを構築しようとしています。ここで、理解を深めるために、より詳細に説明します。

データベースのテーブルに新しい行を登録する必要がある場合、列のさまざまな値をシステムにどのように渡す必要がありますか?

たとえば、ユーザーが新しいイベントをプランナーに登録する場合、イベントの詳細には「どこ」、「いつ」、「誰」、「詳細」などが含まれます。このすべての長い値をサーブレットのパラメータ、つまり:httpリンク?

String accNo = request.getParameter("account_number");
String a = request.getParameter("...");
String b = request.getParameter("...");
String c = request.getParameter("...");
String d = request.getParameter("...");

リンク上のすべてのパラメーターを表示することは本当に専門外であるという私の見解を説明するために:

http://localhost:8080/domain1/servlet1?param1=55555555555555&param2=666666666666666666666666666666666666666666666666666666666666&param3='Some random detail written by user.........................'

それらを渡す他の方法はありますか?

4
lamwaiman1988

複数のレベルでパラメーターを渡す:

例として、Spring MVCは、同様に名前が付けられたリクエストパラメーター(投稿本文パラメーターまたはURLクエリ文字列パラメーター)をコントローラーメソッドのパラメーターにバインドします。これにより、HTTPリクエストでの表現からパラメーターが分割され、適切なJavaパラメーターがメソッドに渡されます。コントローラーからモデルのサービスにデータを渡す場合、3つの方法があります。思想。

1つ目は、パラメーターデータから入力したモデルオブジェクトを渡して、サービスに渡します。おそらくJPAやHibernateのようなある種のO/Rマッパーを使用しているので、これらのオブジェクトをHibernateセッションまたはjpa永続コンテキストにマージする必要があります。ただし、モデルとコントローラーをより緊密に結合しています。

2つ目は、単純なJava=タイプを渡して、サービスとコントローラーをより疎結合に保つことです。複数のフィールドを持つ複雑なオブジェクトの場合、これは面倒です。また、複数のintパラメーターが連続している場合、あなたが誤って2つを反転する可能性はかなり良いです。

3番目のオプションは、serviceメソッドに渡されるデータ転送オブジェクトを定義することです。このオブジェクトは、モデルを操作します。 DTOには、モデル内の2つ以上のオブジェクトにマップする可能性のあるフィールドを含めることができますが、コントローラーロジックはDTOにのみ結合され、コントローラーから独立してモデルを進化させることができます。

さて、それにより、HTTPランドからのデータがコントローラーを介してモデルに送られます。 Java=アプリケーションをビルドするための現在の「ベストプラクティス」方法ですが、アプリケーションに最適ではない可能性があります(ただし、大多数のアプリケーションで機能するためです)。

それらの値(リクエストの本文またはパラメーター)をどこに置くかに関しては、RESTの観点から考えると役立つ場合があります。一般に、新しいデータを追加したりデータを更新したりするフォームがある場合は、投稿の本文でパラメーターを送信します。操作は「危険」(アプリケーションの状態を変更する)または「安全」(何も変更しない)と考えることができます。 (ロギングなどの偶発的な変更はカウントされないことに注意してください。)操作はべき等である場合もあります。つまり、操作は複数回実行でき、システムの状態は最初の呼び出し後と同じです。

危険な、べき等ではない操作はPOSTである必要があります。危険ですがべき等の操作はDELETEまたはPUTである必要があります。 (一部のブラウザーはPOSTのみをサポートしているため、POSTをそのまま使用できます)。パラメータはPOST本文にエンコードする必要があります。通常、クエリ文字列パラメータは使用しません。

安全なべき等演算はGETである必要があります。 GETの操作を容易にするために、URL文字列に追加のパラメーターをエンコードすることは完全に許容されます。たとえば、ユーザー名で検索する場合は、?username = the + userをクエリパラメータとして追加するのが適切です。または、レコードを区別するには?id = 23。一部の人々は、URLがドキュメントパス/ users/23の一部として識別コンポーネントを含む場合にのみ、安心できると信じていますが、/ users?id = 23は/ users/23と同じように一意であるため、それが正しいとは思いません。 (そして私はフィールディングの論文からそれを思い出しません-しかし私はひどい記憶を持っています)。

2
ipaul

まあ、概念を混ぜてはいけません。

片側に...

[〜#〜] mvc [〜#〜]ソフトウェアアーキテクチャパターンです。これは、HTTPが必ずしも関係しないデスクトップアプリにも適用できます。

反対側では...

[〜#〜] http [〜#〜] は通信プロトコルです。ウィキペディアのように言う:

分散型、協調型、ハイパーメディア情報システム用のアプリケーションプロトコル

したがって、クエリ文字列の代わりに(パラメータ化された)情報を渡す他の方法をHTTPがサポートするかどうかを尋ねています


リクエスト

HTTP通信はRequestsおよびResponsesの観点から行われます

どのリクエストでも[〜#〜] method [〜#〜]が通知されます。これは、サーバー側アプリケーションへの指示ですサーバーが送信する情報を使用してサーバーが行うべきこと。しかしこれは情報を渡すメカニズムではありません。これは、追加の指示です。

メソッドの他に、パラメーターをサーバーに渡す3つの方法があります。

1.クエリ文字列

関連するメソッド:[〜#〜] get [〜#〜]

情報はURLに通知(パラメーター化)されます。これはあなたが公開した例です

http://localhost:8080/domain1/servlet1?param1=X&param2=X&param3='X'

その容量は64Kbに制限されます(メモリが機能する場合)。これが基本的な方法です

2.体

関連するメソッド:POST | PUT

messageは、Requestの本文に期待されます。このMessagepayloadformbodyと呼ばれますが、バイナリの場合もあります。メッセージの形式はxmltext plainjson、 ....

ただし、同じリクエストでクエリ文字列を介して情報を渡すことは引き続き可能です。そのため、情報の一部はURLに含まれ、別の部分はリクエストの本文に含まれます

SSL環境で作業している場合、ここの情報は暗号化されます。

基本情報とチュートリアルについては、このリンク W3Schools-Html Forms を確認してください。 HTMLフォームからフォームを介して情報を送信する方法の例としてそれを取り上げます。

3.ヘッダー

関連するメソッド:Any

AからB(Bはサーバー側)へのRequestにはheaderがあります。ここの情報は、アプリのビジネスによって処理されることを意図していません。それはあなたのビジネスに関連するデータではありません。ただし、とにかく情報を入れることができます。クライアントとセキュリティで保護されたAPI Restの間でセキュリティトークンが通知される場所です。さらに、環境に関連する他のいくつかのパラメーターと、Webサーバーにアドレス指定されたいくつかのパラメーター。また、応答で予期されるコンテンツタイプと送信された情報のコンテンツタイプも通知します(xml、json、バイナリ、マルチパートなど)。

したがって、yesパラメータをサーバーに通知する方法は他にもいくつかあります。しかしこのような方法を実装する方法はプラットフォームによって異なります。この作業を簡単にするための多くのプラットフォームとフレームワークがあります。この時点で、プロジェクトが実行されているプラ​​ットフォームを知る必要があります。構築されているプログラミング言語。


最後に Rest を指摘したいのですが、情報を渡すHTTPプロトコルのサポートされているメカニズムとして説明することはできません。これはソフトウェアアーキテクチャスタイルです。

URL構文を使用して情報を渡し、プットします。これは規約であり、プロトコルのメカニズムではありません。


あなたの答えに

データベースのテーブルに新しい行を登録する必要がある場合、どのようにして列のさまざまな値をシステムに渡す必要がありますか?

最良の方法は、[〜#〜] post [〜#〜]htmlフォームを使用することです。チェックアウト W3schools-HTMLフォーム

別の方法としては、[〜#〜] post [〜#〜]Ajaxを使用できます。この方法はより複雑です。ただし、変更のスタックを1つのリクエストで送信できます。 Html formを使用してこれを行うには、少し複雑です。

プロジェクトで使用しているライブラリまたはフレームワークを知っておくとよいでしょう。

:この投稿では、HTTPの技術的な紹介ではなく、簡単な説明を目的としています。私が説明しようとしたことを修正する、またはもっと良い方法を言うのはうまくいきます。

0
Laiv