JavaScriptEngine
https://mvnrepository.com/artifact/org.openjdk.nashorn/nashorn-core
https://github.com/ajaxorg/ace
data class EvalDTO(var script: String) |
data class Keyword( | |
val name: String, | |
val value: String, | |
val caption: String, | |
val meta: String = "variable", | |
val type: String = "variable", | |
val docTooltip: String = "Inner Variable", | |
) |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Script</title> | |
<style> | |
.content { | |
margin: 2em 4em 0 4em; | |
height: 100%; | |
} | |
#editor { | |
min-width: 50em; | |
min-height: 40em; | |
border: chocolate 1px solid; | |
} | |
.error { | |
color: orangered; | |
display: none; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="content"> | |
<div id="editor"></div> | |
<p>Result: <span id="result"></span></p> | |
<p class="error"></p> | |
<button id="eval">SUBMIT</button> | |
</div> | |
<script src="/static/jquery.3.7.1.js"></script> | |
<script src="/static/ace/src/ace.js"></script> | |
<script src="/static/ace/src/ext-language_tools.js"></script> | |
<script> | |
const editor = ace.edit('editor') | |
function init() { | |
editor.session.setMode('ace/mode/javascript') | |
editor.setOptions({ | |
enableBasicAutocompletion: true, | |
enableSnippets: true, | |
enableLiveAutocompletion: true, | |
}) | |
editor.setTheme('ace/theme/github') | |
} | |
function initExtLanguage() { | |
$.get('/script/keywordList', function (data) { | |
addExtKeyWord(data) | |
}) | |
} | |
function addExtKeyWord(keyWorldList) { | |
const languageTools = ace.require("ace/ext/language_tools"); | |
languageTools.addCompleter({ | |
getCompletions: function (editor, session, pos, prefix, callback) { | |
callback(null, keyWorldList); | |
} | |
}); | |
} | |
function evalScript() { | |
const script = editor.getValue() | |
const error = $('.error') | |
$.ajax('/script/eval', { | |
type: 'POST', | |
data: JSON.stringify({'script': script}), | |
contentType: 'application/json;charset=utf-8', | |
success: function (data) { | |
$('#result').text(data) | |
error.hide() | |
}, | |
error: function (data) { | |
error.text(data.responseJSON.message) | |
error.show() | |
} | |
}) | |
} | |
$(document).ready(function () { | |
init() | |
initExtLanguage() | |
// | |
$('#eval').click(function () { | |
evalScript() | |
}) | |
}) | |
</script> | |
</body> | |
</html> |
import org.slf4j.LoggerFactory | |
import org.springframework.stereotype.Controller | |
import org.springframework.web.bind.annotation.* | |
import javax.script.ScriptEngine | |
import javax.script.ScriptEngineManager | |
import javax.script.SimpleBindings | |
/** | |
* @author lpe234 | |
* @since 2024/6/21 13:51 | |
*/ | |
@Controller | |
@RequestMapping("script") | |
class ScriptController { | |
private val logger = LoggerFactory.getLogger(ScriptController::class.java) | |
private lateinit var engine: ScriptEngine | |
private val PARAMS = mapOf(Pair("a", 10), Pair("b", 20)); | |
init { | |
val manager = ScriptEngineManager() | |
engine = manager.getEngineByName("nashorn") | |
} | |
@GetMapping | |
fun index(): String { | |
return "script" | |
} | |
@ResponseBody | |
@GetMapping("keywordList") | |
fun keywords(): List<Keyword> { | |
val wordList = PARAMS.keys.map { | |
Keyword(it, it, it) | |
}.toMutableList() | |
// | |
wordList.add(Keyword("logger", "logger", "logger", "object", "object")) | |
// | |
return wordList | |
} | |
@ResponseBody | |
@PostMapping("eval") | |
fun eval(@RequestBody dto: EvalDTO): Any { | |
val bindings = SimpleBindings() | |
bindings["logger"] = logger | |
// | |
PARAMS.entries.forEach { | |
bindings[it.key] = it.value | |
} | |
// | |
return engine.eval(dto.script, bindings) | |
} | |
} |