2

Hibernate で Spring MVC を使用しています。私のページには、(jQuery 経由で) 新しいテーブル行を作成するボタンがあります。これは、ユーザーがデータベースに挿入される新しいデータを選択できるようにするための入力で構成されています。これらの入力の一部はコンボ ボックスです。私のコンボボックスは次のようになります。

<form:select path="ProductName">
  <form:option>some list<form:option>
</form:select>

1 つのテーブル行に 4 ~ 5 個の異なるボックスがある場合があり、ボタンを複数回クリックして複数の入力行を追加できます。をクリックSaveすると、行内のすべての項目がデータベース テーブルに挿入されます。

ユーザーは一度に複数の行を送信できるため、パス属性について混乱しています。これは、JSP のすべてのスプリング タグにパスを指定するためです。ここでは、1 つの列に挿入したいのですが、複数の行と行は任意の数にすることができるので、どうすればよいですか?

これで私を助けてください。私は本当に立ち往生しています。

4

1 に答える 1

1

更新された回答

この回答を確認してください: Spring MVC: タイムシートからの値の処理 - 複数のオブジェクト

基本的な考え方は、フォーム バッキング オブジェクトはList単一のオブジェクトではなく、複数のオブジェクトであるということです。これは、既存のオブジェクトの編集のみを許可している場合に役立ちます。ユーザーが必要な数の行を作成できるようにするため、何か特別なことを行う必要があります。

フォーム バッキング オブジェクトをList呼び出されたオブジェクトに変更しproducts、各ProductオブジェクトにプロパティがあるとしますproductName。JSP コードは次のように変更されます。

<c:forEach items="${products}" varStatus="row">
  <form:select path="products[${row.index}].productName">
    <form:option>some list<form:option>
  </form:select>
</c:forEach>

HTML がレンダリングされると、次のような HTML が表示されます。

<select path="products[0].productName">
  <option>some list<option>
</select>
<select path="products[1].productName">
  <option>some list<option>
</select>

アイデア#1

ユーザーがクリックして行を追加するたびに、フォームを送信します。サーバー上で、デフォルト値が入力されたオブジェクトをもう 1 つフォーム バッキング リストに追加し、フォームを再送信します。この方法は少し頭が痛いですが、うまくいくことはわかっています。

アイデア#2

このようにシステムをハックできるかどうかはわかりませんが、うまくいけば、アイデア 1 よりも簡単になります。HTML の新しい行を作成するときは、path属性を解析し、インデックスに 1 を追加します。

jQuery サンプル:

// This assumes that each row in the form has the class 'formRow'
function addNewRow() {
  var pathAttr = $(".formRow:last").attr("path");
  var pathIndex = parseIndex(pathAttr);
  var newIndex = parseIndex(pathIndex) + 1;
  var newRow = createNewRow();        //Creates HTML for new row
  // Set the path attribute with new index; would have to operate
  //    on all form elements, since each has a path attribute
  $(newRow).attr("path", "products[" + newIndex + "]");
}

function parseIndex(pathAttr) {
  var start = pathAttr.indexOf('[');
  var end = pathAttr.indexOf(']');
  var indexStr = pathAttr.substring(start + 1, end);
  return new Number(indexStr);
}

アイデア#3

前のアイデアが機能しない場合や複雑すぎる場合は、単純な HTML フォームを使用します。プレーンな HTML フォームでは、jQuery を使用nameして、行インデックスに基づいて各要素に一意のパラメーターを与えることができます (アイデア 2 と同様)。フレームワークは生活を楽にするはずなので、基礎となる言語/プラットフォームよりもフレームワークを使用する方が難しいというまれなケースに遭遇した場合は、元の言語/プラットフォームに戻るのが理にかなっています.


古い回答

まず第一に、あなたの質問はかなり基本的です。必要なこの 1 つのことに対する簡単な修正を単に見つけるのではなく、使用しているフレームワークの背後にあるアーキテクチャを理解できるように、ドキュメント、書籍、チュートリアルなどを読み始める必要があります。

第二に、やろうとしていることを実行する方法はたくさんあります。単純にフォーム データをサーバーに送信して保持したい場合は、単純なフォーム送信を行うことができます。より複雑なフォーム処理が必要な場合は、Spring MVC<form:___>タグを使用するのがおそらく良い方法です。(注: JavaScript でフォームを作成している場合、タグは JSP タグであるため作成できません<form:___>。また、より基本的な HTML をまだ理解していない場合は、より複雑な JSP フォーム タグを使用しないでください。ページ全体を更新せずにデータを送信する場合は、Ajax 呼び出しを使用できます。誰かがあなたを助けるためには、あなたが何をしようとしているのか正確に知る必要があります. 現在のところ、あなたの質問は、データをサーバーに転送するさまざまな方法が混在しているようです。

肝心なのは、世の中にはたくさんの Web テクノロジーがあるということです。最初に基本的な Web フローを理解していない場合は、複雑なことをしようとするべきではありません。何よりもまず、クライアントとサーバーの違いを理解する必要があります。クライアントとサーバーの対話に関しては、JavaScript、JSP、および Spring MVC がどこにあるかを理解する必要があります。読んでおくべきことには、Spring MVC、HTML フォームの送信、および Spring 固有のフォームの送信があります。

いくつかの読書:

クライアントとサーバーの説明

HTMLフォーム

JavaScript による Ajax

jQuery による Ajax

Spring MVCformタグの使用(これはサーバー側のみです)

Spring MVC に関する別の情報

于 2012-06-12T16:04:34.370 に答える