Apache Tapestry - Bileşenler

Daha önce tartışıldığı gibi, Bileşenler ve Sayfalar, Sayfanın kök bileşen olması ve bir veya daha fazla alt bileşen içermesi dışında aynıdır. Bileşenler her zaman bir sayfanın içinde bulunur ve sayfanın neredeyse tüm dinamik işlevlerini yerine getirir.

Goblen bileşenleri, karmaşık ızgara işlevlerine basit bir HTML bağlantıları oluşturur. interactive AJAX. Bir Bileşen başka bir bileşen de içerebilir. Goblen bileşenleri aşağıdaki öğelerden oluşur -

  • Component Class - Bileşenin ana Java sınıfı.

  • XML Template- XML ​​şablonu, Sayfa şablonuna benzer. Bileşen sınıfı, şablonu nihai çıktı olarak işler. Bazı bileşenlerin şablonları olmayabilir. Bu durumda, çıktı, bileşen sınıfının kendisi tarafından,MarkupWriter sınıf.

  • Body- Sayfa şablonunun içinde belirtilen bileşenin özel işaretlemesi olabilir ve buna "Bileşen gövdesi" denir. Bileşen şablonunda<body />öğesi varsa <body /> öğesi, bileşenin gövdesiyle değiştirilir. Bu, XML şablonu bölümünde daha önce tartışılan düzene benzer.

  • Rendering - Oluşturma, bileşenin XML şablonunu ve gövdesini bileşenin gerçek çıktısına dönüştüren bir işlemdir.

  • Parameters - Bileşen ve sayfalar arasında iletişim oluşturmak ve böylece aralarında veri aktarmak için kullanılır.

  • Events- İşlevselliği bileşenlerden kapsayıcısına / üstüne (sayfalar veya başka bir bileşen) devreder. Sayfa gezinme amacıyla yaygın olarak kullanılır.

Rendering

Bir bileşenin oluşturulması önceden tanımlanmış bir dizi aşamada yapılır. Bileşen sistemindeki her aşama, bileşen sınıfında kongre veya açıklama ile tanımlanan karşılık gelen bir yönteme sahip olmalıdır.

// Using annotaion 
@SetupRender 
void initializeValues() { 
   // initialize values 
}

// using convention 
boolean afterRender() { 
   // do logic 
   return true; 
}

Aşamalar, yöntem adı ve ek açıklamaları aşağıda listelenmiştir.

Ek açıklama Varsayılan Yöntem Adları
@SetupRender setupRender ()
@Filmdenkare beginRender ()
@HaberturkTV beforeRenderTemplate ()
@Evleneceksen beforeRenderBody ()
@AfterRenderBody afterRenderBody ()
@AfterRenderTemplate afterRenderTemplate ()
@AfterRender afterRender ()
@Evleneceksen cleanupRender ()

Her aşamanın belirli bir amacı vardır ve bunlar aşağıdaki gibidir:

SetupRender

SetupRender, işleme sürecini başlatır. Genellikle bileşenin parametrelerini ayarlar.

BeginRender

BeginRender, bileşeni oluşturmaya başlar. Genellikle bileşenin başlangıç ​​/ başlangıç ​​etiketini oluşturur.

BeforeRenderTemplate

BeforeRenderTemplate, şablonun etrafına özel işaretleme ekleyerek XML şablonunu süslemek için kullanılır. Ayrıca, şablon oluşturmayı atlama seçeneği de sağlar.

BeforeRenderBody

BeforeRenderTemplate, bileşenin gövde öğesinin oluşturulmasını atlama seçeneği sağlar.

AfterRenderBody

Bileşenin gövdesi işlendikten sonra AfterRenderBody çağrılacaktır.

AfterRenderTemplate

AfterRenderTemplate, bileşenin şablonu oluşturulduktan sonra çağrılacaktır.

AfterRender

AfterRender, BeginRender'ın karşılığıdır ve genellikle close etiketini oluşturur.

CleanupRender

CleanupRender, SetupRender'ın karşılığıdır. Oluşturma işlemi sırasında oluşturulan tüm nesneleri serbest bırakır / ortadan kaldırır.

Oluşturma aşamalarının akışı yalnızca ileriye yönelik değildir. Bir fazın dönüş değerine bağlı olarak fazlar arasında gidip gelir.

Örneğin, SetupRender yöntemi false döndürürse, işleme, CleanupRender aşamasına atlar ve bunun tersi de geçerlidir. Farklı fazlar arasındaki akışı net bir şekilde anlamak için, aşağıda verilen şemadaki akışı kontrol edin.

Basit Bileşen

Çıktı mesajını "Merhaba, Goblen" olarak alacak basit bir bileşen olan Merhaba oluşturalım. Aşağıda, Hello bileşeninin kodu ve şablonu verilmiştir.

package com.example.MyFirstApplication.components;  
public class Hello {  
}
<html  
   xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd" 
   xmlns:p = "tapestry:parameter"> 
  
   <div> 
      <p>Hello, Tapestry (from component).</p> 
   </div> 
  
</html>

Merhaba bileşeni, bir sayfa şablonunda şu şekilde çağrılabilir:

<html title = "Hello component test page" 
   xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd" 
   xmlns:p = "tapestry:parameter"> 
<t:hello />  
</html>

Benzer şekilde, bileşen, aşağıda gösterildiği gibi şablon yerine MarkupWriter kullanarak aynı çıktıyı oluşturabilir.

package com.example.MyFirstApplication.components; 
  
import org.apache.tapestry5.MarkupWriter; 
import org.apache.tapestry5.annotations.BeginRender;   

public class Hello { 
   @BeginRender 
   void renderMessage(MarkupWriter writer) { 
      writer.write("<p>Hello, Tapestry (from component)</p>"); 
   } 
}

Bileşen şablonunu değiştirelim ve aşağıdaki kod bloğunda gösterildiği gibi <body /> öğesini dahil edelim.

<html>  
   xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd" 
   xmlns:p = "tapestry:parameter"> 
   
   <div> 
      <t:body /> 
   </div> 
</html>

Şimdi, sayfa şablonu, aşağıda gösterildiği gibi bileşen işaretlemesinde gövde içerebilir.

<html title = "Hello component test page" 
   xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd" 
   xmlns:p = "tapestry:parameter"> 
   
   <t:hello> 
      <p>Hello, Tapestry (from page).</p> 
   </t:hello> 
</html>

Çıktı aşağıdaki gibi olacaktır -

<html> 
   <div> 
      <p>Hello, Tapestry (from page).</p> 
   </div> 
</html>

Parametreler

Bu parametrelerin birincil amacı, bileşenin bir alanı ile sayfanın bir özelliği / kaynağı arasında bir bağlantı oluşturmaktır. Parametreleri kullanarak, bileşen ve karşılık gelen sayfa birbirleriyle iletişim kurar ve veri aktarır. Bu denirTwo Way Data Binding.

Örneğin, bir kullanıcı yönetimi sayfasındaki yaşı temsil etmek için kullanılan bir metin kutusu bileşeni, parametre aracılığıyla başlangıç ​​değerini (veritabanında bulunan) alır. Yine, kullanıcının yaşı güncellendikten ve geri gönderildikten sonra, bileşen güncellenen yaşı aynı parametre üzerinden geri gönderecektir.

Bileşen sınıfında yeni bir parametre oluşturmak için, bir alan tanımlayın ve bir @Parameterek açıklama. Bu @Parameter iki isteğe bağlı argümana sahiptir, bunlar -

  • required- parametreyi zorunlu kılar. Goblen sağlanmadığı takdirde istisna yaratır.

  • value - parametrenin varsayılan değerini belirtir.

Parametre, sayfa şablonunda bileşen etiketinin öznitelikleri olarak belirtilmelidir. Özniteliklerin değeri, önceki bölümlerde tartıştığımız Bağlayıcı İfade / Genişletme kullanılarak belirtilmelidir. Daha önce öğrendiğimiz bazı genişletmeler:

  • Property expansion (prop:«val») - Sayfa sınıfının özelliğinden verileri alın.

  • Message expansion (message:«val») - Index.properties dosyasında tanımlanan anahtardan verileri alın.

  • Context expansion (context:«val») - Verileri web bağlam klasöründen alın / src / main / webapp.

  • Asset expansion (asset:«val») - Jar dosyasında, / META-INF / varlıklarında gömülü kaynaklardan verileri alın.

  • Symbol expansion (symbol:«val») - Verileri AppModule.javafile dosyasında tanımlanan sembollerden alın.

Goblen, bazıları aşağıda verilen daha birçok faydalı genişletmeye sahiptir -

  • Literal expansion (literal:«val») - Değişmez bir dize.

  • Var expansion (var:«val») - Bileşenin bir işleme değişkeninin okunmasına veya güncellenmesine izin verin.

  • Validate expansion (validate:«val»)- Bir nesnenin geçerlilik kuralını belirtmek için kullanılan özel bir dize. Örneğin, validate: required, minLength = 5.

  • Translate (translate:«val») - Giriş doğrulamasında Translator sınıfını (istemci tarafını sunucu tarafındaki gösterime dönüştürme) belirtmek için kullanılır.

  • Block (block:«val») - Şablon içindeki blok öğesinin kimliği.

  • Component (component:«val») - Şablon içindeki başka bir bileşenin kimliği.

Özellik genişletme ve Var genişletme dışında yukarıdaki tüm genişletmeler salt okunurdur. Bileşen tarafından sayfayla veri alışverişi yapmak için kullanılırlar. Genişletmeyi öznitelik değerleri olarak kullanırken,${...}kullanılmamalı. Bunun yerine genişletmeyi dolar ve parantez sembolleri olmadan kullanın.

Parametre Kullanan Bileşen

Merhaba bileşenini değiştirerek HelloWithParameter adlı yeni bir bileşen oluşturalım. name bileşen sınıfında parametre ve buna göre bileşen şablonunu ve sayfa şablonunu değiştirme.

  • Yeni bir bileşen sınıfı oluşturun HelloWithParameter.java.

  • Özel bir alan ekleyin ve şununla adlandırın: @Parameterek açıklama. Zorunlu hale getirmek için gerekli argümanı kullanın.

@Parameter(required = true) 
private String name;
  • Özel bir alan ekleyin, şununla sonuçlanır: @Properyek açıklama. Result özelliği, bileşen şablonunda kullanılacaktır. Bileşen şablonunun ek not verilen alanlara erişimi yok@Parameter ve sadece ek açıklamalı alanlara erişebilir @Property. Bileşen şablonlarında bulunan değişken, Oluşturma Değişkenleri olarak adlandırılır.

@Property 
 private String result;
  • Bir RenderBody yöntemi ekleyin ve değeri name parametresinden result özelliğine kopyalayın.

@BeginRender 
void initializeValues() { 
   result = name; 
}
  • Yeni bir bileşen şablonu ekleyin HelloWithParamter.tml ve mesajı işlemek için result özelliğini kullanın.

<div> Hello, ${result} </div>
  • Test sayfasına (testhello.java) yeni bir mülk, Kullanıcı adı ekleyin.

public String getUsername() { 
   return "User1"; 
}
  • Sayfa şablonunda yeni oluşturulan bileşeni kullanın ve kullanıcı adı özelliğini şu ad parametresinde ayarlayın: HelloWithParameter bileşen.

<t:helloWithParameter name = "username" />

Tam liste aşağıdaki gibidir -

package com.example.MyFirstApplication.components;  

import org.apache.tapestry5.annotations.*;  
public class HelloWithParameter { 
   @Parameter(required = true) 
   private String name; 
     
   @Property 
   private String result; 
   
   @BeginRender 
   void initializeValues() { 
      result = name; 
   } 
}
<html  
   xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd" 
   xmlns:p = "tapestry:parameter"> 
   
   <div> Hello, ${result} </div> 
  
</html>
package com.example.MyFirstApplication.pages;  

import org.apache.tapestry5.annotations.*;  
public class TestHello { 
   public String getUsername() { 
      return "User1"; 
   } 
}
<html title = "Hello component test page" 
   xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd" 
   xmlns:p = "tapestry:parameter"> 
   <t:helloWithParameter name = "username" />
   
</html>

Sonuç aşağıdaki gibi olacaktır -

<div> Hello, User1 </div>

Gelişmiş Parametre

Önceki bölümlerde, özel bir bileşende basit bir parametrenin nasıl oluşturulacağını ve kullanılacağını analiz ettik. Gelişmiş bir parametre de tam işaretleme içerebilir. Bu durumda işaretleme, sayfa şablonundaki alt bölüm gibi bileşen etiketinin içinde belirtilmelidir. Yerleşik if bileşeninin hem başarı hem de başarısızlık durumu için işaretlemesi vardır. Başarı işaretlemesi, bileşen etiketinin gövdesi olarak belirtilir ve başarısızlık biçimlendirmesi birelseparameter.

Nasıl kullanılacağını görelim ifbileşen. İf bileşeninin iki parametresi vardır -

  • test - Basit özellik tabanlı parametre.

  • Else - Koşul başarısız olursa alternatif işaretlemeyi belirtmek için kullanılan gelişmiş parametre

Tapestry, aşağıdaki mantığı kullanarak test özelliğinin değerini kontrol edecek ve doğru veya yanlışı döndürecektir. Bu denirType Coercion, bir türdeki bir nesneyi aynı içeriğe sahip başka bir türe dönüştürmenin bir yolu.

  • Veri türü ise String, Boş değilse ve "False" değişmez dizesi değilse "True" (büyük / küçük harfe duyarlı değildir).

  • Veri türü ise Number, Sıfır değilse doğru.

  • Veri türü ise Collection, Boş değilse doğrudur.

  • Veri türü ise Object, True (boş olmadığı sürece).

Koşul geçerse, bileşen kendi gövdesini oluşturur; aksi takdirde, else parametresinin gövdesini oluşturur.

Tam liste aşağıdaki gibidir -

package com.example.MyFirstApplication.pages; 
public class TestIf { 
   public String getUser() { 
      return "User1"; 
   } 
}

<html title = "If Test Page" 
   xmlns:t = "http://tapestry.apache.org/schema/tapestry_5_4.xsd" 
   xmlns:p = "tapestry:parameter">  
   
   <body> 
      <h1>Welcome!</h1>  
      <t:if test = "user"> 
         Welcome back, ${user} 
         <p:else>
            Please <t:pagelink page = "login">Login</t:pagelink>  
         </p:else> 
      </t:if>
   </body>
   
</html>

Bileşen Olayları / Sayfada Gezinme

Goblen uygulaması bir collection of Pagesbirbirleriyle etkileşim. Şimdiye kadar, aralarında herhangi bir iletişim olmadan tek tek sayfaların nasıl oluşturulacağını öğrendik. Bir Bileşen etkinliğinin birincil amacı, sunucu tarafı olaylarını kullanarak sayfalar arasında (sayfalar içinde de) etkileşim sağlamaktır. Bileşen olaylarının çoğu, istemci tarafındaki olaylardan kaynaklanır.

Örneğin, bir kullanıcı bir sayfadaki bir bağlantıyı tıkladığında, Tapestry, hedef sayfayı çağırmak yerine aynı sayfayı hedef bilgilerle çağırır ve bir sunucu tarafı olayı başlatır. Goblen sayfası olayı yakalayacak, hedef bilgileri işleyecek ve hedef sayfaya sunucu tarafı yönlendirmesi yapacak.

Goblen bir Post/Redirect/Get (RPG) design patternsayfa gezintisi için. RPG'de, bir kullanıcı bir form göndererek bir gönderi talebi yaptığında, sunucu gönderilen verileri işler ancak yanıtı doğrudan döndürmez. Bunun yerine, başka bir sayfaya istemci tarafı yönlendirme yapacak ve bu da sonucu verecektir. Tarayıcı geri düğmesi, tarayıcı yenileme düğmesi, vb. Yoluyla yinelenen form gönderimlerini önlemek için bir RPG kalıbı kullanılır. Tapestry, aşağıdaki iki tür isteği sağlayarak bir RPG kalıbı sağlar.

  • Component Event Request- Bu tür bir istek, bir sayfadaki belirli bir bileşeni hedefler ve bileşen içindeki etkinlikleri artırır. Bu istek yalnızca yeniden yönlendirme yapar ve yanıtı vermez.

  • Render Request - Bu tür istekler bir sayfayı hedefler ve yanıtı istemciye geri gönderir.

Bileşen olaylarını ve sayfada gezinmeyi anlamak için duvar halısı isteğinin URL modelini bilmemiz gerekir. Her iki istek türü için URL modeli aşağıdaki gibidir -

  • Component Event Requests -

/<<page_name_with_path>>.<<component_id|event_id>>/<<context_information>>
  • Render Request -

/<<page_name_with_path>>/<<context_information>>

URL modellerinin bazı örnekleri şunlardır:

  • Dizin sayfası tarafından talep edilebilir https://«domain»/«app»/index.

  • Dizin sayfası bir alt klasör yöneticisi altında mevcutsa, o zaman bunu talep edebilir https://«domain»/«app»/admin/index.

  • Kullanıcı, ActionLink component ile id test dizin sayfasında ise URL https://«domain»/«app»/index.test.

Etkinlikler

Varsayılan olarak, Tapestry, OnPassivate ve OnActivatetüm istekler için etkinlikler. Bileşen olay istek türü için, goblen, bileşene bağlı olarak ek bir veya daha fazla olay oluşturur. ActionLink bileşeni, bir Action olayı oluştururken, bir Form bileşeni,Validate, Success, vb.,

Olaylar, karşılık gelen yöntem işleyicisi kullanılarak sayfa sınıfında işlenebilir. Yöntem işleyicisi, bir yöntem adlandırma kuralı aracılığıyla veya@OnEventek açıklama. Yöntem adlandırma kuralının biçimi şu şekildedir:On«EventName»From«ComponentId».

ActionLink bileşeninin bir eylem olayı id test aşağıdaki yöntemlerden biriyle ele alınabilir -

void OnActionFromTest() { 
}  
@OnEvent(component = "test", name = "action") 
void CustomFunctionName() { 
}

Yöntem adının belirli bir bileşeni yoksa, yöntem eşleşen olaylara sahip tüm bileşen için çağrılacaktır.

void OnAction() { 
}

OnPasivate ve OnActivate Etkinliği

OnPassivate, bir OnActivate olay işleyicisi için bağlam bilgisi sağlamak için kullanılır. Genel olarak, Tapestry bağlam bilgisini sağlar ve OnActivateevent işleyicisinde bir argüman olarak kullanılabilir.

Örneğin, bağlam bilgisi int türünde 3 ise, OnActivate olayı şu şekilde çağrılabilir:

void OnActivate(int id) { 
}

Bazı senaryolarda, içerik bilgisi mevcut olmayabilir. Bu durumda, bağlam bilgilerini OnActivate olay işleyicisine OnPassivate olay işleyicisi aracılığıyla sağlayabiliriz. OnPassivate olay işleyicisinin dönüş türü, OnActivate olay işleyicisinin bağımsız değişkeni olarak kullanılmalıdır.

int OnPassivate() { 
   int id = 3; 
   return id; 
} 
void OnActivate(int id) { 
}

Olay İşleyici Dönüş Değerleri

Tapestry, olay işleyicisinin dönüş değerlerine dayalı olarak sayfa yeniden yönlendirmesi yayınlar. Olay işleyicisi aşağıdaki değerlerden herhangi birini döndürmelidir.

  • Null Response- Boş değer döndürür. Tapestry, geçerli sayfanın URL'sini oluşturacak ve müşteriye yönlendirme olarak gönderecektir.

public Object onAction() { 
   return null; 
}
  • String Response- Dize değerini döndürür. Tapestry, değerle eşleşen sayfanın URL'sini oluşturacak ve müşteriye yönlendirme olarak gönderecektir.

public String onAction() { 
   return "Index"; 
}
  • Class Response- Bir sayfa sınıfı döndürür. Tapestry, döndürülen sayfa sınıfının URL'sini oluşturacak ve istemciye yönlendirme olarak gönderecektir.

public Object onAction() { 
   return Index.class 
}
  • Page Response- @InjectPage ile açıklanmış bir alan döndürür. Tapestry, enjekte edilen sayfanın URL'sini oluşturacak ve müşteriye yönlendirme olarak gönderecektir.

@InjectPage 
private Index index;  

public Object onAction(){ 
   return index; 
}
  • HttpError- HTTPError nesnesini döndürür. Tapestry, istemci tarafında bir HTTP hatası verir.

public Object onAction(){ 
   return new HttpError(302, "The Error message); 
}
  • Link Response- Doğrudan bir bağlantı örneği döndürür. Tapestry, URL'yi Bağlantı nesnesinden oluşturacak ve istemciye yönlendirme olarak gönderecektir.

  • Stream Response - döndürür StreamResponsenesne. Tapestry, akışı yanıt olarak doğrudan istemci tarayıcısına gönderecektir. Doğrudan raporlar ve görüntüler oluşturmak ve müşteriye göndermek için kullanılır.

  • Url Response - döndürür java.net.URLnesne. Tapestry, nesneden karşılık gelen URL'yi alacak ve müşteriye yönlendirme olarak gönderecektir.

  • Object Response- Yukarıda belirtilen değerler dışındaki tüm değerleri döndürür. Goblen bir hata yaratacaktır.

Etkinlik Bağlamı

Genel olarak, olay işleyicisi bağlam bilgisini bağımsız değişkenler kullanarak alabilir. Örneğin, bağlam bilgisi int türünde 3 ise, olay işleyicisi -

Object onActionFromTest(int id) {  
}

Tapestry, bağlam bilgisini doğru bir şekilde işler ve argümanlar aracılığıyla yöntemlere sağlar. Bazen, Programlamanın karmaşıklığı nedeniyle, Tapestry bunu düzgün bir şekilde işleyemeyebilir. O zaman, bağlam bilgisinin tamamını alabilir ve kendimiz işleyebiliriz.

Object onActionFromEdit(EventContext context) { 
   if (context.getCount() > 0) { 
      this.selectedId = context.get(0); 
   } else { 
      alertManager.warn("Please select a document."); 
      return null; 
   } 
}