Gới thiệu cơ chế ảo và trừu tượng
BÀI 8: MỘT SỐ KỸ THUẬT NÂNG CAO
1. Lập trình kết nối mạng
1.1. Thao tác với URLs
Internet cung cấp rất nhiều phương thức truyền thông trong đó, HTTP (Hyper Transfer Protocol) là căn bản của World Wide Web, sử dụng URIs (Uniform Resource Identifiers) để xác định dữ liệu trên Internet. URIs nhằm xác định vị trí của tài liệu được gọi là URLs (Uniform Resource Locators). Thông thường URLs tham chiếu tới file hoặc thư mục và cũng có thể tham chiếu tới các đối tượng thực hiện các nhiệm vụ phức tạp như tra cứu cơ sở dữ liệu hay tìm kiếm trên Internet. Với bất cứ HTTP URL công khai nào tồn tại văn bản HTML ở bất cứ đâu trên Web, chúng ta đều có thể truy cập được thông qua HTTP.
Thao tác với URLs nay trở nên dễ dàng với Java. Nếu ta sử dụng một URL tham chiếu đến vị trí chính xác của một file nguồn, (Web page chẳng hạn) như một đối số tới phương thức showDocument trong giao diện AppletContext, thì trình duyệt mà applet đang thực thi sẽ hiển thị file nguồn đó. Applet trong ví dụ 7.4.1 và 7.4.2 cho phép người dùng chọn một Web page từ JList và hiển thị trên trình duyệt. Trong ví dụ này, giao tiếp mạng được thực hiện bởi trình duyệt.
Ví dụ 7.4.1. Code HTML hiển thị applet giúp cho việc chon site
<html>
<head>
<title> Site Selector </title><meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
</head>
<body>
<applet codebase = "classes" code = "SiteSelector.class" width =
"300" height = "75">
<param name = "title0" value = "Java – Trang chủ">
<param name = "location0" value = "http://java.sun.com/">
<param name = "title1" value = "W3schools">
<param name = "location1" value = "http://www.w3schools.com/">
<param name = "title2" value = "Sổ tay PHP">
<param name = "location2" value = "http://www.php.net/">
<param name = "title3" value = "Zing mp3 | Thế giới âm nhạc">
<param name = "location3" value = "http://www.mp3.zing.vn/">
</applet>
</body>
</html>
Ví dụ 7.4.2. Thể hiện tài liệu xác định bởi URL trên trình duyệt
import java.applet.AppletContext;
import java.awt.BorderLayout;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class SiteSelector extends JApplet
{
private HashMap< Object, URL > sites; // HashMap chứa tên sites
và URLs
private ArrayList< String > siteNames; // Tên sites
private JList siteChooser; // Danh sách lựa chọn- sites hiển thị trên
trình duyệt
// read HTML parameters and set up GUI
@Override
public void init()
{ sites = new HashMap< >(); // tạo HashMap
siteNames = new ArrayList< >(); // tạo ArrayList
// nhận tham số (param) truyền vào từ tài liệu HTML
getSitesFromHTMLParameters();
// tạo GUI components and giao diện
add( new JLabel( "Click chọn site bạn muốn tới !" ),
BorderLayout.NORTH );
siteChooser = new JList( siteNames.toArray() ); // tạo JList từ
mảng tên sites
siteChooser.addListSelectionListener(
new ListSelectionListener() // lớp trong lớp (anonymous inner class)
{ // tới trang Web page đã chọn
@Override
public void valueChanged( ListSelectionEvent event )
{ // lấy tên site đã chọn
Object object = siteChooser.getSelectedValue();
// sử dụng tên site xác định URL tương ứng
URL newDocument = sites.get( object );
// chọn trình duyệt hiện tại
AppletContext browser = getAppletContext();
// thông báo trình duyệt tải trang mới
browser.showDocument( newDocument );
} // kết thúc phương thức valueChanged
} // kết thúc lớp trong lớp
); // kết thúc addListSelectionListener
add( new JScrollPane( siteChooser ), BorderLayout.CENTER );
} // kết thúc phương thức init
// hàm - nhận tham số (param) truyền vào từ tài liệu HTML
private void getSitesFromHTMLParameters()
{ String title; // tiêu đề site
String location; // vị trí của site
URL url; // URL
int counter = 0; // biến đếm
title = getParameter( "title" + counter ); // nhận tiêu đề site đầu tiên
// duyệt đến hết các param từ văn bản HTML
while ( title != null )
{ // nhận vị trí site
location = getParameter( "location" + counter );
try // thêm title và URL vào HashMap và tiêu đề vào ArrayList
{ url = new URL( location ); // chuyển đổi URL từ vị trí site
sites.put( title, url ); // thêm tiêu đề và URL vào HashMap
siteNames.add( title ); // thêm tiêu đề vào ArrayList
} // kết thúc try
catch ( MalformedURLException urlException )
{ urlException.printStackTrace();
} // kết thúc catch
counter++;
title = getParameter( "title" + counter ); // nhận tiêu đề site tiếp theo
} // kết thúc vòng while
} // kết thúc phương thức getSitesFromHTMLParameters
} // kết thúc lớp SiteSelector
Kết quả hiển thị như sau:
Applet này đã rất hay trong việc vận dụng applet parameters được truyền vào thông qua văn bản HTML. Điều này cũng giúp tùy chỉnh applet trở nên dễ dàng hơn rất nhiều thông qua tham số truyền vào. Trong trường hợp này, văn bản HTML sử dụng 8 tham số được xác định bởi tag <param> được đặt giữa cặp
<applet></applet> cho phép applet có thể đọc giá trị và sử dụng chúng để tùy chỉnh chính nó. Số lượng tham số truyền vào applet là không hạn chế. Mỗi tham số xác định 1 tên (name) và 1 giá trị (value).
Phương thức getParameter nhận name trong thẻ param như một đối số và trả lại kết quả dạng chuỗi là giá trị (value) tương ứng với tên tham số đó. Trong ví dụ này, tham số đại diện cho tiêu đề và vị trí của mỗi website mà người dùng có thể lựa chọn. Tiêu đề (title#), mỗi tiêu đề có một vị trí tương ứng (location#), trong đó # bắt đầu với 0 và tăng dần 1 đơn vị. Câu lệnh sau:
String title = getParameter( "title0" );
lấy giá trị tương ứng với tham số “title0” và gán nó vào mảng title. Nếu không
có thẻ <param> nào xác định tham số “title0”, hàm getParameter trả lại kết quả null.
Những kết quả nhận được sau đó được hiển thị dạng JList trong applet. Lớp SiteSelector sử dụng một HashMap (trong gói java.util) để lưu trữ danh sách tên website và url.
Tạo danh sách chọn
Thêm vào đó, một ArrayList các tên sites (gói java.util) được sử dụng kết hợp phương thức toArray để khởi tạo JList. Một ArrayList là một mảng tham chiếu có kích thước động. Phương thức add trong lớp ArrayList cho phép thêm một phần tử vào cuối mảng.
Các dòng 25, 26 trong phương thức init() khởi tạo một đối tượng HashMap và một ArrayList. Dòng 29 là lời gọi hàm getSiteFromHTMLParameters (được định nghĩa ở các dòng từ 60 đến 89) để nhận các tham số được truyền vào applet thông qua văn bản HTML.
Phương thức getSiteFromHTMLParameters
Để rõ hơn về phương thức getSiteFromHTMLParameters, dòng 67 sử dụng phương thức getParameter trong Applet lấy thông tin về tiêu đề website. Nếu tiêu
đề khác null, vòng lặp các dòng từ 70 đến 88 bắt đầu thực hiện. Vẫn là phương thức getParameter dòng 73 lấy thông tin về location. Dòng 77 tạo một đối tượng URL mới với giá trị location. Hàm khởi tạo URL sẽ kiểm tra liệu tham đối có phải là một URL hợp lệ. Nếu không, hàm khởi tạo gọi ngoại lệ MalformedURLException.
Chú ý rằng hàm khởi tạo URL phải được bao bởi try{}. Nếu xuất hiện MalformedURLExeption, hàm printStackTrace được gọi và cho kết quả tới Java console. Trên hệ điều hành Windows, Java console có thể xem được bằng cách click chuột phải vào biểu tượng Java trên thanh taskbar. Sau đó, chương trình tiếp tục duyệt các tiêu đề Web tiếp theo và bỏ qua các URL không hợp lệ. Do đó các tiêu đề đó không được hiển thị trong JList. (không tồn tại trong HashMap)
Trong trường hợp ngược lại, mục đích dòng 78 thêm tiêu đề Web và URL vào HashMap, và dòng 79 thêm tiêu đề vào ArrayList. Dòng 87 nhận tiêu đề tiếp theo từ văn bản HTML. Vòng lặp tiếp tục cho đến khi lời gọi hàm getParameter dòng 87 trả lại “null”.
Khi lời gọi phương thức getSiteFromHTMLParameters kết thúc, các dòng từ 32 đến 56 nhằm xây dựng giao diện GUI cho applet. Dòng 32 thêm JLabel “Click chọn site bạn muốn tới !” với thuộc tính NORTH trong BorderLayout JFrame hiển thị kết quả. Dòng 34 tạo JList siteChooser cho phép người dùng chọn một webpage để chuyển hướng. Tiếp theo các dòng từ 35 đến 54 tạo hàm xử lý sự kiện -
ListSelectionListener nhận thay đổi từ siteChooser. Dòng 56 cho phép danh sách website hiển thị trong BorderLayout với thuộc tính CENTER.
Khi người dùng lựa chọn một Website được liệt kê trong siteChooser, chương trình gọi phương thức valueChanged (các dòng từ 39 đến 52). Dòng 42 nhận tên site
đã được chọn từ JList. Dòng 45 truyền tên site đó vào phương thức get trong HashMap trả về URL tương ứng và được gán cho biến newDocument.
Dòng 48 sử dụng phương thức Applet, getAppletContext để tham chiếu tới đối tượng bao hàm applet (ở đây là trình duyệt). Dòng 51, phương thức showDocument nhận đối số là một đối tượng URL và truyền nó tới AppletContext (trình duyệt). Cuối cùng, trình duyệt hiển thị trên cửa sổ hiện tại trang web được xác định bởi URL đó. Trong ví dụ này, tất cả đều là tài liệu HTML.
Đối với những lập trình viên đã quen với HTML frame, phương thức showDocument trong AppletContext thường được sử dụng với 2 tham đối: URL và đích đến bao gồm “_blank”, “_self” và “_top”.