我有一个基于 Jersey 的应用程序,对于 HTML 请求,它使用 Freemarker 以编程方式从模板生成 HTML;
@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>
站点网格过滤器:
<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-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”来标记作为装饰器的模板)。装饰器.xml
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/decorators">
<decorator name="main" page="header_and_footer.dec">
<pattern>/*</pattern>
</decorator>
</decorators>
现在,这可以正常工作。HTML 页面用站点网格装饰。
我们目前唯一的问题是,我们现在需要向装饰器中注入由 Spring 确定的参数(例如来自用户原则的事物、请求上下文之外的事物或来自数据库的事物,例如来自那个“somedata”属性)。
鉴于我们没有在这个应用程序的任何地方使用 Spring WebMVC,我们如何连接一个可以访问这些信息的 freemarker servlet?即使它是一个单独的 Spring bean 需要与它的依赖项连接起来,也没关系。或者,我们可以通过某种方式在原始 Jersey 资源方法中以编程方式调用 sitemesh 吗?
我确实在网上找到了一个“Ted Young”的解决方案,但它似乎是部分的,对我不起作用(它还需要使用 SpringWebMVC,这对我来说不是最佳选择)。