Java中使用webview内嵌vue页面

15 篇文章 1 订阅
订阅专栏
7 篇文章 0 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏

技术服务于业务,在什么情况下我们需要使用webview去内嵌vue页面呢。众所周知webview作为一个组件,可以看成是一个微型浏览器内核。那么如果在我们的程序中集成webview,那么我们的程序是不是也可以看成是一个定制版本的微型浏览器呢。如果只是纯粹的web应用也就是不需要参与过多的与本地化资源交互,我们只需要在浏览器中使用前端就可以了。虽说B/S模式已经大行其道但是毕竟还是得益于浏览器本身丰富的能力,当遇到一些特殊的需求,比如说在浏览器中调用本机程序等等,此时浏览器本身的能力已经无法满足需求的时候,我们就需要去拓展浏览器的能力。虽然现在h5已经足够强大,但是比如说使用h5在不使用第三方支持的情况下实现在线编辑word、excel等功能还是不那么容易的。当然等h6问世的时候默认集成人脸识别也说不定。

一方面可以使用浏览器开发者预留的拓展接口,比如说已经渐渐没落的IE浏览器中的ActiveX,谷歌浏览器45版本以下的npapi都可以看成是浏览器本地能力拓展的一种体现。另一方面我们可以自己整合现有资源去实现一个新“浏览器”。当然,视困难程度我们一般会使用自己最擅长的开发语言去实现。在Java中集成webview有什么好处呢,一方面拥有了使用前端脚本、页面的能力、一方面又拥有了与本地交互的能力。缺点就是一旦这样做实际上就变成了一个C/S结构的程序,就面临着更新升级部署困难等C/S共有的缺点,也只适合在一些特定的应用场景下使用。个人更偏向于使用cdn形式使用vue。话不多说,直接上代码。

LocalMain.java

package org.lbz;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.lbz.util.JavaCaller;

public class LocalMain extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        try {
            final WebView browser = new WebView();
            browser.setMinWidth(1200);

            final WebEngine webEngine = browser.getEngine();
            ScrollPane scrollPane = new ScrollPane();
            scrollPane.setContent(browser);

            webEngine.getLoadWorker().stateProperty()
                    .addListener((obs, oldValue, newValue) -> {
                        if (newValue == Worker.State.SUCCEEDED) {
                            netscape.javascript.JSObject o = (netscape.javascript.JSObject) webEngine.executeScript("window");
                            o.setMember("sout",System.out);
                            o.setMember("javaCaller", JavaCaller.instance);
                            System.out.println("SUCCEEDED Inject Java Object to browser");
                        }else{
                            if(newValue == Worker.State.READY){
                                netscape.javascript.JSObject o = (netscape.javascript.JSObject) webEngine.executeScript("window");
                            }
                        }
                    });


            webEngine.setJavaScriptEnabled(true);

            browser.getEngine().setOnAlert((WebEvent<String> wEvent) -> {
                System.out.println("Alert Event  -  Message:  " + wEvent.getData());
            });
            com.sun.javafx.webkit.WebConsoleListener.setDefaultListener(new com.sun.javafx.webkit.WebConsoleListener() {

                @Override
                public void messageAdded(WebView webView, String message, int lineNumber, String sourceId) {
                    System.out.println("Console: " + message + " [" + sourceId + ":" + lineNumber + "] ");
                }
            });

            StringBuilder sb = new StringBuilder();
            browser.setContextMenuEnabled(true);
                        webEngine.load("file:///D:\\BaiduNetdiskDownload\\JavaFormFx\\src\\main\\resources\\index2.html");
            Scene scene = new Scene(new javafx.scene.Group(),1210,800);
            scene.setRoot(scrollPane);

            primaryStage.setScene(scene);

            primaryStage.show();
            primaryStage.setTitle("java内嵌vue");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args){
        launch(args);
    }
}
 
JavaCaller.java
package org.lbz.util;

import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import java.io.File;

public class JavaCaller{
    public static JavaCaller instance = new JavaCaller();

    public void readFile(netscape.javascript.JSObject obj,netscape.javascript.JSObject callback){
        String path = this.chooseFile();
        callback.call("call",this,path);
    }

    public void readDirectory(netscape.javascript.JSObject obj,netscape.javascript.JSObject callback){
        String path = this.chooseDirectory();
        callback.call("call",this,path);
    }

    public String chooseFile(){
        int result = 0;
        File file = null;
        String path = null;
        JFileChooser fileChooser = new JFileChooser();
        FileSystemView fsv = FileSystemView.getFileSystemView();  
        

        fileChooser.setCurrentDirectory(new File("d:\\"));
        fileChooser.setDialogTitle("请选择要上传的文件...");
        fileChooser.setApproveButtonText("确定");
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        result = fileChooser.showOpenDialog(null);
        if(JFileChooser.APPROVE_OPTION == result) {
            path=fileChooser.getSelectedFile().getPath();
        }
        return path;
    }

    public String chooseDirectory(){
        int result = 0;
        File file = null;
        String path = null;
        JFileChooser fileChooser = new JFileChooser();
        FileSystemView fsv = FileSystemView.getFileSystemView();
        
        fileChooser.setCurrentDirectory(new File("d:\\"));
        fileChooser.setDialogTitle("请选择要上传的文件夹...");
        fileChooser.setApproveButtonText("确定");
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        result = fileChooser.showOpenDialog(null);
        if(JFileChooser.APPROVE_OPTION == result) {
            path=fileChooser.getSelectedFile().getPath();
        }
        return path;
    }
}

index2.html

<html>
    <head>
        <link rel="stylesheet" type="text/css" href="elementUI/element.css" />
        <meta charset="UTF-8" />
        <script type="text/javascript" src="vue.js"></script>
        <script type="text/javascript" src="elementUI/element.js"></script>
        <script type="text/javascript" src="jquery-3.4.1.min.js"></script>
        <script type="text/javascript">

            function init(){
                //能够导出网站进行测试,ability
                var DGList = Vue.extend({
                    template: '<el-form ref="form" :model="form" label-width="80px">\n' +
                        '  <el-form-item label="活动名称">\n' +
                        '    <el-input v-model="form.name"></el-input>\n' +
                        '  </el-form-item>\n' +
                        '  <el-form-item label="活动区域">\n' +
                        '    <el-select v-model="form.region" placeholder="请选择活动区域">\n' +
                        '      <el-option label="区域一" value="shanghai"></el-option>\n' +
                        '      <el-option label="区域二" value="beijing"></el-option>\n' +
                        '    </el-select>\n' +
                        '  </el-form-item>\n' +
                        '  <el-form-item label="活动时间">\n' +
                        '    <el-col :span="11">\n' +
                        '      <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>\n' +
                        '    </el-col>\n' +
                        '    <el-col class="line" :span="2">-</el-col>\n' +
                        '    <el-col :span="11">\n' +
                        '      <el-time-picker placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>\n' +
                        '    </el-col>\n' +
                        '  </el-form-item>\n' +
                        '  <el-form-item label="即时配送">\n' +
                        '    <el-switch v-model="form.delivery"></el-switch>\n' +
                        '  </el-form-item>\n' +
                        '  <el-form-item label="活动性质">\n' +
                        '    <el-checkbox-group v-model="form.type">\n' +
                        '      <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>\n' +
                        '      <el-checkbox label="地推活动" name="type"></el-checkbox>\n' +
                        '      <el-checkbox label="线下主题活动" name="type"></el-checkbox>\n' +
                        '      <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>\n' +
                        '    </el-checkbox-group>\n' +
                        '  </el-form-item>\n' +
                        '  <el-form-item label="特殊资源">\n' +
                        '    <el-radio-group v-model="form.resource">\n' +
                        '      <el-radio label="线上品牌商赞助"></el-radio>\n' +
                        '      <el-radio label="线下场地免费"></el-radio>\n' +
                        '    </el-radio-group>\n' +
                        '  </el-form-item>\n' +
                        '  <el-form-item label="活动形式">\n' +
                        '    <el-input type="textarea" v-model="form.desc"></el-input>\n' +
                        '  </el-form-item>\n' +
                        '  <el-form-item>\n' +
                        '    <el-button type="primary" @click="onSubmit">立即创建</el-button>\n' +
                        '    <el-button type="primary" @click="openFile">打开文件</el-button>\n' +
                        '    <el-button>取消</el-button>\n' +
                        '  </el-form-item>\n' +
                        '</el-form>',
                    data: function () {
                        var target = this;
                        return {
                            form: {
                                name: '',
                                region: '',
                                date1: '',
                                date2: '',
                                delivery: false,
                                type: [],
                                resource: '',
                                desc: ''
                            }
                        }
                    },
                    created: function () {

                    },
                    mounted: function () {

                    },
                    methods:{
                        openFile(){
                            javaCaller.readFile({},function (a) {
                                console.log('readfile:'+a);
                            });
                        },
                        handleClose(done) {

                        },
                        onSubmit(){

                        }
                    },
                    props: ['name']
                });

                var dl = new DGList({propsData: {name: 'dear_mr'}}).$mount();
                //这地方只能用append
                $('#app').append(dl.$el);
            }

        </script>
    </head>
    <body οnlοad="init();">
    <div id="app">

    </div>
    </body>
</html>

运行效果

 

Vue项目套壳安卓webview项目记录
jimson_zhu的博客
01-27 1274
第五步创建的assets目录其实就是指路径file:///android_asset/,后边的 dist/index.html 就是要访问的文件地址。实例化我们的StatusBar类,然后填写参数,将我们当前界面的activity和想要设置的颜色color传进去,即可大功告成。Android状态栏的设置要在版本5.0以上,所以我们的方法需要对手机SDK版本进行判断。这里我们需要编写两个初始化方法:一个是设置颜色,一个隐藏状态栏,满足不同界面的需求。在我们的MainActicity调用该方法就行,
webview控件使用(java代码和js的互相调用)
05-04
利用webview控件,实现js和java代码的相互调用
JavaFx Webview 与js(vue)交互
Deslord的博客
12-05 2195
javaFx 与 vue.js 互相调用函数方法
python pywebview + vue3 做桌面端
最新发布
妃妃不妃的小博客
07-23 467
app是flask的对象,也可以是一个具体的远程界面地址,也可以是本地的html路径,自己觉得使用哪个。使用app时还需要写一个前端调用接口的路由跳转哦,篇幅有限,请各位自行百度把!
javawebview交互
jueshihaidao的博客
09-14 1062
html代码<html> <head> <title>提交重置事件</title> <script type="text/javascript"> /* 1 提交事件 onsubmit 1.1 是form的事件 1.2 onsubmit 必须写成 return 方法名 1.3 方法必须是有返
小程序webview内嵌H5页面vue
weixin_44349278的博客
06-30 3165
小程序webview内嵌H5页面vue)准备工作测试公众号域名前端项目后端项目小程序注意事项 准备工作 第一,小程序必须为企业小程序,个人不行;第二,需要公众号,没有的可以选择注册一个测试公众号。 测试公众号 测试公众号申请地址 下图为申请成功后: 接口配置信息:需要一个后端项目域名,自定义token(在config.json配置)这里配置看后面的后端项目代码。 JS安全域名:填写前端项目域名,不要http:// 域名 NATAPP实名 前端项目 index.html引入js文件 <scr
java与js交互_Android WebView —— JavaJavaScript 交互总结
weixin_42321496的博客
02-16 268
相比于 Native App 和 Web App,Hybrid App 凭借其迭代灵活、控制自如、多端同步的优势在应用市场上越发显得优胜,主要得力于,其将变更频繁的部分产品功能使用 H5 开发并在客户端借助 WebView 控件嵌入应用当。所以,开发我们总会遇到原生 Java 代码与网页的 Js 代码之间相互调用从而产生的交互问题。Java 与 Js 彼此调用的前提是设置 WebView ...
webview更改页面字体
12-03
以下将详细讲解如何在Android使用WebView修改页面字体。 首先,了解WebView的基本用法。在Android,我们需要创建一个WebView实例,并在布局文件添加它。然后,设置WebView的相关属性,如WebSettings,以控制...
AndroidWebView加载的网页被放大的解决办法
08-31
在Android开发WebView是一个非常重要的组件,它允许我们在应用程序内嵌网页内容,提供了一种与网页交互的方式。然而,在实际使用过程,有时会遇到一个常见的问题,即WebView加载的网页在显示时会被自动放大...
解决WebView通过URL加载H5界面出现空白的问题
08-19
使用WebView加载H5界面时,需要在配置文件设置网络权限,否则无法加载网页内容。可以在AndroidManifest.xml文件添加以下代码: `<uses-permission android:name="android.permission.INTERNET" />` 二、基本...
WebView基本的js与java相互调用
02-14
简单实现了WebViewjs调用Android以及Android对js的调用
studio-v2:我正在为 JavaFX 应用程序的基于 HTML5 Vue.js 的 UI 替代品的一些设计进行原型设计
05-31
工作室 v2 使命宣言 该模块用作管理控制台,播客可以在其发布新剧集,并对已发布的剧集进行精细处理。 大改写 通过检查 github.com/bootiful-podcast 上以-v2为后缀的所有项目来阐明新架构: desktop-v2 - 用于上传和编辑剧集的 Vue.js 驱动的 Studio 环境 processor-v2 - 基于 Python 的播客音频制作 api-v2 - Studio 环境连接到的 API deployment - 这包含系统通用的基础设施,包括 RabbitMQ 和 PostgreSQL
webview网站全屏显示
06-04
"webview网站全屏显示"这个项目显然关注的是如何利用WebView实现网页的全屏显示,并确保页面能够根据手机屏幕尺寸自适应调整,同时避免在加载网页时跳转到系统浏览器。 1. **WebView基本使用**: - WebView是...
Android javawebview 的交互(转)
狂徒技术分享
07-19 155
WebView初探 了解到WebView的强大,。听说WebViewJavascript的支持也很强,想从网上找些例子,还很难找,最终从google老家找了一个JavaJavascript互调的例子 ,当时看了,下巴“咣当”就掉在地上了,太强了!这样也行?整个Eclipse ADT工程例子都有,这里重点分析一下代码: public class WebViewDem...
java重写webview_WebView极简用法
weixin_35974217的博客
02-26 676
关键类WebViewWebSettingsWebViewClientWebChromeClientWebView基本用法:WebView myWebView = (WebView) findViewById(R.id.webview);myWebView.loadUrl("http://www.example.com");如果加载的是网络页面需要申请网络权限:补充WebView还有两个方法,loa...
【浏览器&exe桌面应用】JavaFX WebView and WebEngine Tutorial教程
程序员石磊
05-19 1085
JavaFX WebView JavaFX WebView is a mini browser that is called as an embedded browser in JavaFX application. This browser is based on WebKit that is a open source code browser engine to support CSS, J...
java 调用webview js方法, webview js调用java方法
android 开发
07-12 718
java 调用webview js方法, webview js调用java方法首先加载一个本地的web页面,html代码如下<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=gb2312"> <script type="text/javascript">function javacalljs(){
uniapp小程序使用webview 嵌套 vue 项目
weixin_45563734的博客
07-10 863
uniapp小程序使用webview 嵌套 vue 项目
通过微信小程序webview嵌套vue2项目相互跳转
Gx754649的博客
08-15 897
首先如果你是小程序嵌套,而不是公众号嵌套的话,根本不需要按照网上的,说要配置在vue项目引入weixin-js-sdk插件,并且需要wx.config配置
uniapp的app项目使用webview内嵌的h5页面报错时改如何检测错误
05-25
在uniapp使用webview内嵌的h5页面报错时,您可以通过以下几种方式来检测错误: 1. 在uniapp的webview组件设置onError监听事件,当webview加载失败时会触发该事件,您可以在事件回调函数打印错误信息或者进行其他处理。 ```html <template> <view> <web-view :src="url" @error="onError"></web-view> </view> </template> <script> export default { data() { return { url: 'http://example.com' } }, methods: { onError(e) { console.error('Webview Error:', e) } } } </script> ``` 2. 在h5页面使用window.onerror全局错误监听事件,当h5页面发生错误时会触发该事件,您可以在事件回调函数打印错误信息或者进行其他处理。 ```html <script> window.onerror = function(message, source, lineno, colno, error) { console.error('H5 Error:', message, source, lineno, colno, error) } </script> ``` 3. 在h5页面使用try...catch语句捕获代码块的错误,您可以在catch语句打印错误信息或者进行其他处理。 ```html <script> try { // Your code here } catch (error) { console.error('H5 Error:', error) } </script> ``` 以上几种方式可以帮助您及时发现和解决uniappwebview内嵌的h5页面的错误。
写文章

热门文章

  • ProcessMonitor实现进程文件和注册表监控 7288
  • 使用jdk工具jdb调试Java应用程序 6890
  • 浅谈windows文件拷贝 5562
  • 谷歌浏览器调试vue项目 5288
  • Java中使用webview内嵌vue页面 5152

分类专栏

  • shell 1篇
  • 自解压 1篇
  • 脚本 7篇
  • java 15篇
  • 调试 7篇
  • classloader 3篇
  • v8 2篇
  • mysql 3篇
  • 前端 3篇
  • vc 4篇
  • 共享内存 1篇
  • 线上诊断 1篇
  • 轻量级web服务 1篇
  • 反编译 1篇
  • 图片 1篇

最新评论

  • Elasticsearch painless脚本中使用java自定义类函数

    九日辰: 您有试过es8的版本吗

  • 浅谈windows文件拷贝

    esas: 赞!如果可以说明多层目录的文件路径是使用\分开就好了!

  • windows下使用jdbc读写excel文件

    yongchuanquan: 请问Excel可以用spring boot 的 Druid进行配置吗?

  • Java中使用webview内嵌vue页面

    weixin_40194570: 同样,似乎不能这么搞

  • windows下mysql 自定义函数 之http 实操

    大数据时代: 您好,按照这个方法编译成功,也生成了dll文件,但是放到mysql的插件目录下,执行Create时报错了Can't open shared library 'MySQLUdfHttpWin.dll',这个是怎么回事啊?

大家在看

  • 【成品论文】2024年华为杯研赛C题28页二等奖成品论文(后续会更新)

最新文章

  • nc/netcat使用
  • DebugView的使用
  • MySQL触发器的使用
2023年21篇
2022年21篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天水麒麟姜伯约

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家潞城玻璃钢仿铜雕塑阳江玻璃钢景观雕塑景观小品昭通玻璃钢雕塑厂家品牌浙江玻璃钢金属雕塑价格廊坊深圳玻璃钢动物雕塑襄阳玻璃钢熊猫雕塑定制宝鸡玻璃钢雕塑裂缝怎么修补个旧市玻璃钢雕塑定制景观玻璃钢雕塑定做价格宁德玻璃钢雕塑哪里有乾安玻璃钢雕塑厂家金明玻璃钢雕塑厂家江西景观玻璃钢雕塑公司南宁个性化玻璃钢雕塑设计玻璃钢毛驴雕塑宿迁设计玻璃钢雕塑黄石玻璃钢雕塑造型贴金玻璃钢脸谱雕塑制作玻璃钢雕塑产品报价河北玻璃钢仿真水果雕塑定制广东特色商场美陈研发公司贵港玻璃钢雕塑厂玻璃钢石头效果雕塑户外商场美陈销售厂家滁州设计玻璃钢雕塑成都玻璃钢花盆生产厂家商业广场玻璃钢雕塑玻璃钢章鱼哥造型雕塑定做玻璃钢花盆厂家玻璃钢雕塑新模型香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化