freemaker 使用思路

本文介绍了如何在Java项目中使用Freemarker模板引擎,包括引入最新jar包,创建Configuration对象,设置模板路径,获取Template对象,设置数据并生成最终结果。提供了基于main方法和servlet的示例代码,适合于动态网页生成和代码自动生成场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 引入freemaker包

注意:选取最新jar包,否则可能会报错

2 创建 Configuration对象: tempConfiguration = new Configuration();

    Configuration 对象主要是用来获取模板(Template)对象(或者说文件)

3 设置Configuration信息,如模板存放位置,字符编码等;

    tempConfiguration.setClassForTemplateLoading(this.getClass(), "/");

    tempConfiguration.setDefaultEncoding("utf-8");

常用有两种方式来设置模板存放位置:

           setClassForTemplateLoading(this.getClass(), "/"); //JAVA源码中相对路径,这里是classpath

           setServletContextForTemplateLoading.getServletContext(),"templates")//获取web工程中相对路径,这里获取的是WebContent下templates文件夹路径

    注意:第一种设置方式适用于自动生成代码,多数用于在main函数中运行时设置模板路径;第二种适用于servlet或者web开发中,用于动态生成页面

4 获取Template对象:template= tempConfiguration.getTemplate("wzq.ftl")

   注意:classpath路径下应该先有个wzq.ftl文件,否则找不到文件

5 设定需要向模板中添加的数据,这里使用map存放数据

    Map root = new HashMap();

    User user = new User();

    user.setName("zhansan");

   root.put("user",user);

6 根据模板生成数据:数据可以为文件,也可以为stream


下面贴出代码,代码中有部分来自网上,关键部分按自己的理解经过修改,共两种方式,一种是基于main方法,另一种是servlet,代码并不完整,希望为用过java或者servlet的朋友一个参考

一个JAVA文件对应一个FTL模板


基于main方法使用

JAVA部分

package example;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class FrermarkerXml {
	Template testfile;
	Map root;
	private void initData() {
		   root = new HashMap();
		   User user = new User();
		      user.setName("root");
		      user.setPwd("root");
		      List<Address> addresses = new ArrayList<Address>(); 
		      for (int i = 0; i < 2; i++) {
		       Address address = new Address();
		          address.setName("address_"+i);
		          addresses.add(address);
		  }
		      Map<String, Address> keyadds = new HashMap<String, Address>();
		      for (int i = 0; i < 2; i++) {
		       Address address = new Address();
		       address.setName("mapaddress_"+i);
		       keyadds.put("keyadd_"+i, address);
		  }
		      user.setAdds(addresses);
		      user.setKeyadds(keyadds);
		      root.put("user", user);
		 }
	private  void init(){
	       try {
	             Configuration tempConfiguration = new Configuration();
	             tempConfiguration.setClassicCompatible(true);
	             tempConfiguration.setClassForTemplateLoading(this.getClass(), "/");	            
	             tempConfiguration.setDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
	             tempConfiguration.setNumberFormat("");
	             tempConfiguration.setDefaultEncoding("utf-8");
	             testfile = tempConfiguration.getTemplate("wzq_main.ftl");
	         } catch (IOException ex) {
	             ex.printStackTrace();
	         }
	   }
	public String toString(){
		   StringWriter sw = new StringWriter();
		   File file = new File("C:\\Apps\\wzq.xml");
		   if(!file.exists()){
			   try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		   }
		         try {
		          testfile.process(root, new OutputStreamWriter(new FileOutputStream(file)));
		         } catch (Exception ex) {
		             ex.printStackTrace();
		         }
		         return sw.toString();
		  }
	FrermarkerXml(){
		   init();
		   initData();
		 }
	public static void main(String[] args) {
		  System.out.println(new FrermarkerXml().toString());
		 }
}

FTL部分 --  
wzq_main.ftl

<用户名>${user.name}</用户名>
<密码>${user.pwd}</密码>
<#list user.adds as add>
<address>
   <地址>List对象address值:${add.name} </地址>
</address>
</#list>
<#list user.keyadds?keys as addkey>
<address>  
    key:${addkey}
    value:${user.keyadds[addkey].name}
</address>
</#list>


基于servlet

JAVA部分

package examples;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
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;

public class Hello extends HttpServlet{
	private Configuration cfg;
	public void init(){	   
        cfg = new Configuration();
        cfg.setServletContextForTemplateLoading(getServletContext(),"templates");
      //  cfg.setClassForTemplateLoading(this.getClass(), "/");
	}
	public void doGet(HttpServletRequest request,HttpServletResponse response) 
			throws ServletException,IOException{
	   Map root = new HashMap();
	   User user = new User();
	   user.setName("zhansan");
	   root.put("user",user);
	   Template t =cfg.getTemplate("wzq_servlet.ftl");
       response.setContentType("text/html; charset=" + t.getEncoding());
	   PrintWriter out = response.getWriter();
	   try{
	    t.process(root,out);
	   }catch(TemplateException e){
	    e.printStackTrace();
	   }
	}
}

FTL部分

wzq_servlet.ftl

<html>
<head>
<title>hello!</title>
</head>
<body>

<h1>hello-classpath ${user.name}!</h1>

</body>
</html>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值