2011-01-14 30 views
3

我一直在使用Tapestry的內置組件,但現在我想嘗試製作自己的組件。假設這是可能的,那麼它是如何實現的?通常預計開發人員除了開箱即用外,還將創建自己的組件?如何在Tapestry 5中創建組件?

回答

6

是的,預計開發人員將創建他們自己的組件,這很容易做到。在那裏人們正在創建他們的組件庫,其中有很多項目。如果你想看到一些例子來看看:

組件很像頁。他們通常有一個.tml文件和一個.java文件。 .java文件位於名爲components(src/main/java/com/examples/app/components)的src目錄中,並且.tml文件位於同一位置,但在資源(src/main/resources/com/examples/app/components)

這裏是一個組件的例子,它呈現爲一個Facebook共享鏈接,鏈接到EventInfo頁面並接受一個Event對象以構建在Facebook上共享的URL。

import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 

import javax.persistence.Transient; 

import net.xeric.register.entities.Event; 

import org.apache.tapestry5.Link; 
import org.apache.tapestry5.annotations.Parameter; 
import org.apache.tapestry5.annotations.Property; 
import org.apache.tapestry5.ioc.annotations.Inject; 
import org.apache.tapestry5.services.PageRenderLinkSource; 

public class ShareEventOnFacebook { 

    @Inject 
    private PageRenderLinkSource linkSource; 

    @Parameter(required=true) 
    @Property 
    private Event event; 


    public String getFacebookShareURL() { 
     Link link = linkSource.createPageRenderLinkWithContext("EventInfo", event); 
     String linkURL = ""; 
     try { 
      linkURL = URLEncoder.encode(link.toAbsoluteURI(),"UTF-8"); 
     } catch (UnsupportedEncodingException e) { 

      e.printStackTrace(); 
     } 
     return linkURL; 
    } 

    public String getFacebookShareTitle() { 
     String returnValue = ""; 
     try { 
      returnValue = URLEncoder.encode(event.getDescription(), "UTF-8"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return returnValue;  
    } 

} 

請特別注意Event屬性是如何標註以將其標記爲必需參數的。這使得你的組件的參數,所以你可以在模板中說<t:shareeventonfacebook event="myEvent"/>

而相應的模板文件調用它:

<t:container 
    xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"> 


    <a href="http://www.facebook.com/sharer.php?u=${facebookShareURL}"> 
     Share on Facebook 
    </a><br/> 

</t:container> 

你想在你的頁面模板中使用的組件使用:

<t:shareeventonfacebook event="event"/> 
2

如果您一直在創建頁面並使用現有組件,那麼您已經創建了組件(頁面是專用組件)。主要的區別是:

  • 組件在不同的包
  • 組件經常去沒有一個模板(他們在代碼中渲染)
  • 組件可以有參數

請檢查掛毯網站的所有其他細節。