LỜI NÓI ĐẦU
Trong thời đại ngày nay, chúng ta luôn hướng đến những gì đơn giản, gần gũi và tiện
lợi trong mọi lĩnh vực. Công nghệ thông tin cũng không nằm ngoài mục tiêu này. Có
điều đây là lĩnh vực có tốc độ thay đổi kinh ngạc, tính từng giây từng phút. Các công
nghệ liên tục thay đổi và cũng liên tục ra đời các công nghệ mới thật phong phú, trợ
giúp hữu ích cho các nhà quản trị và người sử dụng.
Ajax có thể nói là một công nghệ khá mới, đặc biệt là ở Việt Nam nhưng nó được sử
dụng ngày càng phổ biến vì khả năng tương tác cao, làm cho các ứng web gần với ứng
dụng để bàn hơn.
Ajax (Asynchronous JavaScript + XML) được tạo ra bởi Jesss James Garrett của
Adaptive Path. Một số thành phần của Ajax đã được mô tả trước đây là Dynamic
HTML và việc kịch bản hóa từ xa. Về mặt công nghệ, Ajax đưa ra các biểu thức cho
các tiềm năng chưa thực hiện được trong các công nghệ trình duyệt web trước đây.
Google và một số tổ chức chính khác đã sử dụng Ajax để xây dựng những gì có tính
chất cộng đồng được mong đợi giống như những gì mà một ứng dụng web có thể thực
hiện. Một số lượng lớn các kỹ thuật được sắp xếp để lấp đầy những thiếu sót với sự
phong phú hơn, thông minh hơn hoặc về mặt cải tiến các client. Ajax cho phép thực
hiện điều này tốt hơn, thông minh hơn mà chỉ sử dụng các kỹ thuật đã được cài đặt
trên số lượng lớn các máy tính hiện đại.
Một đặc điểm nữa cho thấy Ajax ngày càng được ứng dụng rộng rãi là nó độc lập với
hệ điều hành (không phụ thuộc nền), xứ lý dữ liệu XML, sử dụng các JavaScript.
Tóm lại, đây là một công nghệ thể hiện tính đáp ứng nhanh cao, thích hợp cho việc xây
dựng các ứng dụng đòi hỏi tính tức thời trên môi trường web. Từ điển media trực
tuyến là một ứng dụng điển hình. Và cũng là mục tiêu chính đồ án tốt nghiệp của em.
MỤC LỤC
Phần 1: TÌM HIỂU VẤN ĐỀ
Chương 1: TỔNG QUAN .1
1. Tiền đề xuất hiện công nghệ Ajax 1
1.1. Nguyên nhân xuất hiện công nghệ Ajax .1
1.2. Công nghê web thể hệ thứ hai – Web 2.0 .4
1.3. Các thế mạnh của Ajax .9
2. Nhiệm vụ đồ án . .12
Chương 2: MÔ HÌNH MVC . .14
1. Giới thiệu mô hình MVC .14
2. View trong ứng dụng Ajax . 15
3. Controller trong ứng dụng Ajax . 17
4. Model trong ứng dụng Ajax . 19
5. Ví dụ về mô hình MVC trên nền PHP . 22
6. Mô hình MVC cho ứng dụng từ điển . . . 30
Chương 3: CÁC CÔNG NGHỆ TRONG AJAX . . 32
1. Cascading Style Sheet . .32
2. JavaScript .35
3. DOM 39
4. Đối tượng XMLHttpRequest .43
4.1. Giới thiệu 43
4.2. Phương thức, thuộc tính . 45
4.3. Sự tương tác . 46
4.4. Get và Post . 49
4.5. Gởi Request . 50
5. Streaming .53
5.1. Giới thiệu . .53
5.2. Các phương thức streaming . .54
Phần 2: THIẾT KẾ VÀ CÀI ĐẶT
Chương 4: THIẾT KẾ 56
1. Sơ đồ ứng dụng . .56
2. Cơ sở dữ liệu . .56
3. Cài đặt server .57
Chương 5: CÁC MODULE, LỚP CHÍNH CỦA ỨNG DỤNG . .60
1. Hệ thống tập tin . 60
2. Các module của ứng dụng . 60
3. Các lớp đối tượng chính trong từng module . 60
Phần 3: KẾT QUẢ, ĐÁNH GIÁ VÀ HƯỚNG PHÁT TRIỂN
1. Kết quả thử nghiệm . . .61
2. Hoạt động của ứng dụng .61
3. Kết luận . 69
4. Hướng phát triển . 70
80 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3574 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Xây dựng từ điển multimedia dùng công nghệ ajax trên nền php, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
troller = 'index';
}
/*** Get action ***/
if (empty($this->action)) {
$this->action = 'index';
}
/*** set the file path ***/
$this->file = $this->path .'/'. $this->controller . '.php';
}
?>
Controller
Thêm code sau vào controller.class.php:
<?php
Abstract Class baseController {
/* @registry object */
protected $registry;
function __construct($registry) {
$this->registry = $registry;
}
/* @all controllers must contain an index method */
abstract function index();
}
class indexController extends baseController {
public function index() {
/*** set a template variable ***/
$this->registry->template->welcome = 'Welcome to PHPRO MVC';
/*** load the index template ***/
$this->registry->template->show('index');
}
}
Class blogController Extends baseController {
public function index() {
$this->registry->template-blog_heading = 'This is the blog Index';
$this->registry->template->show('blog_index');
36
}
public function view(){
/*** should not have to call this here.... FIX ME ***/
$this->registry->template->blog_heading = 'This is the blog heading';
$this->registry->template->blog_content = 'This is the blog content';
$this->registry->template->show('blog_view');
}
}
?>
View
Phần này hiển thị template. Code sau trong file template.class.php:
<?php
Class Template {
/* @the registry
* @access private
*/
private $registry;
/* @Variables array
* @access private
*/
private $vars = array();
/* @constructor
* @access public
* @return void
*/
function __construct($registry) {
$this->registry = $registry;
}
/* @set undefined vars
* @param string $index
* @param mixed $value
* @return void
*/
public function __set($index, $value) {
$this->vars[$index] = $value;
}
function show($name) {
$path = __SITE_PATH . '/views' . '/' . $name . '.php';
37
if (file_exists($path) == false) {
throw new Exception('Template not found in '. $path);
return false;
}
// Load variables
foreach ($this->vars as $key => $value) {
$$key = $value;
}
include ($path);
}
}
?>
Template
Template bản thân nó các file HTML với một số PHP được nhúng vào. Đây là file
index.php:
blog_index.php:
blog_view.php:
38
6. MÔ HÌNH MVC CHO ỨNG DỤNG TỪ ĐIỂN
View
Controller
Model
TreeNodes,
Connnections...
Hình 2.3 – Mô hình MVC cho
các chức năng bên trong của
một cây widget
onMouseMove(){
}
onClick(){
Controller code
Model
JavaScript
Objects
View
Hình 2.4 – Mô hình MVC cho
}
ứng dụng Ajax client
39
Controller trong mô hình này là code liên kết giao diện với các đối tượng dịch vụ trong
JavaScript.
Browser
View
onMouseMove(){
}
onClick(){
}
Controller code
Model
JavaScript
Objects
Controller
PHP Controller
Server
Smarty
View Model Hình 2.5 – Ki ến trúc MVC lồng
40
CHƯƠNG 3: CÁC CÔNG NGHỆ TRONG AJAX
1. CASCADING STYLE SHEET
1.1. GIỚI THIỆU
AJAX là một tập hợp các công nghệ bổ sung lẫn nhau. JavaScript có vai trò là chất kết
dính các ứng dụng lại với nhau. Giao diện người dùng được tạo và tái nạp bằng cách
dùng JavaScript để điều khiển Document Object Model, đồng thời xử lí các tương tác
trên chuột và bàn phím.
Cascading Style Sheets (CSS) cung cấp một sự nhất quán trên cảm quan “look and
feel” cho ứng dụng và khả năng thao tác mạnh mẽ với DOM. Đối tượng
XMLHttpRequest (hay một cơ chế tương đương nào đó) được dùng để liên lạc một
cách bất đồng bộ với server, đảm bảo việc gửi yêu cầu người dùng và tái nạp dữ liệu
trong khi người dùng vẫn làm việc.
Cascading Style Sheet – tạm dịch là bảng kiểu xếp chồng - là một phần không thể
thiếu trong thiết kế Web. Nó được dùng rất nhiều trong các ứng dụng web truyền
thống cũng như trong Ajax. Một stylesheet đưa ra cách kiểm soát các loại định dạng
trực quan. Nó có thể được áp dụng cho các thành phần riêng lẻ trên các trang.
Hơn nữa, cho các thành phần định dạng trực quan như màu sắc, lề, hình nền, tính trong
suốt, kích cỡ. Stylesheet có thể xác định cách mà các phần tử được bố trí quan hệ với
các phần tử khác và tương tác với người dùng, cho phép các hiệu ứng khá mạnh mẽ.
Trong ứng dụng web truyền thống, stylesheet cung cấp một cách hiệu quả để xác định
cách thể hiện vị trí và có thể được dùng lại trong nhiều trang web khác nữa.Với AJAX,
stylesheet cung cấp một “kho chứa” các giao diện xác định trước, có thể áp dụng cho
các phần tử động với độ dài các đoạn mã nguồn là nhỏ nhất.
CSS định dạng một trang web theo ba cách:
Sử dụng trực tiếp với các thẻ HTML (Inline Style Sheet).
Định nghĩa trong một trang web (Internal Style Sheet).
Định nghĩa thành một file CSS riêng (External Style Sheet), trang web của ta sẽ
tham chiếu tới file CSS này.
41
Một quy tắc định dạng và bố trí gồm có hai phần: thành phần lựa chọn (selector) và
phần khai báo (style declaration). Selector đặc tả các phần tử được định dạng và bố trí;
style declaration khai báo các thuộc tính định dạng sẽ được áp dụng.
Giả sử muốn tạo ra dòng text level-1 heading trong tài liệu (đó là đoạn nằm trong thẻ
) có màu đỏ, ta có thể khai báo các thuộc tính CSS như sau: h1 {color :
#FF0000}
ƯU ĐIỂM CỦA CSS
CSS giúp tiết kiệm được rất nhiều thời gian và công sức cho việc thiết kế web: Style
trong phiên bản HTML 4.0 qui định cách thức thể hiện các thẻ. Style thường được lưu
trong các file nằm ngoài trang web. Chúng giúp thay đổi cách thức định dạng và cách
bố trí các trang web chỉ bằng cách thay đổi riêng file CSS.
CSS cho phép điều khiển cách định dạng và cách bố trí của cùng lúc nhiều trang web
với chỉ duy nhất một lần thay đổi tại một vị trí.
Có thể định nghĩa nhiều style vào một thẻ HTML: CSS cho phép đưa các thông tin
định nghĩa thẻ thông qua nhiều con đường khác nhau. Style có thể được qui định chỉ
trong một thẻ HTML, trong một trang web hoặc trong một file CSS bên ngoài.
Thứ tự áp dụng các định dạng: Như trên đã nói, có thể sử dụng nhiều cách khác nhau
để làm CSS. Điều gì sẽ xảy ra nếu áp dụng nhiều cách định dạng cho một thẻ HTML.
Theo một cách chung nhất ra có thể nói các style sẽ được "xếp tầng" (cascade). Việc
xếp tầng này tuân theo thứ tự ưu tiên giảm dần như sau:
Inline Style (Style được qui định trong một thẻ HTML cụ thể).
Internal Style(Style được qui định trong phần của trang HTML).
External Style (style được qui định trong file CSS ngoài).
Browser Default (thiết lập mặc định của trình duyệt).
1.2. CÚ PHÁP VÀ THUỘC TÍNH
CÚ PHÁP CƠ BẢN CỦA CSS
Cú pháp của CSS gồm ba phần: Thành phần lựa chọn (Selector), thuộc tính (Property),
giá trị (Value). Thể hiện dưới dạng code như sau:
42
Selector {
Property1: Value1;
Property2: Value2;
}
Selector có thể là các thẻ/nhóm thẻ HTML, các lớp khai báo, hay bằng định danh duy
nhất của phần tử. Khi chèn các đoạn mã CSS vào trang web, trình duyệt sẽ hiển thị
trang web theo cách CSS đã qui định cho nó, có ba cách để chèn CSS vào trang web.
Inline Style: Đây là phương pháp kém hiệu quả nhất, không nên sử dụng
phương pháp này vì làm mất các ưu điểm của CSS.
Ví dụ:
<span style=”font-family : Arial; font-size : 12px; color :
#FF0000”>
Hello Ajax
Internal Style: Trong trường hợp mỗi trang web sử dụng các định dạng khác
nhau, dùng Internal Style Sheet. Để định nghĩa Internal Style Sheet, sử dụng thẻ
đặt bên trong thẻ .
Ví dụ:
body {background-image:url(“images/button.gif”)}
External Style: Mỗi trang web sử dụng file CSS ngoài này đều phải sử dụng thẻ
. Thẻ được đặt bên trong thẻ .
Ví dụ:
THUỘC TÍNH CỦA CSS
Mỗi phần tử trong trang HTML có thể được qui định theo nhiều kiểu. Phần text của
một phần tử có thể được quy định theo các thuộc tính color, font size, độ đậm của font,
và kiểu chữ sử dụng. Có rất nhiều tùy chọn được áp dụng cho thuộc tính trên.
43
Ví dụ: Để qui định cho một paragraph
arial12 {
font-family : Arial;
font-size : 12px;
color : #FF0000;
font-weight : bold;
}
2. JAVASCRIPT
JavaScript là một ngôn ngữ lập trình đa năng, nó tương đối giống C. JavaScript được
biết dưới dạng một ngôn ngữ có kiểu tự do, thông dịch, ngôn ngữ kịch bản đa năng.
Kiểu tự do nghĩa là các biến không được khai báo cụ thể như string, integer, hay
object, các biến giống nhau có thể được gán bởi các kiểu khác nhau. Ví dụ, đoạn mã
sau là hợp lệ:
var x=3.1415926;
x='pi';
Biến x lúc đầu được định nghĩa là giá trị số và sau đó được gán lại bởi giá trị xâu kí tự.
Thông dịch nghĩa là các mã nguồn không được biên dịch thành các đoạn mã nhị phân
có thể thực thi được, mà nó được thực thi trực tiếp, cụ thể là qua các trình duyệt. Khi
triển khai một ứng dụng JavaScript, ta đặt mã nguồn trên web server, và mã nguồn này
được truyền trực tiếp qua Internet tới web browser.
Đa năng nghĩa là ngôn ngữ này thích hợp để lập trình theo hầu hết các thuật toán và
các tác vụ. JavaScript cơ bản hỗ trợ các kiểu number, string, date, time, array, các biểu
thức toán học được xử lí trong văn bản, và các hàm toán học như các hàm lượng giác,
bộ tạo số ngẫu nhiên. Hoàn toàn có thể định nghĩa cấu trúc một đối tượng bằng
JavaScript, điều này mang đến nguyên lý cơ bản cho lập trình để viết những đoạn mã
phức tạp.
Trong môi trường trình duyệt web, các chức năng cơ bản của trình duyệt gồm CSS,
DOM, và các đối tượng XMLHttpRequest, được coi là các phương tiện của JavaScript,
cho phép các nhà phát triển điều khiển các trang ở các mức độ khác nhau.
Trong các công nghệ của Ajax, JavaScript là chất kết dính các thành phần lại với nhau.
44
2.1. BIẾN
Trước khi sử dụng biến trong JavaScript, ta không nhất thiết phải khai báo biến. Có hai
cách để định nghĩa biến trong JavaScript. Một là sử dụng cú pháp var để khai báo
biến:
var tên_biến;
Ngoài ra, ta có thể chỉ việc gán cho biến một giá trị để sử dụng biến đó. Biến được
định nghĩa ngoài tất cả các hàm hoặc được sử dụng mà không khai báo với cú pháp
var sẽ được coi là biến toàn cục, những biến này có thể sử dụng trên toàn trang web.
Biến được khai báo với var bên trong một hàm là biến cục bộ của hàm đó và chỉ có
thể sử dụng được bên trong hàm đó.
2.2. ĐỐI TƯỢNG
Kiểu của JavaScript được chia ra làm hai loại: kiểu cơ bản và đối tượng. Đối tượng
trong JavaScript là một thực thể có tên xác định và có thuộc tính trỏ tới giá trị, hàm
hoặc cũng có thể là một đối tượng khác. Có nghĩa là đối tượng trong JavaScript là một
mảng kết hợp tương tự như mảng trong PHP.
JavaScript có một số đối tượng định nghĩa sẵn, bao gồm: mảng (array), đại số Bool
(Boolean), ngày tháng (Date), hàm (Function), toán học (Math), số (Number), đối
tượng (Object), biểu thức tìm kiếm (RegExp), và chuỗi (String).
Bằng cách định nghĩa hàm khởi tạo, ta có thể tạo đối tượng. JavaScript là một ngôn
ngữ lập trình dựa trên nguyên mẫu, do đó thừa kế diễn ra giữa các đối tượng, không
phải giữa các lớp. Đối tượng thừa kế thuộc tính từ các nguyên mẫu của chúng.
Ta có thể thêm, xóa thuộc tính hoặc hàm trong đối tượng sau khi đối tượng đã được
tạo. Để làm việc này cho tất cả các đối tượng được tạo từ cùng một hàm khởi tạo, ta có
thể sử dụng thuộc tính prototype của hàm khởi tạo để truy cập đối tượng nguyên mẫu.
Ta không nhất thiết phải tự xóa các đối tượng đã tạo, JavaScript tự động gom rác tất cả
những biến không còn được dùng nữa.
45
2.3. CẤU TRÚC DỮ LIỆU
Một cấu trúc dữ liệu tiêu điểm là mảng (Array). Mảng trong JavaScript là một bảng
liên kết chỉ mục đến giá trị. Trong JavaScript, tất cả các đối tượng đều có thể liên kết
chỉ mục đến giá trị, nhưng mảng là một đối tượng đặc biệt có thêm nhiều tính năng xử
lý chỉ mục và dữ liệu đặc biệt (Ví dụ: push, join,...)
Mảng trong JavaScript có thuộc tính length. Thuộc tính length của JavaScript luôn
luôn lớn hơn số chỉ mục lớn nhất trong mảng một đơn vị. Trong phần lớn ngôn ngữ lập
trình, những thuộc tính có tính năng như length thường là thuộc tính chỉ đọc. Tuy
nhiên, với JavaScript, ta có thể thay đổi thuộc tính length. Bằng cách thay đổi thuộc
tính length, làm mảng lớn hơn hoặc nhỏ hơn (và xóa đi những chỉ mục lớn hơn hoặc
bằng thuộc tính length mới).
Mảng trong JavaScript là mảng rải rác, có nghĩa là cho dù ta có một mảng như sau:
var test = new Array();
test[2] = 1;
test[100] = 3;
Trong trường hợp này, dù mảng có đến chỉ mục mang số 100 thì mảng cũng chỉ chiếm
bộ nhớ của hai số 1 và 3. Tuy nhiên, thuộc tính length sẽ có giá trị 101 do chỉ mục lớn
nhất của mảng trong ví dụ trên là 100.
2.4. CẤU TRÚC ĐIỀU KHIỂN
RẼ NHÁNH ĐIỀU KIỆN IF...ELSE
Cú pháp if...else dùng trong trường hợp muốn rẽ nhánh theo điều kiện và có thể lồng
vào nhau.
TOÁN TỬ ĐIỀU KIỆN
Toán từ điều kiện còn được gọi là toán tử tam phân.
Cú pháp:
điều_kiện ? biểu_thức_đúng : biểu_thức_sai;
46
Toán tử này sẽ trả lại giá trị là kết quả của biểu_thức_đúng nếu điều_kiện có giá trị
bool bằng true, ngược lại nó sẽ trả lại giá trị bằng biểu_thức_sai.
VÒNG LẶP WHILE
Vòng lặp while có tác dụng lặp đi lặp lại một khối lệnh nhất định cho đến khi biểu
thức điều kiện trả về false. Khi dùng vòng lặp while phải chú ý tạo lối thoát cho vòng
lặp (làm cho biểu thức điều kiện có giá trị false), nếu không đoạn mã nguồn sẽ rơi vào
vòng lặp vô hạn. While thường được dùng khi không biết chính xác cần lặp bao nhiêu
lần.
VÒNG LẶP DO...WHILE
Cơ bản, vòng lặp do ... while gần như giống hệt như vòng lặp while. Tuy nhiên, trong
trường hợp biểu thức điều kiện trả về false ngay từ đầu, khối lệnh trong vòng lặp while
sẽ không bao giờ được thực hiện. Trong khi đó, vòng lặp do ... while luôn đảm bảo
khối lệnh trong vòng lặp được thực hiện ít nhất một lần.
VÒNG LẶP FOR
Vòng lặp for thường được sử dụng khi cần lặp một khối lệnh mà ta biết trước sẽ cần
lặp bao nhiêu lần.
VÒNG LẶP FOR...IN
Vòng lặp for ... in dùng để lặp qua tất cả các thuộc tính của một đối tượng (hay lặp qua
tất cả các phần tử của một mảng).
CÚ PHÁP SWITCH
Cú pháp switch cũng là cú pháp điều kiện như if ... else hay toán tử tam phân. Tuy
nhiên, cú pháp switch thường được dùng khi cần so sánh bằng với số lượng kết quả
cần kiểm tra lớn.
47
HÀM
Hàm là một khối các câu lệnh với danh sách một hoặc nhiều đối số (có thể không có
đối số) và thường có tên (mặc dù trong JavaScript hàm không nhất thiết phải có tên).
Hàm có thể trả lại một giá trị.
3. DOM
3.1. GIỚI THIỆU
Document Object Model (DOM) giúp phân tích một tài liệu (một trang web chẳng
hạn) phục vụ cho cơ chế của JavaScript. Sử dụng DOM, cấu trúc của tài liệu có thể
được phân rã theo cấu trúc cây và thao tác theo các node. Đây là một khả năng đặc biệt
hữu ích để viết một ứng dụng Ajax. Trong các ứng dụng web truyền thống, trình duyệt
phải nạp các trang HTML theo một luồng từ server.
Trong một ứng dụng AJAX, sự thay đổi giao diện người dùng chủ yếu được tạo ra bởi
DOM. Các thẻ HTML trong trang web được tổ chức theo cấu trúc cây. Gốc của cây là
thẻ , để biểu diễn tài liệu. Trong đó thẻ biểu diễn phần thân của tài
liệu, là gốc của phần hiển thị của tài liệu. Trong thân của tài liệu, có các table,
paragraph, list và các loại thẻ khác với các thẻ ở mức thấp hơn nữa.
Một biểu diễn theo mô hình DOM của một trang web là một cấu trúc cây, có các phần
tử là các node, rồi nó chứa các node con trong nó, và cứ tiếp tục một cách đệ qui như
vậy. JavaScript làm việc với node gốc của trang web hiện thời qua một biến toàn cục
gọi là document. Biến này là điểm bắt đầu của mọi thao tác trên DOM. Phần tử DOM
đã được đặc tả bởi W3C. Mỗi phần tử DOM có một phần tử cha duy nhất, có hoặc
không có các phần tử con, và có một số bất kỳ các thuộc tính, chúng được lưu trữ
trong mảng móc nối.
3.2. LÀM VIỆC VỚI DOM BẰNG JAVASCRIPT
Trong một ứng dụng bất kỳ, nếu muốn thay đổi giao diện người dùng khi họ đang làm
việc thì phải cung cấp các phản hồi lại khi người dùng gửi các yêu cầu.
48
Để hiểu rõ cơ chế làm việc với DOM bằng JavaScript, ta xét một ví dụ về một trang
HTML đơn giản.
Ví dụ:
hello
Ta đã thêm vào các tham chiếu đến các file hello.css (dùng Cascading Style Sheet)
và một file chứa mã nguồn JavaScript là hello.js. Ở đây cũng đồng thời khai báo
một thẻ với một ID.
Còn đây là file hello.css chứa stylesheet để áp dụng cho các mục trong file HTML
.declared{
color: red;
font-family: Arial;
font-weight: normal;
font-size: 16px;
}
.programmed{
color: blue;
font-family: helvetica;
font-weight: bold;
font-size: 10px;
}
Chúng ta định nghĩa hai style để mô tả gốc của các nút DOM (tên của các style là tùy
chọn). Các style này không dược dùng trong file HTML, nhưng chúng sẽ được áp
dụng qua file JavaScript.
49
window.onload=function() {
var hello=document.getElementById('hello');
hello.className='declared';
var empty=document.getElementById('empty');
addNode(empty,"reader of");
addNode(empty,"Ajax in Action!");
var children=empty.childNodes;
for (var i=0;i<children.length;i++) {
children[i].className='programmed';
}
empty.style.border='solid green 2px';
empty.style.width="200px";
}
function addNode(el,text) {
var childEl=document.createElement("div");//tạo một phần tử mới
el.appendChild(childEl);
var txtNode=document.createTextNode(text); //tạo một phần tử mới
childEl.appendChild(txtNode);
}
Hàm window.onload() sẽ được gọi khi trang web được nạp. Tại thời điểm này, cấu
trúc cây DOM sẽ được thiết lập.
TÌM KIẾM NODE DOM
Yêu cầu đầu tiên để làm việc trên DOM với JavaScript là đi tìm kiếm một phần tử để
thay đổi. Trước hết cần bắt đầu tham chiếu qua node gốc (root node). Node này thể
hiện qua biến toàn cục document.
Mỗi node trong DOM là một node con (hoặc node con cấp hai, ba…) của document,
nhưng cứ đi dần vào cây DOM, sẽ thấy một tài liệu phức tạp được biểu diễn bởi DOM,
và việc tìm kiếm là rất khó khăn. Vì vậy có các cách sau để tìm kiếm một node nhanh
chóng hơn.
Mỗi phần tử HTML có một thuộc tính ID
Ví dụ: hay
50
Mỗi một node DOM có thể có một ID gán cho nó, và ID này có thể được dùng
để tham chiếu tới node qua hàm
Ví dụ: var hello = document.getElementById(“hello”);
Trong một số trường hợp, cần duyệt qua cấu trúc cây từng bước một, mỗi node
DOM có một node cha và nhiều node con. Chúng có thể được truy cập bởi các
thuộc tính parentNode và childNodes. Thuộc tính parentNode trả về một
đối tượng DOM node khác, trong khi childNodes trả về một mảng javascript
Ví dụ:
var children = empty.childNodes;
for(var i=0;i<children.length;i++) {...}
Một cách khác để tìm kiếm là dựa trên loại thẻ HTML, dùng phương thức
getElementsByTagName().
Ví dụ: document.getElementsByTagName("UL") sẽ trả về chuỗi tất cả các
thẻ trong tài liệu.
TẠO DOM NODE
Trong nhiều trường hợp cần tạo các node mới và thêm nó vào tài liệu. JavaScript cung
cấp một số phương thức để làm điều đó. Các phương thức chuẩn để tạo node mới là
document.createElement() và document.createTextNode().
Phương thức createElement() có thể được dùng để tạo ra bất kỳ phần tử
HTML nào, tham số là kiểu của loại thẻ HTML.
var childEl=document.createElement("div");
createTextNode() tạo một node thể hiện qua một đoạn text, thường được tìm
thấy trong các thẻ về heading, div, paragraph, và list item.
var txtNode=document.createTextNode("some text");
Chuẩn DOM coi các text node tách rời khỏi biểu diễn HTML. Chúng không có các
stye để áp đặt trực tiếp và vì thế chúng yêu cầu ít bộ nhớ hơn.
Một node khi được tạo ra phải được gắn vào tài liệu trước khi hiển thị trên trình duyệt.
Phương thức appendChild() được dùng để thực hiện điều này
el.appendChild(childEl).
51
Ba phương thức createElement(), createTextNode(), và appendChild() cho
phép thực hiện hầu hết các thao tác để thêm một node vào tài liệu.
THÊM STYLE VÀO TÀI LIỆU
DOM cũng cung cấp các phương thức để chỉnh sửa style của các phần tử và tạo định
dạng lại cho cấu trúc đã được định nghĩa trong stylesheet.
Mỗi phần tử trong trang web có thể có nhiều giao diện trực quan, có thể được áp đặt
qua DOM, như vị trí, chiều dài và rộng, mằu sắc, canh lề và đường viền. Các trình
duyệt ngày nay đều cung cấp các ràng buộc JavaScript cho phép thay đổi giao diện
mức thấp và áp đặt các định dạng một cách nhất quán, dễ dàng với các lớp CSS.
Thuộc tính className
Ví dụ: Đoạn code sau sẽ áp đặt các quy tắc biểu diễn của lớp declared cho một
node, với hello tham chiếu tới một node DOM
hello.className = ‘declared’;
Thuộc tính style
Ví dụ: Đoạn mã sau bổ sung các thuộc tính style cho node empty
empty.style.border = “2px #FF0000 solid”;
empty.style.width = “200px”;
SỬ DỤNG THUỘC TÍNH innerHTML
Các phần tử DOM của các trình duyệt web đều hỗ trợ một thuộc tính gọi là
innerHTML. Thuộc tính này cho phép các nội dung kiểu string tùy ý được gán cho các
phần tử theo thuộc tính này.
Ví dụ:
function addListItemUsingInnerHTML (el, text) {
el.innerHTML += “”+text+””;
}
4. ĐỐI TƯỢNG XMLHTTPREQUEST
4.1. GIỚI THIỆU
XMLHttpRequest được đưa ra ban đầu trong Internet Explorer 5 như một thành phần
ActiveX. Nó chỉ hoạt động trong Internet Explorer. Điều này làm cho ít nhà phát triển
52
làm việc với XMLHttpRequest, cho tới khi nó trở thành một chuẩn chính thức trong
Mozilla 1.0 và Safari 1.2. Một điều rất quan trọng cần chú ý là XMLHttpRequest
không là chuẩn của W3C, mặc dù rất nhiều chức năng của nó được đề xuất trong các
đặc tả: DOM Level 3 Load and Save Specification.
Vì XMLHttpRequest không phải là một chuẩn, nên có những sự khác biệt nhỏ trong
các trình duyệt về hỗ trợ đối tượng này. Tuy nhiên hầu hết các phương thức và thuộc
tính của nó đều được hỗ trợ. Hiện tại, Firefox, Safari, Opera, Konqueror, và Internet
Explorer tất cả đều hỗ trợ XMLHttpRequest tương tự nhau. Nếu ta truy cập website
với các trình duyệt phiên bản cũ thì phải cân nhắc về sự lựa chọn công nghệ sẽ ứng
dụng.
Trước tiên cần tạo một đối tượng XMLHttpRequest bằng JavaScript trước khi sử dụng
đối tượng này để gửi request và xử lý các response. XMLHttpRequest chưa là chuẩn
của W3C, vì thế phải dùng JavaScript theo nhiều cách để tạo một thể hiện của
XMLHttpRequest. Internet Explorer thực thi XMLHttpRequest như một đối tượng
ActiveX. Các trình duyệt khác như Firefox, Safari, và Opera thực thi nó như một đối
tượng JavaScript nguyên thủy. Vì sự khác nhau này, đoạn mã JavaScript phải chứa các
cấu trúc logic để tạo một thể hiện của XMLHttpRequest dùng kỹ thuật ActiveX hay
đối tượng JavaScript nguyên thủy.
Rất may mắn, trong trường hợp này không cần phải viết mã một cách tỉ mỉ để xác định
kiểu trình duyệt và làm thế nào để tạo một thể hiện của đối tượng XMLHttpRequest.
Công việc chỉ đơn giản là kiểm tra sự hỗ trợ đối tượng ActiveX của trình duyệt. Nếu
hỗ trợ ActiveX, thì tạo một đối tượng XMLHttpRequest dùng ActiveX. Trường hợp
khác, tạo đối tượng này bằng kỹ thuật tạo đối tượng JavaScript nguyên thủy. Đoạn mã
JavaScript sau dễ dàng tạo ra các thể hiện của đối tượng XMLHttpRequest mà không
quan tâm tới trình duyệt.
Tạo một thể hiện của đối tượng XMLHttpRequest:
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
53
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
Việc tạo một đối tượng XMLHttpRequest khá là đơn giản. Trước tiên, tạo một biến
toàn cục (giả sử có tên là) xmlHttp để lưu trữ một tham chiếu đến đối tượng. Phương
thức createXMLHttpRequest thực hiện việc tạo một thể hiện của XMLHttpRequest.
Đoạn chương trình này chứa một câu lệnh rẽ nhánh đơn giản để xác định cách thức tạo
một đối tượng.
Lệnh gọi window.ActiveXObject sẽ trả về một biến kiểu object hay giá trị null,
tương đương với điều kiện true hay false của câu lệnh if. Đây là dấu hiệu chỉ ra cho ta
biết trình duyệt hỗ trợ ActiveX control, đó là Internet Explorer. Nếu vậy,
XMLHttpRequest được tạo ra là một thể hiện của ActiveXObject, truyền một chỉ báo
kiểu string để xác định loại đối tượng ActiveX cần tạo. Trong thể hiện này, ta cung cấp
tham số Microsoft.XMLHTTP cho hàm tạo, để chỉ ra rằng cần tạo một thể hiện của
XMLHttpRequest.
Nếu lệnh gọi tới window.ActiveXObject không được thực thi (điều kiện false của
lệnh if), lệnh JavaScript sẽ rẽ nhánh tương ứng với lệnh else, để xác định rằng trình
duyệt thực thi XMLHttpRequest dưới dạng một đối tượng JavaScript nguyên thủy.
Nếu window.XMLHttpRequest tồn tại, sau đó một thể hiện của XMLHttpRequest
được tạo ra.
Kiểu dữ liệu XMLHttpRequest của JavaScript tương thích với rất nhiều trình duyệt
khác nhau, có thể truy cập các thuộc tính và phương thức của một thể hiện của
XMLHttpRequest mà không cần quan tâm tới cách tạo các thể hiện này. Điều này làm
cho việc phát triển các ứng dụng đơn giản hơn và làm cho JavaScript không phụ thuộc
vào trình duyệt cụ thể.
4.2. PHƯƠNG THỨC, THUỘC TÍNH
Sau đây là các phương thức điển hình của đối tượng XMLHttpRequest:
54
+ void open(string method, string url, boolean asynch, string username, string
password)
+ void send(content)
+ void setRequestHeader (string header, string value)
+ void abort()
+ string getAllResponseHeaders()
+ string getResponseHeader()
Ngoài những phương thức chuẩn này, đối tượng XMLHttpRequest còn có các thuộc
tính được liệt kê dưới đây. Ta sẽ phải sử dụng các thuộc tính mở rộng này khi làm việc
với XMLHttpRequest.
onreadystatechange
Bộ xử lý sự kiện cho một sự kiện phát sinh mỗi khi có sự
thay đổi trạng thái.
readyState
Trạng thái của request. Có 5 giá trị là 0 = uninitialized, 1 =
loading, 2 = loaded, 3 = interactive, và 4 = complete
responseText Response trả về từ server dưới dạng string.
responseXML
Response trả về từ server dưới dạng XML. Đối tượng này có
thể được phân tách và khảo sát như một đối tượng tài liệu
DOM.
status
Mã trạng thái HTTP từ server (chẳng hạn 200 nếu không có
lỗi, 404 cho lỗi Not Found, …).
statusText
Thông điệp của mã trạng thái HTTP (chẳng hạn OK hay Not
Found, …).
4.3. SỰ TƯƠNG TÁC
Ta xét một ví dụ để tìm hiểu các tương tác của Ajax. Hình sau cho thấy mô hình tương
tác chuẩn trong một ứng dụng Ajax.
55
XHR
Function callback(){
//do something
}
Event
Server Resource
Data Store 1
2
3
5
4
6
client Server
Ajax-Enabled Web Application
Hình 4.1 – Mô hình tương tác chuẩn
Web Container
Không giống như các cách tiếp cận kiểu request/response thông thường trong các
chuẩn web client, một ứng dụng Ajax có những khác biệt. Sau đây là mô tả quá trình
tương tác:
1. Một event client-side gây ra một sự kiện - Ajax event. Bất kỳ một tác động nào
cũng có thể gây ra Ajax event, từ một sự kiện onchange đơn giản cho đến một
số tác động của người dùng.
Ví dụ:
<input type="text" id="email" name="email" onblur =
"validateEmail()";>
2. Một thể hiện của XMLHttpRequest được tạo ra. Dùng phương thức open(), tạo
lời gọi hàm - địa chỉ URL được thiết lập cùng với phương thức HTTP yêu cầu,
thông thường là GET hay POST. Request được tạo ra qua việc gọi phương thức
send().
Ví dụ:
var xmlHttp;
function validateEmail() {
var email = document.getElementById("email");
var url = "validate?email=" + escape(email.value);
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
56
xmlHttp = new XMLHttpRequest();
}
xmlHttp.open("GET", url);
xmlHttp.onreadystatechange = callback;
xmlHttp.send(null);
}
3. Một request được tạo và gửi đến server. Có thể là một lời gọi tới một servlet,
một CGI script, hay một công nghệ phía server nào đó tương tự như ASP.NET,
JSP, hay PHP…
4. Server xử lí các yêu cầu, chẳng hạn như truy cập cơ sở dữ liệu hay một tác vụ
hệ thống nào đấy.
5. Response được trả về cho trình duyệt. Trường Content-Type được thiết lập ở
dạng text/xml; XMLHttpRequest chỉ có thể xử lí kết quả dạng text/html. Trong
các thể hiện phức tạp hơn, response khá rắc rối, bao gồm JavaScript, các thao
tác trên đối tượng DOM, hoặc các công nghệ liên quan khác. Chú ý là cũng cần
thiết lập header, vì trình duyệt sẽ không lưu kết quả một cách cục bộ.
Ví dụ:
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma", "no-cache");
6. Trong ví dụ sau, cấu hình XMLHttpRequest để gọi hàm callback() khi kết
quả xử lí được trả về. Hàm này kiểm tra thuộc tính readyState trên đối tượng
XMLHttpRequest và sau đó xem xét mã trạng thái trả về từ server. Mọi thứ
hoàn toàn bình thường. Hàm callback() có thể làm nhiều việc trên phía client.
Một phương thức callback thường có dạng sau:
function callback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
//do something interesting here
}
}
}
57
Có một số khác biệt với mô hình request/response thông thường nhưng không quá lạ
lẫm đối với các lập trình viên web. Rõ ràng, phải xem xét thêm về việc tạo và thiết lập
một đối tượng XMLHttpRequest và sau đó (hàm) callback sẽ kiểm tra các trạng thái.
Thường thì các lời gọi chuẩn này được đóng gói vào một thư viện để dùng trong ứng
dụng, hay nói cách khác là dùng một thư viện có sẵn để thực thi Ajax cho ứng dụng
web (có rất nhiều thư viện như thế, ta sẽ xét trong các phần sau). Ajax là vấn đề tuy
còn mới mẻ, nhưng đã có một lượng đáng kể các thư viện và ứng dụng mã nguồn mở
được công bố.
Hầu hết các framework và toolkit Ajax trên các trang web đều dùng các kĩ thuật cơ
bản và trừu tượng hóa các trình duyệt, thêm vào một số thành phần giao diện người
dùng (UI). Một số là các framework thuần client; còn lại làm việc trên server. Nhiều
framework trong số này mới được bắt đầu xây dựng, nhưng chúng liên tục có các
phiên bản và có thêm các thư viện mới. Một số giải pháp để thực thi Ajax là các thư
viện Ajax.NET, Atlas, libXmlRequest, RSLite, sarissa, JavaScript Object Notation
(JSON), JSRS, Direct Web Remoting (DWR), và Ruby on Rails…
4.4. GET VÀ POST
Trên lý thuyết, sử dụng GET khi request không thay đổi giá trị, tức là nhiều request sẽ
trả về cùng kết quả. Trong thực tế, nếu phương thức tương ứng ở server thay đổi trạng
thái theo một vài cách thì điều này không còn đúng nữa. Điều này có nghĩa, nó là một
chuẩn. Có rất nhiều sự khác biệt với chuẩn trong điều kiện kích thước của phần đệm
(payload). Trong nhiều trường hợp, các trình duyệt và server sẽ giới hạn độ dài của địa
chỉ URL sử dụng để gửi dữ liệu tới server. Tóm lại, dùng GET để truy lục dữ liệu từ
server; hay nói cách khác tránh được việc thay đổi trạng thái trên với lời gọi GET.
Phương thức POST được dùng khi muốn thay đổi trạng thái trên server. Không giống
như GET, phải thiết lập phần Content-Type header trên đối tượng XMLHttpRequest
như sau:
xmlHttp.setRequestHeader("Content-Type","application/
x-www-form-urlencoded");
58
POST không hạn chế kích thước của payload được gửi tới server, và POST request
không cần bảo đảm tính không đối.
Hầu hết các request được thiết lập ở GET request. Tuy nhiên trạng thái POST cũng
luôn sẵn sàng khi cần thiết.
4.5. GỞI REQUEST
Các bước cơ bản để gởi request dùng đối tượng XMLHttpRequest:
1. Dùng một tham chiếu tới một thể hiện của XMLHttpRequest, có thể bằng cách
tạo mới hay truy cập vào một biến có thể hiện của XMLHttpRequest.
2. Khai báo cho đối tượng XMLHttpRequest về hàm sẽ xử lí các trạng thái của
XMLHttpRequest. Ta hoàn thành việc này bằng cách thiết lập thuộc tính
onreadystatechange của đối tượng với một con trỏ về một hàm JavaScript.
3. Gán các thuộc tính của request. Phương thức open() của đối tượng
XMLHttpRequest được gán về request trạng thái đợi. Phương thức open() có
ba tham số: một biến string chỉ báo (thường dùng GET hay POST), một biến
string biểu diễn địa chỉ URL của tài nguyên, một biến boolean chỉ báo request
sẽ là bất đồng bộ
4. Gửi request tới server. Phương thức send() sẽ truyền request để yêu cầu tài
nguyên. Phương thức send() chấp nhận một tham số, thông thường là một biến
kiểu string hay một đối tượng DOM. Tham số này được truyền tới địa chỉ URL
đích như là một phần của request. Khi truyển tham số cho send(), phải đảm
bảo rằng kiểu phương thức được gán trong open() là POST. Sử dụng null khi
không có dữ liệu nào được gửi với request.
Có thể diễn giải các bước trên như sau: cần một thể hiện của đối tượng
XMLHttpRequest, chỉ ra xem nó cần làm gì khi thay đổi trạng thái, khi nào thì gửi các
request và gửi như thế nào, cuối cùng là định hướng XMLHttpRequest để truyền
request.
Ta xét khái niệm con trỏ hàm, nó cũng gần giống con trỏ dữ liệu, ngoại trừ thay vì trỏ
vào dữ liệu thì nó trỏ vào một hàm. Trong JavaScript, tất cả các hàm đều được định địa
59
chỉ trong bộ nhớ và có thể tham chiếu bằng tên hàm. Điều này cho ta một cách truyền
tham số qua con trỏ hàm rất linh động và mềm dẻo hay lưu trữ một con trỏ hàm trong
một thuộc tính của lớp.
Đối với đối tượng XMLHttpRequest, thuộc tính onreadystatechange lưu trữ một
con trỏ tới hàm callback(). Hàm callback() được gọi khi trạng thái nội tại của đối
tượng XMLHttpRequest thay đổi. Khi một lời gọi bất đồng bộ được tạo ra, request
được truyền đi, và script tiếp tục xử lí ngay lập tức – nó sẽ không đợi request được đáp
ứng để tiếp tục. Mỗi lần request được gửi đi, thuộc tính readyState của đối tượng sẽ
thay đổi.
Ví dụ:
Trong ví dụ này, có một trang HTML với một nút bấm. Khi nhấn vào nút bấm, sẽ khởi
tạo một request bất đồng bộ gửi tới server. Server sẽ đáp ứng bằng cách gửi một file
text đơn giản. Response được hiển thị nội dung trên một cửa sổ alert.
simpleRequest.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"">
Simple XMLHttpRequest
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function startRequest() {
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", "simpleResponse.xml", true);
60
xmlHttp.send(null);
}
function handleStateChange() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status == 200) {
alert("The server replied with:"+ xmlHttp.responseText);
}
}
}
<input type="button" value="Start Basic Asynchronous Request"
onclick="startRequest();"/>
File response của server (simpleResponse.xml) chứa một dòng text duy nhất. Khi
nhấn vào nút bấm trên trang HTML sẽ trả về một hộp alert với nội dung của file
simpleResponse.xml. Request tới server được gửi một cách bất đồng bộ, cho phép
trình duyệt tiếp tục đáp ứng người dùng trong khi chờ đợi response của server phía
background (còn được gọi là AjaxEngine). Nếu một thao tác bất đồng bộ được chọn và
nếu response của server cần vài giây để trả về, trình duyệt sẽ không thể đáp ứng người
dùng trong thời gian đợi. Sự bất đồng bộ có thể cải thiện tình trạng này bằng cách
tránh hiển thị khi trình duyệt bị tê liệt và không thể đáp ứng người dùng. Điều này cho
phép người dùng tiếp tục làm việc trong khi server tiếp tục làm việc với request trước
trong background.
Khả năng liên lạc với server; không có lỗi ngắt với luồng làm việc của người dùng đã
mở ra rất nhiều kỹ thuật cải thiện cho phía người dùng. Một ứng dụng, chẳng hạn như
chứng thực dữ liệu nhập từ người dùng. Khi một người dùng điền vào một trường dữ
liệu trên form nhập, trình duyệt có thể định kỳ liên tục gửi các form giá trị tới server để
kiểm chứng mà không cần ngắt quãng quá trình điền dữ liệu vào form nhập. Nếu nhập
61
dữ liệu không đúng, người dùng có thể ngay lập tức được thông báo, trước khi form
thực sự được gửi đến server để xử lí. Điều này tiết kiệm được thời gian và giảm quá
trình nạp dữ liệu trên server. Nội dung của form sẽ không được nạp lại sau một form
đệ trình không thành công.
VẤN ĐỀ BẢO MẬT
Bất kỳ một công nghệ nào dựa trên nền tảng trình duyệt sẽ không trọn vẹn nếu bỏ qua
vấn đề bảo mật. Đối tượng XMLHttpRequest được xử lí bảo mật theo mô hình
“sandbox” của trình duyệt.
Sức mạnh của phương pháp bảo mật giới hạn này tùy thuộc vào từng trình duyệt.
Internet Explorer hiển thị một cảnh báo tình trạng một nguy cơ không an toàn có thể
tồn tại và cho phép người dùng sự lựa chọn có tiếp tục với request đó nữa hay không.
Trình duyệt Firefox sẽ dừng request lại và hiển thị thông điệp lỗi trên JavaScript.
5. STREAMING
5.1. GIỚI THIỆU
Streaming thường được đề cập đến như một hệ thống phân phát nội dung media hay
dữ liệu động, hỗ trợ cả broadcasts và multicasts (gởi một luồng dữ liệu tới nhiều
người). Trình chơi nhạc xử lý dữ liệu khi nó nhận và sau đó loại bỏ. Nó bắt đầu quá
trình trong khi dữ liệu được phân phát. Bất cứ lúc nào ta được cung cấp broadcasts hay
video-on-demand (VOD) động được lưu trữ trên server, streaming cho phép
broadcasts để chạy khi nó cần.
Chức năng chính của streaming video là để duy trì thời gian thực phát lại ở các tốc độ
kết nối khác nhau. Để làm được điều này, streaming media dựa vào các giao thức,
server khác nhau cho việc phân phát các trang web chuẩn. Giao thức thời gian thực
(Real-Time Protocol) và giao thức phân luồng thời gian thực (Real-Time Streaming
Protocol) là các giao thức không kết nối, tốc độ cao hơn sự chính xác. Streaming
server giảm bớt băng thông phía trên bằng cách broadcasts dữ liệu qua mạng mà
không thẩm tra là nó thật sự được nhận chưa.
62
5.2. CÁC PHƯƠNG THỨC STREAMING
DOWNLOADING
Khi ta tải xuống một file, toàn bộ file được lưu trên máy (thường trong thư mục tạm)
trước khi mở và xem. Điều này có một số lợi ích (chẳng hạn xử lý nhanh) nhưng bất
lợi lớn là phải đợi toàn bộ file được tải xuống trước khi nó được xem. Nếu file nhỏ
không đáng nói, nhưng với những file lớn sẽ rất khó chịu.
Cách dễ nhất có thể download các file video là sử dụng một hyperlink tới file đó. Có
một phương thức cải tiến nhỏ là nhúng (embed) file vô trang web sử dụng code HTML
đặc biệt.
Phân phát các file video theo cách này gọi là HTTP streaming hay HTTP delivery.
HTTP (Hyper Text Transfer Protocol) là giao thức truyền các trang web.
STREAMING
Streaming media xử lý theo bit. Bằng cách này người sử dụng có thể xem file khi nó
đang được tải xuống. Với khả năng này, file được gởi tới người sử dụng theo một
luồng liên tục, và người sử dụng có thể xem khi nó đến. Lợi ích của phương thức này
là không phải đợi lâu. Streaming media có một lợi ích nữa là có thể broadcast các sự
kiện động.
PROGRESSIVE DOWNLOADING
Phương thức khác tương tự là progressive download. Trong phương thức này, video
clip được tải xuống nhưng bắt đầu chơi chỉ một phần của file nhận được. Do đó, nếu
người sử dụng muốn nhảy đến đoạn nào của clip thì phải download từ đoạn hiện tại tới
tới đoạn cần đến.
Lợi ích của phương thức này là chất lượng cao ở bất kỳ tốc độ kết nối nào. Do đó rất
phổ biến trong công nghiệp giải trí.
Phương thức này sử dụng hai giao thức khác nhau: HTTP (Hyper Text Transfer
Protocol) và FTP (File Transmission Protocol). Hai giao thức này được phân phát
thường sử dụng các Web Server.
63
SỰ KHÁC NHAU GIỮA PHƯƠNG THỨC DOWNLOAD VÀ
PROGRESSIVE DOWNLOAD
Lợi ích
Progressive
Download
Download
Real-Time broadcast x
Độ dài clip x
Truy xuất ngẫu nhiên lập tức tới các đoạn khác nhau
của clip x
Tải xuống toàn bộ clip x
Tải xuống phần được yêu cầu của clip
FLV được cache trên hệ thống cục bộ x
Yêu cầu streaming server đặc trưng x
Yêu cầu web server với PHP
Có thể bị dừng lại bởi firewall x
Phát lại chất lượng cao ở bất kỳ tốc độ kết nối nào x
Phát lại các packet bị mất x
CÁC NHU CẦU THƯỜNG SỬ DỤNG
Nhu cầu Progressive
Download
Download
Broadcasts động x
WebTV x
E-learning x
Biểu diễn online rich media x
Clip quảng cáo x
Sản phẩm offline x
Việc lựa chọn phương thức phụ thuộc vào tình hình cụ thể, thường thì ta chọn HTTP
streaming (downloading và progressive download). Cách này dễ nhất và ít tốn kém
nhất. Khi cần ta có thể nâng cấp streaming server sau.
64
Phần 2: THIẾT KẾ VÀ CÀI ĐẶT
¾ Ngôn ngữ lập trình: PHP, JavaScript, HTML, CSS
¾ Công cụ lập trình: DreamWaver 8
¾ Web Server: Apache
¾ Hệ quản trị cơ sở dữ liệu: MySQL
Chương 4: THIẾT KẾ
1. SƠ ĐỒ ỨNG DỤNG
Từ điển
Anh – Việt
Từ điển
Máy tính
Từ điển
Đồng nghĩa Admin
Tìm trong
CSDL đăng nhập
thêm, sửa,
xóa từ
Kết quả
nghĩa, hình,
clip, phát âm
Tìm với
Google
hình hay các website
liên quan từ đó
Kết quả
Trang chủ
2. CƠ SỞ DỮ LIỆU
Trong ứng dụng từ điển này, phần cơ sở dữ liệu không thực hiện theo chuẩn của các
ứng dụng từ điển khác nên vấn đề khó khăn là ở chỗ dấu của từ. Theo framework của
em, việc nhập trực tiếp từ có dấu vào MySQL thì ta sẽ khó tinh chỉnh hiển thị theo ý
muốn. Vì vậy em đã chọn giải pháp là nhập từ từ form.
Hạn chế: Nhập từ hơi lâu và không sử dụng được database cơ sở dữ liệu có sẵn trên
mạng.
65
Cơ sở dữ liệu được tổ chức như sau:
Tên cơ sở dữ liệu: multimedia_dictionary
Dữ liệu có các bảng:
wordlist_ev (từ điển Anh-Việt)
wordlist_computer (từ điển máy tính)
wordlist_synonym (từ điển đồng nghĩa)
admin (quản trị)
Mỗi bảng có cấu trúc như sau:
wordlist Ý nghĩa
id int(11) id của từ
word varchar(50) Từ
transcription varchar(50) Phiên âm
meaning longtext Nghĩa của từ
3. CÀI ĐẶT SERVER
XAMPP là một công cụ để cài đặt PHP, ApacheServer, MySQL, phpMyAdmin vào hệ
thống một cách nhanh chóng và dễ dàng. Các bước thực hiện như sau:
1. Cài XAMPP trong C:\XAMPP\
2. Chạy XAMPP Control Panel (trên desktop)
66
3. Trong XAMPP Control Panel, chạy Apache và MySQL
* Nếu Apache hay MySQL không chạy, việc cài đặt của ta bị lỗi. Ta qua bước 4
để kiểm tra.
* Nếu các dịch vụ đã chạy ta qua bước 5.
4. Kiểm tra xem các port được sử dụng bởi các ứng dụng khác chưa
Chạy C:\XAMPP\xampp\ xampp-portcheck.exe để kiểm tra port nào được sử
dụng bởi ứng dụng khác rồi. Nếu port được sử dụng:
* Hoặc vô hiệu hay thay đổi các port của ứng dụng đó (ví dụ IIS Admin,
Skype...) . Ở đây ta nên sử dụng các port mặc định cho ứng dụng XAMPP.
* Hoặc thay đổi port của ứng dụng XAMPP.
5. Kiểm tra và cấu hình các dịch vụ
Apache:
Thư mục c:\XAMPP\xampp\htdocs\ chứa tất cả ứng dụng web.
MySQL:
Mặc định XAMPP cài đặt MySQL 5 nhưng cấu hình INNODB bị vô hiệu. Để
kiểm tra ta gõ vào IE, nhấp Storage Engines, sau
đó nhấp InnoDB ta sẽ thấy nó bị vô hiệu hóa. Để enable nó ta mở file
C:\XAMPP\xampp\mysql\bin\my.cnf và thực hiện các thao tác sau:
* Thêm dấu # vào dòng skip-innodb
* Bỏ dấu # ở các dòng:
innodb_data_home_dir = C:/XAMPP/xampp/mysql/data/
innodb_data_file_path = ibdata1:10M:autoextend
67
innodb_log_group_home_dir = C:/XAMPP/xampp/mysql/data/
innodb_log_arch_dir = C:/XAMPP/xampp/mysql/data/
set-variable = innodb_buffer_pool_size=16M
set-variable = innodb_additional_mem_pool_size=2M
set-variable = innodb_log_file_size=5M
set-variable = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
set-variable = innodb_lock_wait_timeout=50
68
Chương 5: CÁC MODULE, LỚP CHÍNH CỦA ỨNG DỤNG
1. HỆ THỐNG TẬP TIN
Do hệ thống dùng ứng dụng XAMPP làm web server nên toàn bộ cơ sở dữ liệu về từ
được lưu trong MySQL. Về phần tập tin hình ảnh hay clip được cập nhật trong
framework.
2. CÁC MODULE CỦA ỨNG DỤNG
Toàn bộ project gồm hai module chính:
Tên module Ý nghĩa
app Chứa dữ liệu, cấu hình, ngôn ngữ, template... cho toàn
bộ ứng dụng.
libs Chứa toàn bộ thư viện, hàm được định nghĩa trước cho
việc gọi từ ứng dụng.
admin quản lý file upload.
3. CÁC LỚP ĐỐI TƯỢNG CHÍNH TRONG TỪNG MODULE
File Ý nghĩa
app\config\ ConfigObject.php Khai báo các lớp chính của thư viện như:
ConfigUser, ConfigDB, ConfigPath
app\language\ Khai báo các từ mặc định được hiển thị
trong template HTML
app\library\db\Word.php Chứa các lớp cho việc tạo ra các đối
tượng (như WordEV, WordUtilEV...) để
truy xuất cơ sở dữ liệu trong MySQL
app\module\ Chứa từng module nhỏ của ứng dụng như:
admin, word_ev, word_ve, ...
app\template\ Chứa toàn bộ template HTML và
javascript
69
Phần 3: KẾT QUẢ, ĐÁNH GIÁ VÀ HƯỚNG PHÁT TRIỂN
Qua quá trình thực hiện đồ án tốt nghiệp, em đã thu thập được rất nhiều kiến thức bổ
ích về công nghệ Ajax trên nền PHP. Với quỹ thời gian có hạn, em đã xây dựng được
một ứng dụng từ điển multimedia trên nền PHP với các chức năng khá đầy đủ. Các
chức năng nâng cao phục vụ cho việc tra từ, cũng như cho việc quản trị nâng cấp
chương trình đòi hỏi nhiều thời gian, kỹ thuật, em đang tìm hiểu và sẽ hoàn thành
trong thời gian tới. Sau đây là những thành quả mà em đã học hỏi được trong quá trình
thực hiện và những định hướng phát triển trong tương lai:
1. KẾT QUẢ THỬ NGHIỆM
Ứng dụng Multimedia Dictionary thử nghiệm được cài đặt trên server có cấu hình máy
P.4, CPU 2.4GHz, bộ nhớ RAM 256M, đĩa cứng 40GB. Dữ liệu demo khoảng
100MB.
2. HOẠT ĐỘNG CỦA ỨNG DỤNG
Giao diện trang chủ ứng dụng
70
Giao diện từ điển Anh-Việt
Mô tả:
Vùng dữ liệu Mô tả
Từ điển Anh-Việt từ điển Anh-Việt
Từ điển máy tính từ điển máy tính
Từ điển đồng nghĩa từ điển đồng nghĩa
Tra từ vùng nhập từ cần tra
Kết quả vùng hiển thị kết quả sau khi tra từ
Kiểu tìm tìm từ vừa nhập thông qua google
Phát âm nút phát âm từ đã tra
Hình nút hiển thị hình minh họa của từ đã tra
71
Giao diện từ điển máy tính
Mô tả:
Vùng dữ liệu Mô tả
Từ điển Anh-Việt từ điển Anh-Việt
Từ điển máy tính từ điển máy tính
Từ điển đồng nghĩa từ điển đồng nghĩa
Tra từ vùng nhập từ cần tra
Kết quả vùng hiển thị kết quả sau khi tra từ
Kiểu tìm tìm từ vừa nhập thông qua google
Phát âm nút phát âm từ đã tra
Hình nút hiển thị hình minh họa của từ đã tra
72
Giao diện từ điển đồng nghĩa
Mô tả:
Vùng dữ liệu Mô tả
Từ điển Anh-Việt từ điển Anh-Việt
Từ điển máy tính từ điển máy tính
Từ điển đồng nghĩa từ điển đồng nghĩa
Tra từ vùng nhập từ cần tra
Kết quả vùng hiển thị kết quả sau khi tra từ
Kiểu tìm tìm từ vừa nhập thông qua google
Phát âm nút phát âm từ đã tra
Hình nút hiển thị hình minh họa của từ đã tra
73
Giao diện sau khi tra một từ
Mô tả:
Vùng dữ liệu Mô tả
Từ điển Anh-Việt từ điển Anh-Việt
Từ điển máy tính từ điển máy tính
Từ điển đồng nghĩa từ điển đồng nghĩa
Tra từ vùng nhập từ cần tra
Kết quả vùng hiển thị kết quả sau khi tra từ
Kiểu tìm tìm từ vừa nhập thông qua google
Phát âm nút phát âm từ đã tra
Hình nút hiển thị hình minh họa của từ vừa tra
Clip minh họa clip minh họa cho từ vừa tra
74
Giao diện đăng nhập quảng trị
Mô tả:
Vùng dữ liệu Mô tả
Tài khoản tài khoản đăng nhập
Mật khẩu mật khẩu đăng nhập
75
Giao diện nhập từ Anh-Việt
Mô tả:
Vùng dữ liệu Mô tả
Upload file upload file của từ cần nhập
Thêm từ thêm từ vào cơ sở dữ liệu
Sửa sửa từ trong cơ sở dữ liệu
Xóa xóa từ trong cơ sở dữ liệu
Từ cần nhập từ muốn nhập vào cơ sở dữ liệu
Phiên âm phiên âm của từ cần nhập
Nghĩa của từ nghĩa của từ cần nhấp
76
Giao diện nhập từ và upload file từ điển Anh-Việt
Mô tả:
Vùng dữ liệu Mô tả
File clip clip của từ cần nhập
File hình file hình minh họa của từ cần nhập
File phát âm file phát âm từ cần nhập
77
Giao diện nhập từ và kết quả sau khi upload
3. KẾT LUẬN
Ưu điểm:
Về cơ bản đồ án đã thực hiện được các nội dung đề ra và đạt được một số kết quả nhất
định:
Đồ án đã trình bày cơ sở lý thuyết về công nghệ Ajax trên nền PHP đối với hoạt
động của một ứng dụng từ điển multimedia.
Tìm hiểu các kỹ thuật và phương thức trong việc thiết kế từng module.
Tìm hiểu các vấn đề đặc trưng của một ứng dụng tra từ điển multimedia.
Tìm hiểu các vấn đề đặc trưng của việc tra từ và hiển thị hình, clip, phát âm
đúng với từ đã nhập.
Thời gian xử lý clip của từ tra nhanh.
Cho phép tìm kiếm mở rộng từ đã nhập thông qua google.
Cho phép upload các file hình, file phát âm, file clip ngay lúc nhập từ.
Thời gian xử lý yêu cầu rất nhanh và kết quả chính xác.
Giao diện đẹp, thân thiện, dễ sử dụng.
78
Nhược điểm:
Do ứng dụng chỉ mang tính chất minh họa nên còn một số hạn chế cần phải cải tiến:
Chưa sử dụng được cơ sở dữ liệu từ có sẵn trên mạng.
4. HƯỚNG PHÁT TRIỂN
4.1. ĐỐI VỚI TỪNG MODULE
9 Quản trị:
Sử dụng cơ sở dữ liệu từ có sẵn trên mạng.
Thực hiện việc đăng ký user, phân quyền user.
Cho phép user post các câu đố, mẫu truyện anh văn vui.
Cho phép user tạo riêng cho mình các chỉ mục từ vựng về lĩnh vực nào đó
để học.
9 Tra từ:
Sau khi hiển thị nghĩa một từ, có thể tra bất kỳ từ nào trong phần nghĩa của
từ đó bằng việc nhấp đôi vào từ muốn tra (tương tự phần mềm từ điển
Babylon).
Hỗ trợ tra từ gần đúng.
Dịch đoạn văn.
Tự động lưu các từ đã tra vào mục history để khi cần ta tìm lại cho nhanh.
4.2. ĐỐI VỚI TOÀN BỘ ĐỒ ÁN
9 Hỗ trợ đa ngôn ngữ.
9 Tăng tính hiệu quả, tính ổn định và bảo mật của ứng dụng.
9 Thêm các module như: các mẫu truyện, câu đố anh văn vui…giúp cho ứng
dụng thêm phong phú.
79
80
TÀI LIỆU THAM KHẢO
[1] Dave Crane, Eric Pascarello with Darren James, (2006). “Ajax in action”. Manning
Publications Co.
[2] Cristain Darie, Brinzarea Bogdan, Filip Chereches-Tosa, Mihai Bucica, (2006).
“Ajax and PHP – Building Responsive Web Applications”. Packt Publishing.
[3] Lee Babin, (2007). “Begining Ajax with PHP: From Novice to Professional”.
Springer-Verlag New York.
[4] Kris Hadlock, (2007). “Ajax for Web Application Developers”. Sams Publishing.
[5] Joshua Eichorn, (2007). “Understanding Ajax: Using JavaScript to Create Rich
Internet Applications”.
[6]
[7]
[8]
Các file đính kèm theo tài liệu này:
- Xây dựng từ điển multimedia dùng công nghệ ajax trên nền php.pdf