我正在將一組grails 2.0.4應用程序遷移到3.x版本。所有這些都與許多Java應用程序一起部署在同一臺服務器上。使用sitemesh和freemarker模板,這兩套java和grails應用程序都具有共同的外觀和感覺。 但是,使用grails 3.x我無法使通常裝飾工作,應用程序堅持使用layouts/main.gsp來渲染我的gsp。在Grails中使用Sitemesh 3
到目前爲止(grails 2.0.4)提供一個共同的裝飾是相當直接的;每個grails應用程序的文件/WEB-INF/decorators.xml都提供了對可用的自由標記模板的引用。和web.xml中包括SiteMesh的過濾器和freemarker的裝飾的servlet聲明和映射
decorators.xml:從web.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>
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:
resources.groovy:
beans = {
sitemeshFreemarkerServlet(ServletRegistrationBean) {
servlet = bean(FreemarkerDecoratorServlet)
urlMappings = ["*.ftl"]
loadOnStartup = 2
}
}
然而,Grails的3.x應用程序 - 堅持使用佈局/ main.gsp來呈現我的GSP頁面。看來decorator.xml沒有被處理。我錯過了什麼?
添加條件也許不是最好的解決方案,但它的工作原理!非常感謝! –