自定义类继承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. OpenGL学习笔记2017/8/29

    OpenGL学习日志: 感谢doing5552 的OpenGL入门学习:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 相 ...

  2. HZOI2019 星际旅行 欧拉路

    题目大意:https://www.cnblogs.com/Juve/articles/11207540.html—————————> 题解:网上都是一句话题解:将所有的边拆成两条,问题变成去掉两 ...

  3. EPSG、SRID、WKT的概念

    转自:http://www.cnblogs.com/jackdong/archive/2010/12/20/1911558.html EPSG:European Petroleum Survey Gr ...

  4. Python技巧—list与字符串互相转换

    Python技巧-list与字符串互相转换 在Python的编程中,经常会涉及到字符串与list之间的转换问题,下面就将两者之间的转换做一个梳理. 1.list转换成字符串 命令:list() 例子: ...

  5. Ubuntu连不上网一直提示连接已断开的解决方案

    win10搜索:服务 把VMware DHCP Service启动即可

  6. 开方运算的DSP实现

    //=============================================== //函数名:VSqrt3 //功能:  实现对32位定点数的开方 //性能:  60M主频28015 ...

  7. Python爬虫笔记【一】模拟用户访问之验证码清理(4)

    清理图片,对图片进行二值化,去边框,去干扰线,去点 from PIL import Image from pytesseract import * from fnmatch import fnmatc ...

  8. 关于hive表同步类型问题

    今天华为做实施的时候发现kylin做刷cube的时候发现源表数据类型不适合刷到kylin提供查询接口.问了下同事发现一个比较简单的解决办法. 源表是String类型,做hive视图可以做个hive表提 ...

  9. Docker(一)简介及核心概念

    1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像: 运行中的这 ...

  10. Leetcode98. Validate Binary Search Tree验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...