自定义类继承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. PKU OJ A Bug's life

    http://bailian.openjudge.cn/tm2018/G/ #include <iostream> #include <vector> #include < ...

  2. 在AlexNet中LRN 局部响应归一化的理

    在AlexNet中LRN 局部响应归一化的理 一.LRN技术介绍: Local Response Normalization(LRN)技术主要是深度学习训练时的一种提高准确度的技术方法.其中caffe ...

  3. pptp,l2tp获取登录用户信息用pppd参数即可

    这个问题困扰了我很久,终于在pppd的man文档里,发现了踪迹.在man中的SCRIPTS下有一系列的参数,其中PEERNAME就是登陆的用户名,并且在/etc/ppp/ip-up和/etc/ppp/ ...

  4. 关于自定义 UITableViewCell

    自定义UITableViewCell的方法有很多 发现一些人都会遇到自己定义的cell里面图片错乱的问题 这个问题往往是因为没有实现prepareForReuse这个方法导致的. UITableVie ...

  5. PHP获取网站中各文章的第一张图片的代码示例

    调取文章中的第一张图作为列表页缩略图是很流行的做法,WordPress中一般主题默认也是如此,那我们接下来就一起来看看PHP获取网站中各文章的第一张图片的代码示例 ? 1 2 3 4 5 6 7 8 ...

  6. PAT甲级——A1015 Reversible Primes

    A reversible prime in any number system is a prime whose "reverse" in that number system i ...

  7. Python Flask高级编程之从0到1开发《鱼书》精品项目

    Python Flask高级编程之从0到1开发<鱼书>精品项目     整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感 ...

  8. Eureka配置问题

    在使用Spring Cloud做微服务开发中,经常会使用Eureka Server作为注册中心,如果配置不当可能会导致一些不可预期的异常信息.以下是我最近遇到的因为忽略了配置eureka.client ...

  9. pytorch 多GPU训练过程中出现ap=0情况

    原因可能是pytorch 自带的BN bug:安装nvidia apex 可以解决: $ git clone https://github.com/NVIDIA/apex $ cd apex $ pi ...

  10. REM布局计算,移动端,pc端有兼容性)

    rem布局计算(移动端,pc端有兼容性) <!DOCTYPE html> <html> <head lang="en"> <script& ...