2

我有一个基于 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,这对我来说不是最佳选择)。

4

3 回答 3

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>
于 2011-11-02T07:58:37.570 回答
1

您需要将所需的数据显式添加到传递给 Freemarker 的“模型”中。

如果它不在“模型”中,它就看不到它。

只需将您的“getresouces”修改put为模型中需要的类。

于 2011-11-03T01:37:32.863 回答
0

快速指针:Struts2 有一个插件可以向 Freemarker for Sitemesh 公开数据。您也许可以挖掘它的想法:

http://www.docjar.com/html/api/org/apache/struts2/sitemesh/FreeMarkerPageFilter.java.html

于 2011-11-03T01:14:23.410 回答