Java中Velocity快速对变量中的引号特殊字符进行转义

 更新时间:2023年07月24日 11:16:02   作者:Sword_Shi  
Velocity是一个基于Java的模板引擎,与Freemarker类似,这篇文章主要介绍了Java中Velocity如何对变量中的引号特殊字符进行转义,主要记录一下在使用中碰到的要对引号特殊字符进行转义的问题,需要的朋友可以参考下

简介

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 : ["etsl"hesaid."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 -->
		<dependency>
			<groupId>org.apache.velocity.tools</groupId>
			<artifactId>velocity-tools-generic</artifactId>
			<version>3.1</version>
		</dependency>

将template修改为: 

        // 创建VelocityContext对象
        VelocityContext context = new VelocityContext();
        // 向VelocityContext中添加变量
        context.put("content", content);
        context.put("scene_id", 59);
        // 添加自定义工具类
        context.put("esc", new EscapeTool());

并且在创建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());
        // 合并模板和VelocityContext
        StringWriter 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);
    }

到此这篇关于Java中Velocity如何对变量中的引号特殊字符进行转义的文章就介绍到这了,更多相关Velocity特殊字符转义内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java向上转型与向下转型超详细图解

    Java向上转型与向下转型超详细图解

    我们在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型,这篇文章主要介绍了Java向上转型与向下转型的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • Java设计模式之Prototype原型模式

    Java设计模式之Prototype原型模式

    这篇文章主要为大家详细介绍了Java设计模式之Prototype原型模式的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 详解Java线程堆栈

    详解Java线程堆栈

    本篇文章主要给大家讲了Java线程堆栈的详细原理以及用法,需要的朋友跟着学习下吧。
    2017-12-12
  • shiro整合swagger的注意事项

    shiro整合swagger的注意事项

    这篇文章主要介绍了shiro整合swagger需要注意的地方,帮助大家更好的理解和学习使用shiro框架,感兴趣的朋友可以了解下
    2021-05-05
  • Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)

    Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)

    这篇文章主要介绍了Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • SpringBoot整合mybatisPlus实现批量插入并获取ID详解

    SpringBoot整合mybatisPlus实现批量插入并获取ID详解

    这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • 一起来学习Java IO的转化流

    一起来学习Java IO的转化流

    这篇文章主要为大家详细介绍了Java IO的转化流,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java小项目之迷宫游戏的实现方法

    Java小项目之迷宫游戏的实现方法

    这篇文章主要给大家介绍了关于Java小项目之迷宫的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 一文详解Java线程的6种状态与生命周期

    一文详解Java线程的6种状态与生命周期

    一个线程在给定的时间点只能处于一种状态。线程可以有6种状态:New、Runnable、Blocked、Waiting、Timed waiting和Terminated。本文将详细讲解这6种状态,需要的可以参考一下
    2022-05-05
  • Java实现登录与注册页面

    Java实现登录与注册页面

    这篇文章主要为大家详细介绍了Java实现登录与注册页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论