我们有一个基于Java的CMS,它有服务器端JS的Mozilla Rhino.目前JS代码库很小但正在增长.在为时已晚并且代码变得非常混乱之前,我想介绍一些最佳实践和编码风格.
显然,名称空间控制非常重要.但其他最佳实践如何 - 尤其是Java程序员?
为Rhino的shell开发的一些JavaScript文件使用load()来加载其他JavaScript文件.我正在尝试使用javax.script从这些Rhino JavaScript文件中嵌入一些功能.不幸的是,javax.script的JavaScript没有实现load()函数.尝试eval()包含load()的脚本时,会发生以下错误:
com.sun.script.javascript.RhinoScriptEngine:-1:in `eval': javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "load" is not defined.
Run Code Online (Sandbox Code Playgroud)
从Java程序(而不是shell)中评估JavaScript文件时,javax.script是否为load()函数提供了一个?
我想在Eclipse中调试我的js代码.如何在Eclipse中设置Mozilla rhino ...(一步一步指导.
我有一个在NetSuite平台上运行的脚本,我99%肯定使用的是Rhino JavaScript引擎.我正在尝试使用相同的脚本在本地工作,但调用JSON.stringify包装的Java数组时出现问题.在这两种环境中,数组都是类型[object JavaArray],但是当在NetSuite上正确地对Java数组进行字符串化时,我的本地Rhino上下文说:
org.mozilla.javascript.EvaluatorException:Java类"[Ljava.lang.String;" 没有名为"toJSON"的公共实例字段或方法.
起初我以为他们NativeJavaArray用一个toJSON方法扩充了类并通过自定义返回它WrapFactory,但事实并非如此,因为toJSON返回的对象上没有方法.
是否有一个选项需要调整以使Java数组与JSON方法一起使用?我应该能够通过添加toJSON到NativeJavaArray我上面提到的子类来解决它,但我希望尽可能与NetSuite的环境兼容.
我正在调查de.undercouch:citeproc-java:2.0.0我当前的 Android 应用程序。
我无法确定ScriptEngine适用于 Android 的citeproc-java.
我的 Gradle 类似于:-
ext {
compileSdkVersion = 30
minSdkVersion = 26
targetSdkVersion = 30
}
dependencies {
implementation 'io.apisense:rhino-android:1.1.1'
implementation 'de.undercouch:citeproc-java:2.0.0'
implementation 'org.citationstyles:styles:20.11'
implementation 'org.citationstyles:locales:20.11'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10"
}
Run Code Online (Sandbox Code Playgroud)
Citeproc要求javax.script.ScriptEngineManager在 Android 平台上不可用,因此我已替换io.apisense:rhino-android:1.1.1
我现在正面临这个例外......
2020-11-19 10:02:22.325 4426-4426/com.google.android.gms.location.sample.basiclocationsample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.google.android.gms.location.sample.basiclocationsample, PID: 4426
java.lang.RuntimeException: Unable to start activity ComponentInfo{----}: java.lang.IllegalArgumentException: Could not make bibliography
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) …Run Code Online (Sandbox Code Playgroud) 我正在用Java 制作一个落砂游戏.我希望用户能够使用更简单的语言为它编写自己的引擎.落砂游戏可能会占用大量CPU资源,因此我希望尽可能快地运行引擎,而无需手动编译.
我需要知道如何在运行时将rhino javascript文件编译为.class文件以供使用.
我已经寻找了一种方法但除了使用命令行手动编译之外找不到任何其他方法,我不希望用户必须这样做.
我目前正在使用一个自动化框架,它将网页拉下来进行分析,然后将其显示为一个字符串进行处理.Rhino Javascript引擎可用于帮助解析返回的网页.
似乎如果字符串(它是一个完整的网页)可以加载到DOM表示中,它将为解析和分析内容提供一个非常好的界面.
仅使用Javascript,这是一个可能和/或可行的概念吗?
编辑:
我将分解问题以澄清:说我在javascript中有一个包含html的字符串,如:
var $mywebpage = '<!DOCTYPE HTML PUB ...//snipped//... </body></html>';
将它以某种方式加载到dom对象中是否可行/现实?
有没有办法在Rhino中访问Java Maps和Lists作为JavaScript对象?
我有一个Map只包含其他地图和基元和字符串列表,我想将它传递给Rhino脚本并对其进行处理,然后将修改后的对象返回给Java - 但由于它们是java.util .Map和java.util.List对象,我不能使用标准的JavaScript关联数组语法.即:fooMap.get("keyName")将工作,但fooMap.keyName并fooMap["keyName"]不会.
我不知道是否有特定于Rhino的方法来执行此操作,或者是否有一些转换/强制转换实用程序可以提供帮助.Commons BeanUtils是不够的,因为要将Map转换为bean(可以通过关联数组语法访问),首先必须创建一个包含所有命名mutator/accessors的类.我不会在运行时知道对象的结构.
是否可以在执行的JavaScript代码中拦截Java对象的字段(和方法)访问?就像JSCocoa中的委托允许处理属性和方法访问一样.
我正在尝试"最新和最好的"LESS版本,它似乎在rhino命令行版本中不起作用.我做了以下
从命令行运行以下命令
java -jar js.jar less-rhino-1.6.3.js text.less text.css
要么
java -jar js.jar less-rhino-1.6.3.js lessc-rhino-1.6.3.js text.less text.css
结果是 - "默默地没有".当试图运行'以前的最新版本'时 - 它运行正常没有问题
java -jar js.jar less-rhino-1.5.1.js text.less text.css
输出是
Written to text.css
关于最新的less-rhino.js我缺少什么?我在http://lesscss.org或https://github.com/less/less.js中找不到相关的帮助.后来的jut说:"stackoverflow.com是一个获得Less的答案的好地方."
rhino ×10
javascript ×8
java ×4
json ×2
android ×1
arrays ×1
citeproc-js ×1
coding-style ×1
compilation ×1
dom ×1
eclipse ×1
javax.script ×1
less ×1
load ×1
mozilla ×1
runtime ×1
web-crawler ×1
web-scraping ×1