Sitemesh и Freemarker с ресурсами Джерси - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть приложение на основе Джерси, которое для запросов 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 настроен контроллер Джерси, фильтр Sitemesh и сервлет Sitemesh-Freemarker;

<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-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-страницы украшены сайтами.

Единственная проблема, с которой мы сталкиваемся в настоящее время, заключается в том, что нам теперь нужно ввести в параметры декоратора параметры, которые определяются из Spring (например, из принципа пользователя, из контекста запроса или из базы данных, например, некоторая информация из этого свойства "somedata").

Учитывая, что мы нигде не используем Spring WebMVC в этом приложении, как нам подключить сервлет freemarker, который может получить доступ к этой информации? Даже если это отдельный bean-компонент Spring, который необходимо связать со своими зависимостями, это нормально. В качестве альтернативы, есть ли какой-нибудь способ, которым мы можем программно вызывать sitemesh внутри оригинального метода ресурсов Джерси?

Я нашел решение от «Теда Янга» в Интернете, но оно, по-видимому, частично и не работает для меня (также оно требует использования SpringWebMVC, что в настоящее время не оптимально для меня).

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Вам необходимо явно добавить необходимые данные в «модель», которую вы передаете Freemarker.

Если их нет в «модели», они не могут их увидеть.

Просто измените свой"getresouces" для put классов, которые вам нужны в модели.

1 голос
/ 02 ноября 2011

Вероятно, самый простой способ - это объединить Джерси и Спринг - в результате 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 голосов
/ 03 ноября 2011

Быстрый указатель: Struts2 имеет плагин для предоставления данных в Freemarker для Sitemesh. Вы можете найти его для идей:

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

...