Haz
24
2013

Faces Flow

 

JavaServer Faces version 2.2 ile, request scope’dan geniş, session scope’dan dar, view scope’dan farklı yeni bir bean kapsamına sahip oldu: Flow Scope

 

Akış nedir?

Günümüz web uygulamalarında çoğunlukla, birbiri ile ilintili bir dizi ekran aracılığıyla kullanıcı etkileşiminin sağlandığı örnekler görüyoruz. Örneğin uçuş rezervasyonu, alışveriş/sipariş uygulamaları vb.

Bu örneklerde rastgele olmayan, giriş ve çıkış noktaları belirlenmiş, bu noktalar arasında yer alan sayfalara navigasyonu ifade eden bir “akış” kavramı söz konusudur.

JavaServer Faces version 2.2 ile, ifade etmeye çalıştığım bu akış kavramına, Spring Web Flow ve ADF Task Flows’dan ilhamla, Faces Flow adıyla destek sağlar ve Spring Web Flow, ADF Task Flows ve Apace MyFaces CODI’nin iyi yanlarını alarak standardize eder.

Her akış, bir dizi sayfadan ve kapsamı FlowScoped olan Managed Bean’den oluşur. Her akışın start node olarak adlandırılan başlangıç noktası ve return node olarak adlandırılan çıkış noktası vardır. Uygulama akışı artık düğümler(nodes) arasındaki akış olarak tanımlanır.

 

Ne sağlar?

Faces Flow, tanımlanmış akışların kapsüllenmesini, kullanılan kaynaklarla birlikte diğer uygulamalarda yeniden kullanılabilir bir modül olarak paketlenebilmesini sağlar.

Bir akış içindeki veriye, o akış kapsamında erişilebilir(ancak bir akış, parametreleri belirterek diğer bir akışa veri geçirebilir). Bu sayede, örneğin aynı tarayıcıda farklı sekme ya da pencerede aynı akış kullanılabilir.

 

Kapsülleme

Kapsüllemeyi tam olarak anlamak için, kapsamı session olan bir bean ile, akışlara benzer bir kullanım senaryosunda neler yaşanacağına yakından bakalım.

Varsayımsal örneğimizde Step1.xhtml, Step2.xhtml, Step3.xhtml adında 3 sayfamız varolsun. Step1.xhtml sayfasında kullanıcıdan bilgi girişi talep edilsin ve Step2.xhtml sayfasında, bu bilgiyi ekrana çıktılayalım. Step2.xhtml sayfasında da kullanıcıdan bilgi girişi talep edilsin ve Step3.xhtml sayfasında alınan her iki bilgi ekrana çıktılansın.

Bu varsayımsal örnekte bean’in kapsamı session olduğundan, örneğin safari tarayıcısında 1. sekme/pencerede, Step1.xhtml sayfasında istenen bilgiyi girip Step2.xhtml sayfasına geçtiğimizde, yeni bir sekme/pencere açıp Step2.xhtml sayfasına yeni bir istekte bulunursak, diğer sekme/pencerede çıktılanan bean verisini görebiliriz. Bunun sebebi, her iki sekme/pencerede de aynı bean örneğinin hizmet vermesidir. Bir başka tarayıcıdan(örneğin chrome) Step2.xhtml sayfasına istekte bulunduğumuzda ise, safari’de gördüğümüz veriyi göremesek de, bir erişim hatasıyla da karşılaşmayız.

Screen Shot 2013-06-21 at 11.29.20 PM

Bu varsayımsal örneği, Faces Flow ile geliştirdiğimizde ise, aynı tarayıcıda 2. sekme/pencerede söz konusu veriyi göremeyiz. Aksine, akışı, akış çağrı eylemi ile çağırmadığımız için “No active contexts for scope type javax.faces.flow.FlowScoped” hatası alırız. Aynı durum, bir başka tarayıcıdan yapılacak çağrı için de geçerlidir. Bir akış, akış çağrı eylemi ile çağırıldığında akış bean’inin yeni bir örneği oluşturulur, Faces Context’te aktive edilir ve bu örnek, kendi verisini depolar.

 

Akışların paketlenmesi

Akışlar JAR dosyalarında veya dizinlerde paketlenebilir.

 

I- JAR paketlemesi

Akışlar JAR dosyasında paketlendiğinde, META-INF/faces-config.xml dosyasında akışların beyan edilmesi gerekir. Akış node’ları(sayfalar), META-INF/flows/ içinde yer alır. META-INF dizini altında beans.xml dosyası bulunmalıdır.

 

II- Dizin paketlemesi

Maven proje dizin yapısını baz alırsak, bir maven web projesinde, dizin paketlemesi için src/main/webapp altında, akış isminde bir dizin kullanılabilir(bu iyi bir alışkanlıktır). Start node, varsayılan olarak akış ismi ile aynıdır ve .xhtml son eki alır. Start node’u farklı bir isim alacak şekilde konfigüre edebilirsiniz. Akış düğümlerinde uyulması zorunlu bir isimlendirme konvansiyonu yoktur.

Bilinmesi gereken diğer noktalar:

  • Bu dizinde her sayfa, akışın bir görünüm düğümüdür(view node).
  • Dizindeki görünümler(sayfalar) arasında navigasyon akış içinde kabul edilir.
  • Dizinin dışına navigasyon, akıştan çıkış olarak kabul edilir.

 

Yapılandırma

Akışlar xml konfigürasyon dosyaları ya da programlı olarak java sınıflarında yapılandırılabilir.

 

I- Konfigürasyon dosyası

Bir akışı yapılandırmak için xml konfigürasyon dosyası kullanırsanız, bu dosya ismi flowname-flow.xml olarak adlandırılmalı ve akış dizini içinde yer almalıdır. Örneğin order isminde bir akış yapılandırılıyorsa dosya adı order-flow.xml olmalıdır. Akış yapılandırma dosyası, flow-definition elemanı içeren bir faces konfigürasyon dosyasıdır.

<flow-definition id="order">
   <flow-return id="returnFromOrderFlow">
     <from-outcome>#{orderBean.returnValue}</from-outcome>
   </flow-return>
</flow-definition>

Flow-definition elemanının id niteliği kullanılarak akış adının tanımlanması gerekir. Yine bu eleman altında akış için dönüş noktası tanımlayan flow-return elemanı olmalıdır.

Akış için gelen parametreler, inbound-parameter elemanıyla, bir akış başka bir akışı çağıracaksa bu, call-flow elemanıyla belirtilir. Hangi akışın çağırılacağı call-flow elemanı altında flow-reference elemanıyla, çağırılan akışa parametre geçirilecekse de bu outbound-parameter elemanıyla belirtilir.

 

II- Programlı

Bir akış, Java sınıfıyla yapılandırılacaksa, sınıf adı akış adı olmalıdır. Örneğin customer adında bir akış yapılandırmak istiyorsak, sınıfımız Customer.java olmalıdır.

public class Customer implements Serializable {
    
    @Produces
    @FlowDefinition
    public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
        String flowId = "customer";
        flowBuilder.id("", flowId);
        flowBuilder.viewNode(flowId, "/" + flowId + "/" + flowId + ".xhtml").markAsStartNode();
        
        flowBuilder.returnNode("returnFromCustomerFlow")
                   .fromOutcome("#{customerBean.returnValue}");
        
        return flowBuilder.getFlow();
    }
}

Akış yapılandırma sınıfı defineFlow adında tek bir metod içerir. Bu metod javax.faces.flow.Flow sınıfı döndürür.

DefineFlow metodu, faces uygulamasından geçirilen bir FlowBuilder parametresi alır. Metod, akışı yapılandırmak için javax.faces.flow.Builder.FlowBuilder sınıfı metodlarını kullanır.

Metotta öncelikle yapılması gereken, akış kimliğini tanımlamaktır, FlowBuilder sınıfının id metodu bu işlem için çağırılır. Ardından akış için start node ve return node tanımlanır.

ReturnNode metoduna geçirilen argüman, dönüş düğümünün adını ayarlar, fromOutcome metoduna geçirilen argüman ise değerini.

Sonuç olarak Faces Flow, JavaServer Faces için varolan bir büyük ihtiyacı gidermiş ve Faces geliştiricileri için önemli bir yenilik sağlamıştır. Faces Flow hakkında, ilk etapta bilinmesi gerekenleri ele aldığım bu makale sonrası, akışların somut örneklerle kullanımını ele alan makalelerle karşınızda olmayı umuyorum.

Yorum yapabilirsiniz..


  • [...] Bu tutorial’da, Faces Flow kullanımını ele alacağız. Faces Flow’a dair temel düzeyde bilgi için şu makaleye bakılabilir: Faces Flow [...]

  • [...] Faces Flow çağrılarını ele alacağız. Faces Flow’a dair temel düzeyde bilgi için Faces Flow, akışları nasıl kullanılacağı hakkında da JSF 2.2: Faces Akışlarını Kullanın makale ve [...]


Yazı gönder
Yazı yayınlayarak Türkçe kaynak üretimine destek olabilirsin.

acikakademi
sirkethaberleri
  Yes We Kanban