【问题标题】:Struts2 not able to retrieve contained Object used as an attribute in action classStruts2 无法检索在动作类中用作属性的包含对象
【发布时间】:2014-09-12 12:40:09
【问题描述】:

嗨,我在 Struts2 中创建了一个动作类“MyClass”,我想在我的 jsp 文件中获取它的实例变量“validationResult”,但我得到了 null,尽管另一个实例变量“version”正在填充。当我显示他们的内容使用<s:iterator>标签显示实例变量“validationResult”的内容。

动作类

package my.com;
public class MyClass extends ActionSupport{
    private String version;
    private List<VersionTO> validationResult;

    @Override
    public String execute() throws Exception {
        validationResult=Arrays.asList(new VersionTO ("abc","def","ghi","jkl"), new VersionTO("mno","pqr","stu","vwx"));
        version="212";
        return SUCCESS;
    }    

    public String getVersion() {
        return Version;
    }    
    public void setVersion(String version) {
        this.version = version;
    }           
    public List<VersionTO> getValidationResult() {
        return validationResult;
    }       
    public void setValidationResult(List<VersionTO> validationResult) {
        this.validationResult = validationResult;
    }
}

豆子

pack my.be;
public class VersionTO {
    private String server;
    private String version;
    private String versionOn;
    private String compared;

    public VersionTO() {
      super();
    }

    public VersionTO(String server, String version,
            String versionOn, String compared) {
        this.server = server;
        this.version = version;
        this.versionOn = versionOn;
        this.compared = compared;
    }

    public String getServer() {
        return server;
    }       
    public void setServer(String server) {
        this.server = server;
    }       
    public String getVersion() {
        return version;
    }       
    public void setVersion(String version) {
        this.version = version;
    }       
    public String getVersionOn() {
        return versionOn;
    }       
    public void setVersionOn(String versionOn) {
        this.versionOn = versionOn;
    }       
    public String getCompared() {
        return compared;
    }       
    public void setCompared(String compared) {
        this.comparedVersion = compared;
    }    
}

JSP

<jsp:useBean id="ver" class="MyClass" scope="page">
    <jsp:setProperty name="ver" property="*" />
</jsp:useBean>
<jsp:getProperty name="ver" property="vdVersion"/> <!--here i am getting proper output ie 212-->
    <jsp:getProperty name="ver" property="validationResult"/> <!--here i am getting null in the output -->
<%
    if (ver.getValidationResult() != null && ver.getValidationResult().isEmpty()) {
%>
    <!--  logic for Presentation not working as each time I am getting null in validationResult -->
<%
    }
%>

<!-- working fine -->
<s:iterator value="validationResult">
    <tr>
        <td><s:property value="server" /></td>
        <td><s:property value="version" /></td>
        <td><s:property value="versionOn" /></td>
        <td><s:property value="compared" /></td>
    </tr>
</s:iterator>

【问题讨论】:

    标签: java jsp struts2


    【解决方案1】:

    你需要在你的对象上设置一个默认的无参数构造函数,否则 Struts2 将无法实例化它。

    public VersionTO() {
       /* ... stuff ... eg set all to =""; */    
    }
    
    public VersionTO(String server, String version,
            String versionOn, String compared) {
       /* ... stuff ... */
    }
    

    Read the whole story


    编辑

    您不需要所有这些标签和操作...动作属性已经在 ValueStack 上。只需使用 Struts 标签而不是 JSP 标签和邪恶的 scriptlet。将您的 JSP 从:

    <jsp:useBean id="ver" class="MyClass" scope="page">
        <jsp:setProperty name="ver" property="*" />
    </jsp:useBean>
    <jsp:getProperty name="ver" property="vdVersion"/> <!--here i am getting proper output ie 212-->
        <jsp:getProperty name="ver" property="validationResult"/> <!--here i am getting null in the output -->
    <%
        if (ver.getValidationResult() != null && ver.getValidationResult().isEmpty()) {
    %>
        <!--  logic for Presentation not working as each time I am getting null in validationResult -->
    <%
        }
    %>
    

    进入:

    <s:property name="version"/> <!--WARNING ! In your Action class it is version... "vdVersion" may be a typo-->
    <s:if test=%{validationResult!=null">
        <!--  now the logic for Presentation will work, for example : -->
        <s:iterator value="validationResult" status="stat">
            <tr>
                <td><s:property value="server" /></td>
                <td><s:textfield name="validationResult[%{#stat.index}].version" /></td>
                <td><s:property value="versionOn" /></td>
                <td><s:property value="compared" /></td>
            </tr>
        </s:iterator>
    </s:if>
    

    【讨论】:

    • 谢谢安德烈亚斯,但我已经添加了一个默认构造函数但我忘了发布它
    • 感谢@Andreas,它起作用了,但仍然不明白为什么 标签不起作用??
    • 不确定,我猜是初始化问题...不过不值得研究,只需使用正确的标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多