Java 在使用JSP时,如何使用Struts 2 ModelDriven接口访问POJO中的属性?
我有一个实现Java 在使用JSP时,如何使用Struts 2 ModelDriven接口访问POJO中的属性?,java,jsp,struts2,model-driven,Java,Jsp,Struts2,Model Driven,我有一个实现ModelDriven接口的action类。这个ModelDriven是一个常规的POJO,问题是它的一个属性是另一个对象 假设my ModelDriven是一个名为Person的对象,my Person有一个名为Address的属性,这是另一个对象。Address具有常规属性,例如String、Long`等 在提交表单时的JSP中,使用的所有常规属性(如String、int、long在Person中)都已正确映射,但应映射到address的所有数据均未正确映射 <s:text
ModelDriven
接口的action类。这个ModelDriven
是一个常规的POJO,问题是它的一个属性是另一个对象
假设my ModelDriven是一个名为
Person的对象,my Person有一个名为
Address的属性,这是另一个对象。
Address具有常规属性,例如
String、
Long`等
在提交表单时的JSP中,使用的所有常规属性(如String
、int
、long
在Person
中)都已正确映射,但应映射到address的所有数据均未正确映射
<s:textfield name="name" id="name" size="25" maxlength="15" />
<s:textfield name="address.zipcode" id="zipcode" size="25" maxlength="15" />
主类FakeDTO
:
@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;
}
}
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;
}
}
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;
}
}
<?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>
类fakefilterdo
:
@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;
}
}
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;
}
}
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;
}
}
<?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>
struts.xml的
@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;
}
}
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;
}
}
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;
}
}
<?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>
对于公司政策,我不允许复制/粘贴实际对象及其名称。但这就是想法。在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
,因此您的操作配置应该包括defaultStack
中包含的内容。默认情况下,当您扩展struts default
包时,将使用struts default
中包含的内容。请参阅使用ModelDriven
的说明。拦截器将模型推送到valueStack
的top
,因此像address
这样的对象应该可用,如果它有一个默认构造函数,它将由OGNL创建,并在那里设置zipcode
。当您在JSP中显示字段时,address.zipcode
将作为OGNL表达式计算,如果模型初始化了该bean和zipcode本身,则从地址bean中检索zipcode
。OGNL表达式中引用的所有bean都应该初始化并具有getter/setter属性。您可以发布实现ModelDriven接口的类吗?@Dan我根据请求编辑了文章。您的地址属性在哪里?为什么不为person提供getter/setter属性呢,这样,可以轻松访问所有深度嵌套的属性。检查这个-Aleksandr M,公司政策不允许我复制/粘贴实际代码,尽管如此,我创建了一个类似于我真正问题的结构。Roman C,如果你检查我的编辑,你会看到我有一个名为FakeDTO的对象,这个对象有一个FakeFilterTo,就像你设计的那样。我没有发布我的struts.xml,因为我认为它没有必要,因为我已经说过,常规属性(如String、Long、Integer等)是正确映射的。不过,感谢您的帮助和时间。我看到您进行了编辑,但其中没有任何内容与address
属性和AddressDTO
相关。因此,您没有属性,代码也没有映射。我的回答没有任何变化,因为我用了个人和地址作为具体的例子,让大家更容易理解。如果您将代码与我描述的情况进行比较,您会发现Person类似于FakeDTO对象作为主DTO,FakeFilterDTO类似于地址作为内部DTO。JSP中的表达式也类似?是的,JSP也类似。最后我的编辑格式不正确,JSP的新代码没有显示出来。如果你再读一遍,你会发现昨天我写了“我以前用作示例的JSP将变成如下:”但是代码不在那里。我现在就编辑并更正。非常感谢你的努力。