【freemarker】

注:模板:1、先建好word。2、将word转xml。3、格式化xml文件。4、将.xml的后缀改成.ftl。5、然后修改文件源码。
https://blog.csdn.net/pengpengpeng85/article/details/52070602
一、代码实例

@RequestMapping("dyQrcodefirst")
	@ResponseBody
	public void dyQrcodefirst(HttpServletRequest request, HttpServletResponse response, String id){
		try {
			/** 初始化配置文件 **/
	        Configuration configuration = new Configuration();
	        /** 设置编码 **/
	        configuration.setDefaultEncoding("utf-8");
	        /** 文件路径 **/
	        //String fileDirectory = "D:\\";
	        String fileDirectory = request.getServletContext().getRealPath("/") + "template/"; // 服务器中地址
	        /** 加载文件 **/
	        configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
	        /** 加载模板 **/
	        Template template = configuration.getTemplate("img.ftl");
	        /** 准备数据 **/
	        Map<String,Object> dataMap = new HashMap<String,Object>();	       	        
	        List<Map<String,Object>> listImg=new ArrayList<Map<String,Object>>();
			String [] qrcodefirst_idArray = id.split(",");
			for (int i = 0; i < qrcodefirst_idArray.length; i++) {
				String qrcodefirst_id = qrcodefirst_idArray[i];
				Map<String, Object> qrcodefirstByid = QrcodefirstService.getQrcodefirstByid(qrcodefirst_id);
				listImg.add(qrcodefirstByid);
			}
			String path = request.getServletContext().getRealPath("/");
			List<Map<String,Object>> listend=new ArrayList<Map<String,Object>>();
			for(Map<String ,Object> mapImg:listImg){
				if(!StringUtils.isEmpty(mapImg)){
					String qrcodefirst_url=mapImg.get("qrcodefirst_url")+"";
					String imagePath = path + qrcodefirst_url;
					InputStream in = null;
		            byte[] data = null;
		            try {
		                in = new FileInputStream(imagePath);
		                data = new byte[in.available()];
		                in.read(data);
		                in.close();
		            } catch (Exception e) {
		                e.printStackTrace();
		            }finally {
		                if(in != null){
		                    in.close();
		                }
		            }
		            /** 进行base64位编码 **/
		            BASE64Encoder encoder = new BASE64Encoder();
		            /** 图片数据**/
		            if(data == null){
		            	mapImg.put("qrcodefirst_url","");
		            } else {
		            	mapImg.put("qrcodefirst_url",encoder.encode(data));
		            }
		            listend.add(mapImg);
				}
			}
			dataMap.put("listImg", listend);
    		//List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
    		//String imgPath = map.get("photoImgUrl").toString();
    		//String imagePath = path + imgPath;
    		
            
            
	        /** 指定输出word文件的路径 **/
            String outFilePath = request.getServletContext().getRealPath("/") + "upload/箱码.doc"; // 服务器中地址
	        //String outFilePath = "D:\\干部登记表.doc";
	        File docFile = new File(outFilePath);
	        FileOutputStream fos = new FileOutputStream(docFile);
	        Writer out = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"),10240);
	        template.process(dataMap,out);

	        String downloadFilename = "箱码.doc";
	        downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
			// 对默认下载的文件名编码。不编码的结果就是,在客户端下载时文件名乱码
			File file = new File(outFilePath);
			if (file.exists()) {
				// 写明要下载的文件的大小
				response.setContentLength((int) file.length());
				response.setHeader("Content-Disposition", "attachment;filename="
						+ downloadFilename);// 设置在下载框默认显示的文件名
				response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
				// 读出文件到response
				// 这里是先需要把要把文件内容先读到缓冲区
				// 再把缓冲区的内容写到response的输出流供用户下载
				FileInputStream fileInputStream = new FileInputStream(file);
				BufferedInputStream bufferedInputStream = new BufferedInputStream(
						fileInputStream);
				byte[] b = new byte[bufferedInputStream.available()];
				bufferedInputStream.read(b);
				OutputStream outputStream = response.getOutputStream();
				outputStream.write(b);
				// 人走带门
				bufferedInputStream.close();
				outputStream.flush();
				outputStream.close();
			}
			/*if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
				}
			}*/
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
    }

2、freewarker语法
一、freemarker模板文件(*.ftl)的基本组成部分
1. 文本:直接输出的内容部分
2. 注释:不会输出的内容,格式为<#-- 注释内容 -->
3. 取值(插值):代替输出数据模型的部分,格式为${数据模型}或#{数据模型}
4. ftl指令:Freemarker指令,类似于HTML标记。
内建指令:开始标签:<#directivename parameter> 结束标签:</#directivename> 空标签:<#directivename parameter/>
自定义指令:开始标签:<@directivename parameter> 结束标签:/@directivename 空标签:<@directivename parameter/>
至于什么是内建指令,什么是自定义指令 我会在下面叙述到。

二、Freemarker语法及使用方法
1. 取值(插值)指令及适用类型:
(1) ${var}
适用类型:java中常用的八大基本类型以及我们的String引用类型,但是,freemarker中boolean类型显示时trueyes falseno
示例:
在后台文件中定义变量
String strVar = “世界你好”;
int intVar = 10;
boolean booVar = true;
在页面中获取变量:
String获取: ${strVar}

int获取: ${intVar}

boolean获取: b o o V a r ? s t r i n g ( &quot; y e s &quot; , &quot; n o &quot; ) &lt; / f o n t &gt; S t r i n g i n t 10 b o o l e a n y e s ( 2 ) {booVar?string(&quot;yes&quot;,&quot;no&quot;)} &lt;/font&gt; 展示结果: String获取:世界你好 int获取:10 boolean获取:yes (2) {var!}
适用类型:对 null 或者不存在的对象进行取值,可以设置默认值,例:${var!‘我是默认值’} 即,有值时显示正常值,无值时显示默认值
示例:
在后台文件中定义变量
String strVar = “世界你好”;
String str = null;
在页面中获取变量:
String获取: ${strVar!“我是空”}

str获取: ${str!}

str获取: s t r ! &quot; &quot; &lt; / f o n t &gt; &lt; b r &gt; S t r i n g s t r s t r ( 3 ) {str!&quot;默认&quot;} &lt;/font&gt;&lt;br&gt; 展示结果: String获取:世界你好 str获取: str获取:默认 (3) {封装对象.属性}
适用类型:对封装对象进行取值,例:${User.name}
示例:
在后台文件中封装对象User[ name, age ]
String name = “姓名”;
int age = 18;
在页面中获取变量:
name获取: ${User.name}

age获取: U s e r . a g e &lt; / f o n t &gt; &lt; b r &gt; n a m e a g e 18 ( 4 ) {User.age} &lt;/font&gt;&lt;br&gt; 展示结果: name获取:姓名 age获取:18 (4) {date?String(‘yyyy-MM-dd’)}
适用类型:对日期格式进行取值,在这里我要强调的是,定义Date类型的变量时,java.util.Date无法输出日期,须使用java.sql.Date
示例:
在后台文件中定义变量
java.sql.Date date = new Date().getTime();
java.sql.Date time = new Date().getTime();
java.sql.Date datetime = new Date().getTime();
在页面中获取变量:
date获取: ${date?string(‘yyyy-MM-dd’)}

time获取: ${date?string(‘HH:mm:ss’)}

datetime获取: d a t e ? s t r i n g ( y y y y M M d d H H : m m : s s ) &lt; / f o n t &gt; &lt; b r &gt; n a m e a g e 18 ( 5 ) {date?string(&#x27;yyyy-MM-dd HH:mm:ss&#x27;)} &lt;/font&gt;&lt;br&gt; 展示结果: name获取:姓名 age获取:18 (5) {var?html}
适用类型:转义HTML内容
示例:
在后台文件中封装变量Menu[ name, model ]
Menu m = new Menu();
m.setName(" freemarker ");
m.setModel(“我只是个菜单”);
在页面中获取变量:
非转义获取: ${m.model}

转义获取: ${m.model?html}


展示结果:
非转义获取:我只是个菜单
转义获取:我只是个菜单
(6)<#assign num = 100 />
适用类型:定义变量,支持计算和赋值
示例:
在页面中定义变量:
<#assign num = 100 />
num获取: ${num)}

计算结果: ${num * 10}

展示结果:
num获取:100
计算结果:1000
(7)对List集合进行取值
<#list list集合 as item>
${item} --取值
</#list>
示例:
在后台文件中定义变量
List strList = new ArrayList();
strList.add(“第一个值”);
strList.add(“第二个值”);
strList.add(“第三个值”);
在页面中获取变量:
<#list strList as item>
${item!}
--取值
</#list>
展示结果:
第一个值
第二个值
第三个值
(8)对Map集合进行取值
<#list map?keys as key>
k e y : {key}: {map[key]}
</#list>
示例:
在后台文件中定义变量
Map<String, Object> m = new HashMap<String, Object>();
m.put(“name”,“姓名”);
m.put(“age”,18);
m.put(“sex”,“男”);
在页面中获取变量:
<#list m?keys as key>
k e y : {key}: {m[key]}
</#list>
展示结果:
name:姓名
age:18
sex:男
2. 条件判断指令:
(1) if
格式:<#if 条件>
输出
</#if>
示例:
在页面中定义变量并判断条件:
<#assign age = 18 />

<#if age == 18>
age = 18
</#if>
展示结果:
age = 18
(2) if - else
格式:<#if 条件>
输出
<#else>
输出
</#if>
示例:
在页面中定义变量并判断条件:
<#assign age = 20 />

<#if age == 18>
age = 18
<#else>
age != 18
</#if>
展示结果:
age != 18
(3) if - elseif - else
格式:<#if 条件1>
输出
<#elseif 条件2>
输出
<#else>
输出
</#if>
示例:
在页面中定义变量并判断条件:
<#assign age = 20 />

<#if age > 18>
青年
<#elseif age == 18>
成年
<#else>
少年
</#if>
展示结果:
成年
(4) switch --常与case break default一起使用 参数可为字符串
格式:<#switch var>
<#case 条件1>
输出
<#break>
<#case 条件2>
输出
<#break>
<#default>
输出
</#switch>
示例:
在页面中定义变量并判断:
<#switch var=“星期一”>
<#case “星期一”>
油焖大虾
<#break>
<#case “星期二”>
炸酱面
<#break>
<#default>
肯德基
</#switch>
展示结果:
油焖大虾
3. 自定义函数、自定义指令:
(1) 自定义函数
实现TemplateMthodModelEx
(2) 自定义指令
实现TemplateDirectiveModel
示例:
<@自定义指令名称 入参(key-value格式) ; 出参(list格式)>
运行条件
</@自定义指令名称>

      PS:不同的返回值用逗号( , )间隔开

4.常用内建函数、macro(宏指令)、function(函数指令):
(1) 常用内建函数
处理字符串:
substring 截取字符串,包头不包尾(下标)
cap_first 第一个字母大写
end_with 以什么字母结尾
contains 是否包含目标字符串
date datetime time 转换成日期格式
starts_with 以什么字母开头
index_of 返回某个指定的字符串值在字符串中首次出现的位置(下标)
last_index_of 获取指定字符出现的最后位置(下标)
split 分隔
trim 去两端空格
处理数字:
string
x?string(“0.##”) 变成小数点后几位
round 四舍五入
floor 去掉小数点
ceiling 近1 变成整数
处理list:
first: 取List值第一个值
last: 取List值最后一个值
seq_contains: 是否包含指定字符
seq_index_of: 指定字符所在位置
size: 集合大小
reverse: 集合倒序排列
sort: 对集合进行排序
sort_by: 根据某一个属性排序
chunk: 分块处理
其他:
is_string: 是否为字符类型
is_number: 是否为整数类型
is_method: 是否为方法
(): 判断整个变量
has_content: 判断对象是否为空或不存在
eval: 求值
(2) macro(宏指令)
调用:<@macro_name param />
语法:<#macro 变量名 参数>
<#nested/>
</#macro>
(3) function(函数指令)
调用:${function_name(param)}
语法:<#function 变量名 参数>
<#return>
</#function>

猜你喜欢

转载自blog.csdn.net/ivy_doudou/article/details/85333557