在Eclipse工具中使用FreeMarker

  1. 点击Window,选择preference,弹出如下框
    找到:General–Editors–File Associations
    如下,如果有*.ftl文件,就不用点击上面的Add。如果没有,就点击Add新建
  2. freemarker多表格 freemarker elseif_freemaker

  3. 点击此页面下面的Add按钮
  4. freemarker多表格 freemarker elseif_freemarker多表格_02

  5. 选择General–Content Types
  6. freemarker多表格 freemarker elseif_html_03

  7. 创建后缀为ftl的文件类型
  8. freemarker多表格 freemarker elseif_java_04

  9. 创建freemaker工具类
package cn.itsource.utils;

import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import cn.itsource.domain.Job;
import freemarker.template.Configuration;
import freemarker.template.Template;

public class FreeMarkerUtils {
	
	/**
	 * 生成职位详情静态页面
	 * @param t	职位对象
	 * @param req	请求对象
	 * @param isAdmin 为true表示生成后台职位详情页面,为false表示生成前台职位详情页面
	 */
	public static void generateHtml(Job t, HttpServletRequest req, Boolean isAdmin){
		//处理业务逻辑【生成职位详情静态页面】
		//创建模板文件
		//生成html文件
		//将生成html文件路径保存到当前对象中,插入到数据库中
		PrintWriter pw = null;
		try {
			//创建配置对象
			Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
			File f = new File(req.getServletContext().getRealPath("/WEB-INF/template"));
			//设置模版文件的存放路径
			cfg.setDirectoryForTemplateLoading(f);
			//设置模板编码
			cfg.setDefaultEncoding("UTF-8");
			//设置异常处理cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
			//获取模板对象
			Template template = cfg.getTemplate("jobDetails.ftl");
			
			//使用Map集合准备模板数据【模板数据一般是具有层级结构的数据】
			Map<String, Object> data = new HashMap<String, Object>();
			String basePath = req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+ req.getContextPath() +"/";
			data.put("basePath", basePath);
			data.put("job", t);
			data.put("isAdmin", isAdmin);
			
			//文件名称不能写死
			String fileName = UUID.randomUUID().toString();
			//创建输出流
			pw = new PrintWriter(req.getServletContext().getRealPath("/details/") + fileName + ".html");
			//输出静态HTML文档内容
			template.process(data, pw);
			
			//设置job对象的detailsPath属性【保存到数据库中】
			if(isAdmin){
				t.setDetailsPath("details/" + fileName + ".html");
			}else{
				t.setDetailsPath2("details/" + fileName + ".html");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(null != pw) pw.close();
		}
	}
	
	/**
	 * 删除职位对象原来已经生成过的职位详情静态页面
	 * @param t
	 * @param req
	 */
	public static void deleteJobDetailsFile(Job t, HttpServletRequest req){
		//当当前职位对象的detailsPath属性值不为空的时候,先删除原来的静态文件
		if(null != t.getDetailsPath() && !"".equals(t.getDetailsPath())){
			File f = new File(req.getServletContext().getRealPath(t.getDetailsPath()));
			if(f.exists()){
				f.delete();
			}
		}
		//当当前职位对象的detailsPath2属性值不为空的时候,先删除原来的静态文件
		if(null != t.getDetailsPath2() && !"".equals(t.getDetailsPath2())){
			File f = new File(req.getServletContext().getRealPath(t.getDetailsPath2()));
			if(f.exists()){
				f.delete();
			}
		}
	}

}
  1. 创建模版文件存储目录
    在src/main/webapp/WEB-INF/下新建一个template目录,用来存放模版文件
  2. 创建生成的静态页面存储目录
    在tomcat/webapps/下新建一个cmstemp,用来存放生成的静态页面。
    放在tomcat/webapps目录下避免因重新发布项目而自动消失
  3. 修改t_job表结构增加一列
ALTER TABLE t_job ADD COLUMN detailsPath VARCHAR(100) DEFAULT NULL;
  1. 编写模版文件jobDetails.ftl(将jobDetails.jsp的内容复制过来修改即可)
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
		<title>物流校招</title>
		<link rel="stylesheet" href="${basePath}css/bootstrap-theme.min.css" />
		<!--引入bootstrap样式文档-->
		<link rel="stylesheet" href="${basePath}css/bootstrap.min.css" />
		<script type="text/javascript" src="${basePath}js/jquery.min.js"></script>
		<script type="text/javascript" src="${basePath}js/bootstrap.min.js"></script>
		<link rel="stylesheet" href="${basePath}css/commons.css" />
	</head>
	<body>
		<div class="breadcrumbs" id="breadcrumbs">
			<!-- 面包屑导航 -->
			<ul class="breadcrumb">
				<li>
					<a href="javascript:void(0);">Home</a>
				</li>
				<li>
					<a href="${basePath}admin/jobs">职位管理</a>
				</li>
				<li class="active">职位详情</li>
			</ul>
		</div>
		<!--职位详情-->
		<div class="container nav-next-element" style="border: 1px solid #dcdcdc;padding-top: 30px;padding-bottom: 30px;">
			<span>
				<img src="${basePath}imgs/join_us_title.jpg" alt="">
			</span>
			<!--职位名称-->
			<div class="col-md-offset-1" style="padding-top: 30px;">
				<img src="${basePath}imgs/join_us_icon.jpg" style="float: left;margin-right: 30px;" />
				<h3>${job.jobName}</h3>
			</div>
			<!--职位描述-->
			<div class="col-md-offset-1" style="padding-top: 36px;">
				<h4 style="float: left;margin-right: 30px;">职位描述:</h4>
				<p style="float: left;font-size: 12px;color: #575656;line-height: 40px;">
					<div style="clear: both;"></div>
					${job.intro}
				</p>
				<div style="clear: both;"></div>
			</div>
			<!--任职要求-->
			<div class="col-md-offset-1" style="padding-top: 36px;">
				<h4 style="float: left;margin-right: 30px;">任职要求:</h4>
				<p style="float: left;font-size: 12px;color: #575656;line-height: 40px;">
					<div style="clear: both;"></div>
					${job.requires}
				</p>
				<div style="clear: both;"></div>
			</div>
		</div>
	</body>
</html>