Skip to content

3. Örnek 02 – Eyleme parametre enjeksiyonu

3.1. NetBeans projesi

  • [1,2]'te, yapılandırma dosyaları
  • [3], eylem
  • [4]'te, görünüm
  • [5]'te, proje kütüphaneleri

3.2. Yapılandırma dosyaları

[web.xml] dosyası şöyledir:


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">
 
  <display-name>Struts tuto-001</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <URL-pattern>/*</URL-pattern>
  </filter-mapping>
  <session-config>
    <session-timeout>
            30
    </session-timeout>
  </session-config>
</web-app>

Bu dosyayı daha önce açıklamıştık. Tekrar açıklamayacağız. Sadece, bu dosyanın tüm URL (15. satır) dosyalarının Struts filtresinden (10. satır) geçmesini sağladığını hatırlamanız yeterlidir.

[struts.xml] dosyası şöyledir:


<?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="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.JSP</result>
    </action>
  </package>
</struts>
  • 7-15. satırlar: [default] paketini tanımlar; bu paket, başka bir pakette bir eylem bulunamadığında kullanılır.
  • 8. satır: index adlı bu paket için varsayılan bir eylem tanımlar.
  • 9-14. satırlar: index adlı eylemi yapılandırır. Bu eylemin bir sınıfa bağlı olmadığı görülmektedir (9. satırda class özniteliğinin bulunmaması).
  • 10. satır: Sonuç, success anahtarı içindir (name özniteliğinin bulunmaması). Türü redirectAction'tir (type özniteliği). Bu tür, bir eylemi başka bir eyleme yönlendirmeye olanak tanır. Burada, müşteri /index eylemini talep ettiğinde, /actions/Action1 eylemine yönlendirilecektir (satır 11-12).
  • 16-20. satırlar: URL ve /actions/Action (class) eylemleriyle ilişkili eylem paketini (name) tanımlar.
  • satır 17-19: /actions/Action1 eylemini (name) yapılandırır. Bu eylemin çağrılması üzerine Struts, actions.Action1 (class) sınıfını örneklendirecek ve ardından bu sınıftaki execute yöntemi çalıştırılacaktır. Bu yöntem, 18. satırda tanımlanan tek anahtar olan success anahtarını döndürmelidir.
  • 18. satır: success anahtarı için görüntülenecek görünüm, JSP [vues/Action1.JSP] sayfası olacaktır.

Sonuç olarak, Struts projesinin yalnızca URL ve [actions/Action1] eylemlerini yürütebileceğini unutmayalım.

3.3. L'action

Action1 eylemi aşağıdaki sınıfla temsil edilir:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // eylem şablonu
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // alıcı ve ayarlayıcılar

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}
  • 8-9. satırlar: get / set ile erişilebilen iki alan (18-32. satırlar)
  • satır 12-14: execute yöntemi, beklendiği gibi success anahtarını döndürür. Başka hiçbir şey yapmaz.

3.4. JSP görünümü

Action1.JSP görünümü şöyledir:


<%@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>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>

Bu görünüm, [Action1].execute yönteminin yürütülmesinden sonra görüntülenir. [Action1] sınıfının param1 (satır 11) ve param2 (satır 19) alanlarının değerlerini gösterir.

3.5. Testler

[exemple-02] projesini çalıştıralım:

  • [1]'te, istenen URL. İlk başta istenen URL'in, herhangi bir işlem yapılmayan [/exemple-02] olduğu unutulmamalıdır. Ardından [web.xml] ve [struts.xml] dosyaları istismar edildi. [web.xml] dosyasının tüm isteklerin işlenmesini Struts 2'ye devrettiği görüldü. Ardından [struts.xml] dosyası istismar edildi:

<struts>
 <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.JSP</result>
    </action>
  </package>
</struts>

Eylem içermeyen URL ve [/exemple-02] dosyaları, 2-10. satırlardaki default paketi tarafından işlendi. URL'te herhangi bir eylem bulunmadığından, 3. satır (varsayılan eylem) nedeniyle eylem index haline geldi. 4-8. satırlar, Struts'un [1]'te gösterildiği gibi, [/exemple-02/actions/Action1] yönlendirme kodunu içeren bir URL'i istemciye geri göndermesine neden oldu.

[Action1] eylemi, 12-14. satırlarda yapılandırıldığı şekilde yürütüldü. Bu eylemin execute yöntemi çalıştırıldı. Bu yöntemin success kodunu döndürdüğü görüldü. [struts.xml]'in 13. satırı, [/vues/Action1.JSP] sayfasının tarayıcıya döndürülmesini sağladı:


...
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>
  1. ve 10. satırlar, [Action1] dosyasındaki param1 ve param2 alanlarının değerlerini görüntüledi. [2] dosyası bunu göstermektedir.

Başka bir URL isteyelim:

[1]'te, [Action1] eylemi, param1 ve param2 parametreleriyle çağrılıyor. Bir Struts eyleminin yürütme şemasına geri dönelim:

[FilterDispatcher] denetleyicisi, eylemin execute yöntemini çalıştırır. Yürütme akışı, ara alıcılar üzerinden geçer. Bunlardan biri, param1=qqchose&param2=autrechose parametre dizisini işler. Ardından, Action1 eyleminin setParam1 ve setParam2 yöntemlerini kullanır:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // eylem şablonu
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // getter ve setter'lar

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}

params yakalayıcısı aşağıdaki yöntemleri yürütür:

[Action1].setParam1("qqchose") ;
[Action1].setParam2("autrechose") ;

Dolayısıyla bu yöntemlerin mevcut olması gerekir. Şu noktayı unutmamak gerekir: Bir HTTP isteğinden parami parametrelerini almak için, çağrılan Struts eyleminin parametrelerle aynı isimlere sahip alanlara ve bunlara ilişkin get / set yöntemlerine sahip olması gerekir.

[Action1]'in execute yöntemi yürütüldüğünde, param1 ve param2 alanları params yakalayıcısı tarafından başlatılmıştır:

param1="qqchose"
param2="autrechose"

execute yöntemi, success anahtarını döndürür ve [Action1.JSP] sayfasıparam1, param2 ve [2]'in yeni değerleriyle görüntülenir.