У меня есть приложение на основе Джерси, которое для запросов 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, что в настоящее время не оптимально для меня).