博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FreeMarker自定义标签select
阅读量:6097 次
发布时间:2019-06-20

本文共 2986 字,大约阅读时间需要 9 分钟。

hot3.png

应用中用到的select经常需要向后台获取系统字典定义的选项然后再<#list>出来。为了重用可以使用服务端标签封装,或者用前端模板组件封装。这里记录一下使用FreeMarker自定义标签封装的方法。主要参考《FreeMarker_Manual_zh_CN》。

###用户自定义指令

<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN/><@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN ; lv1, lv2, ..., lvN/><@user_def_dir_exp ...>...
或<@user_def_dir_exp ...>...
<@user val1, val2, ..., valN/>

这里:

1)user_def_dir_exp:表达式算作是自定义指令(比如宏),将会被调用;
2)param1,param2等:参数的名称,它们不是表达式;
3)val1,val2等:参数的值,它们是表达式;
4)lv1,lv2等:循环变量的名称,它们不是表达式;

参数的数量可以是0(也就是没有参数)。参数的顺序并不重要(除非你使用了位置参数传递)。参数名称必须唯一。在参数名中小写和大写的字母被认为是不同的字母(也就是Color和color是不同的)。

###select标签规则

<@select style="height:200px;padding:3px" name="cd" id="" default="x"  desc="请选择">9100

1)标签体内是系统字典的id或code;

2)标签的参数不限,用来接收常规select html标签的属性,增加default参数用于指定selected,增加desc参数指定空option显示的提示信息;

###TemplateDirectiveModel实现类 public class DictSelectDirective implements TemplateDirectiveModel {

@Autowired	private DataDictService dataDictService;		@Override	public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)			throws TemplateException, IOException {		Map
attrs=new HashMap
(); Iterator paramIter = params.entrySet().iterator(); while (paramIter.hasNext()) { Map.Entry ent = (Map.Entry) paramIter.next(); String paramName = (String) ent.getKey(); TemplateModel paramValue = (TemplateModel) ent.getValue(); attrs.put(paramName,paramValue.toString()); } if(body==null) return; body.render(new DictSelectDirectiveWriter(env.getOut(),attrs)); } private class DictSelectDirectiveWriter extends Writer { private final Writer out; private Map
attrs; DictSelectDirectiveWriter(Writer out,Map
attrs) { this.out = out; this.attrs = attrs; } public void write(char[] cbuf, int off, int len) throws IOException { //获取字典选项 Map
options=new HashMap
(); Integer dictId=Integer.valueOf(new String(cbuf)); List
dataDicts=dataDictService.findChildrenById(dictId); if(dataDicts!=null&&dataDicts.size()>0) { for(DataDict dataDict:dataDicts) options.put(dataDict.getCode(), dataDict.getName()); } StringBuffer buf = new StringBuffer(300); buf.append("
entry:attrs.entrySet()) buf.append(" ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\""); buf.append(">"); //拼提示 String desc=attrs.get("desc"); buf.append("
"); //默认值 String defaultVal=attrs.get("default"); //拼选项 for(Map.Entry
entry:options.entrySet()) { String key=entry.getKey(); buf.append("
"); } buf.append(""); out.write(buf.toString()); } public void flush() throws IOException { out.flush(); } public void close() throws IOException { out.close(); } }}

###FreeMarkerConfigurer配置

转载于:https://my.oschina.net/braveCS/blog/769723

你可能感兴趣的文章
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
codeforce 599B Spongebob and Joke
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
9、Dubbo-配置(4)
查看>>
前端第七天
查看>>
BZOJ 2190[SDOI2008]仪仗队
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>