问题是将索引属性从JSP设置为操作类

时间:2010-01-09 07:54:39

标签: jsp struts2

我们正在使用struts 2.0.14并面临问题设置从JSP到动作类的索引属性。

代码看起来与此类似。

  public class MyExample extends ActionSupport
        {

            private List<Person> persons;
            private List<String> names;

            public String execute()
            {
                //persons = myDAO.readPersons(names);
                return SUCCESS;
            }

            public String update()
            {
                for (Person p : persons)
                {
                    System.out.println(p.getName() + "---" + p.getAddress().getStreet());
                }
                return SUCCESS;
            }

            // Getters and setters     
        }

        class Person
        {
            private Address address;
            private String name;
             // Getters and setters    
        }

        class Address
        {
            private String street;
            private String number;   
             // Getters and setters    
        }

   And JSP:
       <%@ taglib prefix="s" uri="/struts-tags"%>
       <%@ page language="java" pageEncoding="ISO-8859-1"%>
       <!---- Other code ---->
       <s:ieterate value="persons" status="status">
        <tr>
          <s:textfield name="person['%{#status.index}'].name"/>
          <s:textfield name="person['%{#status.index}'].address.number"/>
           <s:textfield name="person['%{#status.index}'].street"/>
        </tr>

我可以在页面上成功显示值,但是当我提交表单时,值不会被填充。 我检查了萤火虫,看看参数是如何发布的,它们就像人['0']。姓名,人物['0']。地址。数字等。请告诉我错误所在。

2 个答案:

答案 0 :(得分:2)

你是否试过没有'围绕%{#status.index}?

像这样:

<s:textfield name="person[%{#status.index}].name"/>

答案 1 :(得分:2)

除了删除索引周围的引号 Nate 建议外,我注意到您的字段名为persons,但您的参数使用的是person。假设这是一个拼写错误,例如persons[%{#status.index}].name,请确保:

  1. 您的操作有setPersons(List<Person> person),因此可以创建新列表并进行设置。
  2. PersonAddress具有无参数构造函数,因此可以动态自动创建它们。
  3. 如果它仍无法正常工作,请尝试将@Elementcom.opensymphony.xwork2.util.Element)添加到persons,以便明确说明要填充的对象类型:

    @Element(value=Person)
    List<Person> persons;
    

    可能发生的另一件事是你的行动的一个超类可以实现ParameterNameAware,它按名称过滤掉参数。一种快速检查方法是覆盖您的操作中的acceptableParameterName,看看它是否有效:

    @Override
    public boolean acceptableParameterName(String name) {
        return true;
    }
    

    有关详细信息,请参阅ParametersInterceptor的API文档:http://struts.apache.org/2.0.14/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/ParametersInterceptor.html