Bài giảng Quản lý trạng thái - Nguyễn Hà Giang

pptx 59 trang huongle 3800
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Quản lý trạng thái - Nguyễn Hà Giang", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxbai_giang_quan_ly_trang_thai_nguyen_ha_giang.pptx

Nội dung text: Bài giảng Quản lý trạng thái - Nguyễn Hà Giang

  1. Quản lý trạng thái Nguyễn Hà Giang Nguyen Ha Giang
  2. Nội dung 2  Đối tượng Request - Response  Quản lý trạng thái  View state  Session state  Cookie  Application state  Query string  Cross-page Postback Nguyen Ha Giang
  3. Request-Response 3 HttpContext The HttpContext class contains objects that are specific to current app request HttpRequest HttpResponse Contains the response that is contains information about the sent to the client, which includes current request like cookies and all the rendered output and browser information cookies Nguyen Ha Giang
  4. Đối tượng Request 4  Request là một thể hiện của lớp HttpRequest, Browser dùng Request object để gửi thông tin cần thiết tới Server  Dùng để đọc thông tin từ client gửi lên (header, query string, cookies, ) Nguyen Ha Giang
  5. Đối tượng Request 5  RequestType: trả về phương thức truyền dữ liệu từ client đến server gồm 2 phương thức POST và GET  Request.Form(“đối tượng cần đọc”): đọc giá trị phần tử gởi theo POST  Request.QueryString(“đối tượng cần đọc”): đọc giá trị của một phần tử được gởi theo phương thức GET Nguyen Ha Giang
  6. Request - POST 6  Có giao diện Nguyen Ha Giang
  7. Request - POST 7 Nguyen Ha Giang
  8. Request - POST 8  Lấy giá trị của UserName và Password trên form Nguyen Ha Giang
  9. Request - GET 9  Lấy dữ liệu từ form  Nếu không có giá trị thì trả về là null Nguyen Ha Giang
  10. Request - GET 10 Nguyen Ha Giang
  11. Request - GET 11  Tại Server, CheckUser.aspx lấy giá trị của UserName và Password Nguyen Ha Giang
  12. Request - GET 12  Ví dụ  Tại ReadNews.aspx muốn lấy giá catID and NewsID, sử dụng cú pháp Nguyen Ha Giang
  13. Đối tượng Response 13  Đối tượng gởi nội dung bất kỳ về cho trình duyệt  Phương thức:  Response.Write( ) dùng để gửi giá trị biểu thức truyền vào cho phía trình duyệt.  Response.Redirect(“địa chỉ URL”): Chuyển tới một trang khác. Nguyen Ha Giang
  14. Đối tượng Response 14  Các phương thức  Response.Clear(): xóa vùng tạm  Response.Flush(): dùng đưa dữ liệu còn trong bộ đệm phía server về cho trình duyệt  Response.End(): kết thúc tiến trình xử lý trên Server và đẩy dữ liệu tới client. Nguyen Ha Giang
  15. Đối tượng Response 15  Thuộc tính:  Buffer: có hai giá trị quy định cách truyền tải dữ liệu ◼ True: hoàn tất công việc và gởi 1 lần ◼ False: thực hiện xong đến đâu thì gởi đến đó. Nguyen Ha Giang
  16. Đối tượng Server 16  Cung cấp các thông tin của server cho ứng dụng, bao gồm các phương thức, mã hóa, chuyển trang, lấy mã lỗi.  Các thuộc tính:  MachineName: tên server  ScriptTimeout: thiết lập thời gian xử lý tối đa cho một file. Nguyen Ha Giang
  17. Đối tượng Server 17  Các phương thức  MapPath(“URL”): ánh xạ đường dẫn ảo thành đường dẫn vật lý cho tập tin trên server.  Cú pháp Server.MapPath(path)  Path là chuỗi thực hiện đường dẫn tương đối của tập tin trên ứng dụng web.  Phương thức sẽ trả về chuỗi hiện thực đường dẫn vật lý của tập tin đó Nguyen Ha Giang
  18. Đối tượng Server 18  Transfer: gửi tất cả thông tin mà server đang xử lý ở trang hiện hành sang trang khác Server.Transfer(path)  Trong đó tham số path là đường dẫn tập tin aspx cần chuyển  Lưu ý:  Kí hiệu “~” chỉ đến đường dẫn tương đối  Kí hiệu “ ” chỉ đến đường dẫn tuyệt đối  Server.Transfer khác với Reponse.Redirect Nguyen Ha Giang
  19. Đối tượng Server 19  HtmlDecode(str): dùng để mã hóa thẻ HTML thành chuỗi  Ví dụ: ")) %> source: The image tag: <img> Web browser output: The image tag: Nguyen Ha Giang
  20. Đối tượng Server 20  HtmlEncode(str): dùng để giải mã thẻ HTML  Ví dụ: Str = “m>10” Str = Server.HtmlDecode(str); // kết quả m>10 Nguyen Ha Giang
  21. Quick test using System; using System.Collections.Generic; public class User using System.Web.UI; { using System.Windows.Forms; private string Name { get; set; } namespace Demo{ } public partial class _Default : Page { private readonly List _source = new List (); protected override void OnInit(EventArgs e) { base.OnInit(e); Không dùng máy tính, giả sử có Button1.Click += Button1_Click; 1 web app có 2 button là Button2.Click += Button2_Click; } button1 , button2! Khi chạy app, user click vào protected void Page_Load(object sender, EventArgs e) button1 3 lần, sau đó click vào { _source.Add(new User()); } button2 thì messagebox sẽ public void Button1_Click(object sender, EventArgs e) show ra giá trị _source.Count { _source.Add(new User ()); } bằng bao nhiêu ! Tại sao ? public void Button2_Click(object sender, EventArgs e) { _source.Add(new User()); MessageBox.Show(_source.Count.ToString()); } } }
  22. View state 22  View State  Kỹ thuật dùng để lưu trữ thông tin của một trang web ASP.NET qua các lần post back.  Do dữ liệu cục bộ của trang web (lớp page) chỉ tồn tại khi xử lý trên server. Khi xử lý xong thì page bị huỷ, nên dữ liệu cục bộ của page cũng bị huỷ.  Những dữ liệu nào tồn tại xuyên suốt các lần post back thì nên đặt là biến view state. ◼ Khi đó dữ liệu sẽ được lưu giữ qua các lần post back. Nguyen Ha Giang
  23. View state 23  Cho phép lưu các kiểu dữ liệu của .NET  Lưu trữ ở client side, trong hidden field của trang web  Lưu trữ trong các lần post back của trang. Mất dữ liệu khi user nhập vào URL mới  Phạm vi giới hạn trong một trang web  Bảo mật: mặc định ở trạng thái insecure. Tuy nhiên ta có thể thiết lập page directive để mã hóa  Hạn chế: lưu trữ số lượng lớn thông tin trong viewstate sẽ làm chậm thời gian response và request  Thường dùng để cài đặt thông tin đặc biệt nào đó của page Nguyen Ha Giang
  24. View state 24  View state là ưu tiên chọn lựa đầu tiên khi cần lưu trữ thông tin trong phạm vi của một trang web!  View state cũng được sử dụng bởi ASP.NET Web control, cho phép các control này duy trì những thuộc tính giữa các lần post back int count;  Có thể add dữ liệu vào if (ViewState["Count"] == null) count = 0; view state collection else count = (int) ViewState["Count"]; thông qua thuộc tính count += 1; Page.ViewState ViewState["Count"] = count; Label1.Text = string.Format("Số lần postback {0}", count); Nguyen Ha Giang
  25. View state 25  Advantages:  View state không sử dụng memory trên server  View state cũng không bị ràng buộc nào (như time out)  Tình huống hạn chế khi sử dụng view state  Cần thiết lưu trữ dữ liệu có mức độ nhạy cảm cao. View state cũng có thể mã hóa, nhưng session lựa chọn tốt hơn.  Cần thiết lưu trữ thông tin được sử dụng trong nhiều trang. Trong tình huống này ta sử dụng session, cookie hoặc query string.  Cần thiết lưu trữ thông tin lớn và không muốn làm chậm thời gian truyền tải, nên sử dụng database, cache hoặc session. Nguyen Ha Giang
  26. Session  HTML định nghĩa các quy luật để truyền tải thông tin text, graphic, video và các dữ liệu khác qua WWW là dạng giao thức “stateless”  Mỗi request sẽ không biết bất cứ thông tin gì về request trước đó hoặc request sau này.  Hạn chế khi xây dựng ứng dụng web phức tạp, quan tâm đến hành vi của người dùng (e-commerce)  Cần phải có cơ chế nào đó để khắc phục vấn đề trên! Nguyen Ha Giang 26
  27. Session là gì? User 2 User 1 Session: user 1 Session: user 2 Session: user 3 User 3 Nguyen Ha Giang 27
  28. Session là gì? Nguyen Ha Giang 28
  29. Session là gì?  Khái niệm phiên làm việc  Mỗi khi user request một trang web (lần đầu tiên) thì phiên làm việc được tạo ra.  Một số nhận dạng phiên làm việc được cấp bởi server  Phiên làm việc kết thúc khi ◼ Người lập trình hủy ◼ Kết thúc cycle life ◼ User đóng trình duyệt  Phiên làm việc là cách thức trau đổi/chia xẻ dữ liệu giữa các trang web trong Web app. Nguyen Ha Giang 29
  30. Session  Cho phép lưu trữ dữ liệu kiểu .NET  Lưu trữ trên bộ nhớ của server  Thời gian sống kết thúc sau một khoảng thời gian định nghĩa trước (thường là 20 phút, có thể thay đổi, hoặc lập trình hủy)  Phạm vi toàn bộ ứng dụng .NET  Tính bảo mật cao, do dữ liệu lưu trữ trên server, không bao giờ chuyển cho client và mỗi client có client session id riêng  Lưu trữ session với dữ liệu lớn cũng có thể làm chậm server, đặc biệt nếu nhiều người truy cập đồng thời, do mỗi user sẽ có bản copy session riêng! Nguyen Ha Giang 30
  31. Session  Mỗi user sẽ được gán một giá trị gọi là Session id, giá trị này là duy nhất  Được lưu trữ trong non-persistent cookie cho đến khi trình duyệt đóng.  Session state sử dụng cú pháp collection như là view state int count; if (Session["Count"] == null) count = 0; else count = (int)Session["Count"]; count++; Session["Count"] = count; Nguyen Ha Giang 31
  32. Session – cấu hình  Thời gian sống của session có thể thiết lập thông qua web.config  Session có thể làm việc mà không cần cookie  Trong trường này Session ID lưu trữ trong URL Nguyen Ha Giang 32
  33. Cookie  Chỉ cho phép lưu trữ dạng chuỗi  Lưu trữ trên máy của client (trong bộ nhớ hoặc file text nhỏ)  Lifetime được thiết lập bởi người lập trình, được sử dụng trong nhiều trang và trong các lần visit site  Phạm vi toàn bộ ứng dụng .NET  Không bảo mật, do toàn bộ dữ liệu được gởi cho client. Cookie có thể modify dễ dàng.  Tương tự như view state, hạn chế chỉ sử dụng dữ liệu nhỏ  Thường lưu trữ thông tin cá nhân để custom cho website. Nguyen Ha Giang 33
  34. Cookie Nguyen Ha Giang 34
  35. Cookie  Để thiết lập một cookie:  Tạo đối tượng System.Net.HttpCookie  Tạo dữ liệu dạng chuỗi  Add đối tượng cookie vào đối tượng Response của trang web hiện tại HttpCookie cookie = new HttpCookie("Account"); cookie["Username"] = “Nguyen Ha Giang"; Response.Cookies.Add(cookie); Nguyen Ha Giang 35
  36. Cookie  Để truy cập cookie  Sử dụng đối tượng Request để lấy cookie  Kiểm tra xem cookie khác null?  Truy cập giá trị cookie qua thuộc tính key string str = ""; HttpCookie cookie = Request.Cookies["Account"]; if (cookie != null) str = cookie["Username"]; Nguyen Ha Giang 36
  37. Cookie  Cookie được phân làm 2 loại  Persistent cookies/permanent cookie ◼ Lưu trữ trong đĩa cứng của client cho đến khi hết hạn, dạng cookie này được thiết lập ngày hết hạn (expiration date)  Non persistent cookie/temporary cookie ◼ Không định nghĩa thời gian hết hạn, cookie được lưu trữ trong browser memory, kết thúc khi đóng trình duyệt!  Không có sự khác nhau khi sử dụng persistent và non persistent cookie! Nguyen Ha Giang 37
  38. Cookie  Khai báo Persistent cookie HttpCookie cookie = new HttpCookie("Account"); cookie["Username"] = "Nguyen Ha Giang"; cookie["email"] = "NguyenHa.Giang@yahoo.com"; // khai báo thời gian hết hạn cho cookie cookie.Expires = DateTime.Now.AddDays(5); // add cookie vào response của trang web Response.Cookies.Add(cookie); Nguyen Ha Giang 38
  39. Query String  Query string không phải là dạng state giống như session, cookie, hay view state. Chính xác là cách chuyển thông tin giữa trang web với nhau.  Query string và view state có thể kết hợp để gởi thông tin từ client đến server mà không cần sử dụng bất cứ bộ nhớ trên server.  Query string là phần của URL được thêm vào trang web, sau dấu chấm hỏi. Nguyen Ha Giang 39
  40. Query String  Một URL request như sau:   Ý nghĩa:  Gởi id có giá trị là 10 cho trang detail.aspx  Để lấy thông tin của query string của trang web, sử dụng Request.QueryString[] string sid = Request.QueryString[“id"]; Nguyen Ha Giang 40
  41. Query String  Demo query string  Tạo một ứng dụng truy cập CSDL GameList gồm 2 trang  GameList.aspx: hiển thị tên tất cả các game có trong database, với mỗi game tạo url dạng querystring với id của game đó, user kích vào sẽ mở ra trang GameDetail.aspx cho phép xem chi tiết thông tin của game đó  GameDetail.aspx: lấy id từ querystring, đọc CSDL GameList và trả về chi tiết tất cả thông tin của game. Nguyen Ha Giang 41
  42. Query String  Database GameList đơn giản chỉ có bảng DanhMuc: chứa danh mục các game online. Nguyen Ha Giang 42
  43. Query String  Tạo trang GameList.aspx  Trang này có control là label sẽ hiển thị danh sách các tên game. Label: có id là “lblGameList” Nguyen Ha Giang 43
  44. Query String  Phần xử lý truy cập database ở trang GameList.aspx  Lưu ý: code kết nối database này sử dụng SQL Server 2005 bản express. protected void Page_Load(object sender, EventArgs e) { GameList.aspx if ( !IsPostBack ) { string sConn = @"server=.\SQLEXPRESS; database=GameList; Trusted_connection=true"; SqlConnection cnn = new SqlConnection(sConn); // tạo đối tượng kết nối try { cnn.Open(); // mở kết nối string query = "select ID,TenGame from DanhMuc"; // truy vấn lấy ds game SqlCommand cmd = new SqlCommand(query, cnn); SqlDataReader reader; reader = cmd.ExecuteReader(); // thực thi câu truy vấn trả về đối tượng reader // phần tiếp qua slide Nguyen Ha Giang 44
  45. Query String // Phần tiếp theo của silde trước string str; if (reader.HasRows) { // nếu truy vấn có kết quả lblGameList.Text = ""; // xóa nội dung label while (reader.Read()) { // duyệt qua từng kết quả str = string.Format(" ", reader["id"], reader["TenGame"]); lblGameList.Text += str; // đưa vào label } } reader.Close(); Tạo hyperlink gọi trang GameDetail.aspx cnn.Close(); sử dụng query string chứa id của game } catch (Exception ex) { Response.Write(ex.Message); // hiển thị nếu có lỗi } } // end if (!IsPostBack) } // end method Page_Load Nguyen Ha Giang 45
  46. Query String  Trang GameList.aspx khi thực thi Danh sách các tên game lấy trong database Hyperlink xem chi tiết của “Thuận Thiên Kiếm” Nguyen Ha Giang 46
  47. Query String  Tạo trang GameDetail.aspx  Trang này có 4 label chứa các thông tin chi tiết của game: ◼ Tên game: lblTenGame, nhà sản xuất: lblNSX, nhà phát hành: lblNPH, thể loại: lblTheLoai Nguyen Ha Giang 47
  48. Query String  Phần xử lý của GameDetail.aspx protected void Page_Load(object sender, EventArgs e) { // lấy query string string sid = Request.QueryString["id"]; // tham số “id” if (sid != null) // kiểm tra xem tham số này có tồn tại hay không { // truy cap database de lay du lieu string sConn = @"server=.\sqlexpress; database=gamelist; trusted_connection=true"; SqlConnection conn = new SqlConnection(sConn); // tạo đối tượng kết nối try { conn.Open(); // mở kết nối string query = string.Format("select * from DanhMuc where ID={0}",sid); SqlCommand cmd = new SqlCommand(query, conn); SqlDataReader reader; reader = cmd.ExecuteReader(); // thực thi câu truy vấn // phần tiếp theo trong slide kế Nguyen Ha Giang 48
  49. Query String // tiếp theo của silde trước if (reader.HasRows) // nếu có dữ liệu { reader.Read(); // đọc 1 dòng dữ liệu lblTenGame.Text = reader["TenGame"].ToString(); lblNSX.Text = reader["NhaSanXuat"].ToString(); lblNPH.Text = reader["NhaPhatHanh"].ToString(); lblTheLoai.Text = reader["TheLoai"].ToString(); } reader.Close(); conn.Close(); // đóng kết nối } catch (Exception ex) { Response.Write(ex.Message); // hiển thị thông báo lỗi } } // end if (sid !=null) } // end method Page_Load Nguyen Ha Giang 49
  50. Query String  Chạy demo id = 5 là mã game Cổ Long Nguyen Ha Giang 50
  51. Cross-page Postback  Cross page postback là dạng postback gởi tới trang khác  Các button control như Button, ImageButton và LinkButton đều có thuộc tính PostBackUrl  Để sử dụng Cross-page postback  Thiết lập PostBackUrl cho web form cần chuyển đến  Khi user click vào button ◼ Page sẽ được gởi tới URL mới với tất cả các giá trị của các control trong trang aspx hiện thời. Nguyen Ha Giang 51
  52. Cross-page Postback  Trang cross page có thể truy cập trang trước thông qua thuộc tính PreviousPage protected void Page_Load(object sender, EventArgs e) { if (PreviousPage != null) { lblInfo.Text = "You came from " + PreviousPage.Header.Title; } } Nguyen Ha Giang 52
  53. Cross-page Postback  Để truy cập chi tiết hơn, các giá trị của control trên form, thì cần phải gán tham chiếu PreviousPage cho lớp page tương ứng!  Ta có thể add thuộc tính (public) vào trang nguồn và đọc chúng ở trang đích. if (PreviousPage != null) { SourcePage prevPage = PreviousPage as SourcePage; if (prevPage != null) { lblInfo.Text = "Welcome" + prevPage.NameEntry; } } Tên lớp của trang source Thuộc tính của lớp SourcePage Nguyen Ha Giang 53
  54. Cross-page Postback  Minh họa cross-page Postback  Tạo 2 trang  SourcePage.aspx: chứa form nhập thông tin user  TargetPage.aspx: lấy thông tin từ user từ SourcePage và hiển thị lên trình duyệt. Nguyen Ha Giang 54
  55. Cross-page Postback  Mô tả control của trang SourcePage.aspx Id control Kiểu control Thuộc tính Diễn giải txtUsername TextBox Nhập tên user txtEmail TextBox Nhập địa chỉ email txtCompany TextBox Nhập tên công ty btnPostInfo Button PostBackUrl = Button thực thi ~/TargetPage.aspx thao tác Cross Page Postback Nguyen Ha Giang 55
  56. Cross-page Postback  Khai báo thuộc tính PostBackUrl cho button btnPostInfo Khai báo URL cho PostBackUrl Nguyen Ha Giang 56
  57. Cross-page Postback  Mô tả trang TargetPage.aspx  Lấy thông tin từ SourcePage.aspx và hiển thị ra trình duyệt Id control Kiểu control Thuộc tính Diễn giải lblUsername Label - Hiển thị tên user lblEmail Label - Hiển thị email lblCompany Label - Hiển thị công ty Nguyen Ha Giang 57
  58. Cross-page Postback  Phần xử lý của TargetPage lấy thông tin từ SourcPage.aspx protected void Page_Load(object sender, EventArgs e) { // lấy thông tin từ previous page SourcePage là class page if (PreviousPage != null) { của SourcePage.aspx // biến đối tượng source tham chiếu đến previous page SourcePage source = PreviousPage as SourcePage; // lấy các control của previous page (SourcePage.aspx) TextBox username = (TextBox) source.FindControl("txtUsername"); TextBox email = (TextBox) source.FindControl("txtEmail"); TextBox company = (TextBox)source.FindControl("txtCompany"); // gán thông tin cho các label lblUsername.Text = username.Text; lblEmail.Text = email.Text; lblCompany.Text = company.Text; ID của control trong SourcePage.aspx } // end if } // end method Page_Load Nguyen Ha Giang 58
  59. Cross-page Postback  Chạy demo click Nguyen Ha Giang 59