- PR -

HTMLエンコード

投稿者投稿内容
クリス
会議室デビュー日: 2002/10/05
投稿数: 6
投稿日時: 2002-10-07 18:20
じゃ、HTMLを解析するしかないんですね

皆さん、ありがとうございました。

クリス
ひろ
常連さん
会議室デビュー日: 2001/12/13
投稿数: 36
投稿日時: 2002-10-07 18:28
URLConnectionって正直に言うと使ったことなかったのですが、HttpURLConnectionクラスもabstractでしたね。URLConnectionがabstractなのは気付いてたのですが、HttpURLConnectionが実装クラスだと思い込んで、不思議だなあと思ってしまいました。
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-07 19:03
sun.net.www.protocol.http.HttpURLConnection
というクラスがどうも実装しているようです。
ソースは公開されてないのかな?
クリス
会議室デビュー日: 2002/10/05
投稿数: 6
投稿日時: 2002-10-07 19:22
★HttpURLConnectionのgetHeaderField(int)を使うと、次のようなフィールドがあります:

Server: Microsoft-IIS/5.0
Date: Mon, 07 Oct 2002 10:12:52 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 07 Oct 2002 02:04:19 GMT
ETag: "20e7dbd8a56dc21:88b"
Content-Length: 149

★同じように、HttpURLConnectionのgetHeaderField(String)を使うと、Serverというフィールドを取得できます:
getHeaderField("Server"); -> Microsoft-IIS/5.0

っていうことは、getHeaderField(String)は実装されています。(Java1.3.1で試してみた)

クリス


amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-07 23:37
個人的に興味がわいたので整理してみます。
スレッドの本題からは少しずれますが。

まず、
URL url = new URL("http://***.com");
URLConnection connection = url.openConnection();
などとして
URLのopenConnectionメソッドを呼びます。
そいつは、URLConnectionのインスタンスを返すわけですが、
実際には、URLConnectionを継承したなんらかのクラスの
インスタンスを返すわけです。(抽象クラスはインスタンス化できないため)

内部的には
public URLConnection openConnection() throws java.io.IOException {
return handler.openConnection(this);
}
上記のようにhandlerに委譲する形になっています。

handlerはURLStreamHandlerというクラスのインスタンスなのですが、
URLクラスのコンストラクタが"http"などのプロトコル名を元に
実装クラスを用意しておいてくれているわけです。
ここでどのような実装クラスが使われているかはちょっとわかりません。

で、結果的に今回の場合はそのhandlerが、
sun.net.www.protocol.http.HttpURLConnection
というクラスのインスタンスをURLConnectionとして
返すと。

この辺は随分動的にやっているようで、場合によっては
違うクラスのインスタンスが使われることもありそうです。
ひろ
常連さん
会議室デビュー日: 2001/12/13
投稿数: 36
投稿日時: 2002-10-08 01:03
私も少しURLクラスのソースを追ってみました。
amnakyさんの説明どおり、URLコンストラクタにより引数を解析し、取得したプロトコル名をもとにgetURLStreamHandler()メソッドを呼び出しています。
このgetURLStreamHandler()メソッド内では動的に"sun.net.www.protocol." + プロトコル名 + ".Handler"のような形でクラス名を生成している。その後、クラスローダーを用いて該当クラスをロードしClass.NewInstance()でインスタンス化する。
このとき一度生成したhandlerはクラス変数handlers(Hashtable)にプールしておき2度目以降は同じプロトコルであれば同じhandlerインスタンスを使いまわしているようです。

URLStreamHandlerは他にも
sun.net.www.protocol.ftp.Handler
sun.net.www.protocol.file.Handler
sun.net.www.protocol.gopher.Handler
sun.net.www.protocol.jar.Handler
sun.net.www.protocol.mailto.Handler
等たくさんあるようです。
(それぞれ対応したURLConnectionの実装クラスも持っています)

やはりsun.XXX.XXX.XXXパッケージのソースは公開されていないみたいですね。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2002-10-08 02:00
> やはりsun.XXX.XXX.XXXパッケージのソースは公開されていないみたいですね。
ソースは公開されてますよ。
SDKに入ってる .jar ではなくて、Community Source Licence から入手できます。
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-08 10:05
皆様フォローありがとうございます。
なるほどCommunity Source License、こんなのがあったんですね。

何故か過去にユーザー登録だけはしていたらしく、
すんなりダウンロードできました。

ライセンスまわりを確認するのででちょっと時間が
かかってしまいましたが、評価目的ならフィーは
かからないんですね。

スキルアップ/キャリアアップ(JOB@IT)