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.2. Đọc file từ Web server
Trong ví dụ tiếp theo, chúng tôi giới thiệu một ứng dụng mạng (ví dụ 7.4.2) sử dụng giao diện người dùng Swing GUI với JEditorPane (gói javax.swing) để hiển thị nội dung của một file được lưu trên web server. Người sử dụng nhập vào khung JTextField một URL và chương trình hiển thị tài liệu tương ứng (nếu có) trong JEditorPane. Lớp JEditorPane có thể hiển thị đổng thời cả dạng văn bản thông thường và văn bản định dạng HTML, (xem screen shot biểu số 24.4) vì vậy ứng dụng có thể coi như là một trình duyệt web đơn giản. Chúng ta cũng sẽ tập trung vào làm thế nào để xử lý HyperlinkEvents khi mà người dùng click vào một liên kết trong văn bản HTML. Kỹ thuật được sử dụng trong ví dụ dưới đây cũng có thể sử dụng trong applet tuy nhiên, một applet chỉ được phép đọc những file đã download
về máy.
Ví dụ 7.4.2. Tạo kết nối để đọc file thông qua URL
1
2
3
4
5
6
7
8
// ReadServerFile.java // Sử dụng JEditorPane hiển thị nội dung file trên webserver
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JEditorPane;
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
public class ReadServerFile extends JFrame
{
private JTextField enterField; // JTextField cho phép
nhập URL
private JEditorPane contentsArea; // cho phép hiển thị
website
// cài đặt GUI
public ReadServerFile()
{
super ("Trình duyệt Web đơn giản");
// tạo enterField và đăng kí listener
enterField = new JTextField("Nhập vào URL");
enterField.addActionListener(
new ActionListener()
{ // đọc tài liệu từ URL
@Override
public void actionPerformed(ActionEvent
event)
{
getThePage(event.getActionCommand());
} // kết thúc phương thức actionPerformed
} // kết thúc lớp trong lớp
); // kết thúc lời gọi addActionListener
add(enterField, BorderLayout.NORTH);
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5
4
contentsArea = new JEditorPane(); // tạo
contentsArea
contentsArea.setEditable(false);
contentsArea.addHyperlinkListener(
new HyperlinkListener()
{ // nếu người dùng click vào liên kết --> điều
hướng tới trang đó
@Override
public void hyperlinkUpdate(HyperlinkEvent
event)
{
if(event.getEventType() ==
HyperlinkEvent.EventType.ACTIVATED)
getThePage(event.getURL().toString());
} // kết thúc phương thức hyperlinkUpdate
} // kết thúc lớp trong lớp
); // kết thúc lời gọi addHyperlinkListener
add(new JScrollPane(contentsArea),
BorderLayout.CENTER);
setSize(400, 300); // đặt size cho cửa sổ hiển thị
setVisible(true); // hiển thị cửa sổ
} // kết thúc hàm khởi tạo ReadServerFile
// tải tài liệu
private void getThePage(String location)
{
try
{ // tải tài liệu và hiển thị location
contentsArea.setPage(location); // đặt page
contentsArea.setText(location); // đặt text
} // kết thúc try
catch(IOException ioException)
{
6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5
7
5
8
5
9
6
0
6
1
6
2
6
3
6
4
JOptionPane.showMessageDialog(this,
"Lỗi load trang", "Bad URL",
JOptionPane.ERROR_MESSAGE);
} // kết thúc catch
} // kết thúc phương thức getThePage
} // kết thúc lớp ReadServerFile
6
5
6
6
6
7
6
8
6
9
7
0
7
1
7
2
7
3
7
4
7
5
Ví dụ: ReadServerFileTest.java
1
2
3
4
5
6
7
8
9
1
0
1
// ReadServerFileTest.java // Khởi tạo và chạy ReadServerFile.
import javax.swing.JFrame;
public class ReadServerFileTest {
public static void main(String args[]) {
ReadServerFile application = new ReadServerFile();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLO
1
1
2
SE);
} // kết thúc hàm main } // kết thúc lớp ReadServerFileTest Kết quả:
Lớp ReadServerFile bao gồm enterField dạng JTextField cho phép người dùng nhập URL trỏ tới file cần đọc và contentsArea dạng JEditorPane hiển thị nội dung file. Khi người dùng nhấn Enter sau khi nhập URL, ứng dụng gọi phương thức actionPerformed (các dòng từ 31 đến 34). Dòng 33 sử dụng ActionEvent phương thức getActionCommand để nhận chuỗi mà người dùng đã nhập vào JTextField và truyền vào phương thức getThePage (các dòng từ 61 đến 74).
Dòng 65 gọi JEditorPane phương thức setPage để download tài liệu được xác định bởi “location” và hiển thị trong JEditorPane. Nếu có lỗi xảy ra trong quá trình load tài liệu, setPage báo ngoại lệ IOException. Cũng tương tự như vậy, nếu người dùng nhập vào một URL không hợp lệ, lỗi MalformedURLException (lớp con của
IOException) xảy ra. Ngược lại, nếu load thành công, dòng 66 hiển thị vị trí hiện tại trong enterField.
Thực tế, trong một tài liệu HTML chứa nhiều yếu tố “liên kết” tới một tài liệu khác trên Internet như text, hình ảnh hay các yếu tố giao diện khác. Trong trường hợp người dùng click vào một trong những yếu tố này, JEditorPane tạo ra một HyperlinkEvent (gói javax.swing.event) và báo cho tất cả HyperlinkListerners (gói javax.swing.event) đã được đăng kí của sự kiện đó. Trong ví dụ này, một HyperlinkListener đã được khai báo để xử lý những sự kiện này ở các dòng từ 42 đến 53. Khi một HyperlinkEvent xảy ra, chương trình gọi tới phương thức hyperlinkUpdate (các dòng từ 56 đến 51). Hai dòng 48, 49 sử dụng HyperlinkEvent phương thức getEventType để xác định loại của HyperlinkEvent. Lớp HyperlinkEvent có chứa một lớp con public được gọi là EventType khai báo 3 đối tượng EventType tĩnh đại diện cho 3 loại sự kiện liên kết. Bao gồm:
“ACTIVATED” - người dùng đã click một liên kết yêu cầu chuyển hướng,
“ENTERED” – người dùng đang chỉ chuột vào một liên kết, và “EXITED” – người dùng đã di chuyển chuột ra khỏi liên kết. Nếu một liên kết được ACTIVATED, dòng 50 sử dung HyperlinkEvent phương thức getURL để lấy URL được đại diện bởi liên kết đó. Phương thức toString cũng đã được sử dụng chuyển dạng của URL
về String sau đó được truyền vào phương thức getThePage.
Chú ý: Các HyperlinkEvent chỉ làm việc khi JEditorPane đặt setEditable(false). (dòng 41)