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