使用Struts1.3中的<logic:iterate>标记</logic:iterate>将表单作为集合提交

时间:2011-11-14 10:54:07

标签: jsp struts jsp-tags

使用Struts 1.3。

使用<logic:iterate>标记将表单提交为集合我想格式化多个用户记录以编辑值。

当数据提交回Action时,它如何处理Action表单中的表单列表?有没有办法将结果作为表格集合提交?

例如,我有List<EmployeeForm>,我正在我的jsp页面上迭代这些记录,它运行正常。但是记录在JSP页面上是可编辑的,因此在修改记录并按下提交按钮后,我需要List<EmployeeForm>在我的动作类中包含更新的记录,以更新数据库中的记录。

更新,我的jsp页面如下:

<html:form action="modify.do" styleId="LogicIterateForm" method="post">
            <table style="font-weight:bold">
            <tr><td>Employee ID</td><td>Employee Name</td></tr>
            <logic:iterate id="employee" name="LogicIterateForm" property="emp" indexId="i">

           <tr>

enter code here                                        

           </tr>
        </logic:iterate>
<tr>
    <html:submit onclick="submitForm()">Modify</html:submit>
</tr>
    </table>
        </html:form>

操作:点击Modify按钮

执行
LogicIterateForm logicIterateForm=(LogicIterateForm)form;
        List<Employee> empList=logicIterateForm.getEmp();
        System.out.println("Size of emp:::::"+empList.size());
        if(empList!=null && empList.size()>0)
        {
            for(Employee emp:empList)
            {
                if(emp!=null)
                {
                    System.out.println("EmployeeID:::::::::::"+emp.getEmpId());
                    System.out.println("EmployeeName:::::::::::"+emp.getEmpName());
                }
            }
        }

并且在行动中发送员工列表工作正常,但遗憾的是我无法在我的操作中获取更新的表单字段值。请帮助我,我在做错了。

以下是我的ActionForm

public class LogicIterateForm extends org.apache.struts.action.ActionForm {


    private List<Employee> emp=new ArrayList<Employee>();


    public List<Employee> getEmp() {
        return emp;
    }

    public void setEmp(List<Employee> emp) {
        this.emp = emp;
    }

和Employee类是一个带有setter and getter of empId and empName

的计划java类

1 个答案:

答案 0 :(得分:2)

简言之,版本生成的HTML将具有不正确的name属性。 ActionForm列表属性名为emp,但您将其称为employee

较长的版本包含一些其他杂项,从长远来看,这些东西应该会让你更轻松。

首先,这是我用来显示表单的Action。请注意,我没有明确地将任何内容放入范围 - 框架为我们做了这个。看起来好像是明确地将表单设置为<logic:iterator>使用的范围,但这是多余的。

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    Employee emp1 = new Employee("1", "Dave");
    Employee emp2 = new Employee("2", "Subodh");
    ((LogicIterateForm) form).setEmp(Arrays.asList(emp1, emp2));
    return mapping.findForward("success");
}

其次,由于上述原因,JSP页面可以变得更简单。请注意,input元素的名称必须与表单emp中的名称匹配,否则Struts将不知道如何处理输入值,它将被忽略。

<logic:iterate name="empForm" property="emp" id="emp">
  <tr>
    <td><html:text name="emp" value="${emp.empId}" property="empId" indexed="true"/></td>
    <td><html:text name="emp" value="${emp.empName}" property="empName" indexed="true"/></td>
  </tr>
</logic:iterate>

然后,在提交给所有数据的操作内部将按预期显示在表单中。

List<Employee> emps = ((LogicIterateForm) form).getEmp();
for (Employee emp : emps) {
    System.out.printf("%s: %s%n", emp.getEmpId(), emp.getEmpName());
}

应该这样做。