使用FreeMarker生成静态html文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/li4562258fj155/article/details/77162489

为了提高程序的效率,一些关联关系复杂或修改频率小的页面最好使用静态页面展示。这里使用freemarker来生成静态html文件。

freemarker环境

下载jar包freemarker-2.3.16.jar 地址:http://download.csdn.net/download/li4562258fj155/9933021

freemarker模板

<!DOCTYPE html>
<html>
  <head>
    <title>学生</title>
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <link href="/demo/css/style2014.css" rel="stylesheet" type="text/css">
    <link href="/demo/css/base.css" rel="stylesheet" type="text/css">

    <style type="text/css">
        
        /* 常用 */
        .td_1{width: 11%;}
        /* 空白单元格 */
        .td_blank{width: 10%;}
        /* 图片样式 */
        .equ_img{width: 225px;height: 150px;}
        
    </style>
  </head>
  <body>
    <div class="div_body">
        <form id="form_main" method="post">
            <table class="table_main">
                <tbody>
                    <tr>
                        <td class="td_blank"></td>
                        <td class="td_common td_1">学生名称</td>
                          <td class="td_common td_1">
                              <input value="${student.name}" class="input_common" readonly="readonly" style="color: gray; background: white none repeat scroll 0% 0%;" type="text">
                          </td>
                          <td class="td_common td_1">学生编号</td>
                          <td colspan="2" class="td_common">
                              <input value="${student.number}" class="input_common" readonly="readonly" style="color: gray; background: white none repeat scroll 0% 0%;" type="text">
                          </td>
                          <td rowspan="5" colspan="3" class="td_common">
                              <img src="/student/${student.imgAddr}" class="stu_img">
                          </td>
                          <td class="td_blank"></td>
                    </tr>
                    <tr>
                        <td class="td_blank"></td>
                        <td class="td_common">是否毕业</td>
                          <td class="td_common">
                              <select class="sel_common" disabled="disabled" style="color: gray; background: white none repeat scroll 0% 0%;">
                                  <option value="">--请选择--</option>
                                  <#if (student.isGraduate == 1)>
                                      <option value="1" selected="selected">是</option>
                                      <option value="0">否</option>
                                  </#if>
                                  <#if (student.isGraduate == 0)>
                                      <option value="1">是</option>
                                      <option value="0" selected="selected">否</option>
                                  </#if>
                              </select>
                          </td>
                          <td class="td_common">毕业时间</td>
                          <td colspan="2" class="td_common">
                              <input id="txt~graduateTime" value="${student.graduateTime?default('')}" readonly="readonly" class="input_common" style="color: gray; background: white none repeat scroll 0% 0%;" type="text">
                          </td>
                          <td class="td_blank"></td>
                    </tr>
                    <tr>
                        <td class="td_blank"></td>
                        <td colspan="5" class="td_common"></td>
                        <td class="td_blank"></td>
                    </tr>
                    <tr>
                        <td class="td_blank"></td>
                        <td colspan="5" class="td_common"></td>
                        <td class="td_blank"></td>
                    </tr>
                    <tr>
                        <td class="td_blank"></td>
                        <td colspan="5" class="td_common"></td>
                        <td class="td_blank"></td>
                    </tr>
                    <!-- 获奖记录 -->
                    <tr>
                        <td class="td_blank"></td>
                        <td colspan="8" class="td_common">获奖记录</td>
                          <td class="td_blank"></td>
                    </tr>
                    <tr>
                        <td class="td_blank"></td>
                        <td colspan="2" class="td_common">序号</td>
                          <td colspan="2" class="td_common">获奖时间</td>
                          <td colspan="4" class="td_common">获奖详情</td>
                          <td class="td_blank"></td>
                    </tr>
                    <#list awardList as award>
                        <tr>
                            <td class="td_blank"></td>
                            <td colspan="2" class="td_common">
                                <span>${award_index+1}</span>
                            </td>
                              <td colspan="2" class="td_common">
                                  <input value="${award.time }" readonly="readonly" class="input_common" style="color: gray; background: white none repeat scroll 0% 0%;"/>
                              </td>
                              <td colspan="2" class="td_common">
                                  <input value="${award.detail }" readonly="readonly" class="input_common" style="color: gray; background: white none repeat scroll 0% 0%;"/>
                              </td>
                              <td class="td_blank"></td>
                        </tr>
                    </#list>
                   </tbody>
            </table>
        </form>
    </div>
  </body>
</html>

freemarker工具类

package com.demo.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * 使用Freemarker生成html文件
 * @author lg
 *
 */
public class GenerateHtml {

	/**
	 * 根据模板生成html文件
	 * @param request
	 * @param templateName	模板名称
	 * @param htmlName	html文件名称
	 */
	public static void generate(HttpServletRequest request, String templateName, String htmlName){
		FileOutputStream fos = null;
		Writer writer = null;
		try {
			HttpSession session = request.getSession();
			String root = session.getServletContext().getRealPath("file/staticPage");// 根目录
			
			// 设置相关配置
			Configuration configuration = new Configuration();
			configuration.setDirectoryForTemplateLoading(new File(root + File.separator + "template"));//	模板存放地址
			configuration.setObjectWrapper(new DefaultObjectWrapper());
			configuration.setDefaultEncoding("UTF-8");// 默认编码
			
			// 根据模板名称获取模板
			Template template = configuration.getTemplate(templateName);
			
			// 设置模板参数
			Map<String, Object> paramMap = new HashMap<String, Object>();// 模板参数
			if ("student.html".equals(templateName)) {// 学生
				paramMap.put("student", request.getAttribute("student"));// 学生
				paramMap.put("awardList", request.getAttribute("awardList"));// 获奖记录列表
			}
			
			// 生成输出流
			File html = new File(root + File.separator + "html/student", htmlName);// html文件
			if (html.exists()) {// 文件已存在时删除原有文件
				html.delete();
			}
			fos = new FileOutputStream(html);
			writer = new OutputStreamWriter(fos,"UTF-8");
			
			// 生成模板
			template.process(paramMap, writer);
			
			System.out.println("成功生成html文件--" + htmlName);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fos != null) {
					fos.close();
				}
				if (writer != null) {
					writer.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

测试

@RequestMapping("/queryStudent")
    public String queryStudent(HttpServletRequest request, HttpServletResponse response){
	String id = request.getParameter("id");// 主键
		
	// 查询是否存在静态展示页面
	String rootPath = request.getSession().getServletContext().getRealPath("file/staticPage/html/student");
	File htmlPage = new File(rootPath, "student_" + id + ".html");
		
	// 无展示页面
	if (!htmlPage.exists()) {
		
		// 查询数据
			
		request.setAttribute("student", student);// 学生
		request.setAttribute("awardList", awardList);// 获奖记录
		
		synchronized (studentController.class) {
			// 重新验证是否已拥有展示页面 防止重复生成
			htmlPage = new File(rootPath, "student_" + id + ".html");
			if (!htmlPage.exists()) {
				// 生成静态展示页面
				String templateName = "student.html";
				String htmlName = "student_" + id + ".html";
				GenerateHtml.generate(request, templateName, htmlName);
			}
		}
	}
	// 访问静态展示页面
	return "redirect:/file/staticPage/html/student/student_" + id + ".html";
}


freemarker常用标签

${}

功能和EL表达式一致,通过{}内的名称获取值。

default()

语法:

${[name]?default('')}

freemarker不支持null,所以对可能出现空值的属性设置默认值!

#if

语法:

<#if ([name] == 0)>
   [name]等于零!
</#if>

#list

语法:

<#list [nameList] as [name]>
    这是第${[name]_index+1}条数据!数据值为${[name]}
    <br/>
</#list>




猜你喜欢

转载自blog.csdn.net/li4562258fj155/article/details/77162489