JxBrowser概述與簡單應用


Q:JxBrowser是什么?
  • JxBrowser是一個跨平台的Java庫,允許將基於Google Chromium的Web瀏覽器組件集成到Java Swing / AWT / JavaFX應用程序中。使用JxBrowser,您可以將輕量級Swing / JavaFX組件嵌入到Java應用程序中,以顯示現代網頁,支持最新的Web標准,如HTML5,CSS3,JavaScript等。
Q:為什么選用JxBrowser?
  • BS結構的優點在於,軟件維護和升級方便,只要能上網就能升級了且在很多地方都能夠直接使用軟件,而不需要安裝,前提要能登陸到服務器。
  • CS結構缺乏通用性,具有較大的局限性,維護和管理的難度大,但是CS結構的交互性強,而且使用CS能與本地的硬件進行交互(如小票打印機、銀聯pos機、錢箱等……)
  • 雖然BS結構有諸多優點,但當遇到需要與硬件進行交互時,並不能完全滿足業務需求,故而采用了BS+CS結合的方式,希望能同時具有CS結構的交互性與BS的靈活性,使用JxBrowser后,客戶端相當於一個帶有谷歌瀏覽器內核的定制瀏覽器,負責與硬件(如打印機、錢箱、POS機等)的交互,同時負責業務網頁的顯示,而業務的處理仍是在服務端后台。
Q:軟件的版本迭代是怎么處理的?
  • 客戶端的jar包采用第三方插件FxLauncher,在打包時,Fxlauncher會生成一個固定格式的app.xml,app.xml文件中記錄了代碼的線上地址、每個jar包詳情等信息;在客戶端啟動時,FxLauncher會將本地的app.xml與線上的進行比較,若文件列表中有文件發生變化,則對該文件進行下載覆蓋。
  • 其它的文件,如調用銀聯pos所需的dll文件等,則有自己編寫的下載更新模塊進行下載與安裝
Q:JxBrowser怎么使用?
  1. JxBrowser的下載
    https://jxbrowser.support.teamdev.com/support/discussions/forums/9000110576
  2. jxbrowser的破解
    (注:破解僅用於技術交流,如有需要還是購買正版的好#手動捂臉)
    在jxbrowser的啟動類中加入如下代碼:
    static {
        try {
            Class claz = null;
            //6.5.1版本破解 兼容xp
            claz =  Class.forName("com.teamdev.jxbrowser.chromium.aq");
            //6.21版本破解 默認使用最新的6.21版本
            // claz =  Class.forName("com.teamdev.jxbrowser.chromium.ba");

            Field e = claz.getDeclaredField("e");
            Field f = claz.getDeclaredField("f");


            e.setAccessible(true);
            f.setAccessible(true);
            Field modifersField = Field.class.getDeclaredField("modifiers");
            modifersField.setAccessible(true);
            modifersField.setInt(e, e.getModifiers() & ~Modifier.FINAL);
            modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
            e.set(null, new BigInteger("1"));
            f.set(null, new BigInteger("1"));
            modifersField.setAccessible(false);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("執行jxbrowser破解程序時出現異常"+LoggerUtil.getErrorMessage(e));
        }
    }

在resources資源文件夾中創建文件夾META-INF,在META-INF文件夾下創建teamdev.licenses文件,將下列信息復制到文件中

Product: JxBrowser
Version: 6.x
Licensed to:
License type: Enterprise
License info: JxBrowser License
Expiration date: 01-01-9999
Support expiration date: NO SUPPORT
Generation date: 01-01-1970
Platforms: win32/x86;win32/x64;mac/x86;mac/x64;linux/x86;linux/x64
Company name: TeamDev Ltd.
SigB: 1
SigA: 1

OK,破解好了,到此就可以正常使用了

jxbrowser的6.5.1是最后的支持XP系統的版本,6.21為我下載時的最新版本,根據具體需求選擇版本,jxbrowser支持windows、mac、linux,並且都有對應的jar包,jxbrowser.jar為核心jar包,其它的可以根據需求選擇性的引入。
3. 通過JxBrowser實現js與java代碼進行交互
JxBrowser為Browser對象提供了豐富的監聽器,要實現js與java代碼的交互,只需在監聽器中添加創建對象的代碼,window是前端中的window對象,這里是通過jxbrowser瀏覽器獲取到window對象,並對該對象擴展了一個名為jsEntity的對象。當然,JsEntity為自定義的一個實體類,需自行創建,創建對象是為了供前端js調用,而后端調用js,直接使用browser.executeJavaScript()即可,傳入方法名與參數

         browser.addLoadListener(new LoadAdapter() {
            @Override
            public void onFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent) {
                super.onFinishLoadingFrame(finishLoadingEvent);
                JSValue window = browser.executeJavaScriptAndReturnValue("window");
                //給jswindows對象添加一個擴展的屬性
                JsEntity jsEntity = new JsEntity();
                window.asObject().setProperty("jsEntity", jsEntity);
                //調用前端頁面js
                browser.executeJavaScript("alert('我是后台,我調用了js!')");
            }
        });

這里我選擇的是加載事件的監聽器,加載事件的監聽器中有幾個方法:

            @Override
            public void onStartLoadingFrame(StartLoadingEvent startLoadingEvent) {
                super.onStartLoadingFrame(startLoadingEvent);
            }

            @Override
            public void onProvisionalLoadingFrame(ProvisionalLoadingEvent provisionalLoadingEvent) {
                super.onProvisionalLoadingFrame(provisionalLoadingEvent);
            }

            @Override
            public void onFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent) {
                super.onFinishLoadingFrame(finishLoadingEvent);
            }

            @Override
            public void onFailLoadingFrame(FailLoadingEvent failLoadingEvent) {
                super.onFailLoadingFrame(failLoadingEvent);
            }

            @Override
            public void onDocumentLoadedInFrame(FrameLoadEvent frameLoadEvent) {
                super.onDocumentLoadedInFrame(frameLoadEvent);
            }

            @Override
            public void onDocumentLoadedInMainFrame(LoadEvent loadEvent) {
                super.onDocumentLoadedInMainFrame(loadEvent);
            }

從方法名上很容易能看出來分別是重寫了什么事件,只需對需要的方法進行重寫即可。
前端js代碼:

<script>
     function jsToJava(){
 	try{
 	    var res = jsEntity.toTest('我是js,我來調用java了');
 	    alert(res);
        }catch(e){
 	    alert(e);
        }
     }
</script>
<body onclick="jsToJava()">
js調用java
</body>

JsEntity實體類的代碼:

public class JsEntity {

    public String toTest(String str){
        System.out.println(str);
        return "I'm ok,真的ok,thank you";
    }
}

在客戶端啟動時,瀏覽器加載完畢后,會彈出“我是后台,我調用了js!”,點擊事件發生后,后台會輸出被js調用的信息,而同時,瀏覽器會彈窗“I'm ok,真的ok,thank you”,如果要實現js調用硬件,只需在自定義的實體類中添加java調用硬件的代碼即可

到此結束!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM