gpt4 book ai didi

java - Tapestry 布局和组件库

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:28 26 4
gpt4 key购买 nike

我有几个不同的项目,它们基本上使用相同的 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 中。

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

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)

最佳答案

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

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

Tapestry 通过扫描类路径上所有 JAR 的 list 文件以查找名为 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.

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

关于java - Tapestry 布局和组件库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4464201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com