我有一个基于泽西岛的应用程序,这对于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