4

我正在尝试通过开花模块将我的 spring 应用程序与 magnolia 集成,但我无法理解如何执行此操作。

我已经阅读了很多关于这个主题的内容,但我仍然不知道我的 web.xml 和 applicationContext.xml 应该是什么样子。

我的 web.xml 文件中是否应该有 2 个木兰监听器和 spring 监听器,并且有 2 个 servlet,一个用于开花,一个用于春季?然后我的 applicationContext 应该是什么样子?

你能帮我举一个 web.xml 和 applicationContext.xml 的工作集成的例子吗?我在网上到处找,但 web.xml 无处可去。

非常感谢你 :)

4

2 回答 2

5

Blossom有一个完整的 webapp 设置示例。看看那里的 web.xml 和 applicationContext.xml。

该示例基于magnolia-empty-webapp项目,该项目旨在作为您可以构建的起点。

在示例中,您将看到通常的 Spring 侦听器不在 web.xml 中,并且其中也没有 DispatcherServlets。相反,启动 spring 的任务由 samples 模块完成。该模块还创建了一个 BlossomDispatcherServlet,用于在渲染过程中渲染模板和段落。这样做的原因是,当 Magnolia 启动时,它将进入安装/更新模式并显示安装 UI。此时您不希望 Spring 已初始化,因为如果您有依赖于 Magnolia 的 bean,当 Magnolia 未准备好时它们将无法启动。因此,Spring 是由模块启动的。

但是,如果您的 bean 不依赖于 Magnolia,那么您可以安全地将 Springs 侦听器添加到 web.xml 并从模块中启动 BlossomDispatcherServlets。

可能有助于了解的另一件事是 Magnolia 使用过滤器进行渲染,并且该过滤器将处理所有进入的请求,除非它们被排除在外。因此,如果您将 servlet 添加到 web.xml,您需要从 Magnolias 过滤器中排除它们的 url 模式。

另一个更直接的选择是将您的 servlet 添加到您的模块描述符 xml 文件中。然后 Magnolia 会从过滤器中提取它们并调用它们。模块描述符的文档在这里

因此,总而言之,我建议使用模块启动 Spring 并将 servlet 添加到模块描述符 xml。在 web.xml 中配置内容也是一个可行的选项,但您需要考虑它与 install/update -phase 和请求路由的交互方式。

于 2011-10-25T14:23:52.640 回答
0

马吕斯,

Blossom的文档涉及如何配置 web.xml 文件。

具体来说,如果您在自己的模块中启动 Spring,则需要在 Magnolia 上下文侦听器之前将其添加到 web.xml 文件中:

<listener>
<listener-class>info.magnolia.module.blossom.support.ServletContextExposingContextListener</listener-class>
</listener>

此外,您需要扩展您的模块类来初始化和销毁​​ Blossom 调度程序 servlet,如下所示:

public class BlossomSampleModule extends BlossomModuleSupport implements ModuleLifecycle {

public void start(ModuleLifecycleContext moduleLifecycleContext) {
        initRootWebApplicationContext("classpath:/applicationContext.xml");
        initBlossomDispatcherServlet("blossom", "classpath:/blossom-servlet.xml");
    }

public void stop(ModuleLifecycleContext moduleLifecycleContext) {
        destroyDispatcherServlets();
        closeRootWebApplicationContext();
    }
}

希望那有所帮助!

肖恩

于 2011-10-25T14:13:25.080 回答