java - 带有 Jersey 资源的 Sitemesh 和 Freemarker

标签 java spring jersey freemarker sitemesh

我有一个基于 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();
}

因此在Spring中初始化的配置实例= freemarker.template.Configuration;

<bean id="configuration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="templateLoaderPath" value="/WEB-INF/template/path"/>
</bean>

现在,我在 web.xml 中设置了 Jersey Controller 、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>
  <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 页面使用 sitemesh 装饰。

我们目前唯一的问题是,我们现在需要将由 Spring 确定的装饰器参数注入(inject)到装饰器中(例如来自用户原则的东西,请求上下文之外的东西,或者来自数据库的东西,例如来自该“somedata”属性的一些信息)。

鉴于我们没有在这个应用程序的任何地方使用 Spring WebMVC,我们如何连接一个可以访问此信息的 freemarker servlet?即使它是一个单独的 Spring bean,需要与其依赖项连接起来,也没关系。或者,我们可以通过某种方式在原始 Jersey 资源方法中以编程方式调用 sitemesh 吗?

我确实在网上找到了一个“Ted Young”的解决方案,但它似乎是部分的并且对我不起作用(它还需要使用 SpringWebMVC,目前这对我来说不是最佳选择)。

最佳答案

可能最简单的方法是集成 Jersey 和 Spring - 这会导致 Spring 完成所有依赖注入(inject)工作。

这是 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>

关于java - 带有 Jersey 资源的 Sitemesh 和 Freemarker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7977186/

相关文章:

java - JPA 属性表达式与使用 'In'

java - 在 pom.xml 中找不到 Artifact 问题

java - 为什么可以使用类名作为 vector 类型?

java - 无法在 Java 野生错误标记中使用 If 语句对参数未定义进行比较?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 如何处理 Cassandra 中的竞争条件?

Spring Boot 不 Autowiring @Repository

java - 泽西警告 - 无法解析为具体类型

Jersey 版本问题 : MessageBodyReader not found for media type=application/xml

java - 泽西客户端非阻塞