java javafx webview_基于JavaFX WebView 的采集开发,了解一下?
背景
最近想做一個桌面版的客戶端,能夠加載連接,獲取源碼等,主要用于快速的獲取網站的欄目,便與爬蟲該欄目下的最新信息。
相關插件介紹
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
?畫布
?媒體播放
?表單控件(除外)
?可編輯的內容
?歷史維護
?支持,,和標簽
?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));
webEngine.setCreatePopupHandler(new PopupCallback(tp));
webEngine.setJavaScriptEnabled(true);
webEngine.executeScript("location.reload(true);");
webEngine.load("加載的地址");
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 {
private WebEngine webEngine;
String html;
public HtmlChangeListener(WebEngine webEngine) {
this.webEngine = webEngine;
}
public void changed(ObservableValue extends State> observable, State oldValue, State newState) {
if (newState == State.SUCCEEDED) {
html = (String) webEngine.executeScript("document.documentElement.outerHTML");
System.out.print("succeeded");
NodeList elementBody = webEngine.getDocument().getElementsByTagName("a");
for (int i = 0; i < elementBody.getLength(); i++) {
Node aTag = elementBody.item(i);
String title = "";
if (aTag != null) {
title = aTag.getTextContent();
}
NamedNodeMap attributes = aTag.getAttributes();
String href = "";
if (attributes != null) {
Node hrefObject = attributes.getNamedItem("href");
if (hrefObject != null)
href = hrefObject.getTextContent();
}
System.out.println(title + "" + href);
}
}
}
}
如果那位想用代碼,可以添加我的公眾號索取哦
總結
以上是生活随笔為你收集整理的java javafx webview_基于JavaFX WebView 的采集开发,了解一下?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2sin30°在python中如何表示_
- 下一篇: java怎么进行浮点数运算_怎样在Jav