2012-01-02 94 views
0

我正在开发一个使用Struts2的注册Web应用程序,需要一些指导。Struts2 - 动态表单域和数据库数据检索

背景:

在登记表,有一组五个表单字段: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来动态插入新的表单域,我该如何使用存储在数据库中的选项来初始化动态下拉菜单?如果页面重新加载,我该如何保留这些值?

任何帮助表示赞赏 - 谢谢!

回答

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 
} 

在你的Action类:

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__,并在用户单击“添加其他联盟”按钮时附加到表单内容。这可以确保新添加的选择框被预填充适当的值。

迭代器块显示用户已经提交的值(除了已经在其上面显示的'主要联系')之外的任何值。

注意:当然,您应该尝试摆脱重复的表单元素,如果可能的话。我会尝试将它们解压缩为包含。

+0

自从我原来的帖子(以及许多小时后)以后,我开始考虑与你有关的关联班。谢谢你的例子!我明天会给出这个镜头,很可能会回来提供额外的反馈/意见和问题。我非常感谢你的帮助! – 2012-01-03 06:11:36

+0

@ A.Cusano好运? – Asa 2012-01-04 05:04:33

+0

非常好,这就是我一直在寻找的!谢谢! – Viktor 2013-02-18 10:37:15