网站开发环境配置,建e全景效果图,苏州网站建设新手,wordpress 即时联系简介
Velocity是一个基于Java的模板引擎#xff0c;与Freemarker类似。相较于Freemarker更轻量#xff0c;但带来的问题就是功能不如Freemarker强大#xff0c;所以实际项目中可能会更倾向于用Freemarker#xff0c;这里不作过多介绍了#xff0c;本文主要记录一下在使用…简介
Velocity是一个基于Java的模板引擎与Freemarker类似。相较于Freemarker更轻量但带来的问题就是功能不如Freemarker强大所以实际项目中可能会更倾向于用Freemarker这里不作过多介绍了本文主要记录一下在使用中碰到的要对引号特殊字符进行转义的问题。
问题背景
项目应用中使用了Velocity但是其中的一个模板在执行时会报错模板如下
[${content},${scene_id}]
当content的值中含有特殊字符时由于本身是List格式在将变量替换后会因为变量中的特殊字符导致转换JSON报错。比如
String content etsl\hesaid.\iathisis;
执行后会报错
Exception in thread main com.alibaba.fastjson.JSONException: syntax error, pos 8, json : [etslhesaid.iathisis,59]at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1436)at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1322)at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:1206)at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:1111)at com.alibaba.fastjson.JSON.parseArray(JSON.java:508)
由于Velocity功能不够强大不能像Freemarker那样用自带的函数对特殊字符进行处理。
解决方法
后来经过查找资料了解到Velocity有拓展工具类org.apache.velocity.tools.generic.EscapeTool查看EscapeTool类的源码可以发现该类中包含了很多工具方法比如针对html,js等语言也有对应的转义方法。当前问题可以使用其中的org.apache.velocity.tools.generic.EscapeTool#java方法来解决。
引入依赖 !-- https://mvnrepository.com/artifact/org.apache.velocity.tools/velocity-tools-generic --dependencygroupIdorg.apache.velocity.tools/groupIdartifactIdvelocity-tools-generic/artifactIdversion3.1/version/dependency
将template修改为
String template [\$esc.java(${content})\,${scene_id}];并且在创建VelocityContext对象时将工具类加载进去 // 创建VelocityContext对象VelocityContext context new VelocityContext();// 向VelocityContext中添加变量context.put(content, content);context.put(scene_id, 59);// 添加自定义工具类context.put(esc, new EscapeTool());
问题得到解决。
完整代码如下 public static void main(String[] args) throws Exception {String template [\$esc.java(${content})\,${scene_id}];String content etsl\hesaid.\iathisis;System.out.println(content);// 初始化Velocity引擎Velocity.init();// 创建VelocityContext对象VelocityContext context new VelocityContext();// 向VelocityContext中添加变量context.put(content, content);context.put(scene_id, 59);// 添加自定义工具类context.put(esc, new EscapeTool());// 合并模板和VelocityContextStringWriter writer new StringWriter();Velocity.evaluate(context, writer, Velocity Example, template);// 输出结果String params writer.toString();System.out.println(params);JSONArray jsonArray JSONObject.parseArray(params);System.out.println(jsonArray);}