繁体   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