JxBrowser概述与简单应用
Q:JxBrowser是什么?
JxBrowser是一個(gè)跨平臺(tái)的Java庫(kù),允許將基于Google Chromium的Web瀏覽器組件集成到Java Swing / AWT / JavaFX應(yīng)用程序中。使用JxBrowser,您可以將輕量級(jí)Swing / JavaFX組件嵌入到Java應(yīng)用程序中,以顯示現(xiàn)代網(wǎng)頁(yè),支持最新的Web標(biāo)準(zhǔn),如HTML5,CSS3,JavaScript等。
Q:為什么選用JxBrowser?
BS結(jié)構(gòu)的優(yōu)點(diǎn)在于,軟件維護(hù)和升級(jí)方便,只要能上網(wǎng)就能升級(jí)了且在很多地方都能夠直接使用軟件,而不需要安裝,前提要能登陸到服務(wù)器。
CS結(jié)構(gòu)缺乏通用性,具有較大的局限性,維護(hù)和管理的難度大,但是CS結(jié)構(gòu)的交互性強(qiáng),而且使用CS能與本地的硬件進(jìn)行交互(如小票打印機(jī)、銀聯(lián)pos機(jī)、錢(qián)箱等……)
雖然BS結(jié)構(gòu)有諸多優(yōu)點(diǎn),但當(dāng)遇到需要與硬件進(jìn)行交互時(shí),并不能完全滿足業(yè)務(wù)需求,故而采用了BS+CS結(jié)合的方式,希望能同時(shí)具有CS結(jié)構(gòu)的交互性與BS的靈活性,使用JxBrowser后,客戶端相當(dāng)于一個(gè)帶有谷歌瀏覽器內(nèi)核的定制瀏覽器,負(fù)責(zé)與硬件(如打印機(jī)、錢(qián)箱、POS機(jī)等)的交互,同時(shí)負(fù)責(zé)業(yè)務(wù)網(wǎng)頁(yè)的顯示,而業(yè)務(wù)的處理仍是在服務(wù)端后臺(tái)。
Q:軟件的版本迭代是怎么處理的?
客戶端的jar包采用第三方插件FxLauncher,在打包時(shí),Fxlauncher會(huì)生成一個(gè)固定格式的app.xml,app.xml文件中記錄了代碼的線上地址、每個(gè)jar包詳情等信息;在客戶端啟動(dòng)時(shí),FxLauncher會(huì)將本地的app.xml與線上的進(jìn)行比較,若文件列表中有文件發(fā)生變化,則對(duì)該文件進(jìn)行下載覆蓋。
其它的文件,如調(diào)用銀聯(lián)pos所需的dll文件等,則有自己編寫(xiě)的下載更新模塊進(jìn)行下載與安裝
Q:JxBrowser怎么使用?
JxBrowser的下載
https://jxbrowser.support.teamdev.com/support/discussions/forums/9000110576
jxbrowser的破解
(注:破解僅用于技術(shù)交流,如有需要還是購(gòu)買(mǎi)正版的好#手動(dòng)捂臉)
在jxbrowser的啟動(dòng)類中加入如下代碼:
static{try{ Class claz =null;//6.5.1版本破解 兼容xpclaz = Class.forName("com.teamdev.jxbrowser.chromium.aq");//6.21版本破解 默認(rèn)使用最新的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,newBigInteger("1")); f.set(null,newBigInteger("1")); modifersField.setAccessible(false); }catch(Exception e) { e.printStackTrace(); logger.error("執(zhí)行jxbrowser破解程序時(shí)出現(xiàn)異常"+LoggerUtil.getErrorMessage(e)); } }
在resources資源文件夾中創(chuàng)建文件夾META-INF,在META-INF文件夾下創(chuàng)建teamdev.licenses文件,將下列信息復(fù)制到文件中
Product:JxBrowserVersion:6.xLicensedto:Licensetype:EnterpriseLicenseinfo:JxBrowser LicenseExpirationdate:01-01-9999Support expirationdate:NO SUPPORTGenerationdate:01-01-1970Platforms:win32/x86;win32/x64;mac/x86;mac/x64;linux/x86;linux/x64Companyname:TeamDev Ltd.SigB:1SigA:1
OK,破解好了,到此就可以正常使用了
jxbrowser的6.5.1是最后的支持XP系統(tǒng)的版本,6.21為我下載時(shí)的最新版本,根據(jù)具體需求選擇版本,jxbrowser支持windows、mac、linux,并且都有對(duì)應(yīng)的jar包,jxbrowser.jar為核心jar包,其它的可以根據(jù)需求選擇性的引入。
通過(guò)JxBrowser實(shí)現(xiàn)js與java代碼進(jìn)行交互
JxBrowser為Browser對(duì)象提供了豐富的監(jiān)聽(tīng)器,要實(shí)現(xiàn)js與java代碼的交互,只需在監(jiān)聽(tīng)器中添加創(chuàng)建對(duì)象的代碼,window是前端中的window對(duì)象,這里是通過(guò)jxbrowser瀏覽器獲取到window對(duì)象,并對(duì)該對(duì)象擴(kuò)展了一個(gè)名為jsEntity的對(duì)象。當(dāng)然,JsEntity為自定義的一個(gè)實(shí)體類,需自行創(chuàng)建,創(chuàng)建對(duì)象是為了供前端js調(diào)用,而后端調(diào)用js,直接使用browser.executeJavaScript()即可,傳入方法名與參數(shù)
browser.addLoadListener(newLoadAdapter() {@OverridepublicvoidonFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent){super.onFinishLoadingFrame(finishLoadingEvent); JSValue window = browser.executeJavaScriptAndReturnValue("window");//給jswindows對(duì)象添加一個(gè)擴(kuò)展的屬性JsEntity jsEntity =newJsEntity(); window.asObject().setProperty("jsEntity", jsEntity);//調(diào)用前端頁(yè)面jsbrowser.executeJavaScript("alert('我是后臺(tái),我調(diào)用了js!')"); } });
這里我選擇的是加載事件的監(jiān)聽(tīng)器,加載事件的監(jiān)聽(tīng)器中有幾個(gè)方法:
@OverridepublicvoidonStartLoadingFrame(StartLoadingEvent startLoadingEvent){super.onStartLoadingFrame(startLoadingEvent); }@OverridepublicvoidonProvisionalLoadingFrame(ProvisionalLoadingEvent provisionalLoadingEvent){super.onProvisionalLoadingFrame(provisionalLoadingEvent); }@OverridepublicvoidonFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent){super.onFinishLoadingFrame(finishLoadingEvent); }@OverridepublicvoidonFailLoadingFrame(FailLoadingEvent failLoadingEvent){super.onFailLoadingFrame(failLoadingEvent); }@OverridepublicvoidonDocumentLoadedInFrame(FrameLoadEvent frameLoadEvent){super.onDocumentLoadedInFrame(frameLoadEvent); }@OverridepublicvoidonDocumentLoadedInMainFrame(LoadEvent loadEvent){super.onDocumentLoadedInMainFrame(loadEvent); }
從方法名上很容易能看出來(lái)分別是重寫(xiě)了什么事件,只需對(duì)需要的方法進(jìn)行重寫(xiě)即可。
前端js代碼:
functionjsToJava(){try{varres = jsEntity.toTest('我是js,我來(lái)調(diào)用java了'); alert(res); }catch(e){ alert(e); } }js調(diào)用java
JsEntity實(shí)體類的代碼:
publicclassJsEntity{publicStringtoTest(String str){ System.out.println(str);return"I'm ok,真的ok,thank you"; }}
在客戶端啟動(dòng)時(shí),瀏覽器加載完畢后,會(huì)彈出“我是后臺(tái),我調(diào)用了js!”,點(diǎn)擊事件發(fā)生后,后臺(tái)會(huì)輸出被js調(diào)用的信息,而同時(shí),瀏覽器會(huì)彈窗“I'm ok,真的ok,thank you”,如果要實(shí)現(xiàn)js調(diào)用硬件,只需在自定義的實(shí)體類中添加java調(diào)用硬件的代碼即可
到此結(jié)束!
歡迎工作一到八年的Java工程師朋友們加入Java高級(jí)交流群:828697593
本群提供免費(fèi)的學(xué)習(xí)指導(dǎo) 架構(gòu)資料 以及免費(fèi)的解答
不懂得問(wèn)題都可以在本群提出來(lái) 之后還會(huì)有直播平臺(tái)和講師直接交流噢
哦對(duì)了,喜歡就別忘了關(guān)注一下哦~
轉(zhuǎn)載于:https://blog.51cto.com/14080124/2325020
總結(jié)
以上是生活随笔為你收集整理的JxBrowser概述与简单应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Kubernetes在上汽集团云平台及A
- 下一篇: 极光推送小结 - iOS