CHƯƠNG II: TÌM HIỂU HTML FORM HTML FORM I.Giới thiệu . Khi muốn giao tiếp giữa HTML và CGI script thì bạn không thể không biết đến form, form là công cụ phổ biến nhất để chuyển dữ liệu từ HTML đến CGI script (client lên server). Thông thường, khi khi viết một script, người ta thiết kế một FORM sao cho nó cung cấp đầy đủ những thông tin mà script cần để xử lý. Sau đây chúng ta sẽ tìm hiểu về FORM cũng như cách liên kết của nó với script. II.Cấu trúc của một FORM. Một FORM được mở đầu bằng thẻ <FORM > và kết thúc bằng thẻ </FORM>. Trong FORM thường có -Thuộc tính : form thường có 3 thuộc tính, 3 thuộc tính này đều nằm trong thẻ FORM mở đầu của một FORM : action, method, enctype. -Các thẻ được dùng trong form : input, select, textarea, hn, p, hr, dir, dl, menu, ol, ul, address, blockquote, [isindex], pre. -FORM : có 3 thành phần chính :TEXTAREA, SELECT, INPUT. -FORM có thể được dùng trong các thẻ : blockquote, body, dd, li. 1.Các thuộc tính: Khi tạo form, công việc quan trọng đầu tiên là xác định thuộc tính của nó. Trong 3 thuộc tính của form, thuộc tính Action là không thể thiếu. -Action=“URL” : URL chỉ đến script mà form sử dụng. Ngoài ra nó cũng có thể là một mailto url, khi đó nội dung của form sẽ được mail đến địa chỉ trong url. -Method=“Get” or “Post” :chỉ ra method là Post hay Get, Get là method mặc định. -Enctype=“Mime_type”:chỉ ra loại dữ liệu sẽ gởi đi. Giá trị mặc định là application/x-www-form-urlencode. Có một số kiểu MIME_type cơ bản, các kiểu này đã được chúng tôi giới thiệu trong phần các kiểu MIME_type cơ bản, ngoài ra còn có một số kiểu MIME_type khác nữa, ví dụ như kiểu "multipart/form-data" mà nó được những trình duyệt về sau này hỗ trợ. Nhờ có Mime_type này mà chúng ta có thể dùng web để upload file lên server. Trong một trang, bạn có thể sử dụng nhiều form nhưng không được lồng chúng vào nhau. 2.Các thành phần chính của một form. Một form, thông thường có 3 thành phần chính: - Textarea -Select -Input 2.1.Textarea. Được dùng bằng cặp thẻ <Textarea> </Textarea>.Bên trong chứa các ký tự, thẻ này được dùng lồng vào trong form. Các thuộc tính của textarea -Name: Định nghĩa tên của thành phần, thuộc tính này luôn luôn phải có . -Rows: Cho biết số hàng của hộp văn bản. -Cols : Cho biết số cột của văn bản. -Wrap: Chỉ ra cách xử lý word_wraping (canh chiều dài của dòng văn bản theo kích thước của hộp văn bản) trong hộp thoại. Nếu Wrap=“off”, chức năng word_wraping bị cấm. Nếu wrap=“vitual”, chức năng này được bật lên, khi bạn gõ văn bản vào, bạn sẽ thấy con trỏ tự động xuống hàng mỗi khi nó chạy đến biên của hộp văn bản, ký tự newline (0A hex) tự động được thêm vào nhưng không được gửi đi cùng với form. Nếu Wrap=“physical”, chức năng này cũng được bật và hoạt động như trường hợp thứ 2, nhưng ký tự newline sẽ được gửi đi cùng với form. Thuộc tính này chỉ có tác dụng đối với những browser hỗ trợ html 3.0 về sau. Văn bản nằm giữa hai thẻ <Textarea>và </Textarea>sẽ được thể hiện như đoạn văn bản mặc định trong vùng dữ liệu . vd: <Textarea> name=“comments” rows=“4” cols=“40”> </Textarea>. 3.Select Được dùng với cặp thẻ <Select> </Select >, cặp thẻ này có thể lồng trong form hay bất kỳ thành phần nào của form ngoại trừ Textarea và Select. -2- Select có những thuợc tính sau -Name : tên của thành phần. -Size : cho biết số phần tử sẽ hiển thị, giá trị mặc định là 1, do đó danh sách lựa chọn thường được thể hiện dưới dạng một pop-up menu. -Multiple:Nếu thuộc tính này được thiết lập, user có thể chọn cùng lúc nhiều phần tử, ngược lại, user chỉ có thể chọn được một phần tử mà thôi Thuộc tính Size có thể không có . Khi sử dụng Select, bạn có thể dùng thêm Option <Option> </Option> Bên trong chứa các ký tự , có thể được sử dụng lồng vào Select. Các thuộc tính : -Disable : đánh một chọn lựa bị cấm. Khi hiển thị, chọn lựa này sẽ bị che mờ Disable chỉ được hỗ trợ bởi các browser có hỗ trợ HTML 3 -Selected : đánh dấu chọn lựa này đã được chọn, nếu thuộc tính Multiple được bật trong select, bạn có thể đánh dấu Selected nhiều chọn lựa cùng lúc. Nó thường được dùng để đánh dấu các lựa chọn mặc định. -Value : chỉ ra giá trị được gán cho lựa chọn, nếu không có thì nội dung của thư mục option sẽ được gửi đi thay cho value. 4.Input. Mở đầu bằng thẻ <Input>, thẻ này có thể dùng trong bất cứ thành phần nào khác của form ngoại trừ textarea và select. Các thuộc tính : -Align : có thể là một trong 3 giá trị top, middle , bottom dùng để canh lề ảnh với các văn bản xung quanh, thuộc tính này chỉ có ý nghĩa với Type=“image” . -Name : gán tên biến cho dữ liệu của thành phần này. Giá trị của thuộc tính do user lựa chọn . -Type : định ra một trong những giá trị sau checkbox, hidden, image, password, radio, reset, submit, text, file. -Checked : chỉ ra một nút radio, hay một checkbox có được chọn hay không. -Maxlength : chỉ ra chiều dài tối đa mà hộp thoại văn bản có thể chứa , thuộc tính này chỉ có ý nghĩa với input có type=“text” hay type=“password”. -Size : chỉ ra kích thước thực sự của hộp thoại văn bản. III.Multipart Message Theo yêu cầu của chương trình thì chúng ta phải đưa một file qua form lên server. Các trình duyệt từ các version sau ngoài MIME_type cơ bản còn cung cấp cho chúng ta các MIME-type như Multipart/x-mixed-replace hay Multipart/form-data, đó là các kiểu -3- dữ liệu truyền thông đặc biệt. Trong chương này, chúng ta cũng gặp phải một loại INPUT của Form là "file", chỉ sử dụng được với ENCTYPE là Multipart/form-data. Vậy chúng ta thử tìm hiểu xem một Multipart Message có cấu trúc như thế nào. Multipart Message là một message có nhiều phần mà mỗi phần là một message và được gọi là mutipart/mixed message. Các phần trong message cách nhau bằng một biên gọi là boundery, boundery này phải được khai báo trong field Content-type của header, dạng khai báo như sau : Content-type: multipart/mixed; boundery=randomstring Trong đó randomstring là một chuỗi ký tự bất kỳ. Mỗi phần trong message được đánh dấu bằng chuỗi randomstring. Trong từng phần sẽ có dòng khai báo loại dữ liệu nó chứa. Kế dòng khai báo này phải là một dòng trống chỉ chứa cặp ký tự CR-LF để đánh dấu đã chấm dứt phần header và bắt đầu phần dữ liệu. Kết thúc phần cuối cùng cũng là kết thúc của message, nó được đánh dấu bằng chuỗi ký tự randomstring Dưới đây là ví dụ khuôn mẫu của một multipart message : MIME-Version: 1.0 CONTENT-type: multipart/mixed; boundery=23xx1211 [CR-LF] 23xx1211 Content-type:text/html [CR-LF] …. Nội dung tài liệu html …. 23xx1211 Content-type:audio/aiff [CR-LF] …. Nội dung âm thanh …. 23xx1211— Đây chỉ là một ví dụ đơn giản, message gồm hai phần, phần thứ nhất là một file văn bản dạng HTML, phần thứ hai là một file âm thanh dạng AIFF. Mô hình Multipart Message này được Netscape ứng dụng phát triển thành hai MIME- type khác là Multipart/x-mixed-replace và Multipart/form-data. Multipart/form-data được phát triển để hỗ trợ cho việc đẩy dữ liệu các Form phức tạp, bao gồm cả các file ở máy Client lên Server. TÌM HIỂU PERL -4- Như trong phần phân tích chúng ta đã nói, hệ thống của chúng ta ngoài những giao diện để giao tiếp với người sử dụng còn những chương trình gọi là script nằm trên server dùng để xử lý các yêu cầu mà người sử dụng đưa vào từ các giao diện. Theo yêu cầu của đề thì những chương trình đó chúng tôi sẽ viết bằng ngôn ngữ PERL. Sau đây chúng tôi xin được giới thiệu về ngôn ngữ này.Tuy nhiên, do thời gian có hạn nên những điều chúng tôi trình bày trong chương này không phải là đầy đủ mà chỉ nhằm đưa ra một số khái niệm màchúng tôi cho là cần thiết về ngôn ngữ này. A.Các khái niệm ban đầu. Perl viết tắt của Practical-Extraction and Report- Language là một ngôn ngữ lập trình do Larry Wall tạo ra với mục đích chung quy là tạo ra những bản báo cáo một cách nhanh chóng và dễ dàng. Do có nhiều toán tử cũng như hàm để hỗ trợ riêng cho xử lý text nên Perl khác biệt với các ngôn ngữ khác là có tính chất xử lý text rất mạnh, có thể xử lý dễ dàng những tác vụ giống như C hoặc UNIX shell thường làm trong việc viết một Script nhưng có thể ngắn gọn và đơn giản hơn. Không giống như các trình biên dịch C hay C++, Perl là một trình thông dịch . B.Chi tiết Vì là một ngôn ngữ lập trình cho nên Perl cũng có đầy đủ các công cụ hỗ trợ cho nó như tất cả các ngôn ngữ lập trình khác như :biến, dãy, danh sách, cấu trúc điều khiển v.v Trong phần này, chúng ta sẽ tìm hiểu về những công cụ sau : -Scalar data -Dãy và danh sách dữ liệu -Cấu trúc điều khiển -Associative array -Regular expressions -Hàm -Filehandles -File kiểm tra -Định dạng I.Scalar data Scalar data là từ chỉ một kiểu dữ liệu bao gồm cả số lẫn chuỗi ký tự, Perl không phân biệt 2 loại dữ liệu trên . -5- Biến vô hướng được sử dụng với các toán tử. Sự vận dụng các biến vô hướng này với các toán tử sẽ sinh ra những giá trị vô hướng. Bạn có thể đọc các giá trị vô hướng này từ các file chứa nó cũng như có thể ghi chúng vào các file đích . 1.Floats , Integer, Literals. Khi làm việc với số, ta nhận thấy có một số các số được viết khác nhau như 4 , 2.5, -3.453e32. Trong ngôn ngữ Perl, các số được chia thành 2 dạng : -Số nguyên (integers). -Số thực (floats). Trong Perl thì số có giá trị là kiểu integer còn ngược lại là float, Perl xem cả integer và float đều là dạng literal. Khi thực thi chương trình thì một giá trị của một biến sẽ được lưu ở kiểu literal. 1.1.Integers. Số nguyên được biểu diễn dựa trên các ký hiệu quen thuộc : 18 -32 100000324. nhưng nên lưu ý là bạn không thể bắt đầu một số integer bằng số “0 “ vì Perl không thể phân biệt số trong hệ thập lục phân và hệ thập phân trong trường hợp cả 2 đều bắt đầu bằng số “0” . 1.2.Chuỗi ký tự. Những ký tự được dùng để tạo thành những chuỗi ký tự, bao gồm 8 bit dữ liệu. Trong Perl, ta có một bộ 256 ký tự đã được định nghĩa. Khả năng xử lý chuỗi của Perl bất chấp những ký tự đã tạo thành đã trở thành điểm mạnh của Perl khi ứng dụng nó để lập trình CGI. Trong Perl, có 2 loại chuỗi ta cần lưu ý là chuỗi trong dấu ngoặc đơn và loại chuỗi trong dấu ngoặc kép. 1.2.1.Loại chuỗi trong dấu ngoặc đơn . Một chuỗi được đặt trong dấu ngoặc đơn như ‘hello’ được gọi là chuỗi ngoặc đơn. Cặp dấu này sẽ chỉ cho Perl biết đâu là bắt đầu và kết thúc của một chuỗi. Nếu bạn muốn đặt những dấu ngoặc đơn trong một chuỗi, bạn phải đặt trước các dấu đó những dấu “\” và nếu bạn muốn đặt những dấu “\” vào trong chuỗi thì bạn cũng phải đặt thêm vào trước chúng những dấu “\”. -6- 1.2.2.Loại chuỗi trong dấu ngoặc kép. Một chuỗi được đặt giữa cặp dấu ngoặc kép như “hello” được gọi là chuỗi ngoặc kép. Trong chuỗi ngoặc kép thì dấu “\” được dùng để chỉ ra một số các ký tự điều khiển .Ví dụ như : “hello!\n”-sau khi chuỗi hello được đưa ra thì những gì sau nó sẽ được biểu diễn trên một hàng mới v v. Sau đây là một số những ký tự điều khiển thường dùng. \n bắt đầu một hàng mới \r dấu hiệu trở lại \t chứa ra một khoảng trắng \b cách ra một ký tự \v chừa ra một khoảng trắng theo chiều dọc \a báo chuông \e dấu hiệu thoát 2.Toán tử. Trong Perl, một toán tử tạo nên một giá trị mới gọi là kết quả. Các toán tử trong Perl có thể làm việc với cả số lẫn chữ và độ ưu tiên cho các toán tử trong Perl cũng được xét bình thường như trong các ngôn ngữ khác. 2.1.Toán tử số học. Những toán tử số trong Perl có rất nhiều công dụng, nhưng cũng giống như các ngôn ngữ khác, Perl cũng sử dụng những ký hiệu đặc biệt đã được quy định để thể hiện các toán tử. Một toán tử sẽ thực hiện hành vi của nó trên các số được thể hiện bằng giá trị nguyên (không phải giá trị thực ) và sẽ trả về giá trị theo nội dung phép tính đó. vd. 25%4 phép tính trên sẽ trả về giá trị là 1. Sau đây là bảng tham khảo một số toán tử . Toán tử Tác vụ Ví dụ + - cộng trừ 1+2=3 1-2=-1 -7- * / % == >= > != < <= nhân chia môđun bằng lớn hơn hay bằng lớn hơn không bằng nhỏ hơn nhỏ hơn hay bằng 2*2=4 4/2=2 2.3/3.2=0 2==2 3>=2 4>2 2!=1 1<2 2<=3 2.2.Toán tử chuỗi. Đây là những toán tử làm cùng công việc với những toán tử số học, nhưng nó không dùng những ký tự đặc biệt để thể hiện toán tử, mà nó sử dụng những ký tự để làm việc này. Sau đây là một số toán tử chuỗi . Toán tử Hành vi ví dụ . eq ne lt gt le ge x Nối Bằng Không bằng Nhỏ hơn Lớn hơn Nhỏ hơn hay bằng Lớn hơn hay bằng Lập lại chuỗi “số” . “một”=“số một” “njk” eq “njk” “njk” ne “hgf” “30” lt “7” “50” gt “300” “ten” le “ten” “hoang” ge “hoang” “hai” x 2=“haihai” -8- . name=“comments” rows= 4 cols= 40 ”> </Textarea>. 3.Select Được dùng với cặp thẻ <Select> </Select >, cặp thẻ này có thể lồng trong form hay bất kỳ thành phần nào của form. trúc như thế nào. Multipart Message là một message có nhiều phần mà mỗi phần là một message và được gọi là mutipart/mixed message. Các phần trong message cách nhau bằng một biên gọi là boundery,. phải là một dòng trống chỉ chứa cặp ký tự CR-LF để đánh dấu đã chấm dứt phần header và bắt đầu phần dữ liệu. Kết thúc phần cuối cùng cũng là kết thúc của message, nó được đánh dấu bằng chuỗi