Tại sao Facebook không được xây dựng bằng Java?


Nhân đọc bài “Facebook đang "hot" hơn cả Mash và MySpace”, và một bài viết của Coach Wei. Đặt ra câu hỏi: Tại sao những website nhỏ lại chọn xây dựng bằng Ruby hay PHP thay cho Java?

Tôi quan tâm vì đơn giản, tôi là một Java developer. Như tất cả Java developers, Tôi tin rằng Java tốt. Không chỉ ngôn ngữ, mà cả môi trường phát triển (Eclipse hay Netbeans), giúp ta từng bước kiểm lỗi, có sẵn nhiều thư viện code, và thông tin về phần lớn các vấn đề về kỹ thuật được tìm thấy qua Google.


Lý do khác mà tôi cân nhắc là Java mạnh và hoàn toàn đáp ứng tốt cho các website cần nhiều hơn là chỉ code html hay scripting, như một middleware logic. PHP và Ruby đang thu hút khá nhiều người xây dựng, nhưng nó không thể xây dựng middleware logic.


Có phải là ngôn ngữ Java khó dùng so với các ngôn ngữ scripting? Vâng, cũng có thể là một lý do. Nhưng có hơn 5 triệu LTV java, và hàng triệu người đang sống bằng nghề viết code java. Nhiều website xây dựng bằng các LTV này, và vì một số lý do họ có thể chọn dùng PHP hay Ruby thay cho Java. Vì sao? Khó khăn hơn nhiều khi dùng java (đặc biệt là khi họ quyết định xây dựng một website 2.0), họ chỉ đến với PHP thông qua viêc học, và kinh nghiệm thì không nhiều.

Thiếu công cụ phát triển(tools)? Tôi nghĩ là java có nhiều tools hơn Ruby.

Thiếu frameworks? Tôi nghĩ là không vì Framework Java nhiều hơn cả số dân Trung Quốc.

OK, nhiều websites đơn giản, chủ yếu dùng html, scripts và một vài phép toán nhỏ trên server, PHP và Ruby là những sự lựa chọn tốt. Java có thể quá “búa rìu” với các websites này. Nhưng có nhiều websites có những xử lý rất phức tạp trên server. Ví dụ, FaceBook là điển hình, nhưng giờ với FaceBook API và Platform, các xử lý ngày càng phức tạp. Vậy vì sao không dùng java?

Vậy cái gì thiếu trong cộng đồng Java? Công nghệ nào dùng để xây dựng một website bằng Java?

  • Lựa chọn 1: JSP/Servlet với bộ Java Servlet ở tầng trên (hay một application server): Đây là công nghệ chính cho ứng dụng web Enterprise. Nhưng nó không dễ dùng để xây dựng websites so với PHP hay Ruby;

  • Lựa chọn 2: JavaServer Faces: JSF là một đứa con mới trong gia đình java web. Nhưng nó không làm cho bạn dễ dàng hơn trong việc xây dựng một websites. Nó được thiết kế để việc xây dựng ứng dụng đơn giản hơn.

  • Lựa chọn 3: Dùng Java dựa trên hệ thống quản lý nội dung (CMS)? Tôi có dùng qua một số hệ thống CMS, và không thấy có gì nổi bật.

Cá nhân tôi nghĩ rằng Java có khả năng xây dựng một ứng dụng có thể nâng cấp, có các xử lý phức tạp (và ngày càng phức tạp), dễ dùng và chỉnh sửa. Vậy tại sao không dùng Java? Tôi mong ý kiến các bạn trong nhận xét.

Đọc tiếp >>

Cao Trong Hien

iPod Touch và iPhone sẽ hỗ trợ java


Phiên bản hiện giờ của iPod Touch và iPhone không hỗ trợ ngôn ngữ java, nhưng sắp tới sẽ có. Theo một viên chức từ Sun Microsystems cho rằng anh ta tin chắc rằng trong tương lai Java sẽ được hỗ trợ trong các thiết bị này.

Anh ta cũng nói Apple đang lên kế hoạch cho ra một sản phẩm có hỗ trợ cho người phát triển( SDK) trong năm 2008 (Khoảng tháng 2), bằng cách mở rộng Java ME .
Bắt đầu một làn sóng phần mềm, và các sản thiết bị di động ra đời khi chính thức dùng SDK. Ta sẽ giải quyết được một số vấn đề như có thể chạy flash trên safari. Tất cả updates sẽ làm cho iPod Touch và iPhone tốt hơn và nhiều tính năng hơn.

Theo(computerworld)

Đọc tiếp >>

Cao Trong Hien

,

10 lý do Android sẽ thành công


Tôi đã hoài nghi về Gphone. Một công ty chuyên cung cấp dịch vụ tìm kiếm và quảng cáo trên mạng, lại chuyển sang sản xuất phần cứng. Vì vậy hiển nhiên là sẽ có sự so sánh với iPhone, và người dùng sẽ nghiêng về phía nào? Một Iphone đắt đỏ, hay một Gphone mới lạ.
Vài tuần gần đây khi Google ra mắt HDH Android, đây có lẽ là một sự kiện lớn, một sự thay đổi lớn trên lĩnh vực di động. Xem video giới thiệu về SDK, bạn sẽ thấy rằng đây chính là đây chính là ngôn ngữ lập trình cho DTDD trong tương lai. Tại sao? Có thể các hãng sản xuất và nhà cung cấp sẽ không chọn Android. nhưng với những người phát triển hiểu rằng: Google đã làm được một việc rất hấp dẫn:

1.Miễn phí: Các nhà cung cấp và cty có thể nâng cấp và cài đặt miễn phí. Vì vậy, sẽ rẻ hơn khi xây dựng so với Windows Mobile, UIQ hay
Symbian. Tuy nhiên, Google/OHA có ý muốn cung cấp đủ cho tất cả các hãng sản xuất miễn phí hay rẻ hơn.

2.Hứa hẹn với JavaME: giống như phát triển JavaME trên eclipse, vì vậy những nhà phát triển trên JavaME sẽ không mấy khó khăn khi chuyển qua Android.

3.Giao diện tốt: giống Layouts, AdapterViews và dùng XML để thiết kế.

4.Ứng dụng tốt: bạn có thể dùng các tiện ích của Google như MAPS, GMAIL, ... và WebKit (không phải một sản phẩm của Google), bạn không cần làm những thứ đã có sẵn. Vùng thông báo là một tính năng lý thú cho người phát triển. Giống như bạn đang phát triển hệ thống Symbian bằng ngôn ngữ Java.

5.Nền Linux: Không mới. Motorola là một trong số hãng phát triển DTDD Linux. Nó không đáng kể vì HDH Linux phát sinh một số lỗi khi dùng trên DTDD. Nhưng đã được Google phát triển, và đầy hứa hẹn, ta hãy cùng chờ xem.

6.Yêu cầu phần cứng: Tôi cũng không thấy một tài liệu nào nói về phần này. Nhưng họ có nói rằng sẽ tương thích với phần lớn. Nhưng chúng ta hãy cùng chờ đợi ý kiến của các nhà phát triển. Có thể sẽ yêu cầu đối với các ứng dụng về Media hay 3D.

7.Tools: Các tools của Google luôn làm hài lòng người dùng, bao gồm người phát triển, GWT, hay Google Grears là ví dụ. Tool cho SDK là Eclipse có lẽ cũng thế.

8. Hỗ trợ: Với các cty phần mềm, thêm một sự lựa chọn là phát triển trên Android và có thêm khách hàng mới.

9.Giải thưởng: Một phần của việc giới thiệu Android là treo giải thưởng cho người phát triển ứng dụng trên Android. Bạn muốn giàu có và nổi tiếng ư? Google sẽ giúp bạn.

10.Quảng cáo: Quảng cáo là nói quá mà. Nhìn vào iPhone bạn sẽ thấy ngay rằng quảng cáo chỉ để họ bán nhiều sản phẩm. Và khi Android/Gphones ra đời, bạn cũng sẽ thấy một trường hợp tương tự?...

Đọc tiếp >>

Cao Trong Hien

Gphone và hệ điều hành Android


Đầu tháng 11, Google giới thiệu Open Handset Alliance (OHA)— một tổ chức đa quốc gia bao gồm 34 nước. Liên minh này sẽ tập trung xây dựng một chiếc điện thoại di động tốt hơn. Một thành phần của nó là phát triển hệ điều hành Android, giải thích là "hệ điều hành nguồn mở dùng cho gồm tất cả các thiết bị cầm tay" phần mềm bao gồm có một hệ đều hành, middleware, và một giao diện người dùng thân thiện." Mục đích là mang đến một cải tiến cho người dùng web trên thiết bị cầm tay, giống như trên một máy tính bình thường, không giống với sự hạn chế của nó hiện nay. Họ đã "và sẽ hoàn thành trong giữa năm 2008." Như đã hứa về Android SDK trong tháng 11. Bài viết này giới thiệu về những điểm mới trong hệ điều hành Android và SDK.
OHA được xây dựng từ những tổ chức phát triển trên dtdd, bao gồm các cty cung cấp dịch vụ DTDD, sản xuất thiết bị cầm tay, sản xuất phần mềm, dụng cụ bán dẫn, và các cty kinh doanh. OHA hiện giờ bao gồm các cty lớn trên lĩnh vực di động trên toàn thế giới, là một đối thủ mới, cũng như đang đổi mới trong công nghệ mua bán. Quan trọng nhất, tổ chức này đang mở cửa cho tất cả các cty khác.
Người dùng có thể chọn một nhà cung cấp dịch vụ tốt hơn thông qua OHA và tính năng sẵn có của HDH Android.


Giới thiệu Android và Open Handset Alliance
Lời đồn đại xoáy quanh vấn đề là có phải Google đang tấn công vào lĩnh vực viễn thông. Mà DTDD là một bước đầu tiên tạo tiền đề cho Google (người nói rằng nhiệm vụ của họ là "thiết lập thế giới thông tin") hoàn thành mục tiêu chinh phục, và mở ra một thế giới mới trong các thiết bị cầm tay.
Một số cty đã có các bức thay đổi, nhưng phần lớn thì im hơi, nghĩa vụ trong hệ thống DD được đưa lên hàng đầu. Một ví dụ, HTC đang chuẩn bị tung ra sản phẩm mới có hỗ trợ trong năm 2008. Có thể bạn chưa nghe gì về HTC vì họ là một nhãn hàng mang tên của các nhà cung cấp dịch vụ. (HTC sản xuất T-Mobile Wing, một sản phẩm lạ mắt như một máy tính nhỏ mà bạn có thể nói chuyện , nhưng không thể lập trình. Trong tương lai, sản phẩm này và Android sẽ có thể lập trình, và xa hơn là sẽ có rất nhiều chức năng trong tương lai.)
Tất cả các bài báo lớn đều đưa ra các thông tin về Android, nhưng có một sự vắng mặt: Nokia, Microsoft, Apple, và BlackBerry. Verizon và AT&T cũng không có bình luận gì. Và HDH lớn nhất hiện nay, Symbian, cũng đang đi theo cách này. Phá vỡ công nghệ thường chứng minh cho một sự đe doạ cho các hãng độc quyền và đem đến cho người dùng một lợi ích lớn.
Vài nhà phân tích cho rằng việc xây dựng lại một HDH là thất bại. Có nhiều "HDH mở" đan xen tồn tại—OpenMoko, Qtopia, hay môi trường Apple's iPhone. Thêm vào đó, còn có Ubuntu Mobile và xu hướng lập trình nhúng của Moblin(mobile internet). Tại sao không dùng Maemo, MontaVista, hay dựa vào những gì đã làm trong Linux Phone Standards Forum?

Một đối thủ (Symbian và Windows Mobile) đã không “mất hồn” khi ca tụng sự cố gắng của OHA. Trong khi một số từ chối OHA.
Với chúng ta, thật lý tưởng khi một HDH miễn phí và mã mở dĩ nhiên là rẻ hơn bao gồm thiết bị và ứng dụng chạy trên nó.

Đọc tiếp >>

Cao Trong Hien

Dùng Dojo và JSON xây dựng Ajax Applications


"Ajax" đã là một từ khá thông dụng và ngày càng hữu dụng. GmailGoogle Suggest là các trang viết và giới thiệu thật hoành tráng cho JavaScript bất đồng bộ (asynchronous). Lợi ích của người dùng và những yêu cầu càng tăng của họ.

Trong bài viết này, Tôi sẽ chỉ cách xây dựng một ứng dụng dùng DojoJSON—là 2 phần khác nhau nhưng bổ xung cho nhau thành một ứng dụng hoàn chỉnh। Chúng ta sẽ hiểu hơn về Dojo và JSON và xây dựng một Ajax applications. Bài viết này cũng sẽ cho bạn biết cách tạo một Dojo widgets bằng cách hiện thực tình năng "autocomplete" cho một text boxes. download



Đặt vấn đề


Ajax hiểu theo một cách ngắn gọn là xử lý trao đổi dữ liệu giữa web server và web browser dùng JavaScript khi trang đã được load. Trên thực tế, nó có nghĩa là chuyển đổi request trên browser, xử lý bất đồng bộ JavaScript, vậy xử lý request/response một cách trực tiếp đến user. Để hoàn thành nó, chúng ta có thể viết các đoạn code JavaScript hay dùng một libraries như Dojo.

Dojo

Dojo bao gồm nhiều chức năng đã được viết sẵn bằng JavaScript. Một trong những tính năng đó là tạo gởi HTTP requests và nhận responses. Và đây cũng là tính năng chính mà ta sẽ dùng. Về chức năng nó cung cấp về Ajax, Dojo cung cấp gói cho thao tác trên string, thao tác trên DOM, hỗ trợ kéo thả, và một số cấu trúc quen thuôc như lists, queues, và stacks.

JSON

JSON là một thư viện(library) Java giúp ta chuyển một đối tượng(object) Java sang biểu diễn dạng chuổi(string). Chuổi này khi eval()gọi trên JavaScript, nó sẽ tạo thành một mảng (array) chứa các thông tin về Java object. JSON là một kiểu đối tượng ghi chú, phù hợp cho mã hoá nhiều cấu trúc của đối tượng. Theo cách này ta sẽ tạo ra được một cấu trúc nhỏ hơn một file XML về thành phần, tiện lợi hơn khi dùng tính năng eval(), là một sự lựa chọn cho việc chuyển dữ liệu giữa browser và server.

JSON được xây dựng dùng cùng với JavaScript để tạo requests. Code ở server, có thể viết trên nhiều ngôn ngữ khác nhau, như C#, Python, PHP, và đương nhiên, Java!


Một HTTP Request đơn giản


Trong ví dụ đầu tiên, tôi cùng Dojo để cung cấp dòng chào mừng khi người dùng click lên trên một button. Minh hoạ cho việc tạo và gọi một Ajax dùng Dojo. Vào http://localhost:8080/dojo_json/example1.jsp và nhập tên, Submit. Một JavaScript thông báo hiển thị dòng chào mừng được tạo trên server. Bạn có thể xem source trên cho example1.jsp


<html>

<body onLoad="onLoad();">
<head>
<title>Example 1</title>
<script language="javascript" src="js/dojo.js"></script>
<script language="javascript">
dojo.require("dojo.io.*");
dojo.require("dojo.event.*");

function onLoad() {
var buttonObj = document.getElementById("myButton");
dojo.event.connect(buttonObj, "onclick",
this, "onclick_myButton");
}

function onclick_myButton() {
var bindArgs = {
url: "welcome.jsp",
error: function(type, data, evt){
alert("An error occurred.");
},
load: function(type, data, evt){
alert(data);
},
mimetype: "text/plain",
formNode: document.getElementById("myForm")
};
dojo.io.bind(bindArgs);
}
</script>
</head>
<body>
<form id="myForm">
<input type="text" name="name"/>
<input type="button" id="myButton" value="Submit"/>
</form>
</body>
</html>

Đầu tiên là import Dojo libraries, tên là dojo.js. Chứa tất cả class của Dojo cần cho phần lớn tính năng của nó. Dojo libraries được đóng gói như một Java code. Ví dụ, tôi cần import 2 gói. Gói dojo.io chứa các class cho phép tạo một HTTP requests dùng các giao thức như XMLHTTPTransport. Gói dojo.event cung cấp tập lệnh thao tác trên DOM và gán sự kiện.

Tiếp theo, tôi gán onclick cho button. Điều mà trước đây ta phải làm như sau:

<input type="submit" onclick="someFunc();"/>

nhưng với đoạn này thì ta chỉ gán cho sự kiện onclick một sử lý nhất định. Phương thức dojo.event.connect() cho phép chúng ta liên kết một xử lý cho nhiều HTML elements. Ở đây, tôi gán onclick_myButton là một xử lý cho myButton.

Khi onclick_myButton executes, tôi gọi đến welcome.jsp và nhận lại response. Dùng phương thức dojo.io.bind(). trong đó có đối số bindArgs, là một mảng name/value. Trong ví dụ trên tôi dùng 5 cặp:

  1. url: URL để gởi request đến.

  2. mimetype: Kiểu của response.

  3. load: Code gọi khi hoàn tất.

  4. error: Code gọi khi lỗi.

  5. formNode: ID của form nơi mà fields truyền tham số đến URL.

Tất cả các tham số bạn có thể tìm thấy ở đây.

Khi gọi dojo.io.bind(bindArgs), là bắt đầu quá trình xử lý, nó phụ thuộc vào request mà ta có thể nhận về errors,load hay error được gọi. Cả loaderror đều có 3 tham số:

  1. type: kiểu chức năng; luôn luôn cho loadload()errorerror().

  2. data: response nhận về. nếu mimetype thì khai báo như text/plain. Nếu text/json được dùng, dữ liệu sẽ có dạng eval('(' + dữ liệu nhận về + ')').

  3. evt: Sự kiện của đối tượng.

Tiếp theo, tôi có thể khai báo một sự kiện dùng dojo.event.connect() bằng cách tạo một chức năng handleResponse(type,data,evt) và kết hợp với request:

var req = dojo.io.bind(bindArgs); dojo.event.connect(req, "load", this, "handleResponse");

Trường hợp này, tôi không cần khai báo thuộc tính load trong bindArgs.

Chú ý: Vì lý do bảo mật, Firefox không cho phép giá trị cho url trong bindArgs liên kết đến một URL trên một domain khác. Internet Explorer thì cho phép.


Dùng JSON chuyển đối tượng Java


Như đã nói ở trên, JSON giúp chuyển Java objects thành chuổi eval()của JavaScript. Trong ví dụ này, người dùng sẽ nhìn thấy danh sách các quayển sách. Khi người dùng rê chuột qua tên sách, chúng ta sẽ tìm và hiển thị tất cả những thông tin về quyển sách đó dùng Ajax. Ví dụ 2, http://localhost:8080/dojo_json/example2.jsp, minh họa cho điều này.

Tạo và Cung cấp Java Objects

Class Book có 4 trường, BookManager có phương thức trả về một object Book object tuỳ thuộc vào bookId và một phương thức trả về tất cả sách có. Trong ví dụ này, tôi đã code cứng 5 quyển sách trong BookManager.

Phương thức Book.toJSONString() chịu trách nhiệm chuyển object Book thành JavaScript eval()thành String dùng trong JSON API.

public String toJSONString() throws JSONException {

JSONObject jsonObj = new JSONObject();
jsonObj.put("bookId", new Integer(this.bookId));
jsonObj.put("title", this.title);
jsonObj.put("isbn", this.isbn);
jsonObj.put("author", this.author);
return jsonObj.toString();
}

Class JSONObject chuyển object Book thành string bên trong dấu ngoặc, với dấu 2 chấm giữ tên và giá trị, và dấu ngoặc kép giựã giá trị và tên của trường khác, phù hợp String với eval()JavaScript. Còn class JSONArray có thể chuyển một danh sách Java objects sang JavaScript arrays.

Chuyển và điều hướng JSON-Encoded Data

Phụ thuộc vào bookId, book.jsp trả về một Book object trên form của JSON. Trang JSP tìm kiếm bookId dùng phương thức BookManager.getBook(bookId) và in ra kết quả qua phương thức Book.toJSONString(). Vì vậy http://localhost:8080/dojo_json/book.jsp?bookId=1 sẽ in ra JSON string cho Book với giá trị bookId1.

Trở lại tầng client, thông tin book được hiển thị trên list. Mổi thành phần trên danh sách có mouseover (trMouseOver) và mouseout (trMouseOut) sự kiện được truyền vào . Mỗi lần sự kiên mouseover, ta gọi book.jsp và truyền vào bookId. Kết quả trả về là một JSON String của quyển sách này Book. Tôi khai báo mime-type như một text/json vì vậy, giá trị trả về sẽ được tự động gọi eval(). Nhìn vào đoạn code JavaScript chịu trách nhiệm gởi request và xử lý response:

function trMouseOver(bookId) {

getBookInfo(bookId);
}

function trMouseOut(evt) {
var bookDiv = document.getElementById("bookInfo");
bookDiv.style.display = "none";
}

function getBookInfo(bookId) {
var params = new Array();
params['bookId'] = bookId;
var bindArgs = {
url: "book.jsp",
error: function(type, data, evt){
alert("error");
},
mimetype: "text/json",
content: params
};
var req = dojo.io.bind(bindArgs);
dojo.event.connect(req, "load", this, "populateDiv");
}

function populateDiv(type, data, evt) {
var bookDiv = document.getElementById("bookInfo");
if (!data) {
bookDiv.style.display = "none";
} else {
bookDiv.innerHTML = "ISBN: " + data.isbn +
"
Author: " + data.author;
bookDiv.style.display = "";
}
}

Trong một số ví dụ khác dùng thuộc tính content của bindArgs thay cho formNode. Thuộc tính content là một key/value liên kết đến thuộc tính được khai báo mapping of properties to be constructed into parameters passed with the data request.

Khi dữ liệu truyền vào JavaScript object, tôi có thể dể dàng truy cập đến các thuộc tính của Book và hiển thị đến người dùng trong

element, như bạn thấy.

Mở rộng Dojo: Tạo Autocompletion Widget


Trong 2 ví dụ trên, ta đã tìm hiểu các thành phần chính của một ứng dụng Ajax: chuyển đổi dữ liệu với web server dùng JavaScript. Một cách hiểu đơn giản, nó mang đến cho developer sử dụng một cách hiệu quả UIs dùng Ajax tools như Dojo. Dojo là một framework có thể mở rộng cho widget và phát triển module sẽ dễ dàng hơn. Trong sự lựa chọn này, tôi sẽ tạo một widget cho phép người dùng tạo một autocompletion cho một trường trên form.

Dojo Widget

Nói theo cách đơn giản, widget là tên của UI element như button, text box, scroll bar, v.v.v... Khi tạo Dojo widget, ngoài những thẻ HTML chúng ta còn có thể tạo một widgets bao gồm nhiều thành phần input, với của ta styles, và nhiều thứ khác. Bạn cần định nghĩa một trình điều khiển sự kiện cho widgets, tạo hành vi, và có thể dùng lại khi tạo một widget khác. Trong ví dụ này, tôi sẽ tạo một widget cung cấp tính năng autocompletion cho text box của HTML form.

Thành phần của Widget

Khi phát triển widgets, chúng ta cần quyết định UI elements nào và làm như thế nào. Khi dùng Dojo, có nghĩa là dùng HTML elements và viết code JavaScript để định nghĩa ứng sử. Ví dụ autocomplete dùng 4 files:

  • dojo.js: Tất cả Dojo libraries.

  • js/dojo/utils/templates/AutoComplete.html: Chứa UI elements, bao gồm HTML tags như

    <input>. File này có thể chứa nhiều đoạn HTML và giới hạn bởi một root element. Nếu nhiều hơn một element tìm thấy trên cùng, thì element đầu tiên sẽ là root.

  • js/dojo/utils/AutoComplete.js: JavaScript code cho widget. Thường là class mở rộng của một trong các Dojo Widget classes.

  • example3.jsp: File mà widget được dùng. Thường là thẻ được định nghĩa trong widget.

Học và hiểu làm sao mà UI elements có thể quản lý và thao tác bằng JavaScript là điều quan trọng trong tạo widgets.

Quản lý UI Elements

Như đã nói trên, chỉ định element gốc. Trong ví dụ autocomplete, element gốc là một

. Element này có thể quản lý torng class AutoComplete dùng this.domNode. Biến this.domNode lưu một liên kết đấn đối tượng HTML, xem ví dụ sau:

this.domNode.style.display = "none";

Để quán lý các element của UI từ JavaScript, bạn có thể dùng this.domNode cho đến khi bạn tìm ra , hay bạn có thể dùng thuộc tính dojoAttachPoint.

<input type="text" name="someTextField" dojoAttachPoint="myTextField"/>

Nếu bạn đã định nghĩa trong file HTML, nó có thể dễ dàng quản lý dùng this.myTextField trong JavaScript. Giống như this.domNode, this.myTextField cũng liên kết đến một đối tượng HTML.

Với Dojo, bạn có thể dễ dàng gắn nhiều sự kiện cho UI elements, kể cả dùng JavaScript và trường của element. Như đã minh hoạ, thật dễ dàng gắn sự kiên cho element, tôi dùng dojo.event.connect():

dojo.event.connect(this.domNode, "onclick", this, "myFunction")

Đoạn trên sẽ gắn onclick sự kiện myFunction() từ class này đến element gốc của UI. Tiếp theo, tôi có thể chỉ định HTML code cho thẻ

<div>:

<div dojoAttachEvent="onclick: myFunction">

<div dojoAttachEvent="onclick, onmouseover: myFunction">

Lập trình Widget

Giờ đã có cách quản lý và điểu khiển UI và các kiểu hành động của người dùng, và sau đó viết code JavaScript để tạo một hành vi ứng sử như ta mong muốn. Mỗi widget tương ứng với một class để quản lý UI elements và chịu trách nhiệm phản ứng với actions người dùng. Đoạn code Javascript sau được trích ra từ class AutoComplete sẽ minh hoạ cho một bộ widget.

dojo.provide("utils.AutoComplete");  dojo.require("dojo.dom"); dojo.provide("utils.AutoComplete");


dojo.require("dojo.dom");
...

dojo.widget.tags.addParseTreeHandler("dojo:AutoComplete");

utils.AutoComplete = function() {

// call super constructor
dojo.widget.HtmlWidget.call(this);

// load template
this.templatePath =
dojo.uri.dojoUri("utils/templates/AutoComplete.html");

this.widgetType = "AutoComplete";

// Instance variables
this.action = "";
this.formId = "";
this.form = {};
...

this.postCreate = function() {
this.form = document.getElementById(this.formId);
this.textbox = document.getElementById(this.textboxId);
dojo.event.connect(this.textbox, "onkeyup",
this, "textboxOnKeyUp");
...
}

this.textboxOnKeyUp = function(evt) {
if (this.isKey(evt.keyCode, 38, 40)) {
this.checkUpDownArrows(evt.keyCode);
} else {
bindArgs = {
url: this.action,
mimetype: "text/javascript",
formNode: this.form
};
var req = dojo.io.bind(bindArgs);
dojo.event.connect(req, "load", this, "populateChoices");
}
}

// Handler for "load" action of dojo.io.bind() call.
this.populateChoices = function(type, data, evt) {
...
}
}

// define inheritance
dj.inherits(utils.AutoComplete, dojo.widget.HtmlWidget);

Tôi đã định nghĩa một class JavaScript, AutoComplete, đoạn code ứng sử cho widget. Khi định nghĩa một widget, Dojo yêu cầu người phát triển khai báo một class dùng chức năng dojo.provide(). Đoạn inheritance này cho biết dùng chức năng dj.inherits(), và thực hiện thông qua việc gọi dojo.widget.HtmlWidget.call(this). File mẫu cho widget được load bằng cách gán giá trị cho biến this.templatePath cho class cha.

Dojo widgets dùng trang HTML dùng custom tags. Tags có thể định nghĩa khi viết một class liên kết. Trong ví dụ trên, bộ thể xuất ra là dojo:AutoComplete, được dùng trong file HTML trong đoạn code sau:

  action="getBooks.jsp"  textboxId="bookName"  formId="bookForm"/>

Đoạn output chứa đoạn template AutoComplete.html trên browser. Khai báo thuộc tính trong thẻ có thể quản lý dùng this. trong class JavaScript.

Khi người dùng nhập, nó sẽ tự động tìm ra danh sách những giá trị hợp lệ. Trong khi nhập, textboxOnKeyUp được gọi, và truyền đến web server cùng với giá trị nhập. Web server trả về một danh sách giá trị để hiển thị cho người dùng chọn. Tôi hiển thị nó trên thẻ <div>

.

Các đoạn code được tôi lược bớt là các đoạn thao tác trên thẻ <div>

, choices. Tìm ra phím tác động của người dùng, như Tab để chuyển sang trường khác để thao tác.

Kết luận


Dojo là một lựa chọn tốt khi phát triển Ajax trên một ứng dụng đòi hỏi JavaScript-intensive। Tuy nhiên, còn một số sản phẩm, như Scriptaculous và AjaxAnywhere, đem đến nhiều chức năng tuỳ theo yêu cầu của ứng dụng.

Hiendt (Java.net)



Đọc tiếp >>

Cao Trong Hien

,