自定义类继承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. APPScan手动探索

  2. occ+vtk显示igs模型

    使用Opencascade读取igs文件内模型,使用vtk进行显示. 本案例环境:Opencascade6.6.0 +  vtk-5.10 + VS2005(win32) 使用CMake管理工程. C ...

  3. python 解决抓取网页中的中文显示乱码问题

    关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换.还包括一些如日文.韩文 .俄文.藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明. 网络爬虫出现乱码的原因 源网页编码和爬取下来 ...

  4. List --搜索列表

    1,常见的内建函数 . if val in L :  # 是否在列表 . L.index(val) # 找下标 . L.count(val) # 有多少个 . min/max(L ) # 最大最小 . ...

  5. SolrCloud4.7.1分布式部署

    一.环境 软件: apache-tomcat-7.0.53.tar.gz solr-4.7.1.tgz zookeeper-3.4.6.tar.gz   规划: 三个节点IP: 192.168.50. ...

  6. hibernate4多对多Use of @OneToMany or @ManyToMany targeting an unmapped class:

    出错之后先查了一下,大家有 @Entity 导错包的,不过我这里没错 import javax.persistence.Entity; 就是这个 还有的是没有注解@Table的,我这里也是没问题的 我 ...

  7. combobox 的onLoadSuccess执行两次解决办法和 取值赋值

    加红色字部分 jsp <input class="easyui-combobox" id="keshi" name="keshi" v ...

  8. Django项目: 5.新闻主页

    一.功能需求分析 1.功能 轮播图 推荐文章列表 文章标签导航 文章列表 分页 二.模型设计 根据功能分析,我们需要如下表 1.表和字段分析 文章分类表 文章表 文章评论表 推荐文章表 轮播图表 2. ...

  9. Luogu P1462 通往奥格瑞玛的道路(最短路+二分)

    P1462 通往奥格瑞玛的道路 题面 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己 ...

  10. Django项目:CRM(客户关系管理系统)--19--11PerfectCRM实现King_admin分页显示条数

    登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html list_per_page = 2 #分页条数 list_per_page = 2 #分页条数 ...