目次
1.はじめに
この記事は、JavaのHTTPネットワークプログラミングを記録し、Webブラウザプログラミングに位置付けられています。前の記事のTCP / SSL Webページのダウンロードとは異なります。次に、URLを介したWebページのダウンロードとのプログラミングを実現します。 Webサイトにアクセスするためのシンプルなブラウザ。ウェブページのダウンロードプログラムはシンプルでわかりやすく、ウェブサイトにアクセスしてインターフェースのソースコードを取得できます。シンプルなブラウザには、ウェブページへのアクセス、更新、ダウンロード、音楽の再生などの基本機能があります。他にも多くの機能があります。一般的なブラウザを模倣して試すことができます!
基本的な知識の研究は主に前の記事にあり、JavaのHTTPネットワークプログラミングを見ることができます(最初の記事:TCP / SSL Webページのダウンロード)。
2、URLカテゴリ
前回の記事では、特定のページを指すアドレスなどの複雑なアドレスに対して、TCP / SSLを介してhttpリクエストを直接送信するプログラムは、Webページをダウンロードするタスクを完了できないため、ここではJavaで提供されるURLクラスを使用します。 Webページアクセスの問題を解決するため。
URL(Uniform Resource Locator):WebページやFTPアドレスなどのリソースアドレスを表すために使用されるUniform ResourceLocator。URLの形式はprotocol:// resource addressです。プロトコルにはHTTP、HTTPS、FTP、Fileを使用できます。リソースアドレスには、https://www.baidu.comなどのポート番号とクエリパラメータを含めることができます。
Javaでは、URLクラスを使用してURLのコンテンツを処理し、openStream()メソッドをInputStream戻り値の型でカプセル化します。プログラムは、このバイト入力ストリームを読み取って、対応するコンテンツを取得できます。
URL url = new URL(address);
//获得url的字节流输入
InputStream in = url.openStream();
//装饰成字符输入流
br = new BufferedReader(new InputStreamReader(in, "utf-8"));
HTTPリクエストヘッダーを送信する方法と比較して、URLを使用してWebページのコンテンツを取得する方がはるかに簡単であり、返される結果に違いがあります。次に、特定の実装を紹介します。
3.URLに基づくWebページのダウンロード
インターフェースを図に示します。
ここでのインターフェースの実装は、前のコードと同様に投稿されたコードではなくなり、わずかに変更するだけで済みます。キーコードを以下に示します。
1.送信ボタン
送信ボタンイベントでは、URLクラスを使用して入力URLアドレスを解析し、「http」で始まる有効なURLを指定してから、InputStreamに含まれているメソッドを使用してWebコンテンツを受信します。
//网页请求按钮事件
btnSend.setOnAction(event -> {
taDisplay.clear();
String domainName=tfSend.getText().trim();
if (!domainName.substring(0,4).equals("http"))
taDisplay.appendText("URL地址输入不合规则!");
try {
URL url = new URL(domainName);
System.out.println("连接"+domainName+"成功!\n");
InputStream in=url.openStream();
br=new BufferedReader(new InputStreamReader(in,"utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
});
2.データを受信するためのマルチスレッド
送信ボタンを押すとすぐにウェブサイトとの通信がトリガーされ、相手のサーバーが複数の情報の送受信を含むウェブページのコンテンツを返すことがわかります。したがって、クライアントは、完全なコンテンツの受信をブロックしないように、Webページデータを受信するためにマルチスレッドを実装する必要があります。
readThread = new Thread(()->{
String receiveMsg=null;//从服务器接收一串字符
try {
while ((receiveMsg=br.readLine())!=null){
String msgTemp = receiveMsg;
Platform.runLater(()->{
taDisplay.appendText(msgTemp+"\n");
});
}
}catch (IOException e){
e.printStackTrace();
}
Platform.runLater(()->{
taDisplay.appendText("对话已关闭!\n");
});
});
readThread.start();
サーバー情報を受信するスレッドを起動し、受信データを処理します。この部分を送信ボタンに追加します。ボタンイベントがトリガーされると、情報を完全に受信する目的でスレッドが起動します。
4、URLウェブページダウンロードクライアント
このようにして、Webページのダウンロードが実現されます。これは、WebページのHTMLソースコードを取得するための小さなツールに相当します。
五、ウェブブラウザを書く
これまでのプログラムはすべて、Webページの閲覧効果をレンダリングせずに、Webページファイルのダウンロードのみを実現します。以下は、Webページの表示機能を実現し、最初にJavaFXのWebEngine、WebView、WebHistoryの関連コンテンツを理解してから、独自のシンプルなブラウザ。
1.WebEngineクラス
WebEngineクラスは、基本的なWebページ関数を提供します。ユーザーと直接対話することはありませんが、リンクのナビゲートやHTMLフォームの送信などのユーザー対話もサポートします。WebEngineクラスは、一度に1つのWebページを処理し、HTMLコンテンツのロードやDOMオブジェクトへのアクセスなどの基本的な機能をサポートし、JavaScript命令の実行もサポートします。
WebEngineオブジェクトを作成するには、空の構築とURLパラメーターを使用した構築の2つの構築方法があります。
空のコンストラクターを使用してインスタンス化する場合、URLはWebEngineオブジェクトのload()メソッドを介して渡すことができます。WebEngineオブジェクトインスタンスのgetLocation()メソッドは、現在ロードされているページのURLアドレスを返します。
2.WebViewクラス
WebViewクラスは、Nodeクラスの拡張です。WebEngineオブジェクトをカプセル化し、プログラムのシーンにHTMLコンテンツを追加し、特殊な効果と変換を適用するためのさまざまな属性とメソッドを提供します。WebViewオブジェクトのgetEngine()メソッドは、それに関連付けられたWebエンジンを返します。たとえば、次のように使用できます。
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
webEngine.load("https://www.baidu.com");
別のURLをロードすると、webViewは自動的に別のページをロードします。
3.WebHistoryクラス
WebHistoryクラスは、WebEngineオブジェクトに関連付けられたセッション履歴レコードを表す訪問済みページのリストを取得できます。WebEngine.getHistory()メソッドは、特定のwebEngineオブジェクトのWebHistoryインスタンスを取得できます。
WebHistory history = webEngine.getHistory();
履歴は基本的に特別なタイプのリストです。通常のリストと同様に、添え字は0から始まります。各エントリは、アクセスされたページを表し、ページ上の関連情報へのアクセスを提供します。このリストは、getEntries()メソッドを介して取得できます。
このオブジェクトのgetCurrentIndex()メソッドの戻り値は、リスト内で現在アクセスされているページのインデックス位置を示します。このオブジェクトのgo(int index)メソッドは、ページのジャンプを示します。たとえば、history.go(-1)は最後にアクセスしたページに戻ることを意味し、history.go(1)は次にアクセスしたページに進むことを意味します。この2つメソッドを使用するときは境界条件に注意してください。そうしないと、ロールバックできるページレコードがないなどの例外がスローされ、ロールバックメソッドが再度実行されると例外がスローされます。
ブラウザページのコンポーネントは上の図のようになっており、次に特定の重要な手順の実装を示します。
6つのシンプルなブラウザキーステップコード
1.ホームページの読み込みボタン
まず、メンバー変数を宣言し、Webオブジェクトを作成します。
private Button fresh=new Button("刷新");
private Button forward=new Button("前进");
private Button backward=new Button("后退");
private Button mainIndex=new Button("首页");
private Button enter=new Button("跳转");
private TextField urlSend=new TextField();
WebView webView=new WebView();
WebEngine webEngine=webView.getEngine();
JavaFxフォームは前の記事のコンテンツを再利用できます。ここでは、webViewコンポーネントをセンターに追加するだけで済みます。
borderPane.setCenter(webView);
ボタンの機能を実現するには、誤操作を防ぐためにプログラム実行ロジックに準拠する必要があることに注意してください。たとえば、「進む」ボタンと「戻る」ボタンを使用している場合、ページ読み込みリストの境界の長さ履歴アクセスレコードを正常に読み取るには、取得する必要があります。
したがって、適切なタイミングで関連するボタンを無効にすると、プログラムの正常な動作を保証できます。
forward.setDisable(true);
backward.setDisable(true);
fresh.setDisable(true);
いくつかの準備が完了したら、ボタンイベントの作成を開始します。これは比較的簡単です。
//首页
mainIndex.setOnAction(event -> {
webEngine.load("https://www.baidu.com");
fresh.setDisable(false);
});
2.更新ボタン
更新方法は大まかなもので、現在のページのURLを取得し、ページを再読み込みします。
//刷新按钮
fresh.setOnAction(event ->{
WebHistory history=webEngine.getHistory();
// 获取当前页面的URL,重新加载该页面
webEngine.load(history.getEntries().get(history.getCurrentIndex()).getUrl());
});
3.ジャンプボタン
入力領域のURLアドレスを取得し、それをwebEngineに渡してWebページをロードします。
//跳转按钮
enter.setOnAction(event -> {
String url=urlSend.getText();
if (url!=null){
webEngine.load(url);
backward.setDisable(false);
fresh.setDisable(false);
}
});
4.進む/戻るボタン
「進む」ボタンと「戻る」ボタンは、実際の状況に応じて自動的に無効または有効にできます。したがって、履歴レコードエントリの長さが判断されます。
//前进
forward.setOnAction(event -> {
WebHistory history=webEngine.getHistory();
//判断已访问页面数与当前页面下标大小,再执行前进操作
if (history.getCurrentIndex()+1<history.getEntries().size()){
history.go(1);
backward.setDisable(false);
}
else {
forward.setDisable(true);
}
});
//后退
backward.setOnAction(event -> {
WebHistory history=webEngine.getHistory();
if (history.getCurrentIndex()-1>=0){
history.go(-1);
forward.setDisable(false);
}
else {
backward.setDisable(true);
}
});
5.ステータスリスナー
webEngineのステータスリスナーを使用して、ページの読み込みステータスを監視します。ページに読み込みアクションがある限り、ページ内のコードがトリガーされます。このリスナーで進むボタンと戻るボタンの可用性を設定します。
webEngine.getLoadWorker().stateProperty().addListener((observable,oldValue,newValue) -> {
forward.setDisable(false);
backward.setDisable(false);
});
6.効果のデモンストレーション
フルデモビデオ
ウェブブラウザ
良いと思う場合は、ブックマーク、フォロー、質問がある場合は直接コメント、交換して学ぶなど、「ワンクリック、3リンク」へようこそ。
JavaでのHTTPネットワークプログラミング:
私のCSDNブログ:https://blog.csdn.net/Charzous/article/details/112254723