繁体   English   中英

OGNL数组和列表索引

[英]OGNL Array and List Indexing

我将此参数发送到我的struts动作

CDATA [1] =巴

在我的行动中,我对索引和价值感兴趣。 我为CDATA定义了一个getter / setter对,因为OGNL文档建议:

public void setCdata(int index, String value){
    LOG.info("setData; key="+ key +"; value="+ value);
    // store index and value;
}

public String getCdata(int index){
    return null; // don't really need a setter
}

这是我得到的例外情况:

2013-04-29 15:38:49,792 [http-apr-8080-exec-3] WARN  com.opensymphony.xwork2.util.logging.commons.CommonsLogger.warn(CommonsLogger.java:60) - Error setting expression 'cdata[1]' with value '[Ljava.
lang.String;@4223d2a4'
ognl.OgnlException: target is null for setProperty(null, "1", [Ljava.lang.String;@4223d2a4)
        at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2309)
        at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
        at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
        at ognl.SimpleNode.setValue(SimpleNode.java:301)
        at ognl.ASTChain.setValueBody(ASTChain.java:227)
        at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
        at ognl.SimpleNode.setValue(SimpleNode.java:301)
        at ognl.Ognl.setValue(Ognl.java:737)
        ...

如果我定义一个公共成员变量String[] cdata = new String[1000]我在日志中没有看到任何异常,但我的setter也没有被调用。 如果成员变量是私有的,我再次得到另一个异常。

使用以下设置

List<String> cdata = new ArrayList<String>();

public List<String> getCdata() {
   return cdata;
}

public void setCdata(final List<String> cdata) {
    if (cdata == null) {
        this.cdata = new ArrayList<String>();
    } else {
        this.cdata = cdata;
    }
}

从JSP提交值,如cdata [1] = value等

唯一的要求是拥有getter / setter。 我已经测试了在Java 1.6上运行的这个Tomcat7。 您可以同样提交cdata [0],cdata [1]等值

否则你可以使用地图

private Map<String, String> data = new HashMap<String, String>();

public Map<String, String> getData() {
    return data;
}

public void setData(Map<String, String> data) {
    this.data = data;
}

JSP可以有

<s:form action="indexProperty">

    <h3>Test The Map</h3>
    <input type="text" name="data['0']"/>
    <input type="text" name="data['1']"/>

    <s:iterator value="data.entrySet()" var="aData">
        <s:property value="#aData.key" />-<s:property value="#aData.value" />
    </s:iterator>

    <input type="submit" name="submit" value="submit"/>
</s:form>

获取填充没有问题

我的解决方案(相当丑陋的黑客):

我创建了我的动作类实现ServletRequestAware并在动作中从HttpServletRequest迭代参数映射,从中获取cdata并解析它的索引和值

我必须更改发送的参数并编码例如cdata[999]=foobarcdata_999_=foobar因为如果它看起来像数组字段struts需要在动作类中有一个setter / getter。

你应该更好地阅读文档。 文档说

JavaBeans支持索引属性的概念。 具体来说,这意味着对象具有一组遵循以下模式的方法:

public PropertyType[] getPropertyName();
public void setPropertyName(PropertyType[] anArray);
public PropertyType getPropertyName(int index);
public void setPropertyName(int index, PropertyType value);

您没有实现所有这些方法。

暂无
暂无

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

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