2. Lớp URL

Cách đơn giản nhất để một chương trình Java định vị và tìm kiếm dữ liệu là sử dụng một đối tượng URL. Bạn không cần phải lo lắng tới các chi tiết bên trong của giao thức đang được sử dụng, khuôn dạng dữ liệu được nhận, hay làm thế nào để truyền tin với server; bạn chỉ cần cho biết URL, Java sẽ lấy dữ liệu về cho bạn.

Lớp java.net.URL là một khái niệm về bộ định vị tài nguyên thống nhất. Nếu lưu trữ URL dưới dạng một đối tượng String sẽ  không có lợi so với việc tổ chức URL như  một đối tượng với các trường : giao thức (protocol), hosname, cổng (port), đường dẫn (path), tên tập tin (filename), mục tài liệu (document section), mỗi trường có thể  được thiết lập một cách độc lập.

2.1. Tạo các URL

Có bốn constructor, khác nhau về thông tin mà nó cần. Constructor mà bạn sử dụng phụ thuộc vào thông tin mà bạn có, và khuôn dạng trong URL  đó.  Tất cả các constructor này sẽ  đưa ra ngoại lệ MalformedURLException (URL không  đúng khuôn dạng) nếu ta tạo ra một URL cho một giao thức mà nó không được hỗ trợ.URL cung cấp các hàm cấu tử sau:

•  public URL(String url) throws MalformedURLException
Đây là constructor đơn giản nhất; tham số của nó chỉ là một URL ở dạng xâu.  
Ví dụ:

try{
URL u = new URL(“http://www.sun.com/index.html”);
} catch(MalformedURLException e) {
System.err.println(e);
}

•  public URL(String protocol, String host, String file) throws MalformedURLException Constructor này xây dựng một URL từ các xâu phân biệt xác  định giao thức, hostname, và tệp tin. Port được thiết lập bằng -1 vì vậy cổng mặc định cho giao thức sẽ được sử dụng.
Ví dụ:

try{
URL u = new URL(“http”,”/www.sun.com”,”index.html”);
}catch(MalformedURLException e){
System.err.println(e);
}

• public URL(String protocol, String host, int port, String file) throws MalformedURLException Trong một số ít trường hợp khi cổng mặc định không còn đúng, constructor này cho phép bạn xác định cổng một cách rõ ràng, là một số kiểu int. Các tham số khác giống như trên.
Ví dụ:

try{
URL u = new URL(“http”,”/www.sun.com”,80,”index.html”);
}catch(MalformedURLException e){
System.err.println(e);
}

•  public URL(URL u, String s) throws MalformedURLException
Hàm cấu tử này xây dựng một URL tuyệt đối từ URL tương đối; có thể là đây là constructor bạn sẽ sử dụng thường xuyên.
Ví dụ:

URL u1,u2;
try{
URL u1= new URL(“http://www.macfaq.com/index.html”);
URL u2 = new URL(u1,”vendor.html”);
}catch(MalformedURLException e) {
System.err.println(e);
}

Tên file được loại khỏi đường dẫn của u1, và tên file mới vendor.html được gán vào để tạo lên u2. Constructor này đặc biệt hữu ích khi bạn muốn duyệt qua một danh sách các file mà tất cả cùng nằm trong một thư mục.

2.2. Phân tích một URL thành các thành phần

Có sáu trường thông tin trong lớp URL: giao thức, port, file, mục tham chiếu tài liệu.

•  public String getProtocol()
Phương thức getProtocol() trả về một xâu ký tự biểu diễn phần giao thức của URL

•  public String getHost()
Phương thức getHost() trả về một xâu ký tự biểu diễn phần hostname của URL.

•  public int getPort()
Phương thức getPort() trả về một số nguyên kiểu int biểu diễn số hiệu cổng có trong URL.

•  public int getDefaultPort()
Phương thức getDefautlPort() trả về số hiệu cổng mặc định cho giao thức của URL

•  public String getFile()
Phương thức getFile() trả về một xâu ký tự chứa phần đường dẫn của một URL; Java không phân chia một URL thành các phần đường dẫn và phần tệp tin riêng biệt.

•  public String getRef()
Phương thức này trả về phần định danh đoạn của URL

Ví dụ: Viết chương trình nhập vào một URL từ đối dòng lệnh và hiển thị từng thành phần tạo nên URL lên màn hình.

//Chương trình lấy thông tin của URL với các thông tin nhập từ bàn phím

import java.net.*;

class getURLParts{

public static void main(String[] args)  {
try {
URL u = new URL(args[0]);
System.out.println(“URL is “+u);
System.out.println(“The protocol part is “+u.getProtocol());
System.out.println(“The host part is “+u.getHost());
System.out.println(“The file part is “+u.getFile());
System.out.println(“The reference part is “+u.getRef());
} catch(MalformedURLException e) {
System.err.println(e);
}
}
}

2.3. Tìm kiếm dữ liệu từ một URL

Nếu chỉ có URL thuần túy thì không có gì thú vị. Điều thú vị là dữ liệu nằm trong các tệp tin mà nó trỏ tới. Lớp java.net.URL có ba phương thức để tìm kiếm dữ liệu từ một URL .

•  public final InputStream openStream() throws java.io.IOException
Phương thức này kết nối tới một tài nguyên được tham chiếu bởi một URL, thực hiện cơ chế bắt tay cần thiết giữa client và server, và trả về một luồng nhập InputStream.
Ta sử dụng luồng này để đọc dữ liệu. Dữ liệu nhận từ luồng này là dữ liệu thô của một tệp tin mà URL tham chiếu (mã ASCII nếu đọc một tệp văn bản, mã HTML nếu đọc một tài liệu HTML, một  ảnh nhị phân nếu ta  đọc một file  ảnh). Nó không có các thông tin header và các thông tin có liên quan đến giao thức

•  public URLConnection openConnection() throws java.io.IOException

Phương thức opeConnection() mở một socket tới một URL xác định và trả về một đối tượng URL. Một  đối tượng URLConnection biểu diễn một liên kết mở tới một tài nguyên mạng. Nếu lời gọi phương thức thất bại nó đưa ra ngoại lệ IOException.

•  public final Object getConetent() throws java.io.IOException

Phương thức này cung cấp cách thứ ba để tải dữ liệu được tham chiếu bởi một URL. Phương thức getContent() tìm kiếm dữ liệu  được tham chiếu bởi một URL và chuyển nó thành một kiểu đối tượng nào đó. Nếu đối tượng tham chiếu tới một kiểu đối tượng văn bản nào đó như tệp tin ASCII hoặc tệp HTML, đối tượng được trả về thông thường sẽ là một kiểu luồng nhập InputStream nào đó. Nếu URL tham chiếu tới một đối tượng  ảnh như  ảnh GIF hoặc JPEG thì phương thức getContent() trả về  đối tượng java.awt.ImageProducer

Ví dụ:Viết chương trình nhập một URL từ bàn phím, kết nối với Internet và hiển thị mã nguồn của trang Web đó lên màn hình.

import java.net.*;
import java.io.*;

public class  ViewSource
{
public static void main(String[] args)   {

URL u;
String thisLine;
if(args.length>0){
try{
u =new URL(args[0]);
try{
DataInputStream  dis  =  new DataInputStream(u.openStream());

while((thisLine=dis.readLine())!=null)
System.out.println(thisLine);
}catch(IOException e) {
System.err.println(e);
}
} catch(MalformedURLException e){
System.err.println(e);
}
}
}
}

2.4. Các phương thức tiện ích

Lớp URL cung cấp hai phương thức tiện ích để thực hiện các thao tác trên URL. Phương thức sameFile() xác định xem hai URL có cùng trỏ tới một tài liệu hay không. Phương thức toExternalForm() chuyển đổi một đối tượng URL thành một xâu ký tự được sử dụng trong một liên kết HTML hoặc hộp thoại của trình duyệt.

•  public boolean sameFile(URL other)

Lập trình mạng trong JAVA(Phần 1)