我正在将一组 grails 2.0.4 应用程序迁移到版本 3.x。所有这些都部署在同一台服务器上,并与许多 java 应用程序一起。两组 java 和 grails 应用程序使用 sitemesh 和 freemarker 模板具有共同的外观和感觉。但是对于 grails 3.x,我无法使 commond 装饰工作,应用程序坚持使用 layouts/main.gsp 来渲染我的 gsp。
到目前为止(grails 2.0.4)提供一个共同的装饰是相当直接的;每个 grails 应用程序的 /WEB-INF/decorators.xml 文件都提供了对适用的 freemarker 模板的引用。web.xml 包括 sitemesh 过滤器和 freemarker 装饰器 servlet 声明和映射
装饰器.xml:
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/">
<excludes>
<pattern>/ND/*</pattern>
<pattern>/*/ND/*</pattern>
</excludes>
<decorator name="freemarker" page="myftl.ftl">
<pattern>/*</pattern>
</decorator>
</decorators>
来自 web.xml 的 Sitemesh 过滤器和 freemarker servlet:
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>class://</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
我试过的:
- 我已经在 src/main/webapp/WEB-INF 下移动了 decorators.xml
- 在 grails 3.x 中,sitemesh 过滤器不再存在,因此,我删除了 sitemesh.xml
- web.xml 没有被使用,所以现在我在 spring/resources.groovy 中定义了 freemarker servlet:
资源.groovy:
beans = {
sitemeshFreemarkerServlet(ServletRegistrationBean) {
servlet = bean(FreemarkerDecoratorServlet)
urlMappings = ["*.ftl"]
loadOnStartup = 2
}
}
但是,grails 3.x 应用程序坚持使用 layouts/main.gsp 来呈现我的 gsp 页面。似乎没有处理 decorators.xml。我错过了什么?