技术服务于业务,在什么情况下我们需要使用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 {@Overridepublic 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() {@Overridepublic 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(){//能够导出网站进行测试,abilityvar 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>

运行效果

Java中使用webview内嵌vue页面相关推荐

  1. 微信小程序webview内嵌H5页面缓存

    微信小程序webview内嵌H5页面缓存 参考链接: link. 问题描述: 公司项目已经开发了一个移动端的vue项目,以微信小程序作为一个入口,节省资源去原生开发,webview成了最好的选择.vu ...

  2. 微信小程序webview内嵌h5页面

    微信官方文档web-view | 微信开放文档 正式上线前准备(前期开发调试可以忽略) 首先登录小程序管理后台,把 web-view 直连的 h5 页面地添加到配置域名白名单中 比如我想要小程序直连地 ...

  3. 微信小程序中嵌套html_微信小程序中使用 web-view 内嵌 H5 时,登录问题的处理方法...

    在微信小程序的开发中,经常遇到需要使用 内嵌 H5 的需求.在这种需求中比较棘手的问题应该就是登录状态的判断了,小程序中的登录状态怎样与H5中的登录状态保持一致? 一般来说,后端开发同事多数会要求我们 ...

  4. [微信小程序]WebView内嵌H5实现本地文件上传

    [官方文档] 小程序与H5如何互相跳转 小程序与H5交互以上传文件为例 微信小程序开放能力web-view使用之h5页面与小程序页面交互传值 快速小程序开发之微信小程序内嵌 H5 微信小程序web-v ...

  5. 实现微信小程序web-view内嵌H5中的下载功能(大文件切片下载)

    实现微信小程序内嵌H5中的下载功能 一.项目场景: 难点 解决方案: 1.H5微信小程序: a.首先必不可少的是安装jweixin-module模块: b.在main.js中将依赖绑定: c.H5对应 ...

  6. React Native 内嵌h5页面(基于vue)的实现方案调研

    React Native 是目前流行的跨平台移动应用开发框架之一.通过采用不同的方法进行混合移动应用开发,它不会生成原生 UI 组件,而是基于 React,React Native 是一个用于构建基于 ...

  7. 苹果状态栏HTML,webview内嵌的html页面,在ios系统上12以上版本和12以下版本状态栏效果不一样...

    详细问题描述 (DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题) [内容] 重现步骤 在vue ...

  8. vue框架中使用iframe内嵌网页,并且双击实现网页全屏放大

    vue框架中使用iframe内嵌网页,并且双击实现网页全屏放大 利用Iframe插入网页 <iframe ref="iframe" src="https://www ...

  9. 微信小程序web-view内嵌公众号网页分享功能实现

    web-view嵌入网页分享,有二种分享情况 1.小程序分享出当前打开的页面            2.部分页面要求,分享指定页面,而不是当前的页面 以下是代码部分 一.web-view内嵌公众号网页 ...

最新文章

  1. 计算机所在网络最多可实际分配,网络技术应用1
  2. 一、activiti工作流(workflow)入门介绍
  3. 物理化学 化学 动力学(上)
  4. 如何在 Github 工作流文件里引用自定义实现的 action
  5. c.语言2017试卷,2017年全国计算机等级考试二级C 语言真题及答案7
  6. windows获取本地时间_如何在Windows 8中重新获得本地登录
  7. appium 如何调用 adb_带你了解可用于Android APP自动化测试的框架:Appium
  8. Go语言基础之结构体
  9. 零信任风口来了,新一代企业安全架构革新势在必行
  10. eclipse Tomcat 启动报错
  11. Java基础-API手册
  12. 打造自己的U盘工具箱
  13. admin5-用户管理
  14. c语言程序填空题库,c语言填空题题库
  15. Python中的PV操作
  16. Javaweb分页技术实现
  17. java语言如何求平方根
  18. Canal Java 入门与使用
  19. 图书管理系统模块,通过模糊查询实现查找图书的功能
  20. 关于android:打开键盘后WebView不会滚动

热门文章

  1. 【论文学习】基于贝叶斯分类的大学生关注热点事件微博文本分类方法研究——殷复莲 张晓宇 冯晴
  2. Day6 python对文件的操作——百度飞桨领航团零基础Python入门
  3. 关于 UGUI 字体花屏或乱码
  4. 【Pygame实战】趣味篮球——迎“篮”而上 ,乐在“球”中,喜欢打篮球的小可爱前来报道~
  5. 教你用面向对象编程写一个烟花爆炸的特效
  6. 面向对象编程思想 - 月亮晶石的日志 - 网易博客
  7. 股票期货数据接口常见的代码介绍
  8. 前世五百次的回眸,才赢得今世的擦肩而过
  9. iphone13 ios 16.2降级15.6刷机教程
  10. 《追风筝的人》读后感