我有一个基于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>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确定的参数(比如来自用户原则的东西,请求上下文之外的东西,或者来自数据库的东西,例如来自“某个数据”属性的一些信息)。
假设我们在这个应用程序中没有使用servlet,那么我们如何连接一个可以访问此信息的freemarker WebMVC?即使它是一个单独的Spring bean,需要与它的依赖项连接在一起,这也没问题。或者,我们是否可以在原始Jersey资源方法中以编程方式调用sitemesh?
我确实在网上找到了一个"Ted Young“的解决方案,但它似乎不全面,对我来说不起作用(而且它需要使用SpringWebMVC,这对我来说并不是最好的)。
发布于 2011-11-02 15:58:38
也许最简单的方法是集成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>发布于 2011-11-03 09:37:33
您需要显式地将所需的数据添加到传递给Freemarker的“模型”中。
如果它不在“模型”中,它就看不到它。
只需修改您的"getresouces“,以便将所需的类put到模型中。
发布于 2011-11-03 09:14:23
快速指针: Struts2有一个插件可以将数据暴露给Freemarker for Sitemesh。你也许能够从其中挖掘出想法:
http://www.docjar.com/html/api/org/apache/struts2/sitemesh/FreeMarkerPageFilter.java.html
https://stackoverflow.com/questions/7977186
复制相似问题