Statistika testů
K této kapitole
Zodpovězených: 0
Správně: 0
Špatně: 0
Úspěšnost: 0%
Nezodpovězených: 0

Pro testování a jeho statistické vyhodnocení je nutné se přihlásit.


Celkem
Zodpovězených: 0
Správně: 0
Špatně: 0
Úspěšnost: 0%
Nezodpovězených: 0

Stav relace
RNDr. Dušan Kovář, Ph.D.
3. ledna 2007
Počet návštěv: 5627

Stav relace zajišťuje ukládání hodnot pro jednotlivé uživatele. Vytváří se tak vazba mezi uživatelem a webovou aplikací. Uživatel se pohybuje na stránkách aplikace, zadává určité hodnoty do formulářů a server využívá stav relace k tomu, aby zjistil, že tyto údaje byly zadány v rámci stejné relace. Přitom během krátkého okamžiku může na server přijít celá řada požadavků od různých uživatelů. Stav relace má tedy za úkol pro každého uživatele udržovat vlastní stav. Typickým využitím stavu relace je uchovávání položek v nákupním košíku, dokud uživatel neuzavře objednávku.

Stav relace je zpřístupněn pomocí instance třídy System.Web.SessionState.HttpSessionState. K takové instanci ve webové aplikaci lze přistoupit:

  • ze stránky (aspx) - pomocí vlastnosti Session zděděné ze třídy System.Web.UI.Page.
  • ze souboru Global.asax - pomocí vlastnosti Session zděděné ze třídy System.Web.HttpApplication.

Vlastnost Session může obsahovat jakékoliv hodnoty, které jsou uloženy v kolekci s řetězcovými klíči. Hodnotu lze přidat přímo pomocí indexeru:

Session["Pocet"] = 1;

Nebo lze použít metodu Add:

Session.Add("Pocet", 1);

Metoda Add má následující signaturu:

public void Add(string name, object value);

Metoda Add i indexer mají stejný význam.

Určitou položku (s daným klíčem) lze ze stavu relace odstranit pomocí metody Remove:

public void Remove(string name);

Lze také odstranit položku s určitým celočíselným indexem. K tomu slouží metoda RemoveAt:

public void RemoveAt(int index);

Metoda RemoveAll odstraní všechny položky ze stavu relace (lze také použít ekvivalentní metodu Clear):

// Odstraní všechny položky ze stavu relace:
public void RemoveAll();
public void Clear();

K procházení jednotlivých položek slouží také následující vlastnosti:

Typ vlastnosti Název vlastnosti Přístup k vlastnosti Význam vlastnosti
int Count get Počet položek ve stavu relace.
NameObjectCollectionBase.KeysCollection Keys get Kolekce klíčů jednotlivých položek.

Položky lze také kopírovat počínaje určitým indexem do pole pomocí metody CopyTo:

public virtual void CopyTo(Array array, int index);

Další vlastnosti třídy HttpSessionState se týkají vlastní relace jako celku. Zde jsou některé z nich

Typ vlastnosti Název vlastnosti Přístup k vlastnosti Význam vlastnosti
bool IsCookieless get Zda se stav relace ukládá bez užití cookie nebo ne.
bool IsNewSession get Zda je relace právě navozená aktuálním požadavkem.
SessionStateMode Mode get Způsob ukládání položek stavu relace.
string SessionID get Jednoznačný identifikátor relace.
int TimeOut get/set Za kolik minut uplynulých mezi dvěma požadavky dojde k ukončení relace.

Kromě situace, kdy vyprší čas nastavený v souboru web.config nebo pomocí vlastnosti TimeOut, lze také relaci ukončit násilně voláním metody Abandon:

public void Abandon();

Na jednoduchém příkladu předvedeme stav relace v praxi. V aplikaci budeme mít dvě stránky. Výchozí stránka bude HlavniStranka.aspx, ve které budou zobrazeny informace o stavu relace. Po prvním načtení bude vypadat takto:

Na této stránce jsou zobrazeny hodnoty některých vlastností objektu Session a hodnota jedné položky ve stavu relace, která udává počet návštěv, jenž je inkrementován při každém načtení stránky. Pokud několikrát aktualizujeme stránku, změní se její vzhled následovně:

Dále je na této stránce odkaz na jinou související stránku SouvisejiciStranka.aspx. Po kliknutí na něj dostaneme v novém okně tuto stránku:

Na hlavní stránce je také tlačítko Ukončit relaci. Po kliknutí na něj se hlavní stránka změní takto:

Po obnovení související stránky dostaneme tuto odezvu:

Kód pro hlavní stránku této aplikace může vypadat následovně:

HlavniStranka.aspx
<%@ Page language="c#" Codebehind="HlavniStranka.aspx.cs" AutoEventWireup="false" Inherits="StavRelace.InfoORelaci.HlavniStranka" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
   <HEAD>
      <title>Hlavní stránka</title>
      <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
      <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
   </HEAD>
   <body MS_POSITIONING="GridLayout">
      <form id="Form1" method="post" runat="server">
         <h1 id="Privitani" runat="server"></h1>
         <table cellpadding="3" id="TabulkaInformaci" runat="server">
            <tr>
               <td>
                  <b>SessionID:</b>
               </td>
               <td id="HodnotaSessionID" runat="server">
               </td>
            </tr>
            <tr>
               <td>
                  <b>IsCookieless:</b>
               </td>
               <td id="HodnotaIsCookieless" runat="server">
               </td>
            </tr>
            <tr>
               <td>
                  <b>Mode:</b>
               </td>
               <td id="HodnotaMode" runat="server">
               </td>
            </tr>
            <tr>
               <td>
                  <b>Timeout:</b>
               </td>
               <td id="HodnotaTimeout" runat="server">
               </td>
            </tr>
            <tr>
               <td>
                  <b>Počet návštěv:</b>
               </td>
               <td id="PocetNavstev" runat="server">
               </td>
            </tr>
            <tr>
               <td align="right" colspan="2">
                  <a href="SouvisejiciStranka.aspx" target="_blank">Související stránka</a> 
                  <asp:Button ID="UkoncitRelaci" Runat="server" Text="Ukončit relaci" />
               </td>
            </tr>
         </table>
      </form>
   </body>
</HTML>
HlavniStranka.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace StavRelace.InfoORelaci
{
   public class HlavniStranka : System.Web.UI.Page
   {
      protected System.Web.UI.HtmlControls.HtmlTableCell HodnotaSessionID;
      protected System.Web.UI.HtmlControls.HtmlTableCell PocetNavstev;
      protected System.Web.UI.WebControls.Button UkoncitRelaci;
      protected System.Web.UI.HtmlControls.HtmlTable TabulkaInformaci;
      protected System.Web.UI.HtmlControls.HtmlTableCell HodnotaIsCookieless;
      protected System.Web.UI.HtmlControls.HtmlTableCell HodnotaMode;
      protected System.Web.UI.HtmlControls.HtmlTableCell HodnotaTimeout;
      protected System.Web.UI.HtmlControls.HtmlGenericControl Privitani;
   
      private void Page_Load(object sender, System.EventArgs e)
      {
         NavazData();
      }

      // Pomocná metoda, která naváže hodnoty do stránky:
      private void NavazData()
      {
         // Vyzkoušíme, zda je relace nová nebo zda neexistuje
         // položka s klíčem PocetNavstev ve stavu relace:
         if (Session.IsNewSession || Session["PocetNavstev"] == null)
         {
                Privitani.InnerHtml = "Vítejte v nové relaci!";
            Session["PocetNavstev"] = 1;
            
         }
         else
         {
            Privitani.InnerHtml = "Vítejte v již existující relaci!";
            Session["PocetNavstev"] = (int) Session["PocetNavstev"] + 1;
         }

         // Naplníme hodnoty některých vlastností objektu Session:
         HodnotaSessionID.InnerHtml = Session.SessionID;
         HodnotaIsCookieless.InnerHtml = Session.IsCookieless.ToString();
         HodnotaMode.InnerHtml = Session.Mode.ToString();
            HodnotaTimeout.InnerHtml = Session.Timeout.ToString();
         // Zobrazíme hodnotu položky s klíčem PocetNavstev ve stavu relace:
         PocetNavstev.InnerHtml = Session["PocetNavstev"].ToString();

      }

      #region Web Form Designer generated code
      override protected void OnInit(EventArgs e)
      {
         //
         // CODEGEN: This call is required by the ASP.NET Web Form Designer.
         //
         InitializeComponent();
         base.OnInit(e);
      }
      
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {   
         this.UkoncitRelaci.Click += new System.EventHandler(this.UkoncitRelaci_Click);
         this.Load += new System.EventHandler(this.Page_Load);

      }
      #endregion

      // Při kliku na tlačítko ukončit relaci:
      private void UkoncitRelaci_Click(object sender, System.EventArgs e)
      {
         // Ukončíme relaci a skryjeme související prvky:
         Session.Abandon();
         Privitani.InnerHtml = "Relace je ukončena!";
         TabulkaInformaci.Visible = false;
      }
   }
}

Následuje kód pro související stránku:

SouvisejiciStranka.aspx
<%@ Page language="c#" Codebehind="SouvisejiciStranka.aspx.cs" AutoEventWireup="false" Inherits="StavRelace.InfoORelaci.SouvisejiciStranka" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
   <HEAD>
      <title>Související stránka</title>
      <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
      <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
   </HEAD>
   <body MS_POSITIONING="GridLayout">
      <form id="Form1" method="post" runat="server">
         <asp:Label ID="Hlaseni" Runat="server" />
      </form>
   </body>
</HTML>
SouvisejiciStranka.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace StavRelace.InfoORelaci
{
   public class SouvisejiciStranka : System.Web.UI.Page
   {
      protected System.Web.UI.WebControls.Label Hlaseni;
   
      private void Page_Load(object sender, System.EventArgs e)
      {
         // Zjistíme, zda není relace nově navozená:
         if (!Session.IsNewSession)
         {
            Hlaseni.Text = "Vím o Vás. Vaše SessionID je <b>"
                  + Session.SessionID.ToString() + "</b><br>"
                  + "Počet návštěv na hlavní stránce je <b>"
                  + Session["PocetNavstev"].ToString() + "</b><br>";
         }
         else
         {
            Hlaseni.Text = "Původní relace byla ukončena!";
         }
      }

      

      #region Web Form Designer generated code
      override protected void OnInit(EventArgs e)
      {
         //
         // CODEGEN: This call is required by the ASP.NET Web Form Designer.
         //
         InitializeComponent();
         base.OnInit(e);
      }
      
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {   
         this.Load += new System.EventHandler(this.Page_Load);

      }
      #endregion

      
   }
}

Další možnosti stavu relace si ukážeme v samostatných kapitolách.



Hodnocení kapitoly "Stav relace"
Oslovila vás tato kapitola?
Ohodnoťte její obsah počtem bodů od 1 (nejhorší) do 10 (nejlepší):
Zatím nikdo nehodnotil. Buďte první.
Diskuze ke kapitole "Stav relace"

Napadá vás zajímavá otázka související s touto kapitolou?

Přidejte do diskuze


Vyhledávání
Programovací jazyk C# | Programování Windows Forms | Architektura .NET | ASP.NET | Dodatky | Diskuze
RNDr. Dušan Kovář, Ph.D.
Gymnázium Olomouc-Hejčín