首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tapestry布局和组件库

tapestry布局和组件库
EN

Stack Overflow用户
提问于 2010-12-17 02:36:10
回答 1查看 4.8K关注 0票数 5

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

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

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

我正在尝试从我的Index.tml中的另一个项目中引用CommonLayout,如下所示:

代码语言:javascript
复制
<t:commonlayout  xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
</t:commonlayout>

但是,每当我访问该页面时,我都会收到一个

代码语言:javascript
复制
Unable to resolve 'commonlayout' to a component class name.

我能这么做吗?我是否也可以将我所有常用的css和javascript放入我的tapestry- common -lib jar中,并从那里引用它们,例如:

代码语言:javascript
复制
<script type="text/javascript" src="${asset:context:/js/jquery-1.4.2.js}"></script>

我一直在四处寻找,找到了很多关于创建自定义组件和组件库的文章,但没有一篇像我试图做的那样重用布局。

更新:

我目前正在使用我的组件库中的其他抽象组件。这些文件存储在root.tapestrylib.base中。

我正在尝试将我的公共布局(Layout.java和Layout.tml)存储在root.tapestrylib.components中。当尝试从我的另一个项目中引用此布局时,我得到一个

代码语言:javascript
复制
Unable to resolve 'layout' to a component class name.

我试着这样使用它:

代码语言:javascript
复制
<html t:type="tapestry-lib/layout" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
</html>

这是我得到的实际异常的一部分:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-17 18:14:14

布局或非布局组件不应该有区别。

你的库中有没有可用的组件?(完整的错误报告tapestry.production-mode=false为您提供了可用组件的列表。)如果不是,您的库可能没有正确设置。

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

component library section in the Tapestry docs展示了如何设置Maven以自动创建这样的条目。

编辑:

组件需要位于您在模块类中为其配置的包中:

代码语言:javascript
复制
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,等等,就像你的主应用程序一样。

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

代码语言:javascript
复制
<div t:type="myprefix/MyComponent" ... />

编辑2:

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

代码语言:javascript
复制
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.

您的组件应该在那里显示它们的全名和前缀。是吗?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4464201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档