我有一個基於澤西島的應用程序,這對於HTML請求使用Freemarker以編程方式從模板生成HTML;Sitemesh和Freemarker與澤西島資源
@GET
@Produces("text/html")
public Response getResources(@PathParam("name") String name) {
LOG.info("got a request for " + name);
Map<String, Object> model = new HashMap<String, Object>();
model.put("name", name);
//lookup some data for name;
model.put("somedata", somedata);
StringWriter out = new StringWriter();
configuration.getTemplate("template.ftl").process(model, out);
return Response.ok().entity(out.toString()).build();
}
所以配置實例= freemarker.template.Configuration在Spring中初始化;
<bean id="configuration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="/WEB-INF/template/path"/>
</bean>
現在,我已經在web.xml中設置了Jersey控制器,Sitemesh過濾器和Sitemesh-Freemarker servlet;
<servlet>
<servlet-name>JerseySpringNode</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JerseySpringNode</servlet-name>
<url-pattern>/mypath/*</url-pattern>
</servlet-mapping>
SiteMesh的過濾器:
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/mypath/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
並且servlet:
<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>/</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>ISO-8859-1</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.dec</url-pattern>
</servlet-mapping>
(我們使用 「.dec」,以紀念那些裝飾模板)。 Decorator.xml
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/decorators">
<decorator name="main" page="header_and_footer.dec">
<pattern>/*</pattern>
</decorator>
</decorators>
現在,這可以正常工作。 HTML頁面用sitemesh裝飾。
我們現在唯一存在的問題是,我們現在需要注入由Spring確定的裝飾器參數(例如來自用戶原理的東西,出於請求上下文的東西或來自數據庫的東西,例如來自該「somedata」屬性的一些信息)。
由於我們沒有在這個應用程序的任何地方使用Spring WebMVC,我們如何連接一個可以訪問這些信息的freemarker servlet?即使它是一個單獨的Spring bean,需要與它的依賴關係連接,也沒關係。或者,有一種方法可以通過編程方式調用原始Jersey資源方法中的sitemesh?
我確實在網上找到了一個「Ted Young」的解決方案,但它看起來很偏袒,並且不適合我(也需要使用SpringWebMVC,這對我來說目前不是最佳選擇)。
阿赫羅伯特,澤西和春天相處得很好。問題在於Sitemesh和它的Freemarker servlet,它沒有明顯的回訪Spring容器。 – scot
糟糕 - 忽略了重要的部分。然後你可以使用一個簡單的過濾器,該過濾器抓取綁定到應用程序上下文的Spring配置,該過濾器將你需要的資源注入到freemarker模板的請求上下文中。 –
小心解釋這個過濾器? – scot