简体   繁体   English

从Struts2中的URL填充Action类实例变量

[英]Populating Action class instance variables from URL in Struts2

Facing an issue with passing values from my html form to action class. 将值从我的html表单传递到操作类时遇到问题。 Created a sample project to test the functionality and have the same issue here. 创建了一个示例项目来测试功能,并在此处遇到相同的问题。 I have the following classes: 我有以下课程:

TestBean 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 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;
    }
}

TestAction TestAction

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;
    }
}

When my url is http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanMap[0].value=1 , testBeanHolder.testBeanMap of my action gets populated with key of 0 mapping to a TestBean instance with value=1 . 当我的网址是http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanMap[0].value=1 ,我的操作的testBeanHolder.testBeanMap填充了0键,映射到value=1TestBean实例。

When the url is http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanList[0].value=1 , testBeanHolder.testBeanList gets populated with single instance of TestBean with value=1 . 当url为http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanList[0].value=1testBeanHolder.testBeanList会填充单个value=1TestBean实例。

I am try to populate testBeanListMap property of testBeanHolder and doesn't work. 我尝试填充testBeanListMap财产testBeanHolder并不起作用。 The testBeanListMap is created but empty. testBeanListMap已创建,但为空。 Here is the URL I am trying http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanListMap[0][0].value=1 这是我正在尝试使用的URL http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanListMap[0][0].value=1

Here is the code which worked, adding modified classes: 这是起作用的代码,添加了修改后的类:

TestBeanListHolder 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 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;
    }
}

URL 网址

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

The url http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanListMap[0][0].value=1 won't work because you are using wrong parameter name. url http://localhost:8080/Struts2Test/test?testBeanHolder.testBeanListMap[0][0].value=1无效,因为您使用了错误的参数名称。 Thus testBeanHolder.testBeanListMap[0][0].value is a name of the parameter that maps to the object which has a property of complex type (collection of collections). 因此, testBeanHolder.testBeanListMap[0][0].value是映射到对象的参数名称,该对象具有复杂类型的属性(集合的集合)。 Struts2 can't handle such scenarios, . Struts2无法处理这种情况。 But you can wrap a second collection with an object and use a collection of objects. 但是,您可以使用对象包装第二个集合并使用对象的集合。 The name would change to testBeanHolder.testBeanListMap[0].object[0].value . 名称将更改为testBeanHolder.testBeanListMap[0].object[0].value

The expression testBeanHolder.testBeanListMap[0][0].value is not a valid OGNL expression. 表达式testBeanHolder.testBeanListMap[0][0].value不是有效的OGNL表达式。

See here for a complete reference of what is allowed. 有关允许的内容的完整参考,请参见此处

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM