当前位置: 首页 > 知识库问答 >
问题:

OGNL数组和列表索引

糜淇
2023-03-14

我把这个参数发送给我的strut动作

Cdata[1]=bar

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

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也没有被调用。如果成员变量是私有的,我再次得到另一个异常。

共有3个答案

羊舌兴文
2023-03-14

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

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

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

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

可以在此处阅读有关索引属性的更多信息。

索引属性

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

public int[] getTestGrades() {
    return mTestGrades;
}

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

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

public int getTestGrades(int index) {
    return mTestGrades[index];
}

public void setTestGrades(int index, int grade) {
    mTestGrades[index] = grade;
}
舒赞
2023-03-14

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

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

我必须更改sent参数并将其编码为egcdata[999]=foobarlikecdata\u 999\uuu=foobar,因为如果它看起来像struts需要的数组字段,那么action类中就有一个setter/getter。

朱高超
2023-03-14

使用以下设置

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。我已经在Java1.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>

在没有问题的情况下填充

 类似资料:
  • 1. 前言 MyBatis 的动态 SQL 广泛应用到了OGNL 表达式,OGNL 表达式可以灵活的组装 SQL 语句,从而完成更多的功能。OGNL 易学易用,与 Java 代码几乎一致,本小节我们将系统的介绍 OGNL 表达式在 MyBatis 中的使用。 2. 定义 慕课解释:OGNL 全称 Object-Graph Navigation Language,是 Java 中的一个开源的表达式语

  • 问题内容: 我已经进行了很多编程工作,最近开始学习更多纯粹的计算机科学主题(用于工作面试)。 我知道Array和LinkedList数据结构之间的区别,但是现在我已经开始使用Java,我看到了这个ArrayList,在概念上我遇到了麻烦。 网络搜索仅真正向我展示了如何使用它们以及何时使用它们(每种优点),但是没有任何东西可以回答我的问题: 什么是ArrayList?我的假设是,它是一个维护对每个元

  • 我的目标是创建一个新的实例,其中前2个元素是原始元素,之后是最后3个元素的中间值。例如,< code>[5,2,9,1,7,4,6,3,8]变成< code>[5,2,5,2,7,4,6,4,6]。 我解决这个问题的方法是创建2个新的数组列表,其中一个是从索引2开始的3个元素之间的子数组,具有排序,最后将新子数组的索引1放入我的新数组列表中。但是,这会遇到索引越界错误。

  • 问题内容: 我有一个奇怪的情况。 我有一个2D Numpy数组,x: 我有2个索引器-一个索引为行,一个索引为列。为了索引X,我必须执行以下操作: 不仅仅是: (失败:错误,无法通过(2,)广播(20,)) 我希望能够使用广播在一行中建立索引,因为这样可以使代码保持干净和可读性…而且,我对幕后的python并不太了解,但是据我了解它,它在一行中应该更快(我将使用相当大的数组)。 测试用例: 问题答

  • OGNL 是一种图对象的导航语言,这是一个表达语言获取和设置属性的Java对象。您使用相同的表达都得到和设置Key-Value的属性。 该ognl.Ognl类包含方便评价方法的OGNL表达式。为此,您可以分两个阶段,剖析表达成一个内部表格,然后使用,内部的任何形式设置或获取价值的财产;或你可以在一个阶段,并获得或设置属性使用字符串的形式表达直接。 OGNL开始,以建立社团之间的UI组件和控制器使用

  • 9.2.1. 识别符限制条件 9.2.2. 识别符大小写敏感性 数据库、表、索引、列和别名是识别符。该节描述了在MySQL中识别符的允许的语法。 下面的表描述了每类识别符的最大长度和允许的字符。 识别符 最大长度(字节) 允许的字符 数据库 64 目录名允许的任何字符,不包括‘/’、‘\’或者‘。’ 表 64 文件名允许的任何字符,不包括‘/’、‘\’或者‘。’ 列 64 所有字符 索引 64 所