`
liuwei8728
  • 浏览: 33676 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Freemarker基础知识(3)

阅读更多

扩展在任何时候都是必要的,前面讲过在FreeMarker做扩展,用的是宏处理,这里使用java代码做扩展。

Java程序员可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。

先把上章代码模拟实践下:现在要求在html文件中输出”你好,Freemarker!“

 

package com.vs.freemarker;

import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
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;

public class ActionServletFM extends HttpServlet {

	private Configuration  cfg;
	
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
     //创建数据模型
		Map<String,String> map=new HashMap<String,String>();
		map.put("msg", "hello,FreeMarker!");
		Template t=this.cfg.getTemplate("free.html");//得到模板,从设置的目录中查找模板
		Writer out = response.getWriter(); 
		try { 
			t.process(map, out);    //t为模板,加入数据模型root ,合并数据模型+模板:
			} catch (TemplateException e) { 
			    throw new ServletException( 
			                         "Error while processing template", e); 
			} 
	}


	public void init() throws ServletException {
		this.cfg=new Configuration();
//		cfg.setSharedVariable("upper", new UpperDirective());
		this.cfg.setServletContextForTemplateLoading(getServletContext(), null);//设置模板路径:此种方式是设置为应用程序根目录下:
	}

}

 <html>

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
${msg} 
</body> 
</html> 

 好了,接着讲扩展。自定义标签

1. 使用TemplateDirectiveModel

package com.vs.freemarker;

import java.io.IOException;
import java.util.Map;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;

public class UpperDirective implements TemplateDirectiveModel {

	public void execute(Environment env, Map params, TemplateModel[] loopVars,
			TemplateDirectiveBody body) throws TemplateException, IOException {
		/**
		 * 下面方法基本固定
		 */
		if (!params.isEmpty()) {
            throw new TemplateModelException(
                    "This directive doesn't allow parameters.");
        }
        if (loopVars.length != 0) {
                throw new TemplateModelException(
                    "This directive doesn't allow loop variables.");
        }
        if (body != null) {
            body.render(new UpperCaseFilterWriter(env.getOut()));   //需要实现的方法体
        } else {
            throw new RuntimeException("missing body");
        }
	}
}

 上面的代码基本固定,变化主要在于需要实现的方法不一样。

import java.io.IOException;
import java.io.Writer;

public class UpperCaseFilterWriter extends Writer {

	private Writer out;
	public UpperCaseFilterWriter(Writer _out){
		this.out=_out;
	}
	@Override
	public void close() throws IOException {
		out.close();
	}

	@Override
	public void flush() throws IOException {
		out.flush();
	}

	@Override
	public void write(char[] cbuf, int off, int len) throws IOException {
		char[] transformedCbuf = new char[len];
        for (int i = 0; i < len; i++) {
            transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
        }
        out.write(transformedCbuf);
	}
}

 当然上面的方法网上实在是多,应该基本都围绕着Freemarker的官方例子做的吧。

好了,既然方法实现了,然后注册它。在最上面的ActionServletFM【Servlet类】注册该方法。

public void init() throws ServletException {
		this.cfg=new Configuration();
		cfg.setSharedVariable("upper", new UpperDirective());  //注册方法
		this.cfg.setServletContextForTemplateLoading(getServletContext(), null);//设置模板路径:此种方式是设置为应用程序根目录下:
	}

 

 好了,现在就是看结果的时候了。下面一起把用宏的写法放下面。

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
${msg} 
<@upper>Welcome to http://www.oschina.net</@upper><!--用java实现的自定义指令-->
<#assign upp = "com.vs.freemarker.UpperDirective"?new()> <!-- 用这种方式也可以创建嘛 -->
<@upp>
<#list ["oracle","SQL Server","DB2"] as db>
${db}
</#list><br/>
</@upp>
</body> 
</html> 

 代码说话,网上到处可见的代码,不做多的解释。

 

 

分享到:
评论

相关推荐

    FreeMarker的基础知识整理

    FreeMarker 是一种强大的模板语言,主要用于生成动态内容,如HTML页面。...FreeMarker的核心概念是将静态的...对于初学者来说,理解FreeMarker的基础知识,如变量类型、模板结构和插值机制,是掌握这一技术的关键步骤。

    FreeMarker语法知识

    ### FreeMarker语法知识详解 #### 一、FreeMarker概述 FreeMarker是一种强大的模板引擎,用于生成文本输出。它被广泛应用于Web开发中,用于动态生成HTML页面以及其他类型的文本文件,如XML、JavaScript、电子邮件等...

    FreeMarker基础语法

    根据提供的文件信息,我们可以深入探讨FreeMarker的基础语法及其在模板引擎中的应用。FreeMarker是一种用于生成文本输出的模板引擎,广泛...掌握了这些基础知识后,开发者就可以更高效地利用FreeMarker来构建动态网页。

    freemarker_-_基础知识

    本文将深入探讨Freemarker的基础知识,包括其主要特性和使用方法。 ### 1. 注释 Freemarker的注释使用`和`--&gt;`这一对标签,而非标准的HTML注释`&lt;!--`和`--&gt;`。例如: ```html 这是一条Freemarker注释 --&gt; ``` ##...

    freemarker培训课件

    从标题和描述中提取的关键知识点是关于Freemarker的基本概念、其功能和用途,以及如何进行模板开发和程序开发。Freemarker是一种强大的模板引擎,广泛应用于Web开发中,尤其是MVC架构的应用中,负责生成HTML网页或...

    freemarker-2.3.28.jar

    在Freemarker的2.3.28版本中,我们可以期待以下关键知识点: 1. **模板语言FTL**: Freemarker使用的模板语言叫做FreeMarker Template Language (FTL),它是一种声明式的、非过程式的语言。FTL文件包含了一系列的...

    freemarkerdemo 生成word 插入图片

    1. **Freemarker基础知识**:Freemarker是一个基于模板的语言,它允许开发者通过定义模板文件,然后结合Java对象数据,生成动态内容。模板文件中包含了一系列控制结构(如条件语句、循环)和变量引用,这些变量可以...

    freemarker基础

    在本资料中,我们将深入探讨Freemarker的基础知识,包括其基本语法、数据模型、模板设计以及如何在实际项目中使用它。 1. **Freemarker语法** Freemarker的核心是模板语言,由控制结构(如条件语句和循环)、变量...

    freemarker中文学习资料

    1. **Freemarker基础概念** - **模板语言**:Freemarker使用一种简单的、声明式的模板语言,允许开发者编写模板,与后台数据模型结合,生成动态内容。 - **数据模型**:Freemarker模板与应用程序的数据模型进行...

    Freemarker 自定义标签 简单案例

    首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它将数据模型与视图(HTML或其他格式的文档)分离,实现了MVC模式。开发者定义模板文件,然后在后端填充数据模型,Freemarker会根据...

    Freemarker实现excel导出功能

    一、Freemarker基础 1. 模板语言:Freemarker是一种基于模板的语言,它允许开发者通过简单的语法(如 `${}` 和 `#if`)来动态地生成文本输出,如HTML、XML或者,如我们所关注的,Excel文件。 2. 数据模型:在使用...

    FreeMarker中文版word文档

    这表明文档会从基础知识入手,逐步深入讲解FreeMarker的各种特性和用法。 - **阅读建议**:对于初学者而言,建议首先了解FreeMarker的基本概念和使用场景;然后,可以重点关注模板语言的语法结构,掌握变量引用、...

    Freemarker分页

    在这个例子中,我们看到的是如何在使用Struts2框架的基础上,集成Freemarker进行分页处理。以下是对这个主题的详细讲解: 首先,**Freemarker** 是一个模板引擎,它允许开发者通过定义模板来生成HTML或其他文本格式...

    freemarker学习资料汇总

    本压缩包集合了丰富的Freemarker学习资源,涵盖从基础到进阶的各种知识点,以下是这些文档中可能包含的详细内容: 1. **Freemarker中文手册.pdf**: 这份手册通常会详细介绍Freemarker的基本概念,如模板语言、...

    FreeMarker实例教程,手把手教你FreeMarker的方方面面

    ### FreeMarker实例教程知识点详解 ...以上知识点覆盖了FreeMarker的主要方面,通过本教程的学习,读者不仅能够掌握FreeMarker的基本使用方法,还能够深入了解其高级特性,为日后解决复杂的Web开发问题打下坚实的基础。

    freemarker语法

    通过掌握这些基础知识,开发者能够有效地使用FreeMarker来构建动态网站和应用程序。在学习FreeMarker模板语法时,需要注意标签的正确使用、插值的类型和应用场景,以及如何通过设置和函数来控制数据的格式化输出。

    FreeMarker应用实例和PPT

    它在Web开发中,尤其是在Struts2框架中,被广泛用于视图层...通过以上内容的学习,开发者不仅可以理解FreeMarker的基础知识,还能掌握在Struts2项目中实际运用FreeMarker的方法,从而提高Web应用的开发效率和代码质量。

    freemarker 2.3.18 中文手册

    在Freemarker 2.3.18版本中,有几个关键知识点值得一提: 1. **模板语言基础**:Freemarker模板由静态文本和动态控制结构组成,如`&lt;#if&gt;`、`&lt;#foreach&gt;`等。动态部分是由${...}或#{...}包裹的表达式,用于插入数据...

    freemarker基础代码

    在FreeMarker的基础实现中,有几个核心概念和关键知识点: 1. **模板(Template)**:模板是FreeMarker的基石,它定义了如何展示数据。模板文件通常以`.ftl`为扩展名,其中包含FreeMarker语法,如`${expression}`...

Global site tag (gtag.js) - Google Analytics