【问题标题】:freemarker + spring configuration and simplest examplefreemarker + spring 配置和最简单的例子
【发布时间】:2015-05-11 16:24:44
【问题描述】:

尽管有很多关于 freemarker + spring 的讨论,但很难找到整洁的工作示例来复制和运行。
您能否提供最简单的 freemarker 在 spring xml 上下文中的工作配置和 java 代码 sn-p 以从资源文件加载模板并进行处理。

【问题讨论】:

标签: java spring freemarker


【解决方案1】:

最佳工作示例。您可以下载源代码here

【讨论】:

  • 感谢您的回复,我已经浏览过这个博客,很好。但它与 Web 项目布局紧密结合。我正在寻找的是“从资源加载模板并替换占位符”尽可能简单。
【解决方案2】:

pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
</dependency>

applicationContext.xml

<bean id="freeMarkerConfigurationFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="templateLoaderPath" value="classpath:/META-INF/freemarker"/>
    <property name="preferFileSystemAccess" value="false"/>
</bean>

AlertMailComposer.java

import static org.springframework.ui.freemarker.FreeMarkerTemplateUtils.processTemplateIntoString;

@Component
public class AlertMailComposer implements Processor {
    
    public static final String TEMPLATE = "AlertMail.ftl";
    
    @Autowired
    private Configuration freemarkerConfiguration;
    
    protected String composeHtml(Alert alert) throws IOException, TemplateException {
        return processTemplateIntoString(freemarkerConfiguration.getTemplate(TEMPLATE), ImmutableMap.of(
                "alertType", alert.getAlertType(),
                "message", alert.getMessage(),
                "nodeName", alert.getEvent().getNodeName(),
                "event", toJson(alert.getEvent(), true)
        ));
    }
...

AlertMail.ftl

<html>
<body style="font-family:verdana;font-size:10">
    <b>${alertType}: </b>${message}<br>
    <b>on: </b>${nodeName}<br>
    <p/>
    <pre style="font-family:verdana;font-size:10;color:grey">
${event}
    </pre>
</body>
</html>

Configuration 类有一些有趣的属性,例如 ClassForTemplateLoading 加载与某个类相关的资源或使用 basePackagePath。类似于Class.getResource

@Autowired
private FreeMarkerConfigurationFactory freeMarkerConfigurationFactory;

@Bean
public freemarker.template.Configuration negativeRatesFreeMarkerConfiguration() throws IOException, TemplateException {
    freemarker.template.Configuration configuration = freeMarkerConfigurationFactory.createConfiguration();
    configuration.setClassForTemplateLoading(getClass(), "/" + getClass().getPackage().getName().replace('.', '/'));
    return configuration;
}

...

@Resource(name = "negativeRatesFreeMarkerConfiguration")
private Configuration freemarkerConfiguration;

...

freemarkerConfiguration.getTemplate("/service/emailReport.ftl")

【讨论】:

    【解决方案3】:

    在spring上下文xml中,声明FreemarkerConfigurationFactoryBean就足够了,即

    <bean id="freemarkerConfigFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
        <property name="templateLoaderPath" value="classpath:templates/"/>
    </bean>
    

    如果使用@Autowired注解,则无需在xml文件中进一步指定freemarker.template.Configuration bean。由工厂创建,由Spring注入。

    【讨论】:

      【解决方案4】:

      除了 pom.xml 中的 maven 依赖之外,你可以在 spring 中将它与 java 配置一起使用 -

      public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
      
          @Override
          protected Class<?>[] getRootConfigClasses() {
              return new Class<?>[] { MyRootContextConfig.class };
          }
      
          @Override
          protected Class<?>[] getServletConfigClasses() {
              return new Class<?>[] { MyServletContextConfig.class };
          }
      
          @Override
          protected String[] getServletMappings() {
              return new String[] { "/test/*" };
          } 
      
      }
      

      然后MyRootContextConfig可以有

      @Bean(name = "myFreeMarkerConfigruation")
      public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
          FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
          bean.setTemplateLoaderPath("classpath:/templates/");
          return bean;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-13
        • 2014-04-18
        • 2016-10-28
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 2018-02-24
        • 2014-04-06
        • 1970-01-01
        相关资源
        最近更新 更多