首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OGNL数组和列表索引

OGNL数组和列表索引
EN

Stack Overflow用户
提问于 2013-04-29 13:46:56
回答 3查看 3.7K关注 0票数 5

我将这个参数发送给我的struts操作

cdata1=bar

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

代码语言:javascript
复制
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
}

这是我得到的例外:

代码语言:javascript
复制
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也没有被调用。如果成员变量是私有的,我将再次获得另一个异常。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-30 11:35:52

使用以下设置

代码语言:javascript
复制
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的值,如cdata1=value等

唯一的要求是拥有getter/setter。我已经测试了运行在Java1.6上的这个Tomcat7。您也可以提交cdata、cdata1之类的值。

或者你可以用地图

代码语言:javascript
复制
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可以

代码语言:javascript
复制
<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>

在没有问题的情况下被填充。

票数 2
EN

Stack Overflow用户

发布于 2013-04-30 16:33:18

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

我让我的action类实现了ServletRequestAware,在操作中从HttpServletRequest迭代参数映射,从它获取cdata并解析它以获得索引和值。

我不得不更改已发送的参数并编码(如cdata[999]=foobar类似于cdata_999_=foobar ),因为如果它看起来像数组字段,struts需要在action类中为它设置一个setter/getter。

票数 1
EN

Stack Overflow用户

发布于 2013-04-29 18:53:21

根据文档,OGNL提供了对JavaBeans:OGNL参考指南的索引属性的支持

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

代码语言:javascript
复制
public PropertyType[] getPropertyName();
public void setPropertyName(PropertyType[] anArray);
public PropertyType getPropertyName(int index);
public void setPropertyName(int index, PropertyType value);

您没有实现所有这些方法。另外,如果没有初始化数组,则无法设置值。

您可以阅读有关索引属性这里的更多信息。

索引属性 索引属性是数组,而不是单个值。在本例中,bean类提供了获取和设置整个数组的方法。下面是一个名为int[]属性testGrades的示例:

代码语言:javascript
复制
public int[] getTestGrades() {
    return mTestGrades;
}

public void setTestGrades(int[] tg) {
    mTestGrades = tg;
}

对于索引属性,bean类还提供获取和设置数组特定元素的方法。

代码语言:javascript
复制
public int getTestGrades(int index) {
    return mTestGrades[index];
}

public void setTestGrades(int index, int grade) {
    mTestGrades[index] = grade;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16280300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档