Freemarker中Configuration的setClassForTemplateLoading方法参数问题

今天使用freemarker中Configuration的setClassForTemplateLoading方法遇到了加载模板目录的一个小问题。

由于网上的其他论坛,博客写的有点乱,故记录一下。

Freemarker是一个模板框架,主要是为了加快染速度而产生的。它与web容器无关,只要是关于模板生成一些代码的都可以使用它完成。

比如xml,Java代码的生成等。 其他类似的模板框架还有velocity。

本文主要讲的是Freemarker的加载模板目录问题,它的语法就不描述了。具体的语法可在官网下载参考手册参考即可。

加载模板目录方法

Freemarker提供了3种加载模板目录的方法。 它使用Configuration类加载模板

3种方法分别是:

public void setClassForTemplateLoading(Class clazz, String pathPrefix);

public void setDirectoryForTemplateLoading(File dir) throws IOException;

public void setServletContextForTemplateLoading(Object servletContext, String path);

看名字也就知道了,分别基于类路径、文件系统以及Servlet Context。

第二,三种没啥好说的。

第二种基于文件系统。 比如加载/home/user/template下的模板文件。

Configuration cfg = new Configuration();

cfg.setDirectoryForTemplateLoading(new File("/home/user/template"));

cfg.getTemplate("Base.ftl");

这样就获得了/home/user/template/Base.ftl这个模板文件。

第三种基于web project。 第二个参数是基于WebRoot下的。

比如: setServletContextForTemplateLoading(context, "/ftl") 就是 /WebRoot/ftl目录。

第一种基于类路径的方法有点小坑,其实看下源码代码就知道了。

比如 :

Configuration cfg = new Configuration();

cfg.setClassForTemplateLoading(FreemarkerUtil.class, "/template");

cfg.getTemplate("Base.ftl");

其实这个方法是根据类加载路径来判断的,最终会执行以下代码:

FreemarkerUtil.class.getClassLoader().getResource("/template/");

这里注意一下第二个参数需要以 "/" 开头。

其实我们看下源码就知道了:

时间: 2024-08-30 17:02:41

Freemarker中Configuration的setClassForTemplateLoading方法参数问题的相关文章

关于servlet中service()方法参数的问题

问题描述 请教一下大家,servlet中的service()方法,一般会传入2个参数:ServletRequest request 和ServletResponse response .ServletRequest和ServletResponse是2个接口,接口是不能实例化的,那么为什么可以定义他们的对象 request和response 呢? 解决方案 意思就是sevlet api可以传入任何实现ServletRequest,ServletResponse的类,这叫做多态,如:Object o

C#中方法参数的四种类型

C#中方法的参数有四种类型: -值参数:不含任何修饰符.方法中的形参是实参的一份拷贝,形参的改变不会影响到内存中实参的的值,实参是安全的. -引用参数:以ref修饰符声明.传递的参数实际上是实参的指针,所以在方法中的操作都是直接对实参进行的,而不是复制一个值:可以利用这个方式在方法调用时双向传递参数:为了以ref方式使用参数,必须在方法声明和方法调用中都明确地指定ref关键字,并且实参变量在传递给方法前必须进行初始化. -输出参数:以out修饰符声明.和ref类似,它也是直接对实参进行操作.在方

jsp中页面间传汉字参数转码的方法

 这篇文章主要介绍了jsp中页面间传汉字参数转码的方法,有需要的朋友可以参考一下 转码:a.href="./showCont.jsp?tcontent="+encodeURI(encodeURI(tcontent));   解码:java.net.URLDecoder.decode((String)request.getParameter("tcontent"), "UTF-8");     例   a.jsp源代码 代码如下: <%@ p

JS中获取函数调用链所有参数的方法

  这篇文章主要介绍了JS中获取函数调用链所有参数的方法,本文直接给出代码示例,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function getCallerArgument(){ var result = []; var slice = Array.prototype.slice; var caller = arguments.callee.caller;   while(caller){ result = result.conca

Python中使用partial改变方法默认参数实例

  这篇文章主要介绍了Python中使用partial改变方法默认参数实例,本文直接给出使用实例,代码中包含详细注释,需要的朋友可以参考下 Python 标准库中 functools库中有很多对方法很有有操作的封装,partial Objects就是其中之一,他是对方法参数默认值的修改. 下面就看下简单的应用测试. 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- #python2.7x #partial.py #authror: orang

net framework-ADO.NET中如何使用AddWithValue方法给用户自定义类型的参数赋值?

问题描述 ADO.NET中如何使用AddWithValue方法给用户自定义类型的参数赋值? 我在sql数据库中注册了程序集并创建了别名为Vector3的自定义的类型,在类库文件中类型名是SqlVector3.已经能够在表和存储结构中使用这个自定义类型. 但我在C#代码中使用AddWithValue方法给一个存储过程的Vector3类型的参数赋值时,却出现了"ArgumentException: The parameter data type of Assets.MyScripts.SqlVect

Java获取代码中方法参数名信息的方法_java

前言 大家都知道随着java8的使用,在相应的方法签名中增加了新的对象Parameter,用于表示特定的参数信息,通过它的getName可以获取相应的参数名.即像在代码中编写的,如命名为username,那么在前台进行传参时,即不需要再编写如@Parameter("username")类的注解,而直接就能进行按名映射. 如下的代码参考所示: public class T { private interface T2 { void method(String username, Stri

java中这个AdapterView&amp;amp;lt;?&amp;amp;gt; arg;泛型作为方法参数的时候&amp;amp;lt;?&amp;amp;gt;可以省略吗?

问题描述 java中这个AdapterView<?> arg:泛型作为方法参数的时候<?>可以省略吗? 这个AdapterView<?> arg:泛型作为方法参数的时候<?>可以省略吗? <?>感觉可有可无啊, 解决方案 应该可以的,泛型的类型不确定,加上?也是白加吧

java中final 变量作为方法的参数?怎么理解?见下面代码

问题描述 java中final 变量作为方法的参数?怎么理解?见下面代码 class NiMingLei { public static void main(String[] args) { Outer out= new Outer(); out.function(7); out.function(8); } } class Outer { static int y=4; void function(final int a) { class Inter { void method() { Sys