版权声明:本文为博主原创文章,未经博主允许不得转载。 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>