一、什么是freemarker?
FreeMarker是一个用Java语言编写的模板引擎。它基于模板来生成文本输出。Freemarker与web容器无关,即在web运行时,它并不知道servlet或者HTTP,它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等。
目前在企业中,主要用freemarker做静态页面或是页面展示。FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。
其实在我的理解freemarker就是一种工具,它能把jsp页面转换成静态页面,为用户的访问节省时间,同样减少服务器的压力。
简单来讲就是模板+数据模型=输出,然后输出页面(如下图)
二、使用方法:
搭建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;
}
}