java - <jsp :include> doesn't work in magnolia cms

标签 java spring jsp content-management-system magnolia

我有一个项目,其中将 Magnolia cms 与 Spring mvc 集成。 spring servlet 作为 Magnolia 中的模块加载,并被分配模式 /web/* 。 servlet 在模块描述符中定义,因此 web.xml 文件中没有 servlet 定义,仅定义了 Magnolia 过滤器链。

我遇到的问题是当我尝试以下代码时

<jsp:include path="/web/header" />

例如,在 Magnolia 页面模板中,我收到一个错误,提示找不到该文件,并在 /src/main/webapp/web/header 中搜索该文件。 .

但是,如果我在 web.xml 中声明 spring servlet,则不会出现错误并且它可以工作。

有人可以告诉我为什么会发生这种情况吗?为什么不能<jsp:include>只需查看 Magnolia 过滤器链,就会发现 Spring servlet 映射了该请求并返回了所请求的页面?

谢谢:)

这是我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <filter>
        <display-name>Magnolia global filters</display-name>
        <filter-name>magnoliaFilterChain</filter-name>
        <filter-class>info.magnolia.cms.filters.MgnlMainFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>magnoliaFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

    <context-param>
        <param-name>magnolia.initialization.file</param-name>
        <param-value>
          WEB-INF/config/${servername}/${webapp}/magnolia.properties, WEB-INF/config/${servername}/magnolia.properties,
          WEB-INF/config/${webapp}/magnolia.properties, WEB-INF/config/default/magnolia.properties,
          WEB-INF/config/magnolia.properties
        </param-value>
    </context-param>

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

</web-app>

这就是我在bloom的模块描述符中定义spring servlet的方式:

    <servlets>
        <servlet>
            <name>Spring Servlet</name>
            <class>info.magnolia.module.blossom.web.InstallationAwareDispatcherServlet</class>
            <comment>Used for spring as dispatcher servlet</comment>
            <mappings>
                <mapping>/web/*</mapping>
            </mappings>
            <params>
                <param>
                    <name>contextConfigLocation</name>
                    <value>/WEB-INF/spring/appServlet/servlet-context.xml</value>
                </param>
            </params>
        </servlet>
    </servlets>

这是我在 Magnolia 中用于主页主页的主模板:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                <title>${content.title}</title>
    </head>

    <body>

        <jsp:include page="/web/header" />

    </body>
</html>

页面 header.jsp 位于 webapps/WEB-INF/views/ 下。

它在 Eclipse 中显示的包含旁边的错误是:

Fragment "/web/header" was not found at expected path /project_name/src/main/webapp/web/header

浏览器中出现的错误是:

HTTP Status 404 - /project_name/web/header

问题是,如果我将以下代码放入 web.xml 中,它就会起作用:

    <servlet>
        <servlet-name>Spring Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Spring Servlet</servlet-name>
        <url-pattern>/web/*</url-pattern>
    </servlet-mapping>

我希望这有帮助..非常感谢:)

最佳答案

默认情况下,Magnolia 过滤器链中的大多数过滤器不处理包含。当然,在您的情况下,让 servlet 接受包含是有意义的。您可以通过更改/server/filters/servlets/[your servlet] 中 servlet 的调度规则来启用此功能。

将/server/filters/dispatching 复制到/server/filters/servlets/[您的 servlet] 并将dispatching/include/toMagnoliaResource 设置为 true。

Magnolia 将请求分类为目标 Magnolia 资源或 Web 容器资源,并且过滤器以不同方式处理它们。它们的分类配置位于/server/webContainerResources 中,所有不符合规则的内容都是 Magnolia 资源。

关于java - <jsp :include> doesn't work in magnolia cms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185474/

相关文章:

Java收银机: Getting change from in different subunits

spring - SFTP 出站网关不工作

jsp - Struts2,字符串空检查

java - Struts servlet 使用 HttpServlet 对象,因此参数会被覆盖

java.lang.UnsatisfiedLinkError : no jzmq in java. 库.path

JavaFx2 IllegalStateException 与 Label.setText

java - 从 Java 在终端中执行 Linux 命令

spring - 如何使 Spring Security 中的其他用户 session 过期

java - Spring Thymeleaf 将对象属性传递给 href 按钮提交

javascript - 如何在单击上下文菜单中的选项时显示模式对话框?