Velocity变量名支持中文探索

Velocity变量名支持中文探索

前言

目前团队在开发自适应模板生成功能,由于模板是根据用户真实分析设置生成,难以避免生成的vm文件中会有中文变量名,故开始研究为什么Velocity不支持中文变量名。

分析

从异常抛出的地方看,可以看到是解析过程中发现变量名不支持导致的。故从org.apache.velocity.app.Velocity#evaluate(org.apache.velocity.context.Context, java.io.Writer, java.lang.String, java.io.Reader) 开始看。

分析解析方法

evaluate方法中的核心部分是
请添加图片描述

跟到parse方法中
请添加图片描述

可以看到有两个主要的部分,一个是初始化,另一个是解析
看解析方法

parser是个接口,velocity提供了标准实现类org.apache.velocity.runtime.parser.StandardParser。这里我们可以观察下StandardParser的描述

This class is responsible for parsing a Velocity template. This class was generated by JavaCC using the JJTree extension to produce an Abstract Syntax Tree (AST) of the template. Please look at the Parser.jjt file which is what controls the generation of this class.

大概意思是这个类是用于解析velocity模板的,这个类是由javaCC生成的。具体的依据得看Parser.jjt。一开始我是没有在意这个的,当时就大概瞄了第一句,而后我就去看这个StandardParser了。

parse方法中核心逻辑是在process()中.我们看下这个方法,可以发现它的命名和我们普通开发中的命名不一致,感觉更像是依赖于计算生成的命名。例如:jjtc000这个命名,除了能感受到它和jjt有关联,其他啥也看不出来。也是从这个命名的生成规律中,我才又回去看了一下类的描述,然后发现了这个描述对我来说更重要的是后面一句,故此发现了Parser.jjt。

分析Parser.jjt

在Parse.jjt中的分析就显得简单粗暴了,试了下命名支持a-z A-Z,于是就搜了下"a"-“z”,果然被我搜到了,可以看到有相关的就3处,但变量名不支持-开头支持_开头,由此得到了这个地方。这是一种很高效的解决问题的方式,关键逻辑分析和关键字搜索,可以很快地定位到问题。
请添加图片描述

原因已经找到了,是因为 名字 的匹配只支持字母数字下划线,那要怎么拓展才能满足我们的需求呢。

重写Parser.jjt

为什么会想到对parser.jjt做一个修改,原先想得是做一个依赖覆盖,自己打个包。后来想到StandardParser这个的命名,为什么会这么命名呢,往往这么做都是因为支持自定义的解析器,于是我又从evaluate方法开始,就到了初始化方法那里,

请添加图片描述

根据命名找到initalizeParserPool(),果然找到了这句
请添加图片描述

这说明在VMTool中只要设置了 PARSER_CLASS,就不会用默认的。

这里我是在代码中了demo去确认该配置确实能生效才去做的修改,我为啥会去写这个demo,因为我始终相信磨刀不误砍柴工,一步一步地下来更容易定位到问题。
请添加图片描述

我把StandartParser复制出来,改名叫TestParser,配置了parser.class,后来发现真的调用了。

接下来是生成自己的parser,在我们之前找到的地方去增加中文匹配符,重新编译,然后将编译后的文件复制到我们的项目里,改下配置就行了。
请添加图片描述

效果展示请添加图片描述

完结撒花✿✿ヽ(°▽°)ノ✿

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值