JavaFX 8 WebEngine: Как получить console.log() из JavaScript в System.out в Java?
Я использую JavaFX и движок javascript внутри JavaFX WebEngine для разработки приложения. Я хотел бы получить отзыв от JavaScript для целей отладки. Что происходит с выводом консоли внутри WebEngine? Есть ли способ получить к нему доступ или перенаправить на System.out в Java?
3 ответа
Следующий код перенаправляет console.log()
в JavaBridge.log()
:
import netscape.javascript.JSObject;
public class JavaBridge
{
public void log(String text)
{
System.out.println(text);
}
}
[...]
webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) ->
{
JSObject window = (JSObject) webEngine.executeScript("window");
JavaBridge bridge = new JavaBridge();
window.setMember("java", bridge);
webEngine.executeScript("console.log = function(message)\n" +
"{\n" +
" java.log(message);\n" +
"};");
});
Вы можете просто добавить прослушиватель сообщений и посмотреть, что происходит в вашем выводе. Вам не нужно вводить JS Bridge с переопределением функций, таких как console.log
за каждую загруженную страницу
WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) -> {
System.out.println(message + "[at " + lineNumber + "]");
});
Мне нравится идти в другом направлении. Мы используем log4j, поэтому я создал оболочку javascript, как показано ниже:
module.exports = {
levels:[ "ALL", "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF"],
level:"INFO",
error:function(msg){
if(this.isErrorEnabled()){
console.error(msg)
}
},
warn:function(msg){
if(this.isWarnEnabled()){
console.warn(msg)
}
},
info:function(msg){
if(this.isInfoEnabled()){
console.log("INFO: "+msg)
}
},
debug:function(msg){
if(this.isDebugEnabled()){
console.log("DEBUG: "+msg)
}
},
trace:function(msg){
if(this.isTraceEnabled()){
console.log("TRACE: "+msg)
}
},
isErrorEnabled:function(){
return this.isEnabled("ERROR");
},
isWarnEnabled:function(){
return this.isEnabled("WARN");
},
isInfoEnabled:function(){
return this.isEnabled("INFO");
},
isDebugEnabled:function(){
return this.isEnabled("DEBUG");
},
isTraceEnabled:function(){
return this.isEnabled("TRACE");
},
isEnabled:function(statementLevel){
return this.levels.indexOf(this.level)<=this.levels.indexOf(statementLevel);
}
}
Затем в начале javascript я проверяю наличие журнала и устанавливаю его:
if(window.log == undefined){
window.log = require("./utils/log4j-wrapper")
window.log.level = "INFO"
}
И таким образом, если вы установите Log4j Logger непосредственно на движке, прежде чем вы даже загрузите URL-адрес, как:
WebEngine webEngine = webView.getEngine()
JSObject win = (JSObject) webEngine.executeScript("window")
win.setMember("log", log) //log being the java log4j logger
Таким образом, я могу войти в систему, если открываю прямо в браузере или он запускается из WebView в программе JavaFX. И имеет дополнительное преимущество наличия уровней для входа в JavaScript, которые соответствуют вашим пакетам контроллера WebView. Просто альтернатива для больших представлений JavaScript.