2012-01-02 9 views
0

私はStruts2を使用して登録Webアプリケーションを開発しており、いくつかのガイダンスが必要です。Struts2 - 動的フォームフィールドとデータベースデータ検索

背景:1テキストボックス、および選択ボックスダウン4ドロップ:登録フォームで

、5つのフォームフィールドのセットがあります。 5つのフィールドは、教育の場面での人の主要な位置を表しています。テキストフィールドにはユーザーが自分の役職を挿入できるようになっています。ドロップダウンメニューでは、所属する学校、機関、部署、部門を選択できます。ドロップダウンメニューは、データベースに格納されているオプションで初期化されます(登録アクション内では、フォームが表示される前に配列リストがこれらの値で初期化されます)。たとえば、次のように

<s:select emptyOption="true" key="school1.schoolId" list="schoolList" listKey="schoolId" listValue="schoolName" required="true" /> 

問題:

私は二位置のX番号を追加する能力をユーザに提供する必要があります。登録フォームで、ユーザーは「別の所属を追加」ボタンをクリックすると、5つのフォームフィールドの新しいセットが表示されます。これらのフィールドも検証する必要があり、ユーザーがフォームの送信ボタンをクリックすると保存されます。

この問題を解決するにはどうすればよいでしょうか?

private List<String> jobTitles = new ArrayList<String>(); 
private List<School> schools = new ArrayList<School>(); 
private List<Institution> institutions = new ArrayList<Institution>(); 
private List<Department> departments = new ArrayList<Department>(); 
private List<Division> divisions = new ArrayList<Division>(); 

しかし、私は続行する方法がわからない:

はこれまでのところ、私はそうのように、各フォームフィールドの配列リストを宣言しました。プライマリポジションの最初の5つのフィールドを表示するにはどうすればよいですか?新しいフォームフィールドを動的に挿入するためにJavascriptを使用する場合、データベースに格納されたオプションを使用して動的ドロップダウンメニューを初期化するにはどうすればよいですか?ページがリロードされた場合、これらの値はどのように保持されますか?

ありがとうございました - ありがとう!

答えて

1

あなたが取り組む必要がある基本的な問題は、アクションクラスにリクエストパラメータのインデックス付きリストを取得する方法です。これは非常に簡単で、私は入力パラメータのListを作成することから始めて、あなたが正しい道にいると思います。私は、件名hereに関する少しの文書を見つけました。基本的にはjobTitles[0]jobTitles[1]のような名前のフォームフィールドを持つことができます。これはjobTitlesリストに入力するために使用されます。

しかし、私が思うに「所属」の概念は、それ自身のクラスに値する:あなたのアクションクラスで

class UserAffiliation { 
    private String title; 
    private String schoolId; 
    private String institutionId; 
    private String departmentId; 
    private String divisionId; 

    // Make sure that there is a no-args constructor (default or explicit) for Struts to create instances. 
    // Add getters and setters 
} 

private List<UserAffiliation> affiliations; 
    ... 
    // getter and setter for affiliations 

は、ユーザーの入力をキャプチャするのに十分だろう。

<form action=".." method="post"> 
    <div class="affiliation"> 
    <s:textfield name="affiliations[0].title"/> 
    <s:select name="affiliations[0].schoolId" list="schools" listKey="schoolId" listValue="schoolName"/> 
    ... 
    </div> 

    <s:if test="affiliations != null && affiliations.size > 1"> 
    <s:iterator value="affiliations" begin="1" status="status"> 
     <s:textfield name="affiliations[%{#status.index + 1}].title"/> 
     <s:select name="affiliations[%{#status.index + 1}].schoolId" list="schools" listKey="schoolId" listValue="schoolName"/> 
      ... 
    </s:iterator> 
    </s:if> 
    .... 
</form> 

<div id="affilationTemplate" style="display:none;"> 
    <div class="affiliation"> 
     <s:textfield name="affiliations[__IDX__].title"/> 
     <s:select name="affiliations[__IDX__].schoolId" list="schools" listKey="schoolId" listValue="schoolName"/> 
    </div> 
    ... 
</div> 

注DIV affilationTemplate

あなたのJSPのようなものを見ることができます。 JSを使用してこのテンプレートのhtmlを取得し、__IDX__を適切なインデックスに置き換え、ユーザーが「別の所属を追加」ボタンをクリックしたときにフォームの内容に追加することができます。これにより、新しく追加された選択ボックスに適切な値があらかじめ入力されていることが確認されます。

反復子ブロックには、ユーザーがすでに送信した値(これまでに表示されていた「第一次所属」を除く)が表示されます。

注:可能であれば、繰り返されるフォーム要素を削除してください。私はインクルードにそれらを抽出しようとします。

+0

私の元の投稿(そして数時間後)から、私はあなたと同じ行であなたと同じ考え方を考え始めました。この例をありがとう!私はこれを明日撮影し、追加のフィードバック/コメントと質問を提供するために戻ってくる可能性が最も高いでしょう。私はこれまでのあなたの助けに感謝します! –

+0

@A.Cusanoどんな運がありますか? – Asa

+0

優秀、これは私が探していたものです!ありがとう! – Viktor

関連する問題