标签:

模板语言绑定变量都是程序主动绑定到beetl,经过努力现在在beetl上实现了模板语言主动发出请求,来执行绑定。

最近做项目用到beetl,因为模板需要用到的变量很多,如果直接绑定,系统消耗很大。

产生了一个想法,当beetl解析不到变量的时候,通过JAVA接口直接获取对象返回给BEETL继续进行解析。

最终实现了Beetl主动发起绑定变量的功能。

修改的代码见最后。

调用时的代码如下:

StringTemplateResourceLoader resourceLoader = new StringTemplateResourceLoader();

Configuration conf =  Configuration.defaultConfiguration();

conf.setEngine("org.koron.ebs.permission.beetl.MyEngine");//这里是改写过的引擎

GroupTemplate gt = new GroupTemplate(resourceLoader, conf);

Template t = gt.getTemplate("${sdf.name}");

t.binding("user",new String[]{"IBM","GOOGLE"});

t.binding("VAR_NOT_DEFINED",new VarListener() {//绑定一个全局变量用来解析变量未定义变量

@Override

public Object parse(String var) {

if(java.util.regex.Pattern.compile("sdf\\.?").matcher(var).find())

{

POJO pj = new POJO();

pj.name="我试试";

pj.id="1111";

return pj;

}

return null;

}

});

t.renderTo(System.out);

package org.koron.ebs.permission.beetl;

import java.util.EventListener;

public interface VarListener extends EventListener{//用来解析变量用

/**

* 解析变量成一个实例,为NULL时,表示不解析

* @param var 变量名

* @return 实例

*/

public Object parse(String var);

}

第一次实现由模板语言主动调JAVA方法,感觉不错:)

修改的代码:

package org.koron.ebs.permission.beetl;

import java.io.Reader;

import java.util.Map;

import java.util.Stack;

import org.beetl.core.*;

import org.beetl.core.engine.FastRuntimeEngine;

import org.beetl.core.engine.FilterProgram;

import org.beetl.core.engine.StatementParser;

import org.beetl.core.exception.BeetlException;

import org.beetl.core.statement.*;

public class MyEngine extends FastRuntimeEngine {

/*

* (non-Javadoc)

*

* @see org.beetl.core.engine.DefaultTemplateEngine#createProgram(org.beetl

* .core.Resource, java.io.Reader, java.util.Map, java.lang.String,

* org.beetl.core.GroupTemplate)

*/

@Override

public Program createProgram(Resource resource, Reader reader, Map textMap, String cr, GroupTemplate gt) {

FilterProgram program = (FilterProgram) super.createProgram(resource, reader, textMap, cr, gt);

modifyStatemetn(resource, program, gt);

modifyStatemetn(resource, program.getCopy(), gt);

return program;

}

private void modifyStatemetn(Resource resource, Program program, GroupTemplate gt) {

Statement[] sts = program.metaData.statements;

StatementParser parser = new StatementParser(sts, gt, resource.getId());

parser.addListener(VarRef.class, new VarRefListener());

parser.parse();

}

class VarRefListener implements Listener {

@Override

public Object onEvent(Event e) {

Stack> stack = (Stack>) e.getEventTaget();

Object o = stack.peek();

if (o instanceof VarRef)

return new MyVarRef((VarRef) o);

return null;

}

}

class MyVarRef extends VarRef implements IVarIndex {

private GrammarToken firstToken;

private VarRef var;

public MyVarRef(VarRef var) {

this(var.attributes, var.hasSafe, var.safe, var.token);

this.var = var;

this.varIndex = var.getVarIndex();

}

private MyVarRef(VarAttribute[] attributes, boolean hasSafe, Expression safe, GrammarToken token) {

this(attributes, hasSafe, safe, token, token);

}

private MyVarRef(VarAttribute[] attributes, boolean hasSafe, Expression safe, GrammarToken token, GrammarToken firstToken) {

super(attributes, hasSafe, safe, token, firstToken);

}

@Override

public Object evaluate(Context ctx) {

Object value = ctx.vars[varIndex];

if (value == Context.NOT_EXIST_OBJECT) {

if (hasSafe) {

return safe == null ? null : safe.evaluate(ctx);

} else {

Object o = ctx.globalVar.get("VAR_NOT_DEFINED");

if (o == null || !(o instanceof VarListener)) {

BeetlException ex = new BeetlException(BeetlException.VAR_NOT_DEFINED);

ex.pushToken(firstToken);

throw ex;

}

o = ((VarListener) o).parse(var.token.text);

if (o != null) {

ctx.vars[varIndex] = o;

value = ctx.vars[varIndex];

} else {

BeetlException ex = new BeetlException(BeetlException.VAR_NOT_DEFINED);

ex.pushToken(firstToken);

throw ex;

}

}

}

if (value == null) {

if (hasSafe) {

return safe == null ? null : safe.evaluate(ctx);

}

}

if (attributes.length == 0) {

return value;

}

for (int i = 0; i < attributes.length; i++) {

VarAttribute attr = attributes[i];

if (value == null) {

if (hasSafe) {

return safe == null ? null : safe.evaluate(ctx);

} else {

BeetlException be = new BeetlException(BeetlException.NULL, "空指针");

if (i == 0) {

be.pushToken(this.firstToken);

} else {

be.pushToken(attributes[i - 1].token);

}

throw be;

}

}

try {

value = attr.evaluate(ctx, value);

} catch (BeetlException ex) {

ex.pushToken(attr.token);

throw ex;

} catch (RuntimeException ex) {

BeetlException be = new BeetlException(BeetlException.ATTRIBUTE_INVALID, "属性访问出错", ex);

be.pushToken(attr.token);

throw be;

}

}

if (value == null && hasSafe) {

return safe == null ? null : safe.evaluate(ctx);

} else {

return value;

}

}

@Override

public void setVarIndex(int index) {

this.varIndex = index;

}

@Override

public int getVarIndex() {

return this.varIndex;

}

@Override

public void infer(InferContext inferCtx) {

Type type = inferCtx.types[this.varIndex];

Type lastType = type;

Type t = null;

for (VarAttribute attr : attributes) {

inferCtx.temp = lastType;

attr.infer(inferCtx);

t = lastType;

lastType = attr.type;

attr.type = t;

}

this.type = lastType;

if (safe != null) {

safe.infer(inferCtx);

if (!safe.type.equals(this.type)) {

this.type = Type.ObjectType;

}

}

}

/**

* @return 获取#{bare_field_comment}

*/

public GrammarToken getFirstToken() {

return firstToken;

}

}

}

标签:

beetl调用java方法_Beetl通过JAVA接口获取JAVA中的变量相关推荐

  1. java 方法 多参数_需要在Java方法中传递多个(20+)参数。这样做有效吗?

    我在Java类中有多个方法,其中每个方法都有20多个参数.我将在另一个类中为这个类创建一个对象并调用每个方法.通常我在Selenium Java中使用POM(页面对象模型). 所以在每个Page对象类 ...

  2. php dump utfp,php pchart乱码-使用REST接口获取GeoServer中的...-结合 thinkPHP 分页写成自己分页类_169IT.COM...

    本页文章导读: ▪php pchart乱码      有俩种情况:①:未将中文字符编码格式修改成utf-8 (例子如下:)mb_convert_encoding($data, "html-e ...

  3. beetl调用java方法_08.自定义方法以及直接访问java类方法---《Beetl视频课程》

    本期视频实现了发布评论时间自定义显示: 内容简介:使用了自定义方法以及直接访问java方法实现了发布时间自定义显示 作者:GK 自定义方法 我们想要实现类似于${ strutil.subString ...

  4. java怎么调用void方法_如何使用反射在java中调用void方法

    如果我使用反射调用方法,我可以让它正常工作而不抛出空指针异常的唯一方法是在我调用的方法中返回一个int值. 例如,我想调用的方法: public int setScore(int n) { this. ...

  5. java 方法当参数_如何在Java中将函数作为参数传递?

    如何在Java中将函数作为参数传递? 这个问题在这里已有答案: Java Pass方法作为参数                                     14个答案 是否可以将方法作为参 ...

  6. java 方法 示例_带有示例的Java EnumSetSupplementOf()方法

    java 方法 示例 EnumSet类complementOf()方法 (EnumSet Class complementOf() method) complementOf() method is a ...

  7. java面试题2 牛客:定义类中成员变量时不可能用到的修饰是

    懵逼树上懵逼果,懵逼树下你和我 第二题 定义类中成员变量时不可能用到的修饰是() A final B void C protected D static 一看到这道题,有点慌了,直接选c,很显然,我又 ...

  8. java jsp取静态常量_获取java静态

    Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...

  9. Java 11:JOIN表,获取Java流

    是否曾经想过如何将联接的数据库表转换为Java Stream? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将从Java 8示例开始,然后研究Java 11 ...

最新文章

  1. 解决multiple definition of的方法
  2. JVM原理和性能调优
  3. 基于OpenCV的摄像头视频录制保存工具【附GIT源码地址】
  4. 并发协作模型“生产者/消费者模式“
  5. 最长递增子序列 子串_最长递增子序列
  6. token会被截取吗_做抖音搬运其他网站视频可以吗?
  7. 前景检测算法(二)--codebook和平均背景法
  8. CodeForces 148D-Bag of mice(概率dp)
  9. 【Java类的封装性】封装的日期类。Person类,使用对象作为成员变量并实现深拷贝。(利用了类的封装性)
  10. 依图科技创始人:如何对AI技术和产业发展更全面的理解?
  11. 归因分析笔记13 特征重要度正确性的验证
  12. RabbitMQ核心功能介绍
  13. jquery手写table行列自动计算(自动计算小计和合计)
  14. 植树节汇报之后的突发奇想
  15. 电脑录像软件推荐?分享3款,简单好用且方便
  16. 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(八)—— 模型训练-训练
  17. QT Q_DISABLE_COPY 宏的用处
  18. 流体力学方程的秘密(1)
  19. 搭建gataway所遇问题及解决
  20. Home Assistant 群里炸开锅了:涂鸦发布新插件啦! 赶紧冲!

热门文章

  1. 如何让设计作品更有张力?
  2. 计算机关机重启后黑屏,电脑重启以后一直黑屏怎么回事_电脑重启后黑屏没反应的解决方法...
  3. 如何对手机网页底部悬浮广告代码做翻转效果,这样做就好了
  4. Java实现 蓝桥杯 历届试题 危险系数
  5. 黄金比例编程python_python中黄金分割法实现方法
  6. 计算机公共基础知识病毒,大学生村官公共基础知识:计算机安全及病毒防治
  7. 配置tomcat 虚拟主机优化
  8. 设计模式之十生成器模式
  9. Auto CAD 2021中文版
  10. jieba分词库下载