Bài giảng Lập trình Asp.Net - Phần 5: Quản lý trạng thái - Nguyễn Hà Giang

Đối tượng Request - Response Quản lý trạng thái View state Session state Cookie Application state Query string Cross-page Postback Đối tượng Request 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, …)

pptx59 trang | Chia sẻ: candy98 | Lượt xem: 588 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình Asp.Net - Phần 5: Quản lý trạng thái - Nguyễn Hà Giang, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nguyễn Hà GiangQuản lý trạng tháiNguyen Ha GiangNội dungĐối tượng Request - ResponseQuản lý trạng tháiView stateSession stateCookieApplication state Query stringCross-page Postback2Nguyen Ha GiangRequest-ResponseHttpContextThe HttpContext class contains objects that are specific to current app requestHttpRequestcontains information about the current request like cookies and browser informationHttpResponseContains the response that is sent to the client, which includes all the rendered output and cookies3Nguyen Ha GiangĐối tượng RequestRequest 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 ServerDùng để đọc thông tin từ client gửi lên (header, query string, cookies, )4Nguyen Ha GiangĐối tượng RequestRequestType: trả về phương thức truyền dữ liệu từ client đến server gồm 2 phương thức POST và GETRequest.Form(“đối tượng cần đọc”): đọc giá trị phần tử gởi theo POSTRequest.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 GET5Nguyen Ha GiangRequest - POSTCó giao diện6Nguyen Ha GiangRequest - POST7Nguyen Ha GiangRequest - POSTLấy giá trị của UserName và Password trên form8Nguyen Ha GiangRequest - GETLấy dữ liệu từ formNếu không có giá trị thì trả về là null 9Nguyen Ha GiangRequest - GET10Nguyen Ha GiangRequest - GETTại Server, CheckUser.aspx lấy giá trị của UserName và Password11Nguyen Ha GiangRequest - GETVí dụTại ReadNews.aspx muốn lấy giá catID and NewsID, sử dụng cú pháp12Nguyen Ha GiangĐối tượng ResponseĐối tượng gởi nội dung bất kỳ về cho trình duyệtPhươ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.13Nguyen Ha GiangĐối tượng ResponseCác phương thứcResponse.Clear(): xóa vùng tạmResponse.Flush(): dùng đưa dữ liệu còn trong bộ đệm phía server về cho trình duyệtResponse.End(): kết thúc tiến trình xử lý trên Server và đẩy dữ liệu tới client.14Nguyen Ha GiangĐối tượng ResponseThuộc tính:Buffer: có hai giá trị quy định cách truyền tải dữ liệuTrue: hoàn tất công việc và gởi 1 lầnFalse: thực hiện xong đến đâu thì gởi đến đó.15Nguyen Ha GiangĐối tượng ServerCung 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 serverScriptTimeout: thiết lập thời gian xử lý tối đa cho một file.16Nguyen Ha GiangĐối tượng ServerCác phương thứcMapPath(“URL”): ánh xạ đường dẫn ảo thành đường dẫn vật lý cho tập tin trên server.Cú phápPath 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 đó 17Nguyen Ha GiangServer.MapPath(path)Đối tượng ServerTransfer: gửi tất cả thông tin mà server đang xử lý ở trang hiện hành sang trang khácTrong đó tham số path là đường dẫn tập tin aspx cần chuyểnLưu ý:Kí hiệu “~” chỉ đến đường dẫn tương đốiKí hiệu “..” chỉ đến đường dẫn tuyệt đốiServer.Transfer khác với Reponse.Redirect18Nguyen Ha GiangServer.Transfer(path)Đối tượng ServerHtmlDecode(str): dùng để mã hóa thẻ HTML thành chuỗiVí dụ:19Nguyen Ha Giang")) %> source: The image tag: <img> Web browser output: The image tag: Đối tượng ServerHtmlEncode(str): dùng để giải mã thẻ HTMLVí dụ:20Nguyen Ha GiangStr = “m>10”Str = Server.HtmlDecode(str); // kết quả m>10Quick test using System; using System.Collections.Generic; using System.Web.UI; using System.Windows.Forms; namespace Demo{     public partial class _Default : Page   {         private readonly List _source = new List();         protected override void OnInit(EventArgs e)        {             base.OnInit(e);             Button1.Click += Button1_Click;             Button2.Click += Button2_Click;        }        protected void Page_Load(object sender, EventArgs e)     {            _source.Add(new User());        }      public void Button1_Click(object sender, EventArgs e)     {            _source.Add(new User ());         }   public void Button2_Click(object sender, EventArgs e)     {        _source.Add(new User());             MessageBox.Show(_source.Count.ToString());      }    }    }   public class User     {         private string Name { get; set; }     }Không dùng máy tính, giả sử có 1 web app có 2 button là button1 , button2!Khi chạy app, user click vào button1 3 lần, sau đó click vào button2 thì messagebox sẽ show ra giá trị _source.Count bằng bao nhiêu ! Tại sao ?View stateView StateKỹ 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.22Nguyen Ha GiangView stateCho phép lưu các kiểu dữ liệu của .NETLưu trữ ở client side, trong hidden field của trang webLư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ớiPhạm vi giới hạn trong một trang webBả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óaHạ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à requestThường dùng để cài đặt thông tin đặc biệt nào đó của page23Nguyen Ha GiangView stateView 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 backCó thể add dữ liệu vào view state collection thông qua thuộc tính Page.ViewState24Nguyen Ha Giangint count;if (ViewState["Count"] == null) count = 0;else count = (int) ViewState["Count"];count += 1; ViewState["Count"] = count; Label1.Text = string.Format("Số lần postback {0}", count);View stateAdvantages:View state không sử dụng memory trên serverView 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 stateCầ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.25Nguyen Ha GiangSessionHTML đị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!Session là gì?User 1User 2User 3Session: user 1Session: user 2Session: user 3Session là gì?Session là gì?Khái niệm phiên làm việcMỗ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 serverPhiên làm việc kết thúc khiNgười lập trình hủyKết thúc cycle lifeUser đó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.SessionCho phép lưu trữ dữ liệu kiểu .NETLưu trữ trên bộ nhớ của serverThờ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 .NETTí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êngLư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!SessionMỗ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 stateint count;if (Session["Count"] == null) count = 0;else count = (int)Session["Count"];count++;Session["Count"] = count;Session – cấu hìnhThời gian sống của session có thể thiết lập thông qua web.configSession có thể làm việc mà không cần cookieTrong trường này Session ID lưu trữ trong URL ỉ cho phép lưu trữ dạng chuỗiLư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 sitePhạm vi toàn bộ ứng dụng .NETKhô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.CookieCookieĐể thiết lập một cookie:Tạo đối tượng System.Net.HttpCookieTạo dữ liệu dạng chuỗiAdd đối tượng cookie vào đối tượng Response của trang web hiện tạiHttpCookie cookie = new HttpCookie("Account");cookie["Username"] = “Nguyen Ha Giang";Response.Cookies.Add(cookie);CookieĐể truy cập cookieSử 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 keystring str = "";HttpCookie cookie = Request.Cookies["Account"];if (cookie != null) str = cookie["Username"];CookieCookie được phân làm 2 loạiPersistent cookies/permanent cookieLư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 cookieKhô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!CookieKhai báo Persistent cookieHttpCookie 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 cookiecookie.Expires = DateTime.Now.AddDays(5);// add cookie vào response của trang webResponse.Cookies.Add(cookie);Query StringQuery 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. StringMộ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"];Query StringDemo query stringTạo một ứng dụng truy cập CSDL GameList gồm 2 trangGameList.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.Query StringDatabase GameList đơn giản chỉ có bảng DanhMuc: chứa danh mục các game online.Query StringTạo trang GameList.aspxTrang này có control là label sẽ hiển thị danh sách các tên game.Label: có id là “lblGameList”Query StringPhần xử lý truy cập database ở trang GameList.aspxLư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){ 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 GameList.aspxQuery 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("{1} ", reader["id"], reader["TenGame"]); lblGameList.Text += str; // đưa vào label } } reader.Close(); cnn.Close(); } catch (Exception ex) { Response.Write(ex.Message); // hiển thị nếu có lỗi } } // end if (!IsPostBack)} // end method Page_LoadTạo hyperlink gọi trang GameDetail.aspx sử dụng query string chứa id của gameQuery StringTrang GameList.aspx khi thực thiDanh sách các tên game lấy trong databaseHyperlink xem chi tiết của “Thuận Thiên Kiếm”Query StringTạo trang GameDetail.aspxTrang 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: lblTheLoaiGameDetail.aspxQuery StringPhầ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ế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_LoadQuery StringChạy demoid = 5 là mã game Cổ LongCross-page PostbackCross page postback là dạng postback gởi tới trang khácCác button control như Button, ImageButton và LinkButton đều có thuộc tính PostBackUrlĐể sử dụng Cross-page postbackThiết lập PostBackUrl cho web form cần chuyển đếnKhi user click vào buttonPage 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.Cross-page PostbackTrang cross page có thể truy cập trang trước thông qua thuộc tính PreviousPageprotected void Page_Load(object sender, EventArgs e){ if (PreviousPage != null) { lblInfo.Text = "You came from " + PreviousPage.Header.Title; }}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 sourceThuộc tính của lớp SourcePageCross-page PostbackMinh họa cross-page PostbackTạo 2 trang SourcePage.aspx: chứa form nhập thông tin userTargetPage.aspx: lấy thông tin từ user từ SourcePage và hiển thị lên trình duyệt.SourcePage.aspxCross-page PostbackMô tả control của trang SourcePage.aspxId controlKiểu controlThuộc tínhDiễn giảitxtUsernameTextBoxNhập tên usertxtEmailTextBoxNhập địa chỉ emailtxtCompanyTextBoxNhập tên công tybtnPostInfoButtonPostBackUrl = ~/TargetPage.aspxButton thực thi thao tác Cross Page PostbackCross-page PostbackKhai báo thuộc tính PostBackUrl cho button btnPostInfoKhai báo URL cho PostBackUrlCross-page PostbackMô tả trang TargetPage.aspxLấy thông tin từ SourcePage.aspx và hiển thị ra trình duyệtTargetPage.aspxId controlKiểu controlThuộc tínhDiễn giảilblUsernameLabel-Hiển thị tên userlblEmailLabel-Hiển thị emaillblCompanyLabel-Hiển thị công tyCross-page PostbackPhần xử lý của TargetPage lấy thông tin từ SourcPage.aspxprotected void Page_Load(object sender, EventArgs e) { // lấy thông tin từ previous page if (PreviousPage != null) { // 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; } // end if} // end method Page_LoadID của control trong SourcePage.aspxSourcePage là class page của SourcePage.aspxCross-page PostbackChạy democlick