Как создать компонент в Tapestry 5? - PullRequest
3 голосов
/ 14 января 2011

Я использовал встроенные компоненты Tapestry, но теперь я хотел бы попробовать сделать свои собственные. Предполагая, что это возможно, как это делается и обычно ли ожидается, что разработчики будут создавать свои собственные компоненты в дополнение к тому, что выходит из коробки?

Ответы [ 3 ]

6 голосов
/ 14 января 2011

Да, ожидается, что разработчики будут создавать свои собственные компоненты, и это довольно легко сделать. Есть немало проектов, где люди создают свои библиотеки компонентов. Если вы хотите увидеть несколько примеров, взгляните на:

Компоненты очень похожи на страницы. У них обычно есть файл .tml и файл .java. Файл .java находится в каталоге src, который называется компонентами (src / main / java / com / examples / app / components), а файл .tml находится там же, но в ресурсах (src / main / resources / com / examples). / приложение / компоненты)

Ниже приведен пример компонента, который отображается в виде ссылки на общий доступ Facebook, которая ссылается на страницу EventInfo и принимает объект Event для создания URL-адреса для обмена на Facebook.

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 голосов
/ 15 января 2011

Если вы создавали страницы и использовали существующие компоненты, значит, вы уже создавали компоненты (страницы являются специализированными компонентами). Основное отличие:

  • Компоненты идут в другой упаковке
  • Компоненты часто не имеют шаблона (они отображаются в коде)
  • Компоненты могут иметь параметры

Пожалуйста, проверьте веб-сайт Гобелен для всех оставшихся деталей.

2 голосов
/ 14 января 2011

Это не только возможно, но и просто и хорошо документировано. Посмотрите на соответствующие биты в документации Гобелен : Классы компонентов , шаблоны компонентов , события компонентов и параметры компонентов . По сути, страницы являются только компонентами верхнего уровня, поэтому вы должны чувствовать себя как дома.

Вы также можете взглянуть на встроенные компоненты, чтобы увидеть, как они реализованы.

...