首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sitemesh和Freemarker与Jersey resources

Sitemesh和Freemarker与Jersey resources
EN

Stack Overflow用户
提问于 2011-11-02 15:52:45
回答 3查看 1.5K关注 0票数 2

我有一个基于Jersey的应用程序,对于HTML请求,它使用Freemarker从模板编程生成HTML;

代码语言:javascript
复制
@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中初始化的;

代码语言:javascript
复制
<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;

代码语言:javascript
复制
<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过滤器:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<?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,这对我来说并不是最好的)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-02 15:58:38

也许最简单的方法是集成Jersey和Spring --这将导致Spring完成所有的依赖注入工作。

下面是web.xml条目:

代码语言:javascript
复制
 <!--  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>
票数 1
EN

Stack Overflow用户

发布于 2011-11-03 09:37:33

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

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

只需修改您的"getresouces“,以便将所需的类put到模型中。

票数 1
EN

Stack Overflow用户

发布于 2011-11-03 09:14:23

快速指针: Struts2有一个插件可以将数据暴露给Freemarker for Sitemesh。你也许能够从其中挖掘出想法:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7977186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档