Freemarker模板应用
freemark.jar包
<!--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文件。