2011-01-14 36 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

如果您一直在创建页面并使用现有组件,那么您已经创建了组件(页面是专用组件)。主要的区别是:

  • 组件在不同的包
  • 组件经常去没有一个模板(他们在代码中渲染)
  • 组件可以有参数

请检查挂毯网站的所有其他细节。