最近做一个电商网站,首页分类数据太多需要实现静态化,于是google了一下找了一大堆的资料.做了一个例子:
由于这个项目使用了freemarker,所以就用freemarker来实现页面静态化.
以下是我生成静态页最核心的方法,使用freemarker。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/**
* 生成静态页面主方法
* @param context ServletContext
* @param data 一个Map的数据结果集
* @param templatePath ftl模版路径
* @param targetHtmlPath 生成静态页面的路径
*/
public
static
void
crateHTML(ServletContext context, Map<String,Object> data, String templatePath,String targetHtmlPath){
Configuration freemarkerCfg =
new
Configuration();
//加载模版
freemarkerCfg.setServletContextForTemplateLoading(context,
"/"
);
freemarkerCfg.setEncoding(Locale.getDefault(),
"UTF-8"
);
try
{
//指定模版路径
Template template = freemarkerCfg.getTemplate(templatePath,
"UTF-8"
);
template.setEncoding(
"UTF-8"
);
//生成静态页面的路径
String htmlPath = context.getRealPath(
"/html"
)+
"/"
+targetHtmlPath;
File htmlFile =
new
File(htmlPath);
Writer out =
new
BufferedWriter(
new
OutputStreamWriter(
new
FileOutputStream(htmlFile),
"UTF-8"
));
//处理模版
template.process(data, out);
out.flush();
out.close();
}
catch
(Exception e) {
e.printStackTrace();
}
}
|
简单说明一下参数:
ServletContext :做java web的应该都知道,这里用的spring mvc 通过request.getSession().getServletContext()获取.
Map<String,Object> data : 模版的数据来源。freemarker通过一个Map给ftl模版送数据.
String templatePath : ftl所在的路径。我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。
String targetHtmlPath : 最后生成静态页的路径:我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。
生成的html文件路径是在: 根目录下的html文件夹下.
ftl模版文件是在根目录下的ftl文件夹下.
我们需要freemarker生成一个index_kinds.html文件。
controller中的方法:
1
2
3
4
5
6
7
8
9
10
|
public String createKinds(HttpServletRequest request){ //得到分类数据 List<Kinds> kindss = kindsService.getDataByHql("from Kinds where rank=2"); Map<String,Object> data = new HashMap<String,Object>(); data.put("kindss", kindss); //调用静态页面方法 createHTML(request.getSession().getServletContext(), data, "/ftl/index_kinds.ftl", "index_kinds.html"); System.out.println("生成静态页面成功!"); return "index_kinds"; }
|
以下是:ftl模版源码:
1
2
3
4
5
6
7
8
9
10
|
<div> <strong>一级分类:</strong> <#list kindss as kinds> <a href="#">${kinds.name}</a> </#list> </div> <#else> <div>没有数据</div> </#if>
|