24/05/2018, 16:05

Đối tượng Request

Mô hình nhập liệu từ người dùng và tiếp nhận dữ liệu của webserver: 2 con đường. 1. POST: Gửi cả một form nhập dữ liệu tới webserver 2. GET : Gửi thông qua liên kết URL Nhận (lấy / đọc) về các giá trị khi người dùng Submit ...

Mô hình nhập liệu từ người dùng và tiếp nhận dữ liệu của webserver: 2 con đường.

1. POST: Gửi cả một form nhập dữ liệu tới webserver

2. GET : Gửi thông qua liên kết URL

Nhận (lấy / đọc) về các giá trị khi người dùng Submit (gửi) đi. (Ví dụ khi người dùng điền các thông tin đăng ký tài khoản và nhấn vào nút Submit thì thông tin đó sẽ được nhận về thông qua đối tượng Request).

Có hai cách để người dùng gửi thông tin đi  Có 2 cách tương ứng để tiếp nhận (đọc) .

Cách 1: Người dùng nhập thông tin trong các textbox, sau đó gửi các thông tin trong các textbox này tới một trang asp khác. Khi đó người ta gọi cách gửi đó là gửi theo kiểu “POST”.

Cách 2: Thông tin có thể gửi tới một trang khác bằng cách gắn vào sau mỗi URL của trang đó. Ví dụ để gửi hai thông tin là HoTen và Tuoi với giá trị tương ứng là T08A và 2 cho trang XuLy.asp thì có thể thực hiện như sau:

XuLy.asp?HoTen=T08A&Tuoi=2

Cú pháp để gắn vào sau trang nhận như sau:

TrangNhan.asp ? Thuộc_Tính 1 = Giá trị1 & Thuộc_Tính 2 = Giá trị 2 & ….

Cách gửi này gọi là phương thức gửi kiểu ”GET”

Thuộc tính Form

Dùng để lấy giá trị của từng thuộc tính mà trang khác gửi tới bằng phương thức POST

Cú pháp:

Request.Form(“Tên_Thuộc_Tính_Cần_Lấy”)

Ví dụ: Trang1.asp có 2 ô textbox tên là HoTen và Tuoi. cho phép người dùng nhập vào và khi người dùng gửi đi (Submit) tới trang Trang2.asp. thì trang2.asp sẽ hiển thị lời chào tới người đó. Nội dung 2 file này sẽ như sau:

Trang1.asp
<HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Gửi dữ liệu sang trang khác</title></head> <BODY>Trang nhập thông tin : <br><FORM name="NhapLieu" action ="Trang2.asp" method="post"> Họ và tên : <Input type ="text" name="HoTen"> <br> Tuổi : <Input type="text" name ="Tuoi"> <br> <Input type="Submit" value="Gửi đi" name="cmdGui"></FORM></BODY></HTML>
Trang2.asp
<HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Nhận dữ liệu gửi từ trang khác </title></head> <BODY><% Dim HT , Tuoi HT = Request.Form(“HoTen”) Tuoi = Request.Form(“Tuoi”) Response.write(“Chào bạn “ & HT &”. Tuổi của bạn : “ &Tuoi)%></BODY></HTML>

Chú ý:

+ Muốn gửi thông tin trong các điều khiển (các textbox, textarea, checkbox, list…) đi thì các điều khiển đó phải đặt trong một Form (cặp thẻ <Form> …. </Form>) nào đó.

+ Trang web tiếp nhận thông tin đó sẽ được đặt trong thuộc tính Action của Form.

+ Phương thức gửi đi được chỉ định thông qua thuộc tính method. Đặt cho thuộc tính này giá trị hoặc là POST hoặc là GET.

+ Một trang có thể gửi (Post) đến chính trang đó. Điều này thường được áp dụng khi nội dung trang web là đơn giản (ví dụ trang Login), còn đối với các trang phức tạp (nhiều xử lý) thì nên gửi đến một trang riêng.

Ví dụ 2: Cho người dùng nhập vào năm sinh, sau đó tính toán và hiển thị tuổi của người đó. Cách thức ở đây là : Trang cho người dùng nhập năm sinh và trang để hiển thị kết quả là giống nhau.

Trang TinhTuoi.asp - Version 1
<%@language = vbscript %><HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Tinh tuoi</title></head><BODY><%IFRequest.Form("NamSinh")="" THENResponse.write (“<form name=Form1 action='TinhTuoi.asp' method=POST>”) Response.write (“Nhap nam sinh cua ban : <Input type=text name=’NamSinh’>”) Response.write (“<Input type=Submit value=’Gui di’>”) Response.write (“</form>”)ELSE Response.write ("Tuoi cua ban la : " & (year(now) - Request.Form("NamSinh")))END IF%></BODY></HTML>
Trang TinhTuoi.asp - Version 2
<%@language = vbscript %><HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Tinh tuoi</title></head><BODY><%IFRequest.Form("NamSinh")="" THEN%> <FORM name=Form1 action="TinhTuoi.asp" method=POST> Nhap nam sinh cua ban : <Input type=text name="NamSinh" > <Input type=Submit value="Gui di"> </FORM><table><% ELSEResponse.write("Tuoi cua ban la : " & (year(now) - Request.Form("NamSinh"))) END IF%></BODY></HTML>

Version 3 – Sử dụng các trang xử lý riêng biệt

  • ý tưởng: Ta tách làm 2 trang, một trang "Chuyên" hiển thị form nhập năm sinh, sau đó gửi tới một trang "chuyên" xử lý và hiển thị kết quả.
  • Trang hiển thị form nhập do không có xử lý gì, do vậy ta chỉ cần tạo trang đó là trang HTM thông thường – NhapNamSinh.htm.
  • Trang xử lý do phải dùng các câu lệnh ASP nên ta sẽ tạo trang ASP- TinhTuoi.asp
Trang NhapNamSinh.htm
<HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Nhap nam sinh </title></head><BODY> <FORM Action="TinhTuoi.asp" method=POST> Nhap nam sinh cua ban : <Input type=text name=NamSinh> <Input type=Submit value="Gui di"> </FORM> </BODY></HTML>
Trang TinhTuoi.asp
<%@language = vbscript %><HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Tinh tuoi</title></head><BODY><%IFRequest.Form("NamSinh")= "" THENResponse.Redirect("NhapNamSinh.htm")ELSEResponse.write ("Tuoi cua ban la: " & (year(now)-Request.Form("NamSinh")))END IF%></BODY></HTML>

Cách (version) nào dễ dàng hơn đối với bạn ? 3 version có ưu và nhược điểm gì ? rút KL !

Thuộc tính QueryString

Dùng để đọc dữ liệu do trang khác gửi tới thông qua phương thức GET (Thường là gửi dữ liệu bằng cách gắn vào ngay sau liên kết - URL).

+ Cú pháp đọc dữ liệu gửi đến thông qua phương thức này như sau:

Request.QueryString("Tên_Thuộc_Tính_Cần_Lấy")

+ Ví dụ 1 : Gửi tới trang TinhTuoi.ASP năm sinh (đặt tên là NamSinh) có giá trị là 1980 ở dạng GET.

Khi đó, Hyperlink gửi đi có dạng :

http://www.T08A.com/TinhTuoi.asp?NamSinh=1980

Dòng địa chỉ trên có thể tạm dịch là "Gửi một thông tin có tên là NamSinh với giá trị 1980 đến trang TinhTuoi.ASP

Chú ý: Để gửi dữ liệu theo kiểu GET thì có thể gửi bằng cách gõ trực tiếp vào hộp địa chỉ (address) của trình duyệt hoặc có thể xây dựng một trang riêng, sau đó mới gửi.

Để tiếp nhận và xử lý dữ liệu này, nội dung trang TinhTuoi.asp sẽ như sau:

TinhTuoi.asp - Version 1
<%@language = vbscript %><HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Tinh tuoi</title></head><BODY><%IFRequest.QueryString("NamSinh")= "" THENResponse.write ("Bạn gõ địa chỉ có dạng: Domain/TinhTuoi.asp?NamSinh=So")ELSEResponse.write ("Tuổi của bạn: " &(year(now)-Request.QueryString("NamSinh")))END IF%></BODY></HTML>

Với phiên bản này, rõ ràng khi muốn gửi dữ liệu cho một trang chúng ta phải gõ một cách thủ công !

 Có thể gửi theo cách này nhưng dễ dàng được hơn không ? Ví dụ như cho người dùng nhập vào các ô textbox chẳng hạn ?

TinhTuoi.asp - Version 2
<%@language = vbscript %><HTML><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>Tinh tuoi</title></head><BODY><%IFRequest.QueryString("NamSinh") = "" THEN%><FORM name=Form1 action="TinhTuoi.asp" method=GET> Nhap nam sinh cua ban : <Input type=text name="NamSinh" > <Input type=SUBMIT value="Gui di"></FORM><%ELSEResponse.write ("Tuổi của bạn : " & (year(now)-Request.QueryString("NamSinh")))END IF%></BODY></HTML>

Kết quả hiển thị trên trình duyệt:

Khi lần đầu tiên mở trang TinhTuoi.asp

Sau khi nhập 1977 vào ô textbox (hãy để ý trên thanh địa chỉ)

Ví dụ 2: Giả lập một ứng dụng để hiển thị các sản phẩm và cho phép người dùng xem chi tiết mặt hàng khi người dùng click chọn hyperlink tương ứng.

Trong ứng dụng giả lập này, ta sẽ hiển thị 3 đầu mục sản phẩm có dạng :

HDD Seagate 40 GB Xem chi tiết
HDD Seagate 80 GB Xem chi tiết
HDD Seagate 160 GB Xem chi tiết

Khi người dùng click vào Hyperlink "Xem chi tiết" ở bên cạnh mỗi sản phẩm thì ta hiển thị thông tin tương ứng về sản phẩm đó.

 Khi người dùng chọn một mục thì cần phải có thông tin gửi trả lại trang xử lý để biết họ đã chọn sản phẩm nào để hiển thị thông tin phù hợp  ẩn chứa trong mỗi Hyperlink phải có những thông tin cần thiết, ví dụ một mã sản phẩm (MaSanPham) chẳng hạn  Dùng hình thức gửi GET là phù hợp !

Trang ShowProduct.asp - Hiển thị sản phẩm và chi tiết sản phẩm: 2 in 1
<HTML><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Hien thi san pham</title></head><BODY><% IFRequest.QueryString("MaSanPham") = "" THEN %> <table border=0 cols=2 awidth="100%"> <TR><TD>HDD Seagate 20 GB </td> <TD> <a href='ShowProduct.asp?MaSanPham=hdd20'>Xem chi tiết</a> </td> </TR><TR><TD>HDD Seagate 40 GB </td> <TD> <a href='ShowProduct.asp?MaSanPham=hdd40'>Xem chi tiết</a> </td> </TR><TR><TD>HDD Seagate 80 GB </td> <TD> <a href='ShowProduct.asp?MaSanPham=hdd80'>Xem chi tiết</a> </td> </TR> </table> <%ELSESELECTCASERequest.QueryString("MaSanPham") CASE "hdd20" Response.write("ổ cứng Seagate 20 GB, giá 40 $") CASE "hdd40" Response.write("ổ cứng Seagate 40 GB, giá 80 $") CASE "hdd80" Response.write("ổ cứng Seagate 80 GB, giá 100 $") ENDSELECTENDIF%></BODY></HTML>

??? Request.QueryString("MaSanPham") = "" có nghĩa gì ?

Phiên bản ở trên : Sử dụng một trang vừa hiển thị vừa xử lý dữ liệu gửi đến (kiểu 2 in 1).

Ta có thể sử dụng cơ chế 1 in 1, tức là: Trang hiển thị riêng và trang hiển thị chi tiết riêng:

Trang HienThiSP.htm
<HTML><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Hiển thị sản phẩm</title></head><BODY><table border=0 cols=2 awidth="100%"> <TR><TD>HDD Seagate 20 GB </td> <TD> <a href=' ShowDetail.asp?MaSanPham=hdd40">Xem chi tiết</a> </td> </TR><TR><TD>HDD Seagate 80 GB </td> <TD> <a href='ENDIF%></BODY></HTML>

 Nhận xét : Gửi dữ liệu theo kiểu POST khi nào ? và GET khi nào ?

Một số bài tập: (Sử dụng cả phương pháp gửi POST và GET)

  1. Viết trang web tra cứu từ điển. Cho người dùng nhập vào một từ tiếng Anh, trang web sẽ hiển thị nghĩa tiếng việt tương ứng.
  2. Viết trang web thực hiện tính toán với các phép toán, hàm đơn giản.
0