24/05/2018, 22:56

Các ứng dụng Internet

Sự gia tăng của các mạng máy tính, bao gồm cả Internet và ‘intranets’ đã giúp cho người dùng có thể truy cập tới một số lượng lớn các nguồn dữ liệu. Điều này đã làm tăng truy cập tới cơ sở dữ liệu cũng như phát triển những ứng dụng thực ...

Sự gia tăng của các mạng máy tính, bao gồm cả Internet và ‘intranets’ đã giúp cho người dùng có thể truy cập tới một số lượng lớn các nguồn dữ liệu. Điều này đã làm tăng truy cập tới cơ sở dữ liệu cũng như phát triển những ứng dụng thực tế có tầm ảnh hưởng lớn; dữ liệu và các dịch vụ được cung cấp trực tiếp cho các khách hàng. Ví dụ những ứng dụng thương mại điện tử như mua sách trực tiếp trên website Amazon.com, tham gia đấu giá trực tuyến tại website eBay, và trao đổi thông tin về sản phẩm giữa các công ty. Sự ra đời các chuẩn như XML nhằm biểu diễn nội dung của các tài liệu đã thúc đẩy sự phát triển của thương mại điện tử và các ứng dụng trực tuyến khác.

Trong khi các thế hệ đầu tiên của Internet là tập hợp của những file HTML, thì ngày nay hầu hết các Website đều lưu trữ một phần lớn (nếu không phải tất cả) các dữ liệu trong các hệ thống cơ sở dữ liệu. Họ dựa vào DBMSs để cung cấp một cách nhanh chóng và đáng tin cậy những yêu cầu của người dùng trên Internet. Điều này đặc biệt đúng đối với những website thương mại điện tử và những ứng dụng thương mại.

Trong chương này, chúng tôi trình bày tổng quan về những khái niệm chủ yếu để phát triển ứng dụng Internet. Chúng tôi bắt đầu với câu hỏi Internet làm việc như thế nào trong Phần 2. Chúng tôi giới thiệu HTML và XML, hai định dạng dữ liệu được sử dụng để biểu diễn dữ liệu trên Internet, trong Phần 3 và 4. Trong Phần 5, chúng tôi giới thiệu về kiến trúc ba lớp, một cách để tổ chức các ứng dụng Internet vào các lớp khác nhau theo chức năng của nó. Trong Phần 6 và 7, chúng tôi mô tả các lớp và trình bày chi tiết lớp giữa; DBMSs là lớp thứ ba. Chúng tôi kết luận chương này bằng việc thảo luận trường hợp nghiên cứu B & N trong Phần 8.

Những ví dụ xuất hiện trong chương này có thể tìm thấy trên website:

http://www.cs.wise.edu/~ dbbook

Internet đã nổi lên như một kết nối tổng hợp giữa các hệ thống phần mềm phân tán. Để hiểu được nó làm việc như thế nào, chúng ta bắt đầu bằng việc tìm hiểu hai vấn đề cơ bản: Các trang trên Internet được định vị thế nào, và các chương trình trên một trang kết nối với các trang khác như thế nào. Đầu tiên, chúng ta giới thiệu về Uniform Resource Identifiers (URI), một sơ đồ tên của các nguồn tài nguyên trên Internet trong Phần 2.1. Sau đó, chúng tôi nói về giao thức phổ dụng nhất cho phép truy cập đến các nguồn tài nguyên trên Web đó là HyperText Transfer Protocol (HTTP) trong Phần 2.2.

Uniform Resource Identifiers

Uniform Resource Identifiers (URIs) là những xâu ký tự giúp định danh duy nhất cho những nguồn tài nguyên trên Internet. Một nguồn tài nguyên là bất kỳ loại thông tin nào có thể được xác định bởi một URI, ví dụ các trang web, hình ảnh, những file có thể tải về, các dịch vụ có thể được điều khiển từ xa, hộp thư, vv… Loại tài nguyên phổ biến nhất là các tập tin tĩnh (tài liệu HTML), nhưng cũng có thể là các tệp tin HTML động được xuất ra từ cơ sở dữ liệu, hay là một bộ phim, hoặc dữ liệu đầu ra của một chương trình, vv…

Một URI có ba phần:

  • (Tên của) giao thức được sử dụng để truy cập nguồn tài nguyên.
  • Các máy vi tính lưu trữ các nguồn tài nguyên.
  • Tên đường dẫn đến nguồn tài nguyên chính trên máy tính.

Xem xét một ví dụ URI: http://www.bookstore.com/index.html.

URI này có thể được giải thích như sau. Sử dụng giao thức HTTP (giải thích trong phần kế tiếp), để lấy tài liệu index.html nằm trên máy tính www.bookstore.com. Một ví dụ khác, đoạn HTML sau đây chỉ ra một URI là một địa chỉ email:

<a href="mailto:webmaster@bookstore.com">Email the webmaster.</a>

The Hypertext Transfer Protocol (HTTP)

Một giao thức là một bộ tiêu chuẩn định nghĩa cấu trúc của các thông điệp giao tiếp giữa hai bên kết nối để chúng có thể hiểu được nhau. The Hypertext Transfer Protocol (HTTP) là giao thức phổ biến nhất được sử dụng trên Internet. Đó là giao thức máy trạm-máy chủ (client-server), trong đó máy trạm (thường là một trình duyệt Web) gửi một yêu cầu tới một máy chủ HTTP, máy chủ này sẽ trả lại kết quả cho máy trạm. Khi một người dùng yêu cầu một trang web (ví dụ, nhấp chuột vào một siêu liên kết), trình duyệt gửi HTTP request messagestới máy chủ. Các máy chủ nhận được các yêu cầu và trả lời bằng HTTP response messages bao gồm các đối tượng. Điều quan trọng có thể nhận ra là HTTP được sử dụng để truyền tải tất cả các loại tài nguyên, không chỉ các tập tin, nhưng hầu hết các nguồn tài nguyên trên Internet ngày nay là các tệp tin tĩnh hoặc các scrip xuất ra từ máy chủ.

Một biến thể của giao thức HTTP gọi là giao thức Secure Sockets Layer (SSL) sử dụng mã hóa an toàn để trao đổi thông tin giữa máy trạm và máy chủ. Chúng ta hoãn thảo luận về SSL tới Phần 21.5.2 và trình bày những giao thức HTTP cơ bản trong chương này.

Ví dụ, xem xét những gì sẽ xảy ra nếu một người dùng nhấn vào liên kết sau: http://www.bookstore.com/index.html. Đầu tiên, chúng tôi giải thích cấu trúc của một HTTP request message và sau đó là cấu trúc của một HTTP response message.

HTTP Requests

Máy trạm (Web brower) thành lập một kết nối tới webserver và gửi một HTTP request message. Ví dụ sau đây chỉ ra một ví dụ về HTTP request message.

GET index.html HTTP/1.1
User-agent: Mozilla/4.0
Accept: text/html, image/gif, image/jpeg

HTTP Responses

Máy chủ sẽ trả về cho máy trạm một HTTP response message. Nó truy cập trang index.html, sử dụng nó để thu thập những HTTP response message, và gửi những message này tới máy trạm. Một ví dụ của HTTP response:

HTTP/1.1 200 OK
Date: Mon, 04 Mar 2002 12:00:00 GMT
Content-Length: 1024
Content-Type: text/html
Last-Modified: Mon, 22 Jun 1998 09:23:24 GMT
<HEAD>
<HTML>
    <HEAD>
    </HEAD>
    <BODY>
    <Hl>Barns and Nobble Internet Bookstore</Hl>
    Our inventory:
    <H3>Science</H3>
    <B>The Character of Physical Law</B>
    …
  • 200 OK: Yêu cầu thành công và đối tượng nằm trong phần thân của response message.
  • 400 Bad Request: Mã lỗi chỉ ra rằng yêu cầu không được máy chủ hoàn thành.
  • 404 Not Found: Đối tượng yêu cầu không tồn tại trên máy chủ.
  • 505 HTTP Version Not Supported: Phiên bản của giao thức HTTP mà máy trạm sử dụng không được máy chủ hỗ trợ (Nhớ lại rằng phiên bản của giao thức này được nằm trong yêu cầu của máy trạm).

Máy trạm (trình duyệt Web) nhận được response message, đưa ra các tệp tin HTML, phân tích, và hiển thị nó. Trong khi làm điều này, nó có thể tìm thấy thêm những URIs trong các file, và sau đó nó sử dụng giao thức HTTP để lấy những tài nguyên này, mỗi một tài nguyên thiết lập một kết nối mới.

Một vấn đề quan trọng là giao thức HTTP là một giao thức ‘không lưu trạng thái’ (stateless protocol). Tất cả các thông báo - từ máy trạm tới HTTP server và ngược lại là ‘self-contained’, và kết nối thành lập (cùng với một thông báo yêu cầu) được duy trì cho đến khi response message được gửi. Các giao thức cung cấp không có cơ chế để tự động 'nhớ' những tương tác trước đó giữa máy trạm và máy chủ.

Tính chất không lưu trạng thái của giao thức HTTP có ảnh hưởng lớn đến việc các ứng dụng Internet được viết như thế nào. Xem xét một người dùng tương tác với ứng dụng Bookstore của chúng ta. Giả định rằng Bookstore cho phép người sử dụng đăng nhập vào website và sau đó thực hiện một số thao tác, chẳng hạn như đặt một số quyển sách hoặc thay đổi địa chỉ của họ, mà không cần đăng nhập lại (cho đến khi hết hạn hoặc người sử dụng đăng xuất). Làm thế nào để chúng ta theo dõi được một người dùng đã đăng nhập hay chưa? Vì HTTP có tính chất ‘không lưu trạng thái’, nên chúng ta không thể chuyển sang một trạng thái khác (ví dụ là trạng thái 'đã đăng nhập'). Thay vào đó, với mọi yêu cầu mà người dùng gửi tới máy chủ, chúng ta phải mã hoá mọi thông tin trạng thái nào ứng dụng yêu cầu, ví dụ như tình trạng đăng nhập của người dùng. Thêm nữa, chương trình ứng dụng phía máy chủ phải duy trì thông tin trạng thái này và đáp ứng khi có yêu cầu. Vấn đề này được trình bày trong Phần 5.

Ghi nhớ rằng sự ‘không lưu trạng thái’ của HTTP được thiết kế dựa trên yêu cầu làm thế nào để cân bằng được giữa sự dễ dàng thực hiện của giao thức HTTP và sự dễ dàng thực hiện của các nhà phát triển ứng dụng. Những người thiết kế ra HTTP lựa chọn cách thức là giữ cho bản thân giao thức này đơn giản, và nhường lại những chức năng yêu cầu đến các đối tượng cho các lớp ứng dụng nằm trên giao thức HTTP.

Trong phần này và phần tiếp theo, chúng tôi tập trung giới thiệu về HTML và XML. Trong Phần 6, chúng tôi đề cập đến cách thức các ứng dụng sử dụng HTML và XML để tạo ra các form tiếp nhận những yêu cầu của người dùng, kết nối tới một máy chủ HTML, và chuyển những kết quả do lớp quản lý dữ liệu tạo ra vào một trong những định dạng này.

HTML là một ngôn ngữ đơn giản được sử dụng để biểu diễn dữ liệu. Các lệnh trong ngôn ngữ này được gọi là thẻ, nó thường có thẻ bắt đầuthẻ kết thúc có dạng <TAG> và </TAG>. Ví dụ, xem xét đoạn HTML trong Hình 1. Nó mô tả một trang Web chỉ ra danh sách các quyển sách. Văn bản này nằm gọn trong thẻ <HTML> và </HTML>, chứng tỏ nó là một văn bản HTML. Phần còn lại của văn bản - nằm trong thẻ <BODY> và </BODY> chứa thông tin về ba quyển sách. Dữ liệu về mỗi quyển được biểu diễn như là một danh sách không được sắp xếp (UL) trong đó toàn bộ các thực thể được đánh dấu bằng thẻ <LI>. HTML định nghĩa một tập các thẻ đúng như là ý nghĩa của nó. Ví dụ, HTML định nghĩa thẻ <TITLE> với mục đích ghi tiêu đề của văn bản. Một ví dụ khác, thẻ <UL> biểu diễn một danh sách không được sắp xếp. Audio, video, thậm chí là các chương trình Java (được viết trong Java, một ngôn ngữ bậc cao) có thể nằm trong các văn bản HTML. Khi một người dùng truy cập một văn bản sử dụng một trình duyệt phù hợp, những hình ảnh trong văn bản được hiển thị, các file audio và video được bật, và những chương trình nhúng được thực hiện trên máy của người dùng. Sự dễ dàng tạo ra những văn bản HTML và dễ dàng truy cập sử dụng trình duyệt Internet là động lực cho sự phát triển mạnh mẽ của các trang Web.

Danh sách các quyển sách trong HTML

Trong phần này, chúng tôi giới thiệu XML như là một định dạng văn bàn, và xem xét cách thức các ứng dụng có thể sử dụng XML. Việc quản lý các văn bản XML trong một DBMS đặt ra những thách thức mới; chúng ta sẽ bàn đến khía cạnh này của XML trong Chương 27.

Trong khi HTML có thể được sử dụng để đánh dấu các văn bản tuỳ vào mục đích hiển thị, nó không phù hợp để biểu diễn các cấu trúc của một nội dung dùng chung cho nhiều ứng dụng. Ví dụ, chúng ta có thể gửi một văn bản HTML chỉ ra trong Hình 1 tới một ứng dụng khác để hiển thị nó, như ứng dụng thứ hai có thể không phân biệt được phần tên đầu (first name) và phần cuối (last name) của các tác giả. (Ứng dụng này có thể cố gắng lấy những thông tin bằng cách tìm những đoạn văn bản nằm bên trong các thẻ, nhưng điều này làm hỏng mục đích sử dụng thẻ để biểu diễn cấu trúc của văn bản). Vì thế, HTML không thích hợp với những văn bản phức tạp.

Extensible Markup Language (XML) là một ngôn ngữ đánh dấu được phát triển để khắc phục những tồn tại của ngôn ngữ HTML. Ngược lại với một tập các thẻ cố định được xác định trong ngôn ngữ HTML, XML cho phép người sử dụng định nghĩa mới một tập các thẻ có thể được sử dụng để cấu trúc bất kỳ loại dữ liệu hay văn bản nào người dùng mong muốn truyền tải. XML có khả năng làm cho các hệ thống cơ sở dữ liệu tích hợp chặt chẽ với những ứng dụng Web hơn bao giờ hết.

XML được xây dựng dựa trên hai công nghệ, SGML và HTML. Standard Generalized Markup Language (SGML) là siêu ngôn ngữ cho phép định nghĩa dữ liệu và trao đổi văn bản như HTML. Chuẩn SGML được công bố vào năm 1998, và rất nhiều tổ chức quản lý nhiều những văn bản phức tạp đã sử dụng nó. Tuy nhiên, SGML phức tạp và yêu cầu các chương trình tinh vi mới khai thác được những khả năng của nó. XML đã được phát triển để có được những tính năng mạnh mẽ của SGML nhưng vẫn khá đơn giản. XML, giống như SGML, cho phép định nghĩa mới những ngôn ngữ đánh dấu văn bản.

Mục đích thiết kế của XML: XML đã được phát triển từ đầu những năm 1996. Mục đích của XML bao gồm:

1. XML nên tương thích với SGML.

2. Dễ dàng viết các chương trình xử lý những văn bản XML.

3. Thiết kế của XML nên có khuôn mẫu và xúc tích.

Giới thiệu XML

Chúng ta sử dụng tài liệu XML trên Hình 2 làm ví dụ.

  • Các nguyên tử (element): Các nguyên tử, hay còn gọi là các thẻ, là những khối chính trong một văn bản XML. Bắt đầu của nội dung một nguyên tử ELM là được đánh dấu bằng <ELM>, nó được gọi là thẻ bắt đầu, và kết thúc bằng thẻ </ELM>, gọi là thẻ kết thúc. Trong văn bản ví dụ của chúng ta, nguyên tử BOOKLIST đóng tất cả thông tin trong văn bản này.

Thẻ BOOK phân chia dữ liệu thành từng quyển sách đơn. Những thẻ XML phải được lồng nhau hợp lý. Những thẻ bắt đầu xuất hiện bên trong nội dung của các thẻ khác phải có thẻ kết thúc tương ứng. Ví dụ, xem xét đoạn XML sau:

<BOOK>
    
        <AUTHOR>
        <FIRSTNAME>Richard</FIRSTNAME>
        <LASTNAME>Feyninan</LASTNAME>
        </AUTHOR>
     </BOOK>

Thẻ AUTHOR nằm trọn vẹn bên trong thẻ BOOK, và cả hai thẻ LASTNAME và FIRSTNAME nằm trọn vẹn bên trong thẻ AUTHOR.

  • Các thuộc tính: Mỗi thẻ có thể có những thuộc tính biểu diễn để cung cấp thêm thông tin. Các giá trị của thuộc tính được thiết đặt ở bên trong thẻ. Chúng ta có thể thiết đặt giá trị cho thuộc tính att thông qua biểu thức sau: <ELM att= “value”>. Tất cả các giá trị thuộc tính phải được đặt bên trong dấu ngoặc. Trong Hình 2, nguyên tử BOOK có hai thuộc tính. Thuộc tính GENRE(loại) xác định thể loại của cuốn sách (là sách khoa học hay sách viễn tưởng) và thuộc tính FORMAT chỉ quyển sách được đóng có bìa cứng hay bìa mềm.
  • Tham chiếu thực thể: Các tham chiếu thực thể là đường tắt tới các phần khác nhau của văn bản hoặc nội dung của các tệp khác, và chúng ta gọi cách sử dụng một thực thể nào đó trong XML là một tham chiếu thực thể. Bất cứ khi nào một tham chiếu thực thể xuất hiện trong một văn bản, nó sẽ được thay thế bằng nội dung của nó. Các tham chiếu thực thể được bắt đầu bằng dấu ‘&’ và kết thúc bằng dấu ‘;’. Năm thực thể được định nghĩa trước trong XML sẽ thay thế cho những ký tự đặc biệt trong XML. Ví dụ, ký tự < dùng để đánh dấu vị trí bắt đầu của một lệnh XML phải được biểu diễn bằng thực thể lt. Bốn ký tự khác là &, >, ”, và ’ được biểu diễn thông qua các thực thể amp, gt, quot và apos. Ví dụ, ký hiệu ‘1<5’ phải được mã hoá trong XML như sau: &apos; l &lt; 5 &apos;. Chúng ta cũng có thể sử dụng các thực thể để thêm các ký tự Unicode vào trong văn bản. Unicode là một chuẩn để biểu diễn dữ liệu, tương tự như ASCII.
  • Chú thích: Chúng ta có thể thêm chú thích tại vị trí bất kỳ trong văn bản XML. Chú thích bắt đầu bằng <!- và kết thúc bằng ->. Chú thích có thể chứa những ký tự bất kỳ, trừ xâu ký tự --.
  • Những khai báo kiểu văn bản (Document Type Declarations-DTDs): Trong XML, chúng ta có thể định nghĩa ngôn ngữ đánh dấu của chúng ta. Một DTD là một tập các quy tắc cho phép chúng ta xác định tập các thẻ, thuộc tính và các thực thể. Vì thế, một DTD sẽ chỉ rõ những thẻ nào được phép, thứ tự xuất hiện của chúng, và chúng có thể được lồng nhau như thế nào. Chúng ta bàn chi tiết về DTDs trong phần tiếp theo.

Chúng ta gọi một văn bản XML là định-dạng-tốt nếu nó tuân theo những hướng dẫn sau:

  • Văn bản bắt đầu bằng một khai báo XML. Một ví dụ của khai báo XML ở dòng đầu tiên của văn bản chỉ ra trong Hình 2.
  • Một thẻ gốc chứa tất cả các thẻ khác. Trong ví dụ của chúng ta, thẻ gốc là thẻ BOOKLIST.
  • Tất cả các thẻ phải được lồng nhau. Yêu cầu này có nghĩa là các thẻ bắt đầu và kết thúc phải xuất hiện cùng nhau.

Thông tin về cuốn sách trong XML

XML DTDs

Một DTD là một tập các quy tắc cho phép chúng ta tự xác định tập các thẻ, thuộc tính, và các thực thể. Một DTD chỉ ra những thẻ nào chúng ta có thể sử dụng và các ràng buộc trên những thẻ này, ví dụ, các thẻ có thể được lồng nhau như thế nào và các thẻ có thể xuất hiện ở đâu trong văn bản. Trong phần còn lại của mục này chúng ta sẽ sử dụng ví dụ DTD trong Hình 3 để minh hoạ cách thức cấu trúc một các DTD.

Bookstore XML DTD

Một DTD được đặt trong <!DOCTYPE name [DTDdeclaration] >, trong đó name là tên của của thẻ ngoài cùng, và DTDdeclaration là các quy tắc của DTD đó. DTD này bắt đầu bằng thẻ ngoài cùng - thẻ gốc- trong ví dụ của chúng ta là thẻ BOOKLIST. Xem xét luật tiếp theo:

<!ELEMENT BOOKLIST (BOOK)*>
    

Luật này nói với chúng ta rằng thẻ BOOKLIST chứa 0 hoặc nhiều thẻ BOOK. Ký hiệu * đằng sau BOOK xác định có bao nhiêu thẻ BOOK có thể xuất hiện ở bên trong thẻ BOOKLIST. Dấu * quy định có 0 hoặc nhiều sự kiện, ký hiệu + quy định có 1 hoặc nhiều sự kiện, và ký hiệu ? quy định 0 hoặc 1 sự kiện. Ví dụ, nếu chúng ta muốn đảm bảo rằng một BOOKLIST có ít nhất một cuốn sách, chúng ta có thể thay đổi quy tắc này như sau:

<!ELEMENT BOOKLIST (BOOK)+>

Hãy cùng chúng tôi xem xét luật tiếp theo:

<!ELEMENT BOOK (AUTHOR,TITLE,PUBLISHED?)>

Luật này chỉ ra rằng một thẻ BOOK sẽ chứa một thẻ AUTHOR, một thẻ TITLE, và một thẻ lựa chọn PUBLISHED (có thể có hoặc không). Lưu ý việc sử dụng dấu ? để chỉ ra rằng thông tin là không bắt buộc, có 0 hoặc một sự kiện của thẻ này.

Hãy cùng chúng tôi xem xét luật tiếp theo:

<! ELEMENT LASTNAME (#PCDATA)>

Từ trước đến giờ chúng ta đã chỉ đề cập đến những thẻ chứa những thẻ khác. Quy tắc này chỉ ra rằng LASTNAME là một thẻ không có chứa thẻ khác bên trong, nhưng nó chứa tập ký tự. Các thẻ chỉ chứa những thẻ khác được nói là có nội dung thẻ, ngược lại những thẻ chứa #PCDATA được nói là có nội dung trộn. Thường thì một khai báo thẻ có cấu trúc như sau:

<! ELEMENT (contentType)>

Năm kiểu nội dung cho phép là:

  • Những thẻ khác.
  • Ký hiệu #PCDATA.
  • Ký hiệu EMPTY, chứng tỏ rằng thẻ này không có nội dung. Các thẻ không có nội dung không yêu cầu có thẻ đóng.
  • Ký hiệu ANY, chứng tỏ rằng bất cứ nội dung nào đều được phép. Điều này nên tránh vì nó sẽ không thể làm những kiểm tra với cấu trúc văn bản ở bên trong thẻ này.
  • Một biểu thức thông thường được xây dựng từ bốn lựa chọn tiền tố. Nó có thể như sau:
  • expl, exp2, exp3: Một danh sách các biểu thức thông thường.
  • exp*: Một biểu thức có thể lựa chọn (0 hoặc nhiều sự kiện).
  • exp?: Một biểu thức có thể lựa chọn (0 hoặc một sự kiện).
  • exp+: Một biểu thức bắt buộc (1 hoặc nhiều sự kiện).
  • expl | exp2: expl hoặc exp2

Các thuộc tính của thẻ được khai báo bên ngoài thẻ. Ví dụ, xem xét cách khai báo thuộc tính trong hình 3:

<!ATTLIST BOOK GENRE (Science|Fiction) #REQUIRED>>

Đoạn XML DTD này khai báo thuộc tính GENRE là thuộc tính của thẻ BOOK. Thuộc tính này có hai giá trị: ScienceFiction. Mỗi một thẻ BOOK phải được biểu diễn trong thẻ bắt đầu của nó bằng một thuộc tính GENRE vì thuộc tính này được yêu cầu do đã xác định #REQUIRED. Hãy cùng chúng tôi xem cấu trúc thông thường của một khai báo thuộc tính DTD:

<!ATTLIST elementName (attName attType default)+>

Từ khoá ATTLIST đánh dấu việc khai báo thuộc tính. Xâu elementName là tên của thẻ có thuộc tính được định nghĩa theo sau. Phần đằng sau là khai báo của một hoặc nhiều thuộc tính. Mỗi thuộc tính có một tên (attName), và kiểu (attType). XML định nghĩa một số kiểu cho mỗi thuộc tính. Chúng ta chỉ bàn đến các kiểu xâu ký tự và các kiểu dữ liệu đếm được ở đây. Một thuộc tính kiểu xâu ký tự có thể mang giá trị của bất kỳ xâu ký tự nào. Chúng ta có thể khai báo một thuộc tính với kiểu dữ liệu là CDATA. Ví dụ, chúng ta khai báo thuộc tính kiểu xâu ký tự của thẻ BOOK như sau:

<! ATTLIST BOOK edition CDATA "1">

Nếu một thuộc tính có kiểu dữ liệu đếm được, chúng ta liệt kê tất cả các giá trị của nó có thể nhận trong phần khai báo thuộc tính đó. Trong ví dụ của chúng ta, thuộc tính GENRE là kiểu đếm được; nó có thể nhận hai giá trị là ‘Science’ và ‘Fiction’.

Thành phần cuối cùng của khai báo thuộc tính là giá trị mặc định của nó. DTD trong Hình 3 chỉ ra hai xác định mặc định khác nhau: #REQUIRED và xâu ‘Paperback’. Xác định mặc định #REQUIRED chỉ ra rằng thuộc tính này được yêu cầu và bất cứ khi nào thẻ liên quan đến nó xuất hiện trong XML thì giá trị của thuộc tính cũng phải được xác định. Phần mặc định là xâu ký tự ‘Paperback’ chứng tỏ rằng thuộc tính này không yêu cầu bắt buộc phải có; khi thẻ xuất hiện không có giá trị của thuộc tính này thì nó sẽ mang giá trị mặc định là ‘Paperback’. Ví dụ, chúng ta có thể xác định giá trị mặc định của thuộc tính GENRE là ‘Science’ như sau:

<!ATTLIST BOOK GENRE (Science|Fiction) "Science">

Trong ví dụ về Bookstore của chúng ta, tài liệu XML có một tham chiếu tới DTD được chỉ ra trong Hình 4.

Thông tin về sách biểu diễn trong XML Lược đồ XML: Cơ chế DTD có một số hạn chế, mặc dù nó vẫn được sử dụng rộng rãi. Ví dụ, các thẻ và các thuộc tính không thể được gán các kiểu một cách mềm dẻo, và các thẻ luôn phải theo thứ tự, dù là ứng dụng không yêu cầu điều này. Lược đồ XML trong đề nghị mới của W3C cung cấp nhiều cách thức hiệu quả để biểu diễn cấu trúc văn bản hơn là trong DTDs; cho phép thừa kế dữ liệu dễ dàng hơn. Một khía cạnh thú vị là nó hỗ trợ các ràng buộc khoá ngoại và ràng buộc duy nhất.

Domain-Specific DTDs

Gần đây, DTDs đã được phát triển cho một số lĩnh vực đặc biệt- phủ lên một vùng rộng lớn của thương mại, kỹ thuật, tài chính, công nghệ và khoa học...- và rất nhiều những điều thú vị về XML đã được bắt nguồn từ một niềm tin rằng có nhiều hơn và nhiều hơn nữa những DTDs chuẩn sẽ được phát triển. DTDs đã được chuẩn hoá sẽ cho phép trao đổi dữ liệu giữa những nguồn dữ liệu không đồng nhất.

Ngay cả trong môi trường nơi mà tất cả các dữ liệu XML là hợp lệ, nó cũng không thể tích hợp một số tài liệu XML một cách minh bạch bằng cách đối sánh các thẻ trong các DTDs khác nhau. Nếu cả hai văn bản sử dụng một chuẩn DTD thì chúng ta sẽ tránh được vấn đề này. Sự phát triển của các chuẩn DTDs bị ảnh hưởng bởi các yếu tố xã hội nhiều hơn là khó khăn trong việc nghiên cứu, vì các đối tượng tham gia trong lĩnh vực này cần phải có ‘tiếng nói chung’ - sự hợp tác với nhau.

Ví dụ, Ngôn ngữ đánh dấu toán học (Mathematical markup language-MathML) đã được phát triển để mã hoá những ký hiệu toán học trên Web. Có hai loại thẻ MathML. Các thẻ trình diễn biểu diễn cấu trúc của một văn bản; ví dụ thẻ mrow xác định một xâu ký tự sẽ được trình bày theo chiều ngang, thẻ msup xác định ký tự cơ sở và số mũ của nó. Các thẻ nội dung biểu diễn các khái niệm toán học. Ví dụ thẻ plus sẽ xác định một phép tính cộng.

MathML cho phép chúng ta mã hoá các đối tượng toán học bằng cả hai loại vì yêu cầu của người sử dụng với các đối tượng có thể khác nhau. Các thẻ nội dung mã hoá chính xác các đối tượng mà không có sự nhập nhằng, và có thể được sử dụng trong các ứng dụng như các hệ thống tính toán số học.

Ví dụ, xem xét công thức đơn giản sau:

2-4x-32=0

Sử dụng các thẻ trình diễn, công thức được biểu diễn như sau:

<mrow>
    <mrow> <msup><mi>x</mi><mn>2</mn></msup>
    <mo>-</mo>
    <mrow><mn>4</mn>
    <mo>&invisibletimes;</mo>
    <mi>x</mi>
    </mrow>
    <mo>-</mo><mn>32</mn>
    </mrow><mo>=</mo><mn>0</mn>
    </mrow>
    Sử dụng các thẻ nội dung, công thức được biểu diễn như sau:
    <reln><eq/>
    <apply>
    <minus/>
    <apply> <power/> <ci>x</ci> <cn>2</cn> </apply>
    <apply> <times/> <cn>4</cn> <ci>x</ci> </apply>
    <cn>32</cn>
    </apply> <cn>0</cn>
    </reln>
    

Nhớ rằng sẽ có sự bổ sung sức mạnh khi chúng ta sử dụng MathML thay vì mã hoá công thức bằng HTML. Cách thường dùng khi biểu diễn các đối tượng toán học trong HTML là phải sử dụng đến các ảnh của các công thức, ví dụ:

<IMG SRC="images/equation.gif" ALT=" x**2 - 4x - 32 = 10 " >

Công thức này được mã hoá bên trong thẻ IMG cùng với việc thêm phần định dạng hiển thị bằng việc sử dụng thẻ ALT. Sử dụng việc mã hoá này cho một đối tượng toán học dẫn đến những vấn đề sau. Đầu tiên, ảnh phải được điều chỉnh kích cỡ để phù hợp với kiểu chữ hiện tại, nếu không thì ảnh sẽ quá nhỏ hoặc quá lớn. Thứ hai, trên các hệ thống có các màu nền khác nhau, ảnh sẽ không phù hợp với các màu nền tương ứng, dẫn đến khó khăn trong hiển thị và in ấn,

Trong phần này, chúng ta bàn đế kiến trúc của các ứng dụng trên Internet chuyên sâu về dữ liệu. Các ứng dụng này có thể được hiểu dưới dạng ba thành phần chức năng khác nhau: quản lý dữ liệu, chương trình ứng dụng và trình diễn. Thành phần quản lý dữ liệu thường sử dụng một DBMS để lưu trữ dữ liệu, như hai thành phần còn lại là chương trình ứng dụng và trình diễn giải quyết nhiều vấn đề hơn là chỉ những chức năng mà DBMS cung cấp.

Chúng ta bắt đầu bằng việc giới thiệu ngắn gọn về lịch sử của các kiến trúc ứng dụng chuyên sâu cơ sở dữ liệu, và giới thiệu các kiến trúc một-lớp và kiến trúc máy trạm-máy chủ (client-server) trong Phần 7.5.1. Chúng ta giải thích kiến trúc ba-lớp chi tiết trong Phần 7.5.2, và những ưu điểm của nó trong Phần 7.5.3.

Kiến trúc một lớp và máy trạm-máy chủ

Kiến trúc một-lớp Kiến trúc hai-lớp: Máy trạm yếu

Kiến trúc hai-lớp còn được gọi là kiến trúc máy trạm-máy chủ, gồm một máy trạm và một máy chủ, được giao tiếp với nhau thông qua một giao thức được định-nghĩa-tốt. Sự phân công chức năng thực hiện giữa hai máy tính này có thể được điều chỉnh thay đổi. Trong kiến trúc máy trạm-máy chủ truyền thống, các máy trạm chỉ làm nhiệm vụ là một giao diện đồ hoạ của người sử dụng, và máy chủ thực hiện cả hai chức năng quản lý dữ liệu và tính toán logic; vì thế các máy trạm thường được gọi là máy-trạm-yếu, và kiến trúc này được minh hoạ trong Hình 6.

Một sự phân chia khác là máy trạm thực hiện cả hai chức năng: giao diện người dùng và tính toán logic, hoặc các máy trạm thực hiện chức năng là giao diện người dùng và một phần của tính toán logic, phần còn lại thực hiện ở phía máy chủ; máy trạm trong trường hợp này thường được gọi là máy-trạm-mạnh, và kiến trúc này được minh hoạ trong Hình 7.

Kiến trúc hai-lớp: Máy trạm mạnh

Mười năm trước đây, các công cụ phục vụ mô hình máy trạm-máy chủ đã được phát triển như Microsoft Visual Basic và Sybase Powerbuilder. Những công cụ này cho phép phát triển nhanh chóng các phần mềm chạy trên kiến trúc máy trạm-máy chủ, góp phần vào sự thành công của mô hình này.

Mô hình máy-trạm-mạnh có một số nhược điểm so với mô hình máy-trạm-yếu. Đầu tiên, nó không có một vùng tập trung để cập nhật và bảo trì các tính toán logic khi cần thiết, vì mã nguồn ứng dụng chạy trên nhiều máy trạm khác nhau. Thứ hai, có một lượng lớn các ‘kiểm tra đúng đắn’ giữa máy trạm và máy chủ. Ví dụ, DBMS của một ngân hàng phải kiểm tra việc thực thi ứng dụng ở máy ATM để đảm bảo cơ sở dữ liệu có sự nhất quán.(Một cách để giải quyết vấn đề này là sử dụng stored procedures. Chúng ta sẽ bàn đến stored procedures chi tiết trong Phần 5).

Nhược điểm thứ ba của kiến trúc máy-trạm-mạnh là nó không thể đồng thời phục vụ được quá nhiều yêu cầu của người dùng đồng thời, cụ thể là không nhiều hơn vài trăm máy trạm. Ứng dụng ở phía máy trạm gửi các truy vấn SQL tới máy chủ và máy chủ trả về kết quả cho máy trạm. Một lượng lớn kết quả truy vấn phải được trao đổi giữa máy trạm và máy chủ. (stored procedures sẽ giúp làm giảm lượng dữ liệu phải trao đổi này). Thứ tư, các hệ thống máy-trạm-mạnh không đáp ứng được khi các ứng dụng cần truy cập đến nhiều hệ thống cơ sở dữ liệu. Giả sử, có x hệ thống cơ sở dữ liệu khác nhau được truy cập bởi y máy trạm, thì sẽ có x*y kết nối khác nhau được mở, rõ ràng đây không là giải pháp tốt.

Kiến trúc ba-lớp chuẩn

Kiến trúc ba-lớp

Kiến trúc hai-lớp-máy-trạm-yếu đã có sự phân chia trong việc trình bày dữ liệu từ các phần khác nhau của ứng dụng. Kiến trúc ba-lớp đã tiến thêm một bước, nó đã tách rời phần logic ứng dụng với phần quản lý dữ liệu.

Các công nghệ cho ba-lớp

Lớp giữa: Logic ứng dụng thực hiện ở đây. Chương trình nguồn của nó thường được viết bằng C ++ hoặc Java.

Lớp quản lý dữ liệu: Các ứng dụng Web chuyên sâu về dữ liệu bao gồm các DBMS, là nội dung của cuốn sách này.

Hình 8 chỉ ra một kiến trúc ba-lớp cơ bản. Các công nghệ khác nhau đã được phát triển nhằm phân bố ba lớp của ứng dụng để có thể phù hợp với nhiều nền tảng phần cứng khác nhau. Hình 9 chỉ ra những công nghệ liên quan đến từng lớp.

Tổng quan về lớp trình diễn

Ở lớp trình diễn, chúng ta cần cung cấp các form để người dùng có thể đưa vào các yêu cầu, và hiển thị thông báo phản hồi mà lớp giữa đưa ra. HTML đã trình bày trong Phần 3 là ngôn ngữ biểu diễn dữ liệu chính. Một điều quan trọng là lớp này được mã hoá để dễ dàng tương thích với các thiết bị hiển thị và các định dạng khác nhau: ví dụ các máy tính bàn thông thường khác với các thiết bị cầm tay, khác với điện thoại di động. Sự tương thích này có thể đạt được ở lớp giữa bằng cách đưa ra những trang khác nhau cho những kiểu máy tính khác nhau, hoặc ở máy trạm thông qua các style sheets xác định cách thức dữ liệu được trình bày. Ở trường hợp cuối cùng, lớp giữa có nhiệm vụ đưa ra dữ liệu phù hợp đáp ứng yêu cầu của người dùng, trong khi đó lớp trình diễn quyết định cách thức hiển thị những thông tin này.

Chúng ta tìn hiển các công nghệ của lớp trình diễn, bao gồm các style sheets trong Phần 6.

Tổng quan về lớp giữa

Lớp giữa thực thi phần mã nguồn của chương trình ứng dụng. Nó điều khiển những dữ liệu nào cần phải đưa vào trước khi một hành động nào đó được thực hiện, xác định thứ tự các hành động được thực hiện, điều khiển việc truy cập tới lớp cơ sở dữ liệu, và thường linh động thu thập các trang HTML phù hợp từ kết quả truy vấn cơ sở dữ liệu.

Mã nguồn của lớp giữa có khả năng hỗ trợ tất cả các role khác nhau của ứng dụng. Ví dụ, trong một cửa hàng Internet, chúng ta muốn khách hàng có thể xem được danh mục hàng và thực hiện việc đặt hàng, người quản trị có thể kiểm tra hàng hoá trong kho, và có thể phân tích dữ liệu để trả lời được truy vấn về lịch sử của việc đặt hàng. Một role có thể yêu cầu nhiều công việc phức tạp.

Ví dụ, xem xét một khách hàng muốn mua một sản phẩm. Trước khi việc bán được thực hiện, khách hàng này phải đi qua một loạt các bước: Cô ấy phải thêm các sản phàm vào giỏ hàng, cung cấp địa chỉ giao hàng và mã số thẻ thanh toán (trừ khi cô ấy có một tài khoản trên trang Web này), và phải xác nhận lại hoá đơn bán hàng sau khi đã được cộng thêm giá vận chuyển và thuế sản phẩm. Việc điều khiển thứ tự thực hiện các bước và ghi nhớ những bước nào đã được thực hiện sẽ được làm ở lớp giữa. Việc đưa ra dữ liệu đáp ứng các bước trên cần đến thao tác truy cập cơ sở dữ liệu, nhưng không phải lúc nào cũng như vậy (ví dụ, một giỏ hàng không được lưu trữ trong cơ sở dữ liệu cho đến khi việc bán được hoàn tất).

Chúng ta nghiên cứu chi tiết về lớp giữa trong Phần 7.

Những ưu điểm của kiến trúc ba-lớp

Kiến trúc ba-lớp có những ưu điểm sau:

  • Những hệ thống không đồng nhất: Các ứng dụng có thể tận dụng sức mạnh của các phần mềm và nền tảng hệ thống của các lớp khác nhau. Chương trình tại các lớp khác nhau dễ được sửa đổi hoặc thay thế mà không ảnh hưởng tới các lớp khác.
  • Các máy trạm yếu: Các máy trạm chỉ cần có năng lực tính toán vừa phải phục vụ cho lớp trình diễn. Các máy trạm chỉ cần là các trình duyệt Web.
  • Truy cập dữ liệu: Trong nhiều ứng dụng, dữ liệu phải được truy cập từ nhiều nguồn khác nhau. Điều này có thể được thực hiện dễ dàng ở lớp giữa, nơi chúng ta có thể quản lý tập trung các kết nối tới tất cả các hệ thống cơ sở dữ liệu liên quan.
  • Phục vụ nhiều máy trạm: Tất cả các truy cập của các máy trạm tới hệ thống đều thông qua lớp giữa. Lớp giữa có thể chia sẻ các kết nối tới cơ sở dữ liệu cho các máy trạm, và nếu lớp giữa trở thành ‘cổ chai’, chúng ta có thể dàn xếp cho một số máy chỉ thực hiện chức năng của lớp giữa; các máy trạm có thể kết tới tới bất kỳ máy chủ nào nếu phần thiết kế logic được thực hiện hợp lý. Điều này được minh hoạ trong Hình 10, trong đó chỉ ra cách thức lớp giữa truy cập tới nhiều nguồn dữ liệu khác nhau. Tất nhiên, chúng ta sẽ nhờ DBMS cho mỗi truy cập nguồn dữ liệu (và ở đây có thể bao gồm thêm phần xử lý song song và sao lưu dữ liệu, chúng ta sẽ bàn tới trong Chương 22).
  • Những lợi ích trong phát triển phần mềm: Bằng việc chia ứng dụng thành các phần như biểu diễn địa chỉ, truy cập dữ liệu, và thực hiện logic của chương trình, chúng ta đạt được nhiều điểm lợi. Phần thực hiện logic của chương trình được tập trung giải quyết, và vì thế nó dễ dàng được bảo trì, thay đổi và gỡ lỗi. Sự ảnh hưởng lẫn nhau giữa các lớp được định nghĩa tốt thông qua chuẩn APIs. Vì thế, mỗi lớp ứng dụng có thể được xây dựng từ các thành phần được phát triển, gỡ lỗi, và kiểm tra độc lập .
Lớp giữa và khả năng truy cập tới nhiều nguồn dữ liệu

Trong phần này, chúng ta trình bày các công nghệ phía máy trạm trong kiến trúc ba-lớp. Chúng ta bàn về các form HTML trong Phần 6.1. Trong Phần 6.2, chúng ta giới thiệu về JavaScrip. Chúng ta tổng kết những công nghệ phía máy trạm bằng việc trình bày về Style sheets trong Phần 6.3. Style sheets là ngôn ngữ cho phép chúng ta biểu diễn cùng một trang Web với các định dạng khác nhau cho các máy trạm; ví dụ, định dạng dữ liệu cho các trình duyệt Web khác với cho điện thoại di động, hoặc trình duyệt Web của Netscape khác với của Microsofts Internet Explorer.

Các Form HTML

Form HTMLs là một cách thường dùng để giao tiếp dữ liệu giữa lớp máy trạm và lớp giữa. Định dạng chung của một form như sau:

<FORM ACTION="page.jsp" METHOD="GET" NAME="LoginForm">
    ...
    </FORM>
    

Một văn bản HTML có thể chứa nhiều hơn một form. Bên trong một Form HTML có thể có bất kỳ một thẻ HTML nào, ngoại trừ một FORM khác. Thẻ FORM có ba thuộc tính quan trọng sau:

  • ACTION: Xác định URI của trang mà nội dung của form sẽ gửi tới trang này; nếu thuộc tính ACTION không xuất hiện, thì URI của trang hiện tại được sử dụng. Trong ví dụ trên, đầu vào của form sẽ được gửi tới trang có tên là page.jsp. (Chúng ta sẽ giải thích các phương pháp đọc dữ liệu form tại lớp giữa trong Phần 7.)
  • METHOD: Phương thức HTTP/1.0 được sử dụng để gửi đi các dữ liệu đầu vào (được nhập trong form) tới Webserver. Có hai lựa chọn, GET và POST; chúng ta sẽ trình bày phần này ở mục sau.
  • NAME: Thuộc tính này chứa tên của form. Mặc dù không cần thiết, nhưng chúng ta nên đặt tên cho form. Trong phần 6.2, chúng ta sẽ bàn tới cách viết các chương trình phía-máy-trạm bằng JavaScript trong đó có việc tham chiếu tới các form thông qua tên và thực hiện các kiểm tra trên những trường của form.

Bên trong Form HTMLs, các thẻ INPUT, SELECT, và TEXTAREA được sử dụng để xác định các thành phần đầu vào: một form có thể có nhiều thành phần của mỗi loại. Thành phần đầu vào đơn giản nhất là một trường INPUT.

Một ví dụ về thẻ INPUT như sau:

<INPUT TYPE="text" NAME="title">

Thẻ INPUT có một số thuộc tính. Ba thuộc tính quan trọng nhất là TYPE, NAME và VALUE. Thuộc tính TYPE xác định kiểu của trường đầu vào. Nếu thuộc tính TYPE có giá trị là text, thì trường này nhận giá trị là text. Nếu thuộc tính TYPE có giá trị là password, thì trường đầu vào là một trường text mà những ký tự nhập vào dù là gì thì cũng chỉ hiển thị ra màn hình là những ký tự *. Nếu thuộc tính TYPE là kiểu reset, nó là một nút đơn giản có khả năng thiết lập lại tất cả các trường đầu vào của form thành giá trị mặc định của chúng. Nếu thuộc tính TYPE có giá trị là submit thì nó là một nút có khả năng gửi các giá trị của các trường đầu vào khác nhau trong form tới máy chủ. Nhớ rằng reset và submit sẽ ảnh hưởng tới toàn bộ form. Trong ví dụ trước, chúng ta xác định title là NAME của trường input.

Thuộc tính NAME của thẻ INPUT xác định tên cho trường này và được sử dụng để nhận ra giá trị của trường đầu vào khi nó được gửi tới máy chủ. NAME phải được thiết đặt cho các thẻ INPUT của tất cả các loại ngoại trừ submit và reset.

Thuộc tính VALUE của thẻ input có thể được sử dụng cho các trường text hoặc password để xác định nội dung mặc định của trường này. Với các nút submit hoặc Form trong Hình 11 chỉ ra hai trường text, một là trường input text thông thường và một là trường password. Nó cũng chứa hai nút, một nút reset có nhãn là ‘'Reset

Values’ và một nút có nhãn là ‘Log on’. Ghi nhớ rằng có hai trường input được đặt tên, ngược lại hai nút reset và submit không có thuộc tính NAME.

Form HTML với hai trường text và hai nút

Form HTMLs có các cách khác nhau để nhận giá trị đầu vào, như các thẻ TEXTAREA và SELECT đã nhắc đến ở trên; chúng ta không bàn sâu đến chúng ở đây.

Gửi các tham số tới các script phía máy chủ

Như đã đề cập trong phần mở đầu của mục 6.1, có hai cách khác nhau để gửi dữ liệu trong Form HTML tới Webserver. Nếu sử dụng phương thức GET thì những nội dung của form này được tập hợp vào một truy vấn URI (sẽ trình bày sau) và gửi tới máy chủ. Nếu sử dụng phương thức POST, thì nội dung của form này được mã hoá như trong phương thức GET, nhưng nội dung này được gửi trong một khối dữ liệu độc lập thay vì gắn trực tiếp chúng vào một URI. Vì thế trong phương thức GET nội dung của form người dùng có thể nhìn thấy như một URI có cấu trúc, ngược lại đối với phương thức POST, nội dung của form được gửi bên trong một thông điệp HTTP và người dùng không được nhìn thấy chúng.

Việc sử dụng phương thức GET cung cấp cho người dùng cơ hội để đánh dấu một trang nào đó cùng với URI có cấu trúc và vì thế có thể ‘nhảy’ trực tiếp tới những phần sau của nó; điều này là không thể khi sử dụng phương thức POST. Lựa chọn GET hay POST nên được xác định bằng ứng dụng.

Hãy cùng chúng tôi xem đoạn mã của URI khi phương thức GET được sử dụng. Đoạn mã URI có dạng sau:

action?name1=valuel&name2=value2&name3=value3
    

Action là một URI đã xác định trong thuộc tính ACTION của thẻ FORM, hoặc URI văn bản hiện tại nếu thuộc tính ACTION không được chỉ ra. Các cặp name=value là giá trị đầu vào mà người dùng đã nhập trong các trường INPUT của form. Với những trường INPUT mà người dùng không nhập dữ liệu cho nó, phần tên vẫn được biểu diễn kèm với giá trị rỗng (name=). Cụ thể, xem xét form nhập vào password ở cuối phần trước. Giả sử rằng người dùng nhập giá trị ‘John Doe’ vào trường username, và ‘secret’ vào password. Thì request URI là:

page.jsp?username=John+Doe&password=secret

Dữ liệu đầu vào được nhập qua form có thể chứa những ký tự ASCII thông thường, ví dụ những ký tự trống, nhưng URIs phải là một xâu liên tục không chứa ký tự trống. Vì thế, các ký tự đặc biệt như ký tự trống, ‘=’, và những ký tự không có khả năng in ra phải được mã hoá một cách đặc biệt. Để tạo ra một URI có các trường được mã hoá, chúng ta thực hiện các bước sau:

  1. Chuyển đổi tất cả các ký tự đặc biệt trong phần name và giá trị là ‘%xyz’, trong đó ‘xyz’ là giá trị mã ASCII của ký tự theo hệ 16. Những ký tự đặc biệt bao gồm =, &, %, +, và những ký tự không thể in được. Ghi nhớ rằng chúng ta có thể mã hoá tất cả các ký tự theo giá trị ASCII của chúng.
  2. Chuyển đổi tất cả các ký tự trống thành ký tự ‘+’.
  3. Gán phần tên và giá trị tương ứng bằng cách sử dụng dấu ‘=’ và sau đó dán các cặp tên-giá trị cùng với dấu ‘&’ để tạo ra một request URI của form:
action?namel=valuel&name2=value2&name3=value3

Lưu ý thứ tự xử lý các thành phần đầu vào của Form HTML ở lớp giữa, chúng ta cần thuộc tính ACTION của thẻ FORM để gán nó tới trang, script, hoặc chương trình phần mềm sẽ xử lý những giá trị của những trường mà người dùng nhập vào form. Chúng ta sẽ bàn về các cách chương trình nhận giá trị của form trong Phần 7.1 và 7.3.

JavaScript

JavaScript là một ngôn ngữ kịch bản ở lớp máy trạm nơi mà chúng ta có thể thêm các chương trình chạy trực tiếp trên máy trạm (ví dụ, ở máy chạy trình duyệt Web). JavaScrip thường được sử dụng cho những tính toán ở máy trạm:

  • Dò tìm trình duyệt: JavaScrip có thể được sử dụng để dò tìm các loại trình duyệt và tải về những trang Web cụ thể.
  • Xác nhận tính hợp lệ của form: JavaScrip được sử dụng để thực hiện những kiểm tra tính nhất quán đơn giản trên những trường của form. Ví dụ, một chương trình JavaScrip có thể kiểm tra một trường trong form cho phép nhập địa chỉ email xem có ký tự @ trong đó không, hoặc tất cả các trường của form đều yêu cầu người sử dụng nhập dữ liệu vào.
  • Điều khiển trình duyệt: Bao gồm những trang đang được mở, ví dụ một trang Web quảng cáo chứa nhiều trang Web bên trong nó, điều này có thể được lập trình bằng JavaScrip.

JavaScrip được nhúng vào văn bản HTML bằng một thẻ đặc biệt, thẻ SCRIPT. Thẻ SCRIPT có thuộc tính LANGUAGE, chỉ định ngôn ngữ mà script được viết. Với JavaScrip, chúng ta phải thiết đặt thuộc tính ngôn ngữ của nó. Một thuộc tính khác của thẻ SCRIPT là SRC, nó dùng để chỉ định một file ở bên ngoài được nhúng vào văn bản HTML. Thường thì file mã nguồn của JavaScrip có đuôi là ‘.js’. Đoạn mã lệnh sau đây chỉ ra có một file JavaScrip được nhúng trong một văn bản HTML:

<SCRIPT LANGUAGE=" JavaScript" SRC="validateForm.js"> 
    </SCRIPT>
    

Thẻ SCRIPT có thể được đặt bên trong chú thích của HTML để đoạn mã chương trình JavaScrip không hiển thị nguyên văn trên các trình duyệt Web. Sau đây là một đoạn ví dụ JavaScrip khác giúp tạo ra hộp thoại pop-up cùng với một lời chào. Chúng ta đặt đoạn mã lệnh JavaScrip bên trong chú thích HTML vì những lý do vừa đề cập.

<SCRIPT LANGUAGE="JavaScript" >
     
    </SCRIPT>
    

JavaScrip cung cấp hai cách để tạo chú thích: chú thích cho một dòng sử dụng ký hiệu ‘//’ ở đầu dòng đó, và chú thích cho nhiều dòng sử dụng ‘/*’ để bắt đầu và ‘*/’ để kết thúc.

Biến trong JavaScrip có thể mang giá trị số, logic (true hoặc false), xâu ký tự, và một số kiểu dữ liệu khác. Các biến dùng chung (global) được khai báo cùng với từ khoá var, và chúng có thể được sử dụng ở bất kỳ đâu bên trong văn bản HTML. Những biến địa phương (local) dùng cho các hàng JavaScrip không cần được khai báo. Các biến không có kiểu cố định nhưng hoàn toàn có thể mang kiểu của dữ liệu được gán cho nó.

JavaScrip thường sử dụng những phép gán (=, +=, vv…), các phép toán số học (+, -, *, /, %), các phép so sánh (==, !=, >=, vv…), và những phép toán logic (&& cho phép AND, || cho phép OR, và ! cho phép NOT). Xâu ký tự có thể được nối dài sử dụng phép ‘+’ xâu. Kiểu dữ liệu của đối tượng xác định phép toán nào được sử dụng; ví dụ 1+1 là 2, vì chúng là phép cộng hai số, ngược lại “1”+ “1” là “11” vì chúng là phép nối xâu ký tự. Một số câu lệnh thường gặp trong JavaScrip là: các phép gán, các câu lệnh điều kiện (if (điều kiện) {các câu lệnh;} else {các câu lệnh;}), và các câu lệnh lặp (for-loop, do-while, và while-loop).

JavaScrip cho phép chúng ta tạo ra các hàng sử dụng từ khoá function:

function f (arg1 , arg2) {các câu lệnh;}. 

Chúng ta có thể gọi các hàm từ chương trình JavaScrip, và các hàm có thể trả về giá trị sử dụng từ khoá return.

Chúng ta tổng kết phần giới thiệu về JavaScrip này với một ví dụ về hàm JavaScrip để kiểm tra trường loginpassword của một form HTML là không rỗng. Hình 12 chỉ ra hàm JavaScrip này và form HTML. Đoạn mã này là một hàm testLoginEmpty() dùng để kiểm tra xem có trường nào trong form LoginForm bị rỗng không. Hàm testLoginEmpty được kiểm tra trong một form event handler. Một event handler là một hàm được gọi nếu một sự kiện nào đó xảy ra trên một đối tượng trong Website. Even handler chúng ta sử dụng ở đây là onSubmit, nó được gọi nếu nút submit được nhấn (hoặc nếu người dùng nhấn trở lại vào một trường text trong form). Nếu event handler trả về giá trị true, thì nội dung của form được gửi (submit) tới máy chủ, ngược lại nội dung này sẽ không được gửi tới máy chủ. JavaScrip có nhiều chức năng hơn là những kiến thức cơ bản được giới thiệu trong phần này; những điều thú vị về JavaScrip bạn có thể tìm hiểu thêm trong những phần tham khảo được giới thiệu ở cuối chương.

Kiểm tra form bằng JavaScript

Style Sheets

Các máy trạm khác nhau có chế độ hiển thị khác nhau, vì lẽ đó chúng ta cần nhiều cách khác nhau để hiển thị cùng một thông tin. Ví dụ, trong một trường hợp đơn giản nhất, chúng ta cần sử dụng kích thước và màu chữ khác nhau để đảm bảo sự tương phản cao trên màn hình đen- trắng. Ví dụ phức tạp hơn, chúng ta có thể c

0