JavaFX系列之WebView介绍

十点数据 1年前 ⋅ 3304 阅读

背景

最近想做一个桌面版的客户端,能够加载连接,获取源码等,用于一些网站的定制采集。

采用技术

java 1.8

相关插件介绍

JavaFX是:

•用于创建和交付桌面应用程序的软件平台,以及可以在各种设备上运行的富Internet应用程序(RIA)。
•一组图形和媒体包,使开发人员能够设计,创建,测试,调试和部署在不同平台上一致运行的富客户端应用程序。

WebView:

使用WebKit HTML技术的Web组件,可以在JavaFX应用程序中嵌入Web页面。在WebView中运行的JavaScript可以调用Java API,Java API可以调用在WebView中运行的JavaScript。
JavaFX中添加了对其他HTML5功能的支持,包括Web套接字,Web Worker和Web字体以及打印功能。

JavaFX WebView:

•JavaFX WebView  是一种迷你浏览器(也称为嵌入式浏览器),它通过JavaFX  应用程序中的API提供Web查看器和完整浏览功能  。
•此浏览器基于  WebKit,这是一个支持HTML5,JavaScript,CSS,DOM渲染和SVG图形的开源Web浏览器引擎。
•WebView类是Node类的扩展。
•嵌入式浏览器从Node类继承所有字段和方法,因此它具有其所有功能。
•它封装了WebEngine对象,将HTML内容合并到应用程序的场景中,并提供应用效果和转换的属性和方法。
•在WebView对象上调用的getEngine()方法返回与之关联的Web引擎。
•构成嵌入式浏览器的类位于javafx.scene.web包中。

•WebView 使开发人员能够在其Java应用程序中实现以下功能:

◦从本地或远程URL呈现HTML内容
◦支持历史记录并提供后退和前进导航
◦重新加载内容
◦将效果应用于Web组件
◦编辑HTML内容
◦执行JavaScript命令
◦执行从JavaScript到JavaFX的上行调用
◦处理事件

• 除了支持CSS3和ecmascript6(ES6)之外,WebView组件还支持以下HTML5功能:

◦DOM3
◦画布
◦媒体播放
◦表单控件(<input type =“color”>除外)
◦可编辑的内容
◦历史维护
◦支持<meter>,<progress>,<details>和<summary>标签
◦SVG
◦Web套接字
◦Web Worker
◦支持使用本国语言编写的域名

Web引擎:

1.是一个能够一次管理一个网页的非可视对象
2.通过其API提供基本网页功能。
3.它支持用户交互,例如导航链接和提交HTML表单,但它不直接与用户交互。
4.它加载网页,创建文档模型,根据需要应用样式,并在页面上运行JavaScript。
5.它提供对当前页面的文档模型的访问,并允许Java应用程序和页面的JavaScript代码之间的双向通信。
6.它包装了一个WebPage对象,该对象提供与本机Webkit核心的交互。

主要代码介绍:

主界面构造:
package org.lc.v1;

import org.lc.v1.component.WebBrowerPane;
import org.lc.v1.handle.AlertEventHandler;
import org.lc.v1.handle.PopupCallback;
import org.lc.v1.html.HtmlChangeListener;
import org.lc.v1.html.WebHistoryVisitListener;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebHistory;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class LCWebBrower extends Application {

public void start(Stage stage) throws Exception {
	final WebBrowerPane tp = new WebBrowerPane(stage);
	stage.setScene(new Scene(tp, 950, 600));

	final WebView webView = new WebView();
	webView.prefWidthProperty().bind(stage.getScene().widthProperty());
	webView.prefHeightProperty().bind(stage.getScene().heightProperty());

	final WebEngine webEngine = webView.getEngine();

	final WebHistory history = webEngine.getHistory();
	history.getEntries().addListener(new WebHistoryVisitListener());

	webEngine.getLoadWorker().stateProperty().addListener(new HtmlChangeListener(webEngine));
	webEngine.setOnAlert(new AlertEventHandler(tp));// 处理JavaScript警报方法
	webEngine.setCreatePopupHandler(new PopupCallback(tp));
	webEngine.setJavaScriptEnabled(true);
	webEngine.executeScript("location.reload(true);");
	webEngine.load("http://www.baidu.com/");
	final Tab tab = new Tab();
	tab.textProperty().bind(webEngine.titleProperty());
	tab.setClosable(false);
	tab.setContent(webView);
	tp.addTabPage(tab);
	stage.show();
}
public static void main(String[] args) {
	launch(args);
}
}

监听也没加载状态,获取源码、所有连接等。
package org.lc.v1.html;

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.scene.web.WebEngine;

public class HtmlChangeListener implements ChangeListener<State> {
private WebEngine webEngine;
String html;// 获取的当前加载网页的源码(js渲染以后的源码);

public HtmlChangeListener(WebEngine webEngine) {
	this.webEngine = webEngine;
}
public void changed(ObservableValue<? extends State> observable, State oldValue, State newState) {
	/***
	 * 以下是所有可能的工作线程状态:
	 * 
	 * READY;SCHEDULED; RUNNING;SUCCEEDED;CANCELLED; FAILED
	 */
	if (newState == State.SUCCEEDED) {
		// 获取网页源码
		html = (String) webEngine.executeScript("document.documentElement.outerHTML");
		System.out.print("succeeded");
		// 获取网页所有的A标签;
		NodeList elementBody = webEngine.getDocument().getElementsByTagName("a");
		for (int i = 0; i < elementBody.getLength(); i++) {
			Node aTag = elementBody.item(i);
			String title = "";// a标签内容
			if (aTag != null) {
				title = aTag.getTextContent();
			}
			NamedNodeMap attributes = aTag.getAttributes();
			String href = "";// a标签链接;
			if (attributes != null) {
				Node hrefObject = attributes.getNamedItem("href");
				if (hrefObject != null)
					href = hrefObject.getTextContent();
			}
			System.out.println(title + "	" + href);
		}
	}
}
}

如果需要完整的代码,请登录下载.

全部评论: 0

    我有话说: