更新された回答
この回答を確認してください: 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 に関する別の情報