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怎么使用?
- JxBrowser的下载
https://jxbrowser.support.teamdev.com/support/discussions/forums/9000110576 - 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调用硬件的代码即可
到此结束!
JxBrowser概述与简单应用的更多相关文章
- AJPFX总结正则表达式的概述和简单使用
正则表达式的概述和简单使用* A:正则表达式 * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * 作用:比如注 ...
- Linux概述及简单命令
Linux概述及简单命令 转自https://www.cnblogs.com/ayu305/p/Linux_basic.html 一.准备工作 1.环境选择:VMware\阿里云服务器 2.Linux ...
- Flume概述和简单实例
Flume概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方( ...
- java基础之Socket编程概述以及简单案例
概述: 用来实现网络互连的 不同的计算机上 运行的程序间 可以进行数据交互 也就是用来在不同的电脑间, 进行数据传输. 三大要素: IP地址: 设备(电脑,手机,ipad)在网络中的唯一标识. 组成 ...
- Spring Cloud Alibaba(12)---Gatway概述、简单示例
Gatway概述.项目搭建 前言 有关网关的概念之前这里不在概述,因为之前在写zuul网关的时候有详细陈述过,地址如下: SpringCloud(7)---网关概念.Zuul项目搭建 SpringCl ...
- JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一)概述及简单实例
上文我们讲述了如何对 HTTP请求 的响应数据进行断言,以判断响应是否符合我们的预期,敬请参阅:JMeter学习-007-JMeter 断言实例之一 - 响应断言 那么我们如何获取 HTTP请求 响应 ...
- [Lucene]-Lucene基本概述以及简单实例
一.Lucene基本介绍: 基本信息:Lucene 是 Apache 软件基金会的一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.Luc ...
- 数据结构---散列表查找(哈希表)概述和简单实现(Java)
散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...
- AJAX概述和简单使用
一.ajax概述: asynchronous javascript and xml ,用于异步的向服务器发出请求,接收数据的 一种技术. 在整个过程中:页面无刷新,不打断用户的操作: 按需要获取数据, ...
随机推荐
- Oracle笔记之约束
约束用于保证数据库中某些数据的完整性,给某一列添加一个约束可以保证不满足约束的数据是绝对不会被接受的. 约束主要有那么五种类型:非空约束.唯一约束.主键约束.外键约束.校验约束. 使用如下命令检索某个 ...
- IIS7.5 配置应用程序初始化功能
IIS进程回收后,第一次访问会超级慢,这对于用户是不能接受的,怎么解决这个问题? 我们不能设置IIS不回收进程,因为这样可能会导致IIS内存泄漏.有效的方法时,尽量在业务空闲时间回收进程,回收后立刻预 ...
- java正则: 忽略大小写匹配
import java.util.regex.Matcher; import java.util.regex.Pattern; import com.sun.org.apache.xerces.int ...
- PHP提取url
<?php $str = parse_url('http://localhost/?id=2&cd=2', PHP_URL_QUERY); ECHO $str; parse_str($s ...
- 145.Binary Tree Postorder Traversal---二叉树后序非递归遍历
题目链接 题目大意:后序遍历二叉树. 法一:普通递归,只是这里需要传入一个list来存储遍历结果.代码如下(耗时1ms): public List<Integer> postorderTr ...
- UNDO自我理解总结
[场景] 当在更新数据的时候,发现更新的值写错了,这时就需要将已经更新的地方恢复到原始数据. [基本概念] 在更新的过程中,Oracle会将原始的数据都放入到UNDO里,这样当以上情况发生后,就可以从 ...
- Educational Codeforces Round 25 D - Suitable Replacement(贪心)
题目大意:给你字符串s,和t,字符串s中的'?'可以用字符串t中的字符代替,要求使得最后得到的字符串s(可以将s中的字符位置两两交换,任意位置任意次数)中含有的子串t最多. 解题思路: 因为知道s中的 ...
- hdu 1846(巴什博弈)
Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 将dubbo框架里的服务提供者迁移进k8s里,以docker提供服务时要注意的细节
在将dubbo框架里的服务提供者迁移进k8s时,有几个注意事项: 1, 要为默认情况下,dubbo会将k8s里的pod ip地址作为注册服务的地址,所以这个地址需要被改写(ip测试过,行得通,而dns ...
- 在microsoft/dotnet:2.0.0-sdk中安装vim编辑器
在Docker中安装了dotnetcore 2.0.0 的sdk,没有发现可用的编辑器,该sdk是基于debian:stretch构建的,以前没玩过debian,因为CentOS玩的多一些所以对vim ...