簡體   English   中英

Struts2-動態表單字段和數據庫數據檢索

[英]Struts2 - Dynamic form fields and database data retrieval

我正在使用Struts2開發注冊Web應用程序,需要一些指導。

背景:

在注冊表單上,有一組五個表單字段:1個文本框和4個下拉選擇框。 這五個字段描述了一個人在教育環境中的主要職位:文本字段允許用戶插入其職務,下拉菜單允許用戶選擇他們所屬的學校,機構,部門和部門。 下拉菜單使用存儲在數據庫中的選項進行初始化(在注冊操作內部,在顯示表單之前,使用這些值初始化陣列列表)。 例如:

<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動態插入新的表單字段,如何使用存儲在數據庫中的選項初始化動態下拉菜單? 重新加載頁面后如何保留這些值?

任何幫助表示贊賞-謝謝!

您需要解決的基本問題是如何將請求參數的索引列表添加到操作類中。 這非常簡單,我認為通過創建輸入參數的List開始,您將走上正確的道路。 我在這里找到了一些有關該主題的文檔。 基本上,您可以具有名稱為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

足以捕獲用戶輸入。

您的jsp可能類似於:

<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 您可以使用JS來獲取此模板的html,將__IDX__替換為適當的索引,並在用戶單擊“添加另一個從屬關系”按鈕時將其附加到表單內容中。 這樣可以確保新添加的選擇框已預先填充了適當的值。

迭代器塊顯示用戶已提交的值(“主從屬關系”除外,該值已顯示在其上方)。

注意:當然,您應該盡可能擺脫重復的表單元素。 我會嘗試將它們提取到包含中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM