Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用JSP时,如何使用Struts 2 ModelDriven接口访问POJO中的属性?_Java_Jsp_Struts2_Model Driven - Fatal编程技术网

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将变成如下:”但是代码不在那里。我现在就编辑并更正。非常感谢你的努力。