<!--maven中支持freemark的包 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.19</version>
</dependency>
<!-- apache文件工具包 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
一.自动生成代码应用
1.创建模板文件,在/resource/template目录下建立codeModel.ftl文件。
Java代码
package com.order.model;
public class ${class} {
<#list properties as prop>
private ${prop.type} ${prop.name};
</#list>
<#list properties as prop>
public ${prop.type} get${prop.name?cap_first}(){
return ${prop.name};
}
public void set${prop.name?cap_first}(${prop.type} ${prop.name}){
this.${prop.name} = ${prop.name};
}
</#list>
}
2.应用代码生成模板文件。
Java代码
public class GenerateCodeTest {
public static void main(String args[]) throws IOException,
TemplateException {
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File(
"D:/myspace/freemarker/resource/template/"));
cfg.setObjectWrapper(new DefaultObjectWrapper());
/* 获取模板文件 */
Template template = cfg.getTemplate("codeModel.ftl");
/* 模板数据 */
Map<String, Object> root = new HashMap<String, Object>();
root.put("class", "Order");
Collection<Map<String, String>> properties = new HashSet<Map<String, String>>();
root.put("properties", properties);
/* 字段1 orderId */
Map<String, String> orderId = new HashMap<String, String>();
orderId.put("name", "orderId");
orderId.put("type", "Long");
properties.add(orderId);
/* 字段2 orderName */
Map<String, String> orderName = new HashMap<String, String>();
orderName.put("name", "orderName");
orderName.put("type", "String");
properties.add(orderName);
/* 字段3 money */
Map<String, String> money = new HashMap<String, String>();
money.put("name", "money");
money.put("type", "Double");
properties.add(money);
/* 生成输出到控制台 */
Writer out = new OutputStreamWriter(System.out);
template.process(root, out);
out.flush();
/* 生成输出到文件 */
File fileDir = new File("D:/generateCodeFile");
// 创建文件夹,不存在则创建
org.apache.commons.io.FileUtils.forceMkdir(fileDir);
// 指定生成输出的文件
File output = new File(fileDir + "/Order.java");
Writer writer = new FileWriter(output);
template.process(root, writer);
writer.close();
}
}
二。在Servlet中使用FreeMarker
1、在WEB-INF文件夹下创建一个文件夹pages用来放freemark相关的模板文件,我创建了一个名为hello.ftl的模板文件,内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>使用Freemarker渲染2</title>
</head>
<body>
hello ${userName!}!
</body>
</html>
2、创建一个servlet
package freemark.web.test;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* Servlet implementation class HelloAction
*/
public class HelloAction extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloAction() {
super();
// TODO Auto-generated constructor stub
}
private Configuration configuration;
public void init() throws ServletException {
configuration = new Configuration();
configuration.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/pages");
//设置编码模板的编码方式,否则会乱码
configuration.setEncoding(Locale.CHINA, "UTF-8");
}
public void destroy() {
super.destroy();
if(configuration != null){
configuration = null;
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
//创建数据模型
Map map = new HashMap();
map.put("userName", "小龙女");
//加载模板
Template template = configuration.getTemplate("hello.ftl");
//Writer对象将输出内容打印到HttpServletResponse对象的输出流中
Writer out = response.getWriter();
try{
//模板与数据模型结合
template.process(map,out);
}catch (TemplateException e) {
e.printStackTrace();
}
}
}
3、配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!--***************************************关于freemark的相关配置*********************************-->
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>
freemarker.ext.servlet.FreemarkerServlet
</servlet-class>
<!-- FreemarkerServlet 设置: -->
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html; charset=UTF-8</param-value>
<!-- 强制使用 UTF-8作为输出编码格式! -->
</init-param>
<!-- FreeMarker 设置: -->
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value>
<!-- 0 只对开发使用! 否则使用大一点的值. -->
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
<!-- 模板文件的编码方式. -->
</init-param>
<init-param>
<param-name>number_format</param-name>
<param-value>0.##########</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
<!--*****自己定义的servlet,就是你第二步创建的那个servlet,用来调用freemark模板***** -->
<servlet>
<servlet-name>HelloAction</servlet-name>
<servlet-class>freemark.web.test.HelloAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloAction</servlet-name>
<url-pattern>/HelloAction</url-pattern>
</servlet-mapping>
</web-app>
4、浏览器中访问:http://localhost:8080/freemark/HelloAction结果如下:
hello 小龙女! |
三.JSP调用模板文件输出。
1.首先创建模板文件,在WEB-INF/templates目录下建立test.ftl文件。
Java代码
Hello,${name}!
2.解析模板文件类,传入pageContext参数。
Java代码
public class FreemarkerTest {
public void execute(PageContext pageContext) throws Exception
{
Configuration cfg = new Configuration();
// 设置模板的路径
cfg.setServletContextForTemplateLoading(pageContext.getServletContext(),
"WEB-INF/templates");
Map root = new HashMap();
root.put("name", "Tom");
// 获取模板文件
Template t = cfg.getTemplate("test.ftl");
Writer out = pageContext.getResponse().getWriter();
t.process(root, out);
}
}
3.创建JSP文件调用输出。
Html代码
<%@ page language="java" contentType="text/html; charset=GB2312"
pageEncoding="GB2312"%>
<%@page import="com.freemarker.test.FreemarkerTest;"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>HelloWorld</title>
</head>
<body>
<%
FreemarkerTest c1 = new FreemarkerTest();
c1.execute(pageContext);
%>
</body>
</html>
四.Servlet调用模板文件生成html文件进行页面展示。
1.创建模板文件,在WebRoot/index目录下建立test.ftl文件。
Java代码
<html>
<body>
用户名:${userName}<br>
邮 箱:${email}
</body>
</html>
2.创建Servlet文件解析模板文件并生成html文件进行页面输出。
Java代码
public class FreemarkerServletTest extends HttpServlet {
public FreemarkerServletTest() {
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//生成html后的文件
String path = getServletContext().getRealPath("/") + "index.htm";
System.out.println(path);
try {
freemarker(request, "test.ftl", path, "index");
} catch (Exception e) {
e.printStackTrace();
}
//跳转到刚生成的html文件中
request.getRequestDispatcher("/index.htm").forward(request, response);
}
/**
* 生成静态文件
* @param request
* @param ftl ftl文件
* @param html 生成html后的文件
* @param file 存放ftl文件的路径
* @throws Exception
*/
public void freemarker(HttpServletRequest request,String ftl,
String html,String file) throws Exception {
Configuration cfg = new Configuration();
// 设置加载模板的路径
cfg.setServletContextForTemplateLoading(getServletContext(),"/" + file);
cfg.setEncoding(Locale.getDefault(), "GB18030");
//获得模板并设置编码
Template tep = cfg.getTemplate(ftl);
tep.setEncoding("GB18303");
//新建输出,生成html文件
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(html),"GB18030"));
//设置值
Map map = new HashMap();
map.put("userName", "wxj");
map.put("email", "jxauwxj@126.com");
// 解析并输出
tep.process(map, out);
}
public void init() throws ServletException {
}
}
3.web.xml文件进行servlet配置。
Xml代码
<servlet>
<servlet-name>FreemarkerServletTest</servlet-name>
<servlet-class>com.servlet.FreemarkerServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FreemarkerServletTest</servlet-name>
<url-pattern>/servlet/FreemarkerServletTest</url-pattern>
</servlet-mapping>
4.页面访问如下Url:
http://localhost:8080/freemarkerWeb/servlet/FreemarkerServletTest
输出结果如下:
Java代码
用户名:wxj
邮 箱:jxauwxj@126.com
同时会在部署环境的目录下生成index.htm文件。