freemark自定义标签:
自定义标签类需SelectDirective implements TemplateDirectiveModel;
eg:public class SelectDirective implements TemplateDirectiveModel
实现execute方法:
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
throws TemplateException, IOException {
}
实现code:
/**
* 自定义下拉框
* @author Administrator
*
*/
public class SelectDirective implements TemplateDirectiveModel {
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
throws TemplateException, IOException {
//id value noSelection multiple onEventName callBack optionKey optionValue styleStr
//list strList map
// id
String id = MapUtils.getString(params, "id", "selectId");
// value
String value = MapUtils.getString(params, "value");
// noSelection
String noSelection = MapUtils.getString(params, "noSelection");
// multiple
boolean multiple = Boolean.valueOf(MapUtils.getString(params, "multiple"));
// onEventName:默认有callback时为onChange
String onEventName = MapUtils.getString(params, "onEventName","onChange");
// callBack
String callBack = MapUtils.getString(params, "callBack");
// optionKey
String optionKey = MapUtils.getString(params, "optionKey");
// optionValue
String optionValue = MapUtils.getString(params, "optionValue");
Map<String, Object> templateContext = new HashMap<String, Object>();
//list
Object temp = params.get("list");
if(temp instanceof SimpleSequence){
SimpleSequence lists = (SimpleSequence) params.get("list");
templateContext.put("list",lists.toList());
}
//strList
String strList = MapUtils.getString(params, "strList");// strList : 文字:1,图片:2
if(StringUtils.isNotBlank(strList)){
if(StringUtils.isNotBlank(strList)){
templateContext.put("strList", Arrays.asList(strList.split(",")));
}
}
//map
SimpleHash map=(SimpleHash)params.get("map");
if(null!=map){
templateContext.put("map",map.toMap());
}
templateContext.put("optionKey", optionKey);
templateContext.put("optionValue", optionValue);
templateContext.put("id", id);
templateContext.put("value", value);
if( StringUtils.isNotBlank(noSelection) ){
String noSelectionKey= noSelection.substring( noSelection.indexOf(":")+1 , noSelection.length());
String noSelectionValue= noSelection.substring(0, noSelection.indexOf(":"));
templateContext.put("noSelectionKey", noSelectionKey);
templateContext.put("noSelectionValue", noSelectionValue );
}
templateContext.put("multiple", multiple);
if(StringUtils.isNotBlank(callBack)){
templateContext.put("onEventStr", onEventName+"='javascript:"+ callBack +"'");//onchange="javascript:submitForm();"
}
Template template = env.getConfiguration().getTemplate("/ftl/select.ftl");
template.process(templateContext, env.getOut());
}
}
页面code:
<#ftl attributes={"content_type":"text/html; charset=UTF-8"}>
<select name="${id}" id="${id}" <#if onEventStr?? && onEventStr?length gt 0 >${onEventStr!''}</#if> <#if multiple?? && multiple==true >multiple="multiple"</#if> >
<#if noSelectionKey?? && noSelectionValue?? !(value??)>
<option value="${noSelectionKey}" <#if ((value??)&& value == noSelectionValue) >selected</#if>>${noSelectionValue}</option>
</#if>
<#if strList?? && strList?size gt 0>
<#list strList! as str>
<#assign keys = t_util.cutString(str, 0, t_util.indexOf(str, ':') ) >
<#assign values = t_util.cutString(str , t_util.indexOf(str, ':')+1 , str?length ) >
<option value= "${values}" <#if value?? && value==values >selected</#if>>${keys}</option>
</#list>
<#elseif list?? && list?size gt 0>
<#list list as obj>
<#if obj??>
<#assign keys = ('obj.'+ optionKey) >
<#assign values = ('obj.'+ optionValue) >
<#if ((values?eval)?length gt 0 && (keys?eval)?length gt 0) >
<option value="${values?eval}" <#if ((value??)&& value == values?eval) >selected</#if>>${keys?eval!''}</option>
</#if>
</#if>
</#list>
<#elseif map?? && map?size gt 0>
<#list map?keys as key>
<#if optionKey?? && optionKey=="value">
<option value="${map[key]!''}" <#if value?? && value== map[key]>selected="selected"</#if> >${key!''}</option>
<#else>
<option value="${key!''}" <#if value?? && value== key>selected="selected"</#if> >${map[key]!''}</option>
</#if>
</#list>
</#if>
</select>
调用code:
<div class="main-content">
<h1 align="center">d_select使用示例:</h1>
<div >
strList:集合为静态字符串集合:</br>
指定字符串:strList="key:value,key:value....",eg:strList="文字:1,图片:2"</br>
</br>
1,指定onchange事件的回调函数: <@d_select id="type_1" strList="文字:1,图片:2" callBack="callbackonChanged();"/>指定callBack为js回调函数名即可,默认有callBack时击发onchange事件,js函数需自己写;</br>
2,指定除onchange的其他事件的回调函数: <@d_select id="type_1" strList="文字:1,图片:2" callBack="callbackonClick();" onEventName="onClick"/>指定callBack为js回调函数名,并且指定事件名onEventName,eg:onEventName="onClick",js函数需自己写;</br>
3,多选: <@d_select id="type_2" strList="文字:1,图片:2" noSelection="请选择:0" value="2" multiple="true" callBack="callbackonClick();" onEventName="onClick"/>多选:multiple="true";附加选项:noSelection="0:请选择" </br>
4,有默认选中项时: <@d_select id="type_3" strList="文字:1,图片:2" value="2" noSelection="请选择:0" callBack="callbackonChanged();" onEventName="onChange"/>默认选中值:value="2"; </br>
</br></br></br>
list:集合为页面上的list对象:</br>
5, <@d_select id="type_4" optionKey="position" optionValue="id" list=adSpaceBoList callBack="test();" value="4f0eabc9073c1f0de52b25d2" ></@d_select>指定list对象名:list=adSpaceBoList;选项key对应集合中的属性:optionKey="position";选项value对应集合中的属性:optionValue="id";</br>
城市:<@d_select id="currentlyCity" optionKey="display" optionValue="name" noSelection="所有:" list=serverAreaList ></@d_select>
</br></br></br>
map:集合为页面上的map对象:</br>
6, <@d_select id="pageId" optionKey="value" map=pageIdMap callBack="submitForm();" value=""></@d_select>指定map对象名:map=pageIdMap;如果optional的key,value与map的key,value相反,则:optionKey="value",否则,不写。</br>
</div>
<h1 align="center">d_select属性:</h1>
<div>
选项集合:</br>
必须指定,list strList map,且只能有一个</br>
注:集合为list时,需指定optional的key和value对应集合对象的属性名:optionKey optionValue;</br>
为map时,optional的key,value与map不一致时,指定optionKey="value"即可;</br>
其他属性:id value noSelection multiple onEventName callBack optionKey optionValue ;</br>
id:下拉框Id,默认值为:selectId;name属性值与Id相同;</br>
value:默认选中的值;</br>
noSelection:除指定集合的一个额外选项( key:value,空值时eg(:value) );</br>
multiple: 是否多选(true/false);</br>
onEventName:事件名,默认为onChange;</br>
callBack:回调函数名;</br>
optionKey , optionValue:
对应list的属性字段,必须写;</br>
对应map的key,value字段,可以不写(如果map的key对应optional的value,需写为:optionKey="value");
</br>
</div>
</div>
分享到:
相关推荐
自定义标签是Freemarker的一个重要特性,它允许开发者扩展模板语言的功能,以满足特定项目的需求。本篇文章将对Freemarker自定义标签进行深入的总结。 1. **自定义标签基础** 自定义标签在Freemarker中被称为`...
3. 使用自定义标签:在模板文件中,你可以像使用内置标签一样使用你的自定义标签。例如,如果你注册了一个名为`myCustomTag`的自定义指令,你可以在模板中这样使用:`...
自定义标签是Freemarker的一个强大特性,它可以帮助我们更好地组织视图层代码,提高代码复用性,使得模板更加模块化。下面将详细介绍Spring MVC与Freemarker自定义标签的使用。 首先,我们需要了解Freemarker的基础...
为了使自定义标签在JSP中可用,你需要在`WEB-INF`目录下创建一个`tld`文件夹,并创建一个`.tld`文件(例如`my-tags-tld.tld`)。`tld`文件定义了你的自定义标签库,包括描述、显示名称、版本等信息。尽管在示例中...
### freemarker 标签详解:提升Web开发效率与灵活性 #### 1. Include标签:高效复用模板 **功能概述:** `Include` 标签是Freemarker中一个非常实用的功能,它允许开发者在多个页面间共享相同的布局或组件,如页头...
- **自定义标签**:当需要扩展功能时,可以通过自定义标签实现。这部分可能会涉及到FreeMarker的API和标签库的创建。 4. **参考手册** - **函数和方法**:FreeMarker提供了丰富的内置函数,如`html`用于转义HTML...
### Freemark标签运用知识点 #### 一、Freemarker简介 Freemarker 是一款功能强大的模板引擎,由 Apache 软件基金会所维护的一个开放源码项目。它主要用于生成动态 HTML 页面,但也支持生成 XML、Java 源代码等...
2. 自定义标签库:支持自定义标签,可以扩展模板语言的功能。 3. 国际化支持:通过不同的消息资源文件实现多语言输出。 4. 缓存机制:提高性能,减少对服务器资源的消耗。 5. 高级控制结构:包括条件判断、循环、...
通常,Word模板会遵循Open XML标准,这样FreeMarker就能识别并处理其中的标签。同时,这个描述中还提到了转换为PDF格式,虽然FreeMarker本身不直接支持PDF生成,但可以结合其他库,如Apache POI或iText,先用...
此外,也可以自定义方法,通过`<#function>`标签实现。 5. **模板继承与导入**: 使用`<#include>`标签可以导入其他模板,而`<#macro>`可以定义可重用的模板片段,通过`<#nested>`调用。 6. **运行Test.java**: ...
FreeMarker支持更复杂的功能,如宏、指令、自定义标签等,这使得模板可以处理更复杂的逻辑。同时,Apache POI库提供了丰富的API,用于对Word文档进行更细致的控制,比如插入图片、设置样式等。 总结,使用Java和...
3. **国际化(Internationalization)**: FreeMarker支持多语言,通过`<#t>`或`<#lt>`标签进行日期和时间格式化,`<#trans>`处理翻译。 4. **自定义函数和指令(Custom Tags and Directives)**: 可以通过扩展...
涉及的知识点有:springboot框架原理、freemark模板标签语法、jpa数据库操作及自动建表、统一上传文件实现方法、自定义注解实现统一验证方法、权限拦截器实现权限统一管理、自定义分页插件封装、调用控制台命令对...
标签"freemark官方插件2"再次强调了这是FreeMarker官方提供的插件,并且是系列中的第二个。官方插件通常具有较高的可靠性和与核心库的良好兼容性,开发者可以放心使用,因为它们会得到官方的支持和维护。 在压缩...
format}):可以自定义数字的显示格式,如`mX`(小数部分最小X位)和`MX`(小数部分最大X位)。 4. **FTL指令**:FreeMarker的FTL指令类似于HTML标签,但以`#`开头,用来控制模板的逻辑和流程。例如,`<#if>`、`...
- **FTL标签**:可以使用`<@tag>`形式在模板中调用自定义或框架提供的标签。 - **初始化共享变量**:通常在Web应用启动时设置,用于跨模板共享数据。 - **整合配置**:与WebWork或其他MVC框架整合时,需要配置...
系统实现的功能主要有用户管理、角色管理、权限管理、日志管理、数据库备份等等,涉及的知识点有:springboot框架原理、freemark模板标签语法、jpa数据库操作及自动建表、统一上传文件实现方法、自定义注解实现统一...
FreeMarker模板中主要包含静态数据和FTL标签(FreeMarker Template Language,FreeMarker模板语言),在处理模板时,静态数据原封不动地输出,而FTL标签则根据数据模型中的数据动态生成相应的输出。数据模型是一个...
标题"freemark2.36"指的是FreeMarker的版本号2.3.16,这可能是该软件的一个稳定版本。 FreeMarker的核心功能是将数据模型与HTML或其他格式的模板结合,生成动态内容。它的工作原理是将预先设计好的模板文件(.ftl...