使用freemarker实现页面静态化

来源:互联网 发布:网络电视需要多少网速 编辑:程序博客网 时间:2024/05/19 20:44

最近做一个电商网站,首页分类数据太多需要实现静态化,于是google了一下找了一大堆的资料.做了一个例子:

由于这个项目使用了freemarker,所以就用freemarker来实现页面静态化.

   以下是我生成静态页最核心的方法,使用freemarker。

Java code
?
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中的方法:

Java code
?
1
2
3
4
5
6
7
8
9
10
 @RequestMapping(value="createKinds.html")
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模版源码:
Java code
?
1
2
3
4
5
6
7
8
9
10
<#if kindss?size != 0>
<div>
    <strong>一级分类:</strong>
    <#list kindss as kinds>
<a href="#">${kinds.name}</a>
</#list>
</div>
<#else>
<div>没有数据</div>
</#if>

我这里的ftl模版只是一个测试的模版,当然会根据自己的业务来实现模版.


0 0
原创粉丝点击