FreeMarker(五)宏和函数的定义
来源:互联网 发布:淘宝店铺最高等级 编辑:程序博客网 时间:2024/06/01 12:19
宏和函数的异同:
宏指的是<#macro>,函数指的是<#function>,都允许设置参数,内部可以包含流程控制语句。
区别如下:
- 宏内部的Html代码会直接显示在页面上,更适合用来封装一些页面组件,宏不允许有返回值,如果设置返回值,将直接报错。
- 函数用来写一些仅用于计算的代码块,内部即便写了Html代码,页面也是不会显示的,函数可以有返回值。
宏的定义和使用
如下列代码所示:
宏的参数允许有返回值string的默认值是”“,marquee的默认值是false
通过<@>标签使用宏,参数设值和一般的Html标签类似
<#--定义宏--><#macro TextView string="" color="silver" marquee=false> <#if marquee> <marquee behavior="alternate" width="300" style="color: ${color}">${string}</marquee> <#else> <font style="color: ${color}">${string}</font> </#if> <br/> <#--宏不可有返回值,但是可以提前结束,如果强行设置返回值,将报错:A macro cannot return a value--> <#return></#macro><#--使用宏--><@TextView string="test"/><@TextView string="test" color = "red"/><@TextView color = "green" string="test" marquee = true/>
函数的定义和使用
<#function Add a b> <#--函数就算写了其它页面代码也不会显示--> <font>asdadadad</font> <#assign sum = a+b> <#return sum/></#function>${Add(1, 2)}
在Java代码中函数
具体看SpringMVC的Xml配置文件
@Controllerpublic class MController { @RequestMapping("test/temp") public void ftlTest1(Model model) { //注入一个Java对象 model.addAttribute("util", new Test()); model.addAttribute("map", new HashMap()); }}
//页面调用Java中的函数 ${map.size()} ${map.getClass()} ${util.pr("aa")}
在Java代码中定义宏
感觉没必要在Java代码中设计,实在有些麻烦了。
Java类
package com.css.ftl.plus;import java.io.IOException;import java.net.InetAddress;import java.util.Map;import java.util.Map.Entry;import freemarker.core.Environment;import freemarker.template.ObjectWrapper;import freemarker.template.TemplateDirectiveBody;import freemarker.template.TemplateDirectiveModel;import freemarker.template.TemplateException;import freemarker.template.TemplateModel;import freemarker.template.TemplateNumberModel;import freemarker.template.TemplateScalarModel;public class IP implements TemplateDirectiveModel { /** * * @param 传入的参数,params类型为Map<String, * TemplateModel>,由于历史原因没用泛型。比如传入参数“count=5”,String为count,TemplateModel为5 * * @loopVars 循环变量 * * @see freemarker.template.TemplateDirectiveModel#execute(freemarker.core. * Environment, java.util.Map, freemarker.template.TemplateModel[], * freemarker.template.TemplateDirectiveBody) */ @Override @SuppressWarnings("deprecation") public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { @SuppressWarnings("unchecked") Map<String, TemplateModel> models = params; for (Entry<String, TemplateModel> entry : models.entrySet()) { if (entry.getKey().equalsIgnoreCase("count")) { TemplateNumberModel model = (TemplateNumberModel) entry.getValue(); System.out.println(model); //TODO:int类型参数的相关处理 } if (entry.getKey().equalsIgnoreCase("exclude")) { TemplateScalarModel model = (TemplateScalarModel) entry.getValue(); System.out.println(model); //TODO:string类型参数的相关处理 } } InetAddress address = InetAddress.getLocalHost(); env.setVariable("rest", ObjectWrapper.BEANS_WRAPPER.wrap(address.getHostAddress())); if (body != null) { body.render(env.getOut()); } }}
SpringMVC配置文件
<!--FreeMarker配置 --> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="order" value="1"></property> <property name="suffix" value=".ftl"></property> <property name="contentType" value="text/html;charset=utf-8"></property> <property name="viewClass"> <value>org.springframework.web.servlet.view.freemarker.FreeMarkerView </value> </property> </bean> <!-- 以代码的方式自定义宏 --> <bean id="IP" class="com.css.ftl.plus.IP"/> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <!-- 以代码的方式自定义宏 --> <property name="freemarkerVariables"> <map> <entry key="IP" value-ref="IP"/> </map> </property> <property name="templateLoaderPath"> <value>/WEB-INF/ftl/</value> </property> <!-- 设置FreeMarker环境属性 --> <property name="freemarkerSettings"> <props> <prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop> <prop key="locale">zh_CN</prop><!--设置地区:中国 --> <prop key="template_update_delay">5</prop><!--刷新模板的周期,单位为秒 --> <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 --> <prop key="locale">UTF-8</prop><!--本地化设置 --> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <prop key="date_format">yyyy-MM-dd</prop> <prop key="time_format">HH:mm:ss</prop> <prop key="number_format">0.####</prop> <prop key="boolean_format">1,0</prop><!--Boolean类型默认true,false,但页面不支持默认设置--> <prop key="whitespace_stripping">true</prop> <prop key="tag_syntax">auto_detect</prop> <prop key="url_escaping_charset">UTF-8</prop> </props> </property> </bean>
页面调用
<@IP> 本机的IP地址是:${rest}</@IP>
阅读全文
0 0
- FreeMarker(五)宏和函数的定义
- Freemarker定义宏的用法
- Freemarker定义宏的用法
- Freemarker定义宏的用法
- Freemarker定义宏的用法
- Freemarker宏和函数的用法和区别
- freemarker macro宏定义
- 宏定义和函数
- 宏定义和内联函数的学习
- 内联函数和宏定义的区别
- 内联函数和宏定义的差别
- 内联函数和宏定义的区别
- 内联函数和宏定义的区别
- 内联函数和宏定义的区别
- 宏定义和内联函数的区别
- 内联函数和宏定义的区别
- 内联函数和宏定义的区别
- 内联函数和宏定义的区别
- linux每天一命令: chgrp ,chown 修改档案的用户组和拥有者
- ListView setselection()不起作用
- 2006年培养学员8万人,每年增长%25,请问按此增长速度,到那一年培训学员人数将达到20万人用for,while,dowhile,实现
- 455. Assign Cookies
- angularjs常用知识点和指令
- FreeMarker(五)宏和函数的定义
- leetcode-Two Sum(2)
- 1.3 Java平台及适用范围
- 多线程
- javaweb一些总结
- 求出100~200之间的素数
- 认证相关的点滴积累
- UIWebView 修改背景色 和 禁止复制 清除 webview 的缓存
- 命题逻辑-1