2011-11-02 85 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”即可。