【问题标题】:Problem setting back indexed properties from JSP to action class将索引属性从 JSP 设置回操作类的问题
【发布时间】:2010-01-09 07:54:39
【问题描述】:

我们正在使用 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>

我可以成功地在页面上显示值,但是当我提交表单时,值没有被填充。 我检查了firebug,看看参数是如何发布的,它们就像person['0'].name,person['0'].address.number等,请告诉我错误在哪里。

【问题讨论】:

    标签: jsp struts2


    【解决方案1】:

    您是否尝试过在 %{#status.index} 周围不使用 '?

    像这样:

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

    【讨论】:

      【解决方案2】:

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

      1. 您的操作有一个setPersons(List&lt;Person&gt; person),以便它可以创建一个新列表并进行设置。
      2. PersonAddress 具有无参数构造函数,因此它们可以在运行中自动创建。

      如果仍然无法正常工作,请尝试将 @Element (com.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

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        相关资源
        最近更新 更多