在现有的Web应用程序中部分集成Tapestry

时间:2013-11-07 03:35:59

标签: java web-applications tapestry

我有一个仅使用servlet和JSP的现有Web应用程序。

现在我正在使用Tapestry 5构建我的Web应用程序,但我想知道是否有一种方法可以将Tapestry集成到我的应用程序中的几个URL中。

有可能这样做吗?我在Tapestry文档中找不到它。

部分解决

好的,这就是我到目前为止所做的。我将Tapestry 5网站上的JARS添加到了/ WEB-INF / lib文件夹,还添加了Hibernate验证器和Hibernate ORM的JARS,因为Tomcat正在抛出ClassNotFoundErrors。

我修改了我的web.xml文件并添加了这个:

这是我认为对我的问题的解决方案。但是我遇到了一个问题:我现有的Web应用程序没有使用Maven进行依赖关系管理。所以我将Tapestry5下载的所有JARS都包含在WEB-INF文件夹中的lib文件夹中。使用以下信息修改了我的web.xml文件:

<context-param>
    <param-name>tapestry.app-package</param-name>
    <param-value>be.blauweregen.ledenplatform</param-value>
</context-param>
<filter>
    <filter-name>app</filter-name>
    <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>app</filter-name>
    <url-pattern>/tapestry5/*</url-pattern>
</filter-mapping>

据我所知,只有带有rootpath / tapestry5的URL才会被Tapestry处理。

然后我在Eclipse中的src文件夹中添加了一个包be.blauweregen.ledenplatform.services,并向该包添加了一个类文件AppModule.java,其中包含以下内容:

package be.blauweregen.ledenplatform.services;

import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
import org.apache.tapestry5.ioc.services.SymbolProvider;

public class AppModule {
    @Contribute(SymbolProvider.class)
    @ApplicationDefaults
    public static void applicationDefaults(MappedConfiguration<String, String> configuration) {
        configuration.add(SymbolConstants.APPLICATION_FOLDER, "tapestry5");
    }
}

现在,当我在本地Tomcat 7.0.42服务器上的Eclipse中启动应用程序时,我在Tomcat启动时遇到此异常:

SEVERE: Exception starting filter app
java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
    at java.lang.Class.privateGetPublicMethods(Class.java:2641)
    at java.lang.Class.getMethods(Class.java:1457)
    at com.zeroturnaround.javarebel.Ce.b(JRebel:461)
    at com.zeroturnaround.javarebel.Ce.a(JRebel:183)
    at com.zeroturnaround.javarebel.Ce.getMethods(JRebel:611)
    at java.lang.Class.getMethods(Class.java)
    at org.apache.tapestry5.ioc.internal.DefaultModuleDefImpl.<init>(DefaultModuleDefImpl.java:115)
    at org.apache.tapestry5.ioc.RegistryBuilder.add(RegistryBuilder.java:131)
    at org.apache.tapestry5.ioc.RegistryBuilder.add(RegistryBuilder.java:159)
    at org.apache.tapestry5.ioc.IOCUtilities.addModulesInList(IOCUtilities.java:137)
    at org.apache.tapestry5.ioc.IOCUtilities.addModulesInManifest(IOCUtilities.java:107)
    at org.apache.tapestry5.ioc.IOCUtilities.addDefaultModules(IOCUtilities.java:77)
    at org.apache.tapestry5.internal.TapestryAppInitializer.<init>(TapestryAppInitializer.java:124)
    at org.apache.tapestry5.TapestryFilter.init(TapestryFilter.java:103)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4775)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5452)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    ... 29 more

找不到解决此问题的方法。

3 个答案:

答案 0 :(得分:2)

一种选择是让tapestry处理根上下文(/)然后tell it which paths to ignore

另一种选择是configure tapestry to run inside a subfolder

答案 1 :(得分:2)

Tapestry可以在与当前JSP和servlet相同的应用程序中轻松运行。您需要做的就是将TapestryFilter映射到只需要in your web.xml和/或tell tapestry to ignore某些路径的网址。

由于Tapestry使用servlet规范,因此使用HttpSession,您可以轻松获取会话并在Tapestry和您的JSP应用程序之间共享信息。你是否可以通过“整合”更具体地表达你的意思?否则,这将是您将得到的答案的详细信息;-)

答案 2 :(得分:0)

听起来您手动将jar添加到类路径而不是使用依赖关系管理工具(例如gradlemavenivy)。

以这种方式工作非常困难,因为您必须手动确定transitive dependencies并添加它们。很容易错过一些。

我猜你已经添加了tapestry-spring jar(s),但是为了添加弹簧罐而导致你的NoClassDefFoundError。

我建议您使用适当的依赖关系管理工具来构建您的webapp。