3

我有一个实现ModelDriven接口的动作类。这ModelDriven是一个普通的 POJO,问题是它的一个属性是另一个对象。

想象一下我的 ModelDriven is a object calledPerson and my person has an attribute calledAddress that is another object.Address has regular properties such asString , Long` 等。

在我提交表单时的 JSP 中,所有使用的常规属性(如Stringintlongin )Person都正确映射,但所有应该映射到地址的数据都没有。

<s:textfield name="name" id="name" size="25" maxlength="15" />
<s:textfield name="address.zipcode" id="zipcode" size="25" maxlength="15" />

这就是我尝试映射属性的方式。我可以正确使用 name 属性,但是在映射人员地址中的属性时,这种方法不起作用。

我究竟做错了什么?

随着时间的推移,我的Address属性是在Person实例化对象时声明的,所以它永远不会null.

编辑:根据要求,这里是动作源和 DTO:

那个行动:

@Controller
@Scope("request")
public class AnAction extends BaseAction implements ModelDriven<FakeDTO> {

    private static final long serialVersionUID = 8238033889271514835L;

    @Autowired
    private FakeFacade facade;

    private FakeDTO fakeDTO = new FakeDTO();

    public String action01() {
        return Action.SUCCESS;
    }

    public String action02() {
        this.fakeDTO.setAnswer(this.fakeFacade.fakeFacadeMethod(this.fakeDTO.getComplexObject()));
        return Action.SUCCESS;
    }

    @Override
    public FakeDTO getModel() {
        return this.fakeDTO;
    }
}

主要课程FakeDTO

public class FakeDTO implements BaseDTO {

    private static final long serialVersionUID = -2093038083351846003L;

    private FakeFilterDTO filter = new FakeFilterDTO();
    private String name;

    public FakeDTO() {
        super();
    }

    @Override
    public FakeFilterDTO getFilter() {
        return this.filter;
    }

    public void setFilter(final FakeFilterDTO filterParam) {
        this.filter = filterParam;
    }

    public String getName() {
        return this.name;
    }

    public String setName(final String nameParam) {
        this.name = nameParam;
    }
}

班级FakeFilterDTO

public class FakeFilterDTO extends BaseFilterDTO {

    private static final long serialVersionUID = 4528040257605851210L;

    private Date aDate;
    private Long aLong;
    private Integer anInteger;
    private String aString;

    public Date getADate() {
        return this.aDate;
    }

    public void setDataInicial(final Date aDateParam) {
        this.aDate = aDateParam;
    }

    public Long getALong() {
        return this.aLong;
    }

    public void setALong(final Long aLongParam) {
        this.aLong = aLongParam;
    }

    public Integer getAnInteger() {
        return this.anInteger;
    }

    public void setAnInteger(final Integer anIntegerParam) {
        this.anInteger = anIntegerParam;
    }

    public String getAString() {
        return this.aString;
    }

    public void setAString(final String aStringParam) {
        this.aString = aStringParam;
    }
}

struts.xml:_

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>

    <include file="META-INF/bsad/struts2/struts-config.xml" />

    <package name="reports" namespace="/reports" extends="project-default">
        <action name="anAction" class="anAction" method="action01">
            <result>/WEB-INF/pages/success.jsp</result>
            <result name="input">/WEB-INF/pages/input.jsp</result>
        </action>

    <action name="generateReport" class="anAction" method="action02">
            <result>/WEB-INF/pages/reportGenerated.jsp</result>
        </action>
    </package>
</struts>

被放置project-default在包含. 我可以保证,因为我在这个拦截器中放置了一个断点并让它通过那里。struts-config.xmlstruts-defaultModelDrivenInterceptor

我之前用作示例的 JSP 将变为如下:

<s:textfield name="name" id="name" size="25" maxlength="15" />
<s:textfield name="filter.aString" id="zipcode" size="25" maxlength="15" />

对于公司政策,我不允许复制/粘贴实际对象及其名称。但这就是想法。

4

1 回答 1

1

fakeDTO你的模型中,你应该有一个属性address,它应该返回一个对象,就像AddressDTO在这个对象中应该有一个属性一样zipcode

public class FakeDTO implements BaseDTO {

  private AddressDTO address;

  public AddressDTO getAddress() {
    return address;
  }

  public void setAddress (AddressDTO address) {
    this.address = address;
  }
 ...
}

public class AddressDTO implements BaseDTO {

  private String zipcode;

  public String getZipcode() {
    return zipcode;
  }

  public void setZipcode(String zipcode) {
    this.zipcode = zipcode;

  }
 ...
}

由于您尚未发布struts.xml您的操作配置,因此您的操作配置应包括在扩展包时默认使用的modelDriven拦截器。请参阅使用示例。模型被拦截器推送到,因此如果对象有默认构造函数,它将由 OGNL 创建并设置在那里。当您在 JSP 中显示字段时,如果模型已初始化该 bean 和邮政编码本身,则会将其评估为 OGNL 表达式并从地址 bean 中检索。OGNL 表达式中引用的所有 bean 都应该被初始化并具有 getter/setter 属性。defaultStackstruts-defaultModelDriventopvalueStackaddresszipcodeaddress.zipcodezipcode

于 2013-11-29T11:22:11.343 回答