一、什么是freemarker?
  FreeMarker是一个用Java语言编写的模板引擎。它基于模板来生成文本输出。Freemarker与web容器无关,即在web运行时,它并不知道servlet或者HTTP,它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等。
目前在企业中,主要用freemarker做静态页面或是页面展示。FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。
 其实在我的理解freemarker就是一种工具,它能把jsp页面转换成静态页面,为用户的访问节省时间,同样减少服务器的压力。

  简单来讲就是模板+数据模型=输出,然后输出页面(如下图)

FreeMaker 调用静态方法 freemarker 静态化_spring

二、使用方法:

     搭建FreeMarker


    FreeMarker从一个配置类开始,来源于配置对象,并没有 FreeMarker freeMarker = new...


//配置对象
    private Configuration conf; 
    //设置模板目录
    conf.setDirectoryForTemplateLoading(文件,不能是字符串);

    //拿到模板目录后再获取模板,快速返回一个模板对象
   Template template = conf.getTemplate("freemarker.html");

    //数据
      Map   root = new HashMap();

    //输出流,要指明输出的文件目录+文件名
      Writer out = new FileWriter(new File(dir+"hello.html"));
   
    //开始生成,这里发现有两个参数,
    //rootMap:数据,out:输出流
    template.process(rootMap,out);

    //最后关流
      out.close();

在新巴巴运动网项目中,我们将FreeMarker写到了Service层,新建了一个staticpage包,包含有StaticPageService接口和StaticPageServiceImpl实现类。如果我们不想使用@Service注解方式注入,那么可以手动配置,将其交给Spring托管。、

方法:新建一个freemarker.xml配置文件,具体为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--配置freemarker-->
    <bean id="staticPageService" class="cn.hdu.li.core.service.staticpage.StaticPageServiceImpl">//id一定要写为接口名
          <property name="freeMarkerConfigurer" >
              <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
                  <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
                  <property name="defaultEncoding" value="UTF-8"/>
              </bean>
          </property>
        <!--模板+数据=输出-->
    </bean>
    </beans>

java类:

public class StaticPageServiceImpl  implements StaticPageService,ServletContextAware{

    //不用@Autowired,那么就用set注入方式(还有一种为构造器注入),注入FreeMarkerConfigurer(写到配置文件中注入:<property name="freeMarkerConfigurer" >...),
    // 它含有getConfiguration()方法,就能得到configuration
    private Configuration conf;

    //以set方式注入Configuration
    public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
        this.conf = freeMarkerConfigurer.getConfiguration();
    }

    //静态化方法
    public void productIndex(Map<String, Object> root, Integer id) {  //map为数据,再传一个商品ID

        //1.设置模板目录( "/WEB-INF/ftl/"),已在配置文件中freemarker.xml设置,这里不用再设置了
        //conf.setDirectoryForTemplateLoading(dir);

        //输出流  写出去也要设置编码格式
        Writer out = null;
        try {
            //读模板,读进来,要设置编码格式,已经写在配置文件中
            //拿到模板目录后再获取模板,快速返回一个模板对象;
            //模板:productDetail.html
            Template template = conf.getTemplate("productDetail.html");

            //获取输出的html路径
            String path = getPath("/html/product/" + id + ".html");
            File f = new File(path);
            File parentFile = f.getParentFile();
            if (!parentFile.exists()) {
                parentFile.mkdirs();
            }
            //输出流
            out = new OutputStreamWriter(new FileOutputStream(f), "UTF-8");

            //开始生成
            template.process(root, out);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();   //关流
                } catch (IOException E) {
                    E.printStackTrace();
                }
            }
        }
    }

    //获取路径
    public String getPath(String name) {
        return servletContext.getRealPath(name);
    }
    private ServletContext servletContext;

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
}