freemarker自定义标签(与java合用)
自定义类继承FreemarkerManager类,重写protected Configuration createConfiguration(ServletContext servletContext)throws TemplateException方法定义有哪些TemplateDirectiveModel类与它的别名[自定义标签名称],通过Spring来取:

import java.util.Map;
import javax.servlet.ServletContext;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import freemarker.template.Configuration;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
/**
* 从spring取得所有的TemplateDirectiveModel类的对象,全部取出来,交给struts管理
* @author Administrator
*
*/
public class DirectiveFreemarkerManager extends FreemarkerManager{
@Override
protected Configuration createConfiguration(ServletContext servletContext)
throws TemplateException {
//调用你父类操作
Configuration configuration=super.createConfiguration(servletContext);
//设定在页面使用的标签的类型 (([]、<>),[]这种标记解析要快些) [] SQUARE_BRACKET_TAG_SYNTAX , <>ANGLE_BRACKET_TAG_SYNTAX
configuration.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
//取得spring所管理所有的对象 ClassPathXmlApplication, WebAplicationContext
ApplicationContext appContext=WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
// 获取实现TemplateDirectiveModel的bean
Map<String, TemplateDirectiveModel> beans= appContext.getBeansOfType(TemplateDirectiveModel.class);
//再把这些类,全部交给struts的freemarker来管理
//Component("upper") public class UpperDirective implements TemplateDirectiveModel
for(String key : beans.keySet()){
Object obj=beans.get(key); //TemplateDirectiveModel
if(obj!=null && obj instanceof TemplateDirectiveModel){
configuration.setSharedVariable(key, obj);
}
}
return configuration;
}
}

在struts.xml中添加:
<!-- 让struts来管理freemarker自定义标签类 struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager -->
<constant name="struts.freemarker.manager.classname" value="com.xxxx.struts.DirectiveFreemarkerManager"></constant>
编写TemplateDirectiveModel,并交给Spring管理:

import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import org.springframework.stereotype.Component;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException; /**
- 自定义指定,作用,把嵌套的内容中的小写全部转换为大写字母
- @author Administrator
/
@Component("upper")
public class UpperDirective implements TemplateDirectiveModel {
//evn 环境输出
//params 参数
//loopVars 循环
//body 内容
@Override
public void execute(Environment env, Map params,
TemplateModel[] loopVars, TemplateDirectiveBody body)
throws TemplateException, IOException {
//如果有参数 应该不支持参数
if(!params.isEmpty()){
throw new TemplateModelException(
"这个指令不允许使用参数.");
}
if(loopVars.length!=0){
throw new TemplateModelException(
"这个指令不允许使用循环参数.");
}
// 如果嵌套内容不为空的
if(body!=null){
//如果有内容,自己去重写输出流
body.render( new UpperCaseFilterWriter(env.getOut()));}</span><span style="color: #0000ff">else</span><span style="color: #000000">{</br>
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> RuntimeException("无内容异常"<span style="color: #000000">);</br>
}</br>
}
//内部类
private static class UpperCaseFilterWriter extends Writer{
private final Writer out; //接收网页中的输出 流对象
public UpperCaseFilterWriter(Writer out){
this.out=out;
}
//cbuf 文字内容, off位移,len 文字长度
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
char[] transformedChar=new char[len];
for(int i=0;i<len;i++){
transformedChar[i]=Character.toUpperCase(cbuf[i+off]);
}
out.write(transformedChar);
}
@Override
public void flush() throws IOException {
out.flush();
}
@Override
public void close() throws IOException {
out.close();
}
}
}

编写action,result—>字符串,type=”freemarker”:
<!-- 约定大于配置 /admin/Flinktype_list.action -->
<package name="freemarkerPackage" namespace="/admin" extends="commonPackage" >
<action name="*_*" class="{1}Action" method="{2}">
<result name="{2}" type="freemarker">/admin/template/{1}/{2}.ftl</result>
</action>
</package>
模板/template/upper.ftl:

<!DOCTYPE html>
<html lang="ch-ZN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<title>freemarker自定义标签</title>
</head>
<body><span style="color: #0000ff"><</span><span style="color: #800000">@upper</span><span style="color: #0000ff">></span><span style="color: #000000"></br>
bar
</span><span style="color: #0000ff"><</span><span style="color: #800000">#-- </span><span style="color: #ff0000">All kind of FTL is allowed here --</span><span style="color: #0000ff">></span></br>
<span style="color: #0000ff"><</span><span style="color: #800000">#list </span><span style="color: #ff0000">["red", "green", "blue"] as color</span><span style="color: #0000ff">></span><span style="color: #000000"></br>
${color}</br>
</span><span style="color: #0000ff"></</span><span style="color: #800000">#list</span><span style="color: #0000ff">></span><span style="color: #000000"></br>
baaz</br>
</span><span style="color: #0000ff"></</span><span style="color: #800000">@upper</span><span style="color: #0000ff">></span></br></br></br> <span style="color: #0000ff"><</span><span style="color: #800000">hr</span><span style="color: #0000ff">/></span></br></br> <span style="color: #0000ff"><</span><span style="color: #800000">@cms_linktype </span><span style="color: #ff0000">limit</span><span style="color: #0000ff">="0,10"</span> <span style="color: #0000ff">></span><span style="color: #000000"></br>
请选择分类: </span><span style="color: #0000ff"><</span><span style="color: #800000">select</span><span style="color: #0000ff">></span></br>
<span style="color: #0000ff"><</span><span style="color: #800000">#list </span><span style="color: #ff0000">arrTypes as x</span><span style="color: #0000ff">></span></br>
<span style="color: #0000ff"><</span><span style="color: #800000">option </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="${x.id}"</span><span style="color: #0000ff">></span>${x.typeName}<span style="color: #0000ff"></</span><span style="color: #800000">option</span><span style="color: #0000ff">></span></br>
<span style="color: #0000ff"></</span><span style="color: #800000">#list</span><span style="color: #0000ff">></span> </br>
<span style="color: #0000ff"></</span><span style="color: #800000">select</span><span style="color: #0000ff">></span></br>
<span style="color: #0000ff"></</span><span style="color: #800000">@cms_linktype</span><span style="color: #0000ff">></span></br>
</body>

freemarker自定义标签(与java合用)的更多相关文章
- freemarker自定义标签报错(六)
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered "\"\u4f60\u597d\uff01\& ...
- freemarker自定义标签报错(五)
freemarker自定义标签 1.错误描述 六月 05, 2014 11:40:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...
- freemarker自定义标签报错(四)
freemarker自定义标签 1.错误描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...
- freemarker自定义标签报错(三)
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered " " at line 14, column ...
- freemarker自定义标签报错(二)
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Unexpected end of file reached. at freemarker ...
- freemarker自定义标签报错(一)
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgr ...
- freemarker自定义标签报错(七)
1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- freemarker自定义标签(一)
freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...
- freemarker自定义标签(三)-nested指令
freemarker自定义标签 1.nested指令 是可选的,可以在<#macro>和</#macro>之间使用在任何位置和任意次数 2.示例说明 <#macro ta ...
随机推荐
- 使用Colaboratory的免费GPU训练神经网络
1 Colaboratory 介绍 Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并 ...
- springmvc-环境配置-架构-配合mybatis-参数绑定
1.1. Spring入门 1.1.1. Springmvc是什么 Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得 ...
- mysql导出某张表的部分数据
.使用into outfile '保存到操作系统的外部文件路径' mysql -uroot -p123456 -hhostname -P3306 select column_name_list fro ...
- set_case_analysis
set_case_analysis给某个Pin指定固定电平,然后时序分析会根据该结果优化原先的电路. 试举例如下:
- 阿里云HBase Ganos全新升级,推空间、时空、遥感一体化基础云服务
1.HBase Ganos是什么 Ganos是阿里云时空PaaS服务的自研核心引擎.Ganos已作为云数据库时空引擎与数据库平台融合,建立了以自研云原生数据库POALRDB为基础,联合NoSQL大数据 ...
- php表单 - 验证邮件和URL
PHP - 验证名称 以下代码将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息: $name = test_input($_POST[" ...
- php基础学习过程
1.基础知识 a.注释: <?php // 这是单行注释 # 这也是单行注释 /* 这是多行注释块 它横跨了 多行 */ ?> b.大小写敏感: 在 PHP 中,所有用户定义的函数.类和关 ...
- China Final J - Mr.Panda and TubeMaster
和一般的管道不同 不能类似“无限之环”或者“弯弯国”的建图,因为这两个题都是某些位置必须有,或者必须没有 但是本题可以有的位置随意,不能限制某个位置要么流2,要么流0,(实际上可能流了1过去) 所以建 ...
- supports-screensandroid
最近在做一个开发者入门的专题,因此一直在搜索关于入门开发的知识和资料,希望能够给开始学习Android开发的朋友提供指导性参考.今天找到了一篇不错的技术文章. 语法: <supports-scr ...
- 深入浅出 Java Concurrency (6): 锁机制 part 1[转]
前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明.从这一章开始花少量的篇幅谈谈锁机制. 上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设 ...