如何在Tapestry 5中创建组件?

时间:2011-01-14 14:46:49

标签: tapestry

我一直在使用Tapestry的内置组件,但现在我想尝试制作自己的组件。假设这是可能的,它是如何完成的,并且通常期望开发人员除了开箱即用之外还将创建自己的组件?

3 个答案:

答案 0 :(得分:6)

是的,预计开发人员将创建自己的组件,这很容易做到。有很多项目在那里人们正在创建他们的组件库。如果你想看一些例子,请看看:

组件很像页面。它们通常有.tml文件和.java文件。 .java文件位于名为components(src / main / java / com / examples / app / components)的src目录中,.tml文件位于同一位置,但位于资源下(src / main / resources / com / examples /应用/组件)

以下是一个组件示例,该组件呈现为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"/>

答案 1 :(得分:2)

这不仅可行,而且简单且记录良好。请查看Tapestry documentationComponent classescomponent templatescomponent eventscomponent parameters中的相关位。实际上,页面只是顶级组件,因此您应该感到宾至如归。

您还可以查看内置组件以了解它们的实现方式。

答案 2 :(得分:2)

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

  • 组件使用不同的包
  • 组件通常没有模板(它们在代码中呈现)
  • 组件可以包含参数

请查看Tapestry网站了解所有剩余的详细信息。