1. 程式人生 > >JxBrowser概述與簡單應用

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包,其它的可以根據需求選擇性的引入。

  1. 通過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呼叫硬體的程式碼即可

到此結束!