16. Örnek 13 - Bir eylemin bağlamı
Bu uygulama, bir eylemin aşağıdakilere erişimi olduğunu göstermeyi amaçlamaktadır:
- isteğin parametrelerine
- isteğin özniteliklerine
- kullanıcı oturumunun özniteliklerine
![]() |
16.1. NetBeans projesi
![]() |
NetBeans projesi şöyledir:
- [1]'te, [Context.JSP] görünümü
- [2]'te, [Action1.java] eylemi ve [example.xml] Struts yapılandırma dosyası
16.2. Configuration
Proje yapılandırması [example.xml] dosyasında yapılır:
<?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>
<package name="example" namespace="/example" extends="struts-default">
<action name="Action1" class="example.Action1">
<result name="success">/example/Context.JSP</result>
</action>
</package>
</struts>
- 8. satır: URL [/example/Action1] isteği, [example.Action] sınıfının örneklenmesine neden olacaktır. Herhangi bir yöntem belirtilmediğinden, execute yöntemi yürütülecektir.
- 9. satır: Yalnızca tek bir anahtar kabul edilir. success anahtarı, [Context.JSP] görünümünün görüntülenmesine yol açar.
Bir isteğin işlenmesine ilişkin basitleştirilmiş mimari şu şekilde olacaktır:
![]() |
İstek, web uygulamasının iki bileşeni tarafından işlenecektir: [Action1] [1] eylemi ve [Context.JSP] [2] görünümü. Bu iki bileşen, farklı türde verilere erişebilir:
- Application, [3] ve c.a.d kapsamındaki veriler. Bu veriler, tüm kullanıcıların tüm istekleri tarafından erişilebilir durumdadır. Neredeyse her zaman salt okunurdur. Bu verilerde genellikle uygulamanın başlangıç yapılandırması bulunur. Burada [Action1] ve [Context.JSP] bu verilere erişebilir.
- Session, [4] ve c.a.d kapsamındaki veriler. Bu veriler, aynı kullanıcının tüm istekleri tarafından erişilebilir durumdadır. Bu veriler okuma/yazma erişimine sahiptir. Burada [Action1] oturumu okuma/yazma olarak kullanırken, [Context.JSP] oturumu okuma olarak kullanacaktır.
- Requête ve [5] kapsamındaki veriler, isteği işleyen tüm öğeler tarafından erişilebilir. Burada [Action1] bu belleğe bir veri yerleştirecek ve [Context.JSP] bu veriyi geri alacaktır. İstek kapsamındaki veriler, N bileşeninin N+1 bileşenine bilgi aktarmasını sağlar.
- İstemci tarafından gönderilen [6] istek parametreleri. Bu parametreler, isteği işleyen bileşenler tarafından salt okunur olarak kullanılır.
16.3. [Action1] eylemi
[Action1] sınıfının kodu şöyledir:
package example;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import java.util.Set;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
public class Action1 extends ActionSupport implements SessionAware, RequestAware, ParameterAware {
// parametresiz oluşturucu
public Action1() {
}
// Oturum, İstek, Parametreler
Map<String, Object> session;
Map<String, Object> request;
Map<String, String[]> parameters;
@Override
public String execute() {
// parametre listesi
System.out.println("Paramètres...");
Set<String> clés = parameters.keySet();
for (String clé : clés) {
for (String valeur : parameters.get(clé)) {
System.out.println(String.format("[%s,%s]", clé, valeur));
}
}
// oturum
System.out.println("Session...");
if (session.get("compteur") == null) {
session.put("compteur", new Integer(0));
}
Integer compteur = (Integer) session.get("compteur");
compteur = compteur + 1;
session.put("compteur", compteur);
System.out.println(String.format("compteur=%s", compteur));
// istek
request.put("info1", "information1");
// sayfa görüntüleme JSP
return SUCCESS;
}
// oturum
public void setSession(Map<String, Object> session) {
this.session = session;
}
// istek
public void setRequest(Map<String, Object> request) {
this.request = request;
}
// parametreler
public void setParameters(Map<String, String[]> parameters) {
this.parameters = parameters;
}
}
- 10. satır: Sınıf, aşağıdaki arayüzleri uygular
- SessionAware: oturum öznitelik sözlüğüne erişim sağlamak için (satır 16). Bu arayüzün tek bir yöntemi vardır; bu, satır 46'daki yöntemdir.
- RequestAware: isteğin öznitelik sözlüğüne erişmek için (satır 17). Bu arayüzün tek bir yöntemi vardır; bu, satır 51'deki yöntemdir.
- ParameterAware: sorgu parametreleri sözlüğüne erişmek için (satır 18). Bir anahtara (parametrenin adı) bir değer dizisinin karşılık geldiği dikkatinizi çekecektir. Bu, örneğin çoklu seçim listesi gibi birden fazla değer gönderen giriş alanlarını hesaba katmak için gereklidir. ParameterAware arayüzünde tek bir yöntem vardır; bu, 56. satırdaki yöntemdir.
- 21. satır: [Action1] eylemi talep edildiğinde yürütülen execute yöntemi. Yürütüldüğünde, ara alıcılar görevlerini tamamlamış olur:
- setParameters yöntemi (56. satır) çağrılmıştır ve 18. satırdaki parameters sözlüğü, isteğin tüm parametrelerini içerir.
- setSession yöntemi (46. satır) çağrılmıştır ve 16. satırdaki session sözlüğü, oturumun tüm özniteliklerini içerir.
- setRequest yöntemi (51. satır) çağrıldı ve 17. satırdaki request sözlüğü, isteğin tüm özniteliklerini içeriyor.
- 31-38. satırlar: compteur anahtarına ait değer oturuma yazılır
- 32-34. satırlar: oturumda compteur anahtarı aranır. Eğer bulunmazsa, 0 tamsayısı değeriyle ilişkilendirilerek oturuma eklenir.
- 35-37. satırlar: Oturumda compteur anahtarı aranır, değeri artırılır ve ardından anahtar oturuma geri eklenir.
- 38. satır: compteur anahtarına atanan değer görüntülenir. [Action1] eylemine yapılan her istekte değer artırıldığından, istekler ilerledikçe sayacın değerinin arttığını görmemiz gerekir.
- 40. satır: İstek öznitelikleri sözlüğüne, anahtarı info1 ve değeri information1 olan bir öznitelik eklenir. Bir isteğin öznitelikleri, parametrelerinden farklıdır. Parametreler, web uygulamasının istemcisi tarafından gönderilir. İstek öznitelikleri ise, isteği işleyen web uygulamasının farklı bileşenleri arasında iletişimi sağlar. Böylece, [Action1]'in yürütülmesinden sonra [Context.JSP] görünümü görüntülenecektir. Bu görünümün istek özniteliklerini alabildiğini göreceğiz.
- 42. satır: execute yöntemi, succes anahtarını döndürür.
16.4. Mesaj dosyası
[messages.properties] dosyası şu şekildedir:
Context.titre=Contexte de l''action
Context.message=Contexte de l''action
Context.parameters=Param\u00E8tres de l''action
Context.session=Elements de session
Context.request=Attributs de requ\u00EAte
16.5. [Context.JSP] görünümü
[Context.JSP] görünümü şu bilgileri görüntülemekle görevlidir:
- isteğin belirli parametrelerini
- oturumdaki compteur anahtarının değerini
- sorgudaki info1 anahtarının değerini
Kodu şöyledir:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title><s:text name="Context.titre"/></title>
<s:head/>
</head>
<body background="<s:url value="/ressources/standard.jpg"/>">
<h2><s:text name="Context.message"/></h2>
<h3><s:text name="Context.parameters"/></h3>
<s:iterator value="#parameters['nom']" var="nom">
nom : <s:property value="nom"/><br/>
</s:iterator>
<s:iterator value="#parameters['prenom']" var="prenom">
prenom : <s:property value="prenom"/><br/>
</s:iterator>
<s:iterator value="#parameters['age']" var="age">
âge : <s:property value="age"/><br/>
</s:iterator>
<h3><s:text name="Context.session"/></h3>
compteur : <s:property value="#session['compteur']"/>
<h3><s:text name="Context.request"/></h3>
info1 : <s:property value="#request['info1']"/>
</body>
</html>
- 12-14. satırlar: nom parametresiyle ilişkili tüm değerleri gösterir
- 15-17. satırlar: prenom parametresiyle ilişkili tüm değerleri gösterir
- 18-20. satırlar: age parametresiyle ilişkili tüm değerleri görüntüler
- 22. satır: oturumda compteur anahtarıyla ilişkili değeri görüntüler
- satır 24: sorguda info1 anahtarına ilişkin değeri görüntüler
16.6. Testler
![]() |
- [1]'te, Action1 parametre olmadan çağrılmıştır
- [2]'te, [Context.JSP] için parametre bulunamadı
- [3]'te, [Context.JSP] oturumda compteur anahtarını buldu
- [4]'te, [Context.JSP] sorguda info1 anahtarını buldu
Başka bir test yapalım:
![]() |
- [1]'te, Action1,
- [2]'te, [Context.JSP] bu parametreleri görüntülüyor
- [3]'te, [Context.JSP] oturumda compteur anahtarını buldu. Sayaç 1 artırıldı; bu da iki istek arasında bilginin gerçekten saklandığını gösteriyor.
- [4]'te, [Context.JSP], istekte info1 anahtarını buldu
Hatırlayacağınız üzere, [Action1.execute] yöntemi web sunucusunun konsoluna yazıyordu. İşte bir örnek:
16.7. Conclusion
Aşağıdaki noktalara dikkat edelim:
- Tüm kullanıcıların tüm isteklerinde paylaşılacak bilgileri saklamak için uygulama belleği kullanılacaktır. Yakında bunun bir örneğini göstereceğiz.
- Aynı kullanıcının tüm istekleri tarafından paylaşılacak bilgileri saklamak için, o kullanıcının oturumu kullanılacaktır.
- Bir isteği işleyen tüm öğeler tarafından paylaşılacak bilgileri saklamak için istek belleği kullanılacaktır.




