我如何使用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对象,而不是像上面那样动态创建它。
答案 0 :(得分:3)
通常,您可以调用Context.javaToJS
将Java对象转换为Javascript中最接近的表示形式。但是,对于String
个对象,该函数返回字符串本身而不需要包装它。因此,如果您总是返回一个字符串,则无需执行任何特殊操作。
答案 1 :(得分:2)
两者都可以,但先尝试或浏览rhino教程 https://developer.mozilla.org/en/Rhino_documentation
答案 2 :(得分:1)
关闭基元的包装,然后表达式中返回的值将是一个JS字符串:
Context cx = Context.enter();
cx.getWrapFactory().setJavaPrimitiveWrap(false);
答案 3 :(得分:0)
虽然在大多数情况下返回的Java String类型可以像JS代码中的JS String类型一样使用,但它没有相同的方法!
特别是我发现它不能用于传递给' stringify()'的JS对象。因为它没有toJSON()方法。
我找到的唯一解决方案是明确添加""在JS中,将Java String转换为JS String。我发现没有办法编写java方法直接返回一个好的JS字符串...(因为Context.javaToJS()没有转换Java字符串) 例如:
action="{{ route('login') }}" # form Submit action
答案 4 :(得分:0)
对我来说,这是犀牛的臭虫。 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(“”,“”)就是错误的