文档章节

Freemarker模板应用

binhu
 binhu
发布于 2014/12/09 14:34
字数 1354
阅读 51
收藏 0
点赞 0
评论 0

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代码 

  1. 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>  
   邮&nbsp;&nbsp;箱:${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代码  收藏代码

  1. 用户名:wxj  

  2. 邮  箱:jxauwxj@126.com  

 

同时会在部署环境的目录下生成index.htm文件。


© 著作权归作者所有

共有 人打赏支持
binhu
粉丝 17
博文 196
码字总数 199655
作品 0
合肥
FreeMarker | 取值篇

第一部分:Spring Boot 集成 FreeMarker 1、 需要这些依赖 2、yml 我喜欢 yml,所以删掉 ,新建 3、配置 在 中添加如下配置 4、Controller - View 5、运行效果 第二部分:取值 1、学过 free...

Wenyi_Feng ⋅ 06/14 ⋅ 0

SpringBoot笔记(五)模板引擎thymeleaf和freemarker

SpringBoot本来不应该关注这块,但是既然都学了,就看看吧 SpringBoot属于前后端分离的微服务框架,默认的模板引擎是thymeleaf,虽然也能支持JSP,但是比较麻烦,另外freemarker也是SpringB...

世外大帝 ⋅ 04/25 ⋅ 0

FreeMarker | 数据篇

变量及运算 1、变量定义和赋值 2、判空 防止为空 FreeMarker 不区分单双引号 逻辑判空 对象、集合 1、对象 2、集合 3、Map 可以根据key直接取值可以获取所有key然后遍历也可以直接遍历值 资料...

Wenyi_Feng ⋅ 06/15 ⋅ 0

SpringBoot集成Thymeleaf

上一篇给大家介绍了springboot整合freemarker,这一片来继续为大家介绍一种模板thymeleaf。 首先在项目中增添thymeleaf依赖spring-boot-starter-thymeleaf 同时为了解决html严格校验报错的问...

dalaoyang ⋅ 03/15 ⋅ 0

Freemarker介绍、使用并与Spring整合

一、什么是Freemarker 1.1 介绍 是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而...

yuanlaijike ⋅ 04/16 ⋅ 0

SpringBoot集成FreeMarker

给大家简单介绍一下springboot 集成FreeMarker 过程很简单,5分钟即可。 首先在项目中增添依赖spring-boot-starter-freemarker pom文件代码如下: 然后创建controller,代码如下: applicat...

dalaoyang ⋅ 03/14 ⋅ 0

MiniDao 1.6.4 版本发布,轻量级 Java 持久化框架

MiniDao1.6.4 版本发布,MiniDao是轻量级Java持久化框架,也是Hibernate项目辅助利器。 MiniDao 简介及特征 MiniDao 是一款超轻量的JAVA持久层框架,具备Mybatis一样的SQL能力: 支持SQL分离...

Jeecg ⋅ 06/04 ⋅ 0

(三)SpringBoot——模板引擎thymeleaf

一、SpringBoot支持的模板引擎 1、Thymeleaf(官方推荐) 2、FreeMarker 3、Groovy 4、mustache SpringBoot为什么不推荐使用JSP呢? 1、JSP对页面的侵入性较强。 2、web容器版本的的管理问题...

solidwang ⋅ 04/19 ⋅ 0

FreeMarker(二):利用FreeMarker转pdf

设计需求 订票成功后,生成一个pdf 文件,用户打印入场票,门票大致如下所示: 2. 设计思想 1). 使用FreeMarker 转换 ftl(就是FreeMarker 魔板文件),生成HTML 2). 使用jtidy库将 HTML转换...

AHUSKY ⋅ 04/17 ⋅ 0

NutzBoot Maven Plugin v2.1.9,支持 JDK10

跟随 nutzboot 主版本, 升级一下。 变化: fix: war打包下freemarker启动失败的bug add: 支持scp上传到服务器 add: 支持JDK10 这是 NutzBoot 的 Maven 插件。 在 build-plugins 添加本 plugin...

wendal ⋅ 06/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 51分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部