tapestry - 如何在 Tapestry 5 中创建组件?

标签 tapestry

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

最佳答案

是的,开发人员将创建自己的组件,而且这很容易做到。有相当多的项目,人们正在创建他们的组件库。如果您想查看一些示例,请查看:

组件很像页面。它们通常有一个 .tml 文件和一个 .java 文件。 .java 文件位于名为 Components 的 src 目录中 (src/main/java/com/examples/app/components),.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"/>

关于tapestry - 如何在 Tapestry 5 中创建组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4692257/

相关文章:

javascript - 是否有任何复杂的 UI 小部件可以与 Tapestry 很好地集成?

java - 在Tapestry中将参数从java传递到js

hibernate - 使用 Spring Boot 和数据 JPA,尽管有 OpenSesionInViewFilter ,但仍然获得 LazyInitializationException

playframework - Tapestry5 与 Play 框架

java - Tapestry 5 用户认证

java - Java Tapestry 中的静态、非静态以及不同类之间的调用

java - Tapestry5 : loop, 访问表达式中的值

java - 如何使用来自网络服务的列表填充 Tapestry5 调色板?

java - Tapestry 5 : 2 dependent select fields using zone

java - Tapestry 5.4 和 HTML5 音频标签