3

インターフェイスを実装するアクション クラスがありModelDrivenます。これModelDrivenは通常の POJO です。問題は、そのプロパティの 1 つが別のオブジェクトであることです。

私の ModelDriven is a object calledPerson and my person has an attribute calledAddress that is another object.Address has regular properties such asString , Long などを想像してみてください。

フォームを送信するときの JSP ではString、 、intlonginなどの通常のプロパティPersonはすべて正しくマップされますが、アドレスにマップする必要があるすべてのデータは正しくマップされません。

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

それが私がプロパティをマッピングしようとする方法です。名前のプロパティは正しく理解できますが、個人の住所にプロパティをマッピングする場合、このアプローチは機能しません。

私は何を間違っていますか?

やがて、私の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含む include struts-config.xmland extendsstruts-defaultパッケージに配置されますModelDrivenInterceptor。このインターセプターとそこを通過するブレークポイントにブレークポイントを配置したため、それを保証できます。

前に例として使用した 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です。AddressDTOzipcode

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 でフィールドを表示すると、モデルが初期化されている場合は OGNL 式として評価され、その Bean と郵便番号自体がアドレス Bean から取得されます。OGNL 式で参照されるすべての Bean は初期化され、getter/setter プロパティを持つ必要があります。defaultStackstruts-defaultModelDriventopvalueStackaddresszipcodeaddress.zipcodezipcode

于 2013-11-29T11:22:11.343 に答える