在使用JSP时,如何使用Struts 2 ModelDriven接口访问POJO中的属性?

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

想象一下,我的ModelDriven是一个名为Person的对象,我的人有一个名为Address的属性,它是另一个对象。 地址具有常规属性,如String,Long等。

在我提交表单的JSP中,所有使用的常规属性(如String,int,long in Person)都被正确映射,但是应该映射到地址的所有数据都不是。

  

这就是我尝试映射属性的方式。 名称属性我可以把它弄好,但是当涉及到人物地址中的属性时,这种方法不起作用。

我究竟做错了什么?

最后,我的Address属性在Person中声明实例化对象,因此它永远不会为null。

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

那个行动:

 @Controller @Scope("request") public class AnAction extends BaseAction implements ModelDriven { 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; } } 

主要的DTO:

 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

       /WEB-INF/pages/success.jsp /WEB-INF/pages/input.jsp   /WEB-INF/pages/reportGenerated.jsp    

project-default放在include struts-config.xml中,并扩展包含ModelDrivenInterceptor的struts-default包。 我可以保证,因为我在这个拦截器中设置了一个断点,并且它在那里穿过。

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

   

对于公司政策,我不允许复制/粘贴实际的对象及其名称。 但那是个主意。

在作为模型的fakeDTO ,你应该有一个属性address ,该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拦截器,默认情况下包含在defaultStack ,当你扩展struts-default包时。 查看模型驱动的示例 。 该模型被拦截器推送到valueStacktop ,因此如果它具有默认构造函数 ,那么像address这样的对象应该是可用的,它将由OGNL和那里设置的zipcode创建。 当您在JSP中显示字段时,如果模型初始化为bean和zipcode本身,则address.zipcode被评估为OGNL表达式并从地址bean中检索zipcode 。 OGNL表达式中引用的所有bean都应该初始化并具有getter / setter属性。