扩展在任何时候都是必要的,前面讲过在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 是一种强大的模板语言,主要用于生成动态内容,如HTML页面。...FreeMarker的核心概念是将静态的...对于初学者来说,理解FreeMarker的基础知识,如变量类型、模板结构和插值机制,是掌握这一技术的关键步骤。
### FreeMarker语法知识详解 #### 一、FreeMarker概述 FreeMarker是一种强大的模板引擎,用于生成文本输出。它被广泛应用于Web开发中,用于动态生成HTML页面以及其他类型的文本文件,如XML、JavaScript、电子邮件等...
根据提供的文件信息,我们可以深入探讨FreeMarker的基础语法及其在模板引擎中的应用。FreeMarker是一种用于生成文本输出的模板引擎,广泛...掌握了这些基础知识后,开发者就可以更高效地利用FreeMarker来构建动态网页。
本文将深入探讨Freemarker的基础知识,包括其主要特性和使用方法。 ### 1. 注释 Freemarker的注释使用`和`-->`这一对标签,而非标准的HTML注释`<!--`和`-->`。例如: ```html 这是一条Freemarker注释 --> ``` ##...
从标题和描述中提取的关键知识点是关于Freemarker的基本概念、其功能和用途,以及如何进行模板开发和程序开发。Freemarker是一种强大的模板引擎,广泛应用于Web开发中,尤其是MVC架构的应用中,负责生成HTML网页或...
在Freemarker的2.3.28版本中,我们可以期待以下关键知识点: 1. **模板语言FTL**: Freemarker使用的模板语言叫做FreeMarker Template Language (FTL),它是一种声明式的、非过程式的语言。FTL文件包含了一系列的...
1. **Freemarker基础知识**:Freemarker是一个基于模板的语言,它允许开发者通过定义模板文件,然后结合Java对象数据,生成动态内容。模板文件中包含了一系列控制结构(如条件语句、循环)和变量引用,这些变量可以...
在本资料中,我们将深入探讨Freemarker的基础知识,包括其基本语法、数据模型、模板设计以及如何在实际项目中使用它。 1. **Freemarker语法** Freemarker的核心是模板语言,由控制结构(如条件语句和循环)、变量...
1. **Freemarker基础概念** - **模板语言**:Freemarker使用一种简单的、声明式的模板语言,允许开发者编写模板,与后台数据模型结合,生成动态内容。 - **数据模型**:Freemarker模板与应用程序的数据模型进行...
首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它将数据模型与视图(HTML或其他格式的文档)分离,实现了MVC模式。开发者定义模板文件,然后在后端填充数据模型,Freemarker会根据...
一、Freemarker基础 1. 模板语言:Freemarker是一种基于模板的语言,它允许开发者通过简单的语法(如 `${}` 和 `#if`)来动态地生成文本输出,如HTML、XML或者,如我们所关注的,Excel文件。 2. 数据模型:在使用...
这表明文档会从基础知识入手,逐步深入讲解FreeMarker的各种特性和用法。 - **阅读建议**:对于初学者而言,建议首先了解FreeMarker的基本概念和使用场景;然后,可以重点关注模板语言的语法结构,掌握变量引用、...
在这个例子中,我们看到的是如何在使用Struts2框架的基础上,集成Freemarker进行分页处理。以下是对这个主题的详细讲解: 首先,**Freemarker** 是一个模板引擎,它允许开发者通过定义模板来生成HTML或其他文本格式...
本压缩包集合了丰富的Freemarker学习资源,涵盖从基础到进阶的各种知识点,以下是这些文档中可能包含的详细内容: 1. **Freemarker中文手册.pdf**: 这份手册通常会详细介绍Freemarker的基本概念,如模板语言、...
### FreeMarker实例教程知识点详解 ...以上知识点覆盖了FreeMarker的主要方面,通过本教程的学习,读者不仅能够掌握FreeMarker的基本使用方法,还能够深入了解其高级特性,为日后解决复杂的Web开发问题打下坚实的基础。
通过掌握这些基础知识,开发者能够有效地使用FreeMarker来构建动态网站和应用程序。在学习FreeMarker模板语法时,需要注意标签的正确使用、插值的类型和应用场景,以及如何通过设置和函数来控制数据的格式化输出。
它在Web开发中,尤其是在Struts2框架中,被广泛用于视图层...通过以上内容的学习,开发者不仅可以理解FreeMarker的基础知识,还能掌握在Struts2项目中实际运用FreeMarker的方法,从而提高Web应用的开发效率和代码质量。
在Freemarker 2.3.18版本中,有几个关键知识点值得一提: 1. **模板语言基础**:Freemarker模板由静态文本和动态控制结构组成,如`<#if>`、`<#foreach>`等。动态部分是由${...}或#{...}包裹的表达式,用于插入数据...
在FreeMarker的基础实现中,有几个核心概念和关键知识点: 1. **模板(Template)**:模板是FreeMarker的基石,它定义了如何展示数据。模板文件通常以`.ftl`为扩展名,其中包含FreeMarker语法,如`${expression}`...