实现JS与JAVA代码交互,是做应用所必须的一步。通过JS调用JAVA代码,实现一切JAVA代码能实现的东西。可查阅 org.cef.browser.CefMessageRouter类的文档。
因为是异步方式,要获取java代码的处理结果,需要在回调处理结果。我不喜欢目前这种形式的调用。如果和JAVA代码交互步骤很多,JS代码会一层套一层,很不雅观。
JAVA代码实现
public class JsTestFrame extends JFrame{
/**
*
*/
private static final long serialVersionUID = -9131822589633996915L;
public static void main(String[] args) {
String url=System.getProperty("user.dir")+"/jstest.html";
new JsTestFrame(url);
}
public JsTestFrame(String url) {
//是否Linux系统
boolean useOSR=OS.isLinux();
//是否透明
boolean isTransparent=false;
//添加Handler,在CEFAPP状态为终止时退出程序
CefApp.addAppHandler(new CefAppHandlerAdapter(null) {
@Override
public void stateHasChanged(org.cef.CefApp.CefAppState state) {
// Shutdown the app if the native CEF part is terminated
if (state == CefAppState.TERMINATED) System.exit(0);
}
});
CefSettings settings = new CefSettings();
settings.windowless_rendering_enabled = useOSR;
//获取CefApp实例
CefApp cefApp=CefApp.getInstance(settings);
//创建客户端实例
CefClient cefClient = cefApp.createClient();
//添加一个JS交互
jsActive(cefClient);
//创建浏览器实例
CefBrowser cefBrowser = cefClient.createBrowser(url, useOSR, isTransparent);
//将浏览器UI添加到窗口中
getContentPane().add(cefBrowser.getUIComponent(), BorderLayout.CENTER);
pack();
setTitle("测试JCEF-JS与JAVA代码交互");
setSize(800, 600);
setVisible(true);
//添加一个窗口关闭监听事件
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
CefApp.getInstance().dispose();
dispose();
}
});
}
/**
* 添加js交互
* @author:liuming
*/
public void jsActive(CefClient client) {
//配置一个查询路由,html页面可使用 window.java({}) 和 window.javaCancel({}) 来调用此方法
CefMessageRouterConfig cmrc=new CefMessageRouterConfig("java","javaCancel");
//创建查询路由
CefMessageRouter cmr=CefMessageRouter.create(cmrc);
cmr.addHandler(new CefMessageRouterHandler() {
@Override
public void setNativeRef(String str, long val) {
System.out.println(str+" "+val);
}
@Override
public long getNativeRef(String str) {
System.out.println(str);
return 0;
}
@Override
public void onQueryCanceled(CefBrowser browser, CefFrame frame, long query_id) {
System.out.println("取消查询:"+query_id);
}
@Override
public boolean onQuery(CefBrowser browser, CefFrame frame, long query_id, String request, boolean persistent,
CefQueryCallback callback) {
System.out.println("request:"+request+"\nquery_id:"+query_id+"\npersistent:"+persistent);
callback.success("Java后台处理了数据");
return true;
}
}, true);
client.addMessageRouter(cmr);
}
}
html实现,在工程根目录新建 jstest.html
<!DOCTYPE html>
<html>
<head>
<title>JCEF帮助文档</title>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<a href="javascript:testToJava()">测试与java代码交互</a>
</body>
<script>
function testToJava(){
window.java({
request: '发送给JAVA的数据',
persistent:false,
onSuccess: function(response) {
alert("返回的数据:"+response);
},
onFailure: function(error_code, error_message) {}
});
}
</script>
<!-- author:玄翼猫 -->
</html>
可参考JCEF官方的demo
您也可以参考 PowerOfLongedJcef 中通过反射+注解的实现方式
本示例教程开源项目地址:
github:https://github.com/lieyanfeimao/JcefTest.git
码云:https://gitee.com/edadmin/JcefTest.git
开源项目:
PowerOfLongedJcef【注:本项目在win10 64位系统上开发,不保证其他系统可以直接运行】
github:https://github.com/lieyanfeimao/PowerOfLongedJcef.git
码云:https://gitee.com/edadmin/PowerOfLongedJcef.git