Skip to content

8. Örnek 06 – Oturum

8.1. Oturum kavramı

Bir istemci tarayıcısı bir web uygulamasına ilk kez bağlandığında, bir oturum jetonu alır; bu, web uygulamasına yaptığı her yeni istekte geri gönderdiği benzersiz bir karakter dizisidir. Bu, web uygulamasının istemci tarayıcısını tanımasını sağlar. Web uygulaması, bu oturum jetonuna veriler atayabilir. Bu veriler, tek bir istemci tarayıcısına aittir. Böylece, istemci tarayıcının istekleri ilerledikçe bir bellek oluşur.

Yukarıda görüldüğü gibi, her kullanıcının (tarayıcının) kendi oturumu olarak adlandırılan bir belleği vardır. Bu bellek, aynı kullanıcının tüm istekleri tarafından paylaşılır. Ayrıca, uygulama belleği olarak adlandırılan daha üst düzey bir bellek de mevcuttur. Bu bellek, tüm kullanıcıların tüm istekleri tarafından paylaşılır. Genellikle salt okunurdur.

8.2. NetBeans Projesi

[exemple-06] projesi, [exemple-05] projesinin kopyalanmasıyla elde edilmiştir. Kullanıcı oturumundan

  • kullanıcının oturumundan yararlanmak için birkaç öğeyi değiştireceğiz.
  • Giriş alanını temizlemek için [Effacer] [1] adlı yeni bir eylem ekleyeceğiz.

8.3. Configuration

[struts.xml] dosyası şu şekilde değişir:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
  <!-- uluslararasılaştırma -->
  <constant name="struts.custom.i18n.resources" value="messages" />
  <!-- varsayılan paket -->
  <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Saisir</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <!-- eylem paketi -->
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Saisir">
      <result name="success">/vues/Saisie.JSP</result>
    </action>
    <action name="Confirmer" class="actions.Confirmer">
      <result name="success">/vues/Confirmation.JSP</result>
    </action>
    <action name="Effacer" class="actions.Effacer">
      <result name="success">/vues/Saisie.JSP</result>
    </action>
  </package>
</struts>

27-29. satırlar, [Effacer] sınıfıyla ilişkili yeni bir eylem olan [Effacer]'i tanımlar. Bu eylemin yanıtı, [Saisie.JSP] görünümüdür.

8.4. [Confirmer] eylemi

Aşağıdaki gibi gelişir:


package actions;

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

public class Confirmer extends ActionSupport implements SessionAware{
  
  // şablon
  private String nom;
  // oturum
  private Map<String, Object> session;
  
  // alıcı ve ayarlayıcılar

  public String getNom() {
    return nom;
  }

  public void setNom(String nom) {
    this.nom = nom;
  }

  @Override
  public void setSession(Map<String, Object> session) {
    this.session=session;
  }
  
  @Override
  public String execute(){
    // adı oturuma kaydediyoruz
    session.put("nom",nom);
    // gezinme
    return SUCCESS;
  }
  
}
  • 7. satır: [Confirmer] sınıfı, SessionAware arayüzünü uygular. Bu arayüzün tek bir yöntemi vardır: 25-27. satırlardaki setSession yöntemi. execute yönteminin çağrılmasından önce, istek engelleyicilerinden biri, setSession yöntemi aracılığıyla, kullanıcının oturumunu bir Map<String, Object> sözlüğü biçiminde enjekte edecektir (25. satır). Bu sözlüğü, 12. satırdaki session alanında saklamayı tercih ediyoruz.
  • 30-34. satırlar: eylemin execute yöntemi. Bu yöntem çalıştırıldığında, session alanı bir interceptor tarafından, nom alanı ise başka bir interceptor tarafından başlatılmıştır. session sözlüğü, nom alanını depolamak için kullanılır. Böylece ad, kullanıcının belleğinde yer alır ve kullanıcının tüm isteklerinde kullanılabilir hale gelir.

8.5. [Confirmation.JSP] ve [Saisie.JSP] görünümleri

[Confirmation.JSP] görünümü değişmez. [Saisie.JSP] görünümü ise şu şekilde değişir:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title><s:text name="saisie.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="saisie.titre2"/></h1>
    <s:form action="Confirmer">
      <s:textfield key="saisie.libelle" name="nom" value="%{#attr['nom']}"/>
      <s:submit key="saisie.valider" action="Confirmer"/>
      <s:submit key="saisie.effacer" action="Effacer"/>
    </s:form>
  </body>
</html>
  • 12. satır: <s:textfield>. etiketine value özniteliğini ekliyoruz. Bu öznitelik, giriş alanında görüntülenecek değeri belirler. Bu öznitelik yoksa, value = name olur. Burada özniteliğin değeri, %{expression_à_évaluer} biçimindedir. Burada değerlendirilecek ifade #attr['nom']'tir. nom özniteliği, sırasıyla geçerli eylem, sayfa, istek, oturum ve uygulama içinde aranacaktır. [Confirmer] eylemi, nom özniteliğini oturuma eklediğinden, bu öznitelik orada bulunacaktır. Aşağıdaki sorgu bunu göstermektedir:

[1] eyleminde girilen ad ST idi. [Confirmer] eyleminin bu adı oturuma eklediği bilinmektedir. [2] bağlantısı bizi URL ve [3]'e yönlendirir. [Saisie.JSP] görünümü görüntülenir. Giriş alanı için %{#attr['nom']} özniteliği, oturumdaki adı bulmaya olanak tanır.

  • 14. satır: [Effacer] düğmesi, [Effacer] eyleminin yürütülmesini ve [Saisie.JSP] görünümünün görüntülenmesini tetikleyecektir

<action name="Effacer" class="actions.Effacer">
      <result name="success">/vues/Saisie.JSP</result>
</action>

8.6. [Effacer] eylemi

[Effacer] eyleminin kodu şöyledir:


package actions;

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

public class Effacer extends ActionSupport implements SessionAware{
  
  // oturum
  private Map<String, Object> session;
  
  @Override
  public String execute(){
    // oturumdan adı alıyoruz
    String nom=(String)session.get("nom");
    // gerekirse oturumdan silme
    if(nom!=null){
      session.remove("nom");
    }
    // gezinme
    return SUCCESS;
  }

  @Override
  public void setSession(Map<String, Object> map) {
    this.session=map;
  }
}
  • 7. satır: [Effacer] sınıfı, [Confirmer] eyleminin yaptığı gibi [SessionAware] arayüzünü uygular.
  • 13. satır: [Effacer] eylemi, [Saisie.JSP] görünümündeki ad giriş alanının içeriğini silmelidir. Bu görünümün adı oturumdan aldığı biliniyor. Dolayısıyla adı oturumdan silmemiz gerekiyor. execute yöntemi bunu yapıyor.

Bunun nasıl sonuçlandığını görelim:

[1]'te, giriş alanını silmek istiyoruz. [Effacer] düğmesine tıklıyoruz.


<s:submit key="saisie.effacer" action="Effacer"/>

[Effacer] eylemi yürütülecektir. [2]'te, çağrılan URL'in [Confirmer] eylemi olduğu görülür. Bu, formdaki <s:form> etiketinden kaynaklanmaktadır:


<s:form action="Confirmer">

bu da formun [Confirmer] eylemine gönderilmesini sağlar. [Effacer] düğmesine tıklandığında,

action:Effacer=Effacer

parametresi URL [/actions/Confirmer.action] eylemine gönderilmiştir. Struts, bu parametreyi kullanarak gönderilen verilerin [Effacer] eylemi tarafından işlenmesini sağlar. Bu eylem, oturum adını kaldırır. [Saisie.JSP] sayfası, [Effacer] eyleminin yanıtıdır:


<action name="Effacer" class="actions.Effacer">
      <result name="success">/vues/Saisie.JSP</result>
</action>

Oturum adını görüntüleyen bu eylem, boş bir dize olan [3]'i görüntüler.

Struts 2'nin önemli kavramlarını tanıtmak amacıyla birkaç basit örnek yazdık:

  • sayfaların uluslararasılaştırılması
  • eylem alanlarına gönderilen parametrelerin enjeksiyonu
  • oturum kavramı
  • Eylemler ve Görünümler arasındaki ilişki

Bu kavramları öğrendikten sonra, artık daha karmaşık örnekleri ele alabiliriz. Öncelikle, bir formda kullanılabilecek çeşitli etiketleri tanıtacağız.