2011-11-02 110 views
2

我有一個基於澤西島的應用程序,這對於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,這對我來說目前不是最佳選擇)。

回答

1

可能最簡單的方法是集成Jersey和Spring - 這會導致Spring執行所有的依賴注入工作。

這裏的web.xml中的條目:

<!-- Configure Jersey in this application. --> 
    <servlet> 
    <servlet-name>jersey</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
<!-- want a custom Jersey application class? do that here. 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>org.example.jersey.MyJerseyApp</param-value> 
    </init-param> 
--> 
    <!-- Spring managed resources do not need to be listed here. Leave out if empty --> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <!-- 
     <param-value>org.example.jersey.package;org.example.jersey.otherpackage</param-value> 
    </init-param> 
    </servlet> 
+0

阿赫羅伯特,澤西和春天相處得很好。問題在於Sitemesh和它的Freemarker servlet,它沒有明顯的回訪Spring容器。 – scot

+0

糟糕 - 忽略了重要的部分。然後你可以使用一個簡單的過濾器,該過濾器抓取綁定到應用程序上下文的Spring配置,該過濾器將你需要的資源注入到freemarker模板的請求上下文中。 –

+0

小心解釋這個過濾器? – scot

1

您需要您所需要的數據明確地添加到「模式」傳遞給了Freemarker。

如果它不在「模型」中就看不到它。

只需將您需要的類別修改爲put模型中的「getresouces」即可。