【问题标题】:Rhino: How to return a string from Java to Javascript?Rhino:如何将字符串从 Java 返回到 Javascript?
【发布时间】:2011-05-02 07:40:24
【问题描述】:

如何使用 Rhino 将字符串从 Java 返回到 Javascript,我使用时得到的只是 org.mozilla.javascript.JavaNativeObject

var jsString = new java.lang.String("test");

在我的 js 文件中。

这是正确的做法吗?

var jsString = String(new java.lang.String("test"));

目标是有一个 Java 方法来返回 String 对象,而不是像上面那样动态创建它。

【问题讨论】:

  • 不能使用简单的字符串文字吗? var jsString = "test";?
  • 如果 var1 是 java.lang.String,简单到 javascript String 是:""+var1

标签: java javascript string rhino


【解决方案1】:

一般来说,您会调用Context.javaToJS,它将Java 对象转换为其最接近的Javascript 表示形式。但是,对于String 对象,该函数返回字符串本身而不需要包装它。所以如果你总是返回一个字符串,你不需要做任何特别的事情。

【讨论】:

  • 这并不能解决问题。对于正确的解决方案,请参阅我的答案。
【解决方案2】:

虽然在大多数情况下,返回的 Java String 类型可以像 JS 代码中的 JS String 类型一样使用,但它没有相同的方法!

特别是我发现它不能用于传递给“stringify()”的 JS 对象,因为它没有 toJSON() 方法。

我找到的唯一解决方案是在 JS 中显式添加“”,将 Java 字符串转换为 JS 字符串。我发现没有办法编写 java 方法来直接返回一个好的 JS 字符串......(因为 Context.javaToJS() 不会转换 Java 字符串) 例如:

var jstr = MyJavaObj.methodReturningAString();
JSON.stringify({ "toto":jstr});   // Fails
JSON.stringify({ "toto": ""+jstr});  // OK

【讨论】:

    【解决方案3】:

    关闭 Primitives 的包装,然后你的表达式中返回的值将是一个 JS 字符串:

    Context cx = Context.enter();
    cx.getWrapFactory().setJavaPrimitiveWrap(false);
    

    【讨论】:

      【解决方案4】:

      两者都可以,但请先尝试或阅读 rhino 教程 https://developer.mozilla.org/en/Rhino_documentation

      【讨论】:

        【解决方案5】:

        对我来说,这是一个 Rhino 错误。 JavaScript 中的 s+"" 技巧有效,但这里有一个快速补丁可以在 Java 端修复它 - 在 NativeJavaMethod.call() 中的这一行之后

        Object retval = meth.invoke(javaObject, args);
        

        添加此检查以将其转换为原生 JavaScript 字符串(即 typeof 返回“字符串”而不是“对象”)

        if (retval instanceof String) {
            return NativeJavaObject.coerceTypeImpl(String.class, retval);
        }
        

        这很重要,否则 s.replace() 调用 Java 版本是错误的,例如 "h e l l o".replace(" ", "")

        https://github.com/mozilla/rhino/issues/638

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 2019-11-28
          • 2020-05-23
          • 1970-01-01
          • 2017-11-30
          • 2012-11-16
          • 2011-04-14
          相关资源
          最近更新 更多