インターフェイスを実装するアクション クラスがあり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、 、int、longinなどの通常のプロパティ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" />
会社のポリシーにより、実際のオブジェクトとその名前をコピー/貼り付けすることは許可されていません。しかし、それがアイデアです。