JCEF-JS与JAVA代码交互(4)

实现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 中通过反射+注解的实现方式

本示例教程开源项目地址:
githubhttps://github.com/lieyanfeimao/JcefTest.git
码云https://gitee.com/edadmin/JcefTest.git

开源项目:

PowerOfLongedJcef【注:本项目在win10 64位系统上开发,不保证其他系统可以直接运行】

githubhttps://github.com/lieyanfeimao/PowerOfLongedJcef.git
码云https://gitee.com/edadmin/PowerOfLongedJcef.git

猜你喜欢

转载自blog.csdn.net/xymmwap/article/details/101198634