挂毯布局和组件库

时间:2010-12-16 18:36:10

标签: java tapestry

我有一些基本上使用相同的javascript / css和布局模板的不同项目。我想把所有这些都移到我的tapestry-common-lib项目中并从那里引用它。

我的tapestry-common-lib中有其他常见组件,但似乎无法使布局正常工作。

在我的tapestry-common-lib项目中,我在com.company.tapestrylib.components中有一个CommonLayout.java 和一个CommonLayout.tml文件 com/company/tapestrylib/components

我试图在我的Index.tml中引用CommonLayout表单中的另一个项目,如下所示:

<t:commonlayout  xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
</t:commonlayout>

然而,每当我访问该页面时,我都会得到一个

Unable to resolve 'commonlayout' to a component class name.

我可以这样做吗?我是否也可以将所有常见的CSS和javascript放入我的tapestry-common-lib jar中,并使用例如来自那里的那些:

<script type="text/javascript" src="${asset:context:/js/jquery-1.4.2.js}"></script>

我一直在环顾四周,发现了很多关于创建自定义组件和组件库的文章,但没有重复使用像我正在尝试的布局。

更新:

我目前正在使用组件库中的其他抽象组件。它们存储在[root] .tapestrylib.base。

我试图在[root] .tapestrylib.components中存储我的公共布局(Layout.java和Layout.tml)。当我试图从我的其他项目中引用这个布局时,我得到了一个

Unable to resolve 'layout' to a component class name.

我试图像这样使用它:

<html t:type="tapestry-lib/layout" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
</html>

这是我得到的实际例外的一部分:

11:28:01 ERROR RequestExceptionHandler - Processing of request failed with uncaught exception: Unable to resolve 'tapestry-lib/layout' to a component class name.
org.apache.tapestry5.ioc.internal.OperationException: Unable to resolve 'tapestry-lib/layout' to a component class name. [at classpath:com/mycompany/webapp/pages/Index.tml, line 1]
    at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:102)
    at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:69)
    at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
    at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1057)
    at org.apache.tapestry5.internal.pageload.PageLoaderImpl.createAssembler(PageLoaderImpl.java:218)
    at org.apache.tapestry5.internal.pageload.PageLoaderImpl.getAssembler(PageLoaderImpl.java:208)
    at org.apache.tapestry5.internal.pageload.PageLoaderImpl$3.invoke(PageLoaderImpl.java:180)
    at org.apache.tapestry5.internal.pageload.PageLoaderImpl$3.invoke(PageLoaderImpl.java:174)
    at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65)
    at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
    at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1057)
    at org.apache.tapestry5.internal.pageload.PageLoaderImpl.loadPage(PageLoaderImpl.java:173)
    at $PageLoader_12d045be613.loadPage($PageLoader_12d045be613.java)

1 个答案:

答案 0 :(得分:4)

布局或非布局组件不应该有所作为。

您图书馆的任何组件是否可用? (完整的错误报告[tapestry.production-mode=false]为您提供了可用组件的列表。)如果没有,您的库可能没有正确设置。

Tapestry通过扫描类路径上所有JAR的清单文件来查找组件库,以查找名为Tapestry-Module-Classes的条目,并从那里加载组件模块配置。检查JAR中的META-INF/MANIFEST.MF是否有这样的条目,以及它是否引用了正确的组件模块类。

component library section in the Tapestry docs显示如何设置Maven以自动创建此类条目。

编辑:

组件需要位于模块类中为它们配置的包中:

public class MyTapestryComponentsModule {

   public static void contributeComponentClassResolver(
            Configuration<LibraryMapping> configuration) {
        configuration.add(
            new LibraryMapping("myprefix", "my.tapestry.basepackage"));
   }

}

因此,任何组件都会进入my.tapestry.basepackage.components,混合到my.tapestry.basepackage.mixins等,就像在您的主应用中一样。

要使用库中的组件,只需在其前面加上您定义的内容:

<div t:type="myprefix/MyComponent" ... />

编辑2:

好的,看起来很好。真正有用的是启动时Tapestry日志的可用组件列表。它位于启动后最后打印的服务列表的正上方,应如下所示:

2010-12-20 20:27:07,663 [main] INFO  org.apache.tapestry5.services.TapestryModule.ComponentClassResolver - Available components:
  ActionLink: org.apache.tapestry5.corelib.components.ActionLink
  AddRowLink: org.apache.tapestry5.corelib.components.AddRowLink
  etc.

您的组件应以其全名和前缀显示在那里。他们呢?