【问题标题】:Populating Action class instance variables from URL in Struts2从 Struts2 中的 URL 填充 Action 类实例变量
【发布时间】:2015-10-07 03:44:56
【问题描述】:

面临将值从我的 html 表单传递到操作类的问题。创建了一个示例项目来测试功能并在此处遇到相同的问题。我有以下课程:

TestBean

package com.struts2test.beans;

public class TestBean {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

TestBeanHolder

package com.struts2test.beans;

import java.util.List;
import java.util.Map;

public class TestBeanHolder {
    private Map<Integer, TestBean> testBeanMap;
    private List<TestBean> testBeanList;
    private Map<Integer, List<TestBean>> testBeanListMap;

    public Map<Integer, TestBean> getTestBeanMap() {
        return testBeanMap;
    }
    public void setTestBeanMap(Map<Integer, TestBean> testBeanMap) {
        this.testBeanMap = testBeanMap;
    }
    public Map<Integer, List<TestBean>> getTestBeanListMap() {
        return testBeanListMap;
    }
    public void setTestBeanListMap(Map<Integer, List<TestBean>> testBeanListMap) {
        this.testBeanListMap = testBeanListMap;
    }
    public List<TestBean> getTestBeanList() {
        return testBeanList;
    }
    public void setTestBeanList(List<TestBean> testBeanList) {
        this.testBeanList = testBeanList;
    }
}

测试操作

package com.struts2test.action;

import com.opensymphony.xwork2.ActionSupport;
import com.struts2test.beans.TestBeanHolder;

public class TestAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    private TestBeanHolder testBeanHolder;

    public TestBeanHolder getTestBeanHolder() {
        return testBeanHolder;
    }

    public void setTestBeanHolder(TestBeanHolder testBeanHolder) {
        this.testBeanHolder = testBeanHolder;
    }

    public String execute() throws Exception {
        return SUCCESS;
    }
}

当我的 url 是 http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanMap[0].value=1 时,我的操作的 testBeanHolder.testBeanMap 将填充有 0 的键映射到带有 value=1TestBean 实例。

当 url 为 http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanList[0].value=1 时,testBeanHolder.testBeanList 将填充有 TestBeanvalue=1 的单个实例。

我尝试填充testBeanHoldertestBeanListMap 属性但不起作用。 testBeanListMap 已创建但为空。这是我正在尝试的 URL http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanListMap[0][0].value=1

【问题讨论】:

标签: java struts2 ognl


【解决方案1】:

这是有效的代码,添加了修改后的类:

TestBeanListHolder

package com.struts2test.beans;

import java.util.List;

public class TestBeanListHolder {
    private List<TestBean> testBeans;

    public List<TestBean> getTestBeans() {
        return testBeans;
    }

    public void setTestBeans(List<TestBean> testBeans) {
        this.testBeans = testBeans;
    }

}

TestBeanHolder

package com.struts2test.beans;

import java.util.List;
import java.util.Map;

public class TestBeanHolder {
    private Map<Integer, TestBean> testBeanMap;
    private List<TestBean> testBeanList;
    private Map<Integer, TestBeanListHolder> testBeanListMap;

    public Map<Integer, TestBean> getTestBeanMap() {
        return testBeanMap;
    }

    public void setTestBeanMap(Map<Integer, TestBean> testBeanMap) {
        this.testBeanMap = testBeanMap;
    }

    public Map<Integer, TestBeanListHolder> getTestBeanListMap() {
        return testBeanListMap;
    }

    public void setTestBeanListMap(
            Map<Integer, TestBeanListHolder> testBeanListMap) {
        this.testBeanListMap = testBeanListMap;
    }

    public List<TestBean> getTestBeanList() {
        return testBeanList;
    }

    public void setTestBeanList(List<TestBean> testBeanList) {
        this.testBeanList = testBeanList;
    }
}

网址

http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanListMap[1].testBeans[0].value=somevalue

【讨论】:

【解决方案2】:

网址http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanListMap[0][0].value=1 不起作用,因为您使用了错误的参数名称。因此testBeanHolder.testBeanListMap[0][0].value 是映射到具有复杂类型属性(集合集合)的对象的参数名称。 Struts2 无法处理这种情况,.但是您可以使用对象包装第二个集合并使用对象集合。名称将更改为 testBeanHolder.testBeanListMap[0].object[0].value

【讨论】:

  • 谢谢@Roman。有效。需要List&lt;TestBean&gt; 的支架
  • @JamesJithin 你读过我评论中链接的the answer 吗? Roman,如果我们从 Q&A 中知道它不能,为什么要说 不确定 struts 是否可以处理这种情况
  • 他在问你一个与你的答案直接相关的问题;打开一个新问题来回复你的答案是不合适的。
  • ...他问你为什么这么说。我不明白问题是什么。问一个问题的目的是得到一个答案——不仅仅是自己回答,不是吗?没有答案似乎是提出问题的完美时间。
  • 没有问为什么。
【解决方案3】:

表达式 testBeanHolder.testBeanListMap[0][0].value 不是有效的 OGNL 表达式。

请参阅 here 以获取有关允许内容的完整参考。

【讨论】:

  • testBeanHolder.testBeanListMap[0][0].value 是一个有效的表达式。
  • 它有什么不妥之处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多