自定义类继承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">&lt;</span><span style="color: #800000">@upper</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></br>
bar
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">#-- </span><span style="color: #ff0000">All kind of FTL is allowed here --</span><span style="color: #0000ff">&gt;</span></br>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">#list </span><span style="color: #ff0000">["red", "green", "blue"] as color</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></br>
${color}</br>
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">#list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></br>
baaz</br>
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">@upper</span><span style="color: #0000ff">&gt;</span></br></br></br> <span style="color: #0000ff">&lt;</span><span style="color: #800000">hr</span><span style="color: #0000ff">/&gt;</span></br></br> <span style="color: #0000ff">&lt;</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">&gt;</span><span style="color: #000000"></br>
请选择分类: </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">select</span><span style="color: #0000ff">&gt;</span></br>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">#list </span><span style="color: #ff0000">arrTypes as x</span><span style="color: #0000ff">&gt;</span></br>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">option </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="${x.id}"</span><span style="color: #0000ff">&gt;</span>${x.typeName}<span style="color: #0000ff">&lt;/</span><span style="color: #800000">option</span><span style="color: #0000ff">&gt;</span></br>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">#list</span><span style="color: #0000ff">&gt;</span> </br>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">select</span><span style="color: #0000ff">&gt;</span></br>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">@cms_linktype</span><span style="color: #0000ff">&gt;</span></br>

</body>

freemarker自定义标签(与java合用)的更多相关文章

  1. freemarker自定义标签报错(六)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered "\"\u4f60\u597d\uff01\& ...

  2. freemarker自定义标签报错(五)

    freemarker自定义标签 1.错误描述 六月 05, 2014 11:40:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...

  3. freemarker自定义标签报错(四)

    freemarker自定义标签 1.错误描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...

  4. freemarker自定义标签报错(三)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered " " at line 14, column ...

  5. freemarker自定义标签报错(二)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Unexpected end of file reached. at freemarker ...

  6. freemarker自定义标签报错(一)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgr ...

  7. freemarker自定义标签报错(七)

    1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...

  8. freemarker自定义标签(一)

    freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...

  9. freemarker自定义标签(三)-nested指令

    freemarker自定义标签 1.nested指令 是可选的,可以在<#macro>和</#macro>之间使用在任何位置和任意次数 2.示例说明 <#macro ta ...

随机推荐

  1. python urllib模块中的方法

    1.urllib.urlopen(url[,data[,proxies]]) 打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作.本例试着打开google >>> ...

  2. HZOI20190823 C magic

    数论板子合集... 我们要求: $N^{\sum\limits_{i=1}^{N}[gcd(i,N)==1]C_{n}^{i}}mod p$ 其中p为54184622,是个合数 指数是组合数,不能用快 ...

  3. Location protocol 属性

    Location protocol 属性 定义和用法 protocol 属性是一个可读可写的字符串,可设置或返回当前 URL 的协议. 语法 location.protocol <!DOCTYP ...

  4. MySql存储过程批量删除多个数据库中同名表中的指定字段

    1. 创建存储过程batchDeleteField:删除所有名称为"MyDB_"开头的数据库中的指定字段 -- ---------------------------- -- Pr ...

  5. MySql存储过程批量给多个数据库中的同名表添加字段

    1 创建存储过程 batchAddField:给所有"MyDB_"开头的数据库添加新字段 -- ---------------------------- -- Procedure ...

  6. 关于使用注解设置token免拦截 和 必要 的权限拦截

    先说一下这样子做的原理:将某一个注解配置在方法头部,在spring实例化的时候会将注解以切面的形式注入给方法,在拦截的地方判断当前方法有没有注入指定的注解类. 1.先声明一个注解类(类中不需要做任何逻 ...

  7. this的五种指法

    this 到底指向哪里 以下如果没提及,则为严格模式. js中作用域有两种: 词法作用域 动态作用域 词法作用域 词法作用域指在书写代码时就被确定的作用域.看如下代码 var value = 1; f ...

  8. webService学习五(插入片,---监控方法)

    WS Explorer工具的使用: 1- web服务浏览器 2-将对应的路径copy到这里 - 3- 4-- 5-- 6--请求的数据: 7--相应数据 二.使用TCP/IP Monitor-拦截HT ...

  9. oracle基础学习(1)

    -解锁用户,需要使用dba权限conn sys/1234 as dba; alert user scott account unlock;/ --initcap方法,实现字符串首字符大写,其余字符小写 ...

  10. 自定义事件javascript

    自定义事件 1.event构造函数自定义事件 /* * 自定义一个名为build的事件 * bubbles :事件是否冒泡 * cancelable:是否阻止事件的默认操作 * composed:指示 ...