如何在Tapestry 5应用程序中创建简单且可重构的页面链接?

时间:2013-01-25 09:12:04

标签: java tapestry

假设我有一个Grid,其中包含一些编辑Entity的链接。这是我的.tml文件

<table t:id="personGrid">
    <!-- ... -->
    <p:editCell>
        <p t:id="edit">${person.lastName}</p>
    </p:editCell>
    <!-- ... -->
</table>

在我的.java文件中,我有这个:

@Component(parameters = {"context=person.employeeNumber", "page=person/PersonPage"})
private PageLink edit;

这是succint,我不必写很多样板代码。这里的陷阱是我重构employeeNumberPersonPage。它将不再起作用,最糟糕的是我不会收到错误消息。

我发现我可以使用PageRenderLinkSource代替:

@Inject
private PageRenderLinkSource editPersonLink;
// ...
Object onActionFromEdit(String employeeNumber)
{
    return editPersonLink.createPageRenderLinkWithContext(PersonPage.class, employeeNumber);
}

这很不错。它没有更多的样板,但它是抗重构的。

我的问题是我仍然要保持

@Component(parameters = {"context=person.employeeNumber", "page=PersonPage"})
private PageLink edit;

在我的.java文件中,否则Tapestry会抱怨丢失@Component

所以我的问题是如何在没有样板的情况下实现一些非重构的参数化页面链接?

我正在使用Tapestry 5.3.6。

1 个答案:

答案 0 :(得分:1)

看起来您正在使用 PageLink 作为 ActionLink ,并且它有点奇怪,它可行。

此外,这种方法的另一个问题是,您最终要再次向服务器发送往返行程。

请改为尝试:

@Inject
private PageRenderLinkSource renderLinkSource;

public Link getEditLink() {
    return renderLinkSource.createPageRenderLinkWithContext(PersonPage.class, person.getEmployeeNumber());
}

然后:

<a href="${editLink}">${person.lastName}</a>

顺便说一句,这假设您的网格中有“row = person”