velocity源码分析:事件处理

若依代码生成器原理velocity模板引擎(自用) 在ruoyi-generator模块下新增一个区域的实体类。 阅读详情

velocity提供了一些扩展点,如: 指令扩展、事件处理等。本文主要阐述基于事件处理的扩展,并提供一些事例。

本文讨论的velocity版本如下:

URL: http://svn.apache.org/repos/asf/velocity/engine/trunk
Repository Root: http://svn.apache.org/repos/asf
Repository UUID: 13f79535-47bb-0310-9956-ffa450edef68
Revision: 1221660
Node Kind: directory
Schedule: normal
Last Changed Author: nbubna
Last Changed Rev: 1221053
Last Changed Date: 2011-12-20 08:55:01 +0800 (Tue, 20 Dec 2011)

类图:



velocity中提供了一些事件处理扩展:

IncludeEventHandler
InvalidReferenceEventHandler
MethodExceptionEventHandler
ReferenceInsertionEventHandler
本文先简单介绍各个扩展点,最后重点介绍ReferenceInsertionEventHandler


1.IncludeEventHandler(#include()和#parse()对应事件的接口类):

    默认实现主要有两个,IncludeNotFound和IncludeRelativePath

    IncludeNotFound在#include(x)和#parse(x)加载x之前操作,返回具体的x给指令加载

        若x存在,返回x;

        若x不存在则返回配置的eventhandler.include.notfound属性对应的模板文件;

        若eventhandler.include.notfound对应的文件也不存在直接记录log;

具体代码如下:


IncludeRelativePath在#include(x)和#parse(x)加载x之前操作,返回具体的x给指令加载

   增加了相对模板路径的文件加载,避免文章太长,代码不给出了。


2.InvalidReferenceEventHandler(对无效比较的错误提示):

    主要在get,set以及其他方法调用时出现细化错误(ParseErrorException)提示内容,当然这个错误是根据eventhandler.invalidreference.exception的设置是否抛出,默认不抛出。


3.MethodExceptionEventHandler(对会抛出异常的方法调用时作友好性处理):

    目前实现有两个类:ExceptionGeneratingEventHandler、PrintExceptions,主要对异常作些友好性处理。


以上三个点更接近系统内部的一些规则处理,可扩展性不大,如果使用到,默认实现基本足够,因此不做细讲,我们重点讨论最后一种。


4.ReferenceInsertionEventHandler(变量结果写入事件处理);

    这个比较有用是对渲染结果的处理,比如html,javascript,url,java,sql,xml等,这些是比较实用的功能。velocity默认提供了替换html,javascript,java,sql,xml的过滤扩展。

   目前定义了四个实现:

    EscapeReference                             escape抽象类,定义公共的外部属性读入和接口

    EscapeHtmlReference                    过滤html标签,配置属性eventhandler.escape.html.match,实现类StringEscapeUtils.escapeHtml()

    EscapeJavaScriptReference          过滤javascript标签,配置属性eventhandler.escape.javascript.match,实现类StringEscapeUtils.escapeJavaScript()

    EscapeSqlReference                       过滤sql标签,配置属性eventhandler.escape.sql.match,实现替换'为‘’(单引号替换为双引号)

    EscapeXmlReference                      过滤xml,配置属性eventhandler.escape.xml.match,具体实现类StringEscapeUtils.escapeXml

如果自己要扩展,除了配置多个Reference外也可以采用一个Reference多个条件处理,如果和macros集合,效果会更好,

比如:定义一个宏:

#macro(URL $url_escape_z)
    $url_escape_z
#end

我们可以在页面中如下使用

#URL("a&=<>?b")

若在velocity.properties属性中配置对应的过滤器为EscapeURLReference,那么代码在解析时会把#URL()中的变量改成url格式输出。


需要说明的是:

    调用到EscapeURLReference并非是#URL标签,而是$url_escape_z

    即便是$!url_escape_z活${url_escape_z}活$!{url_escape_z}都不会处理

    #URL指令之所以会处理,是因为和对应变量挂钩

   若自己在代码中有$url_escape_z变量,该内容也会被处理,因此需要变量名唯一























ZYNQ裸机LWIP双网口实现 文章目录前言一、LWIP双网口二、使用步骤1.部分说明2.部分代码总结 前言 一、LWIP双网口 由于项目需要多通讯口,查阅资料发现lwip支持多网口操作。于是,就开搞了。 二、使用步骤 1.部分说明 利用xemac_add函数在网卡链表中添加一个网卡,即使用netif块重复xemac_add操作。 先用轮询的方式实现双网口,后期修改为中断模式 2.部分代码 导入官方例程LWip echo server, 修改main函数,增加一个netif块 #if LWIP_IPV6==0 #if L.. 阅读详情

相关推荐

【生成数据集EXCEL文件】使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL

生成器的任务是接收随机噪声向量作为输入,并尽可能生成与真实数据相似的样本,而判别器则是一个二分类器,旨在区分输入的样本是来自生成器生成的,还是来自真实数据。在训练过程中,生成器和判别器通过对抗学习的方式相互博弈,生成器的目标是生成足以欺骗判别器的样本,而判别器的目标则是尽可能准确地判断样本的真实性。GAN网络在多个领域展现了强大的能力,能够生成与训练数据分布相似的新数据,包括但不限于图像生成、图像风格转换、超分辨率、数据增强、视频生成、自然语言处理、医学图像处理以及游戏与虚拟现实等。

hustef的博客 1521

关于velocity的ReferenceInsertionEventHandler

在做一个项目的时候发现一个问题就是要求输出的数值保留2位小数点。开始使用orcale的round(xxx.2)来处理取出的数据。但是在完成后发现取出的数据经过二次运算后数值就和真实的不一样了,但是木已成舟。在老大的指点下,使用了ReferenceInsertionEventHandler接口。 ReferenceInsertionEventHandler可以在输出到vm文件前修改参数的内容。 ...

丐帮弟子 558

双击文件夹弹窗“找不到应用程序”,但是右键点击打开可以

此电脑、回收站、c、d、f盘、控制面板、任意文件夹等都没有办法双击打开。 右键中包含“使用filemanager打开”,是由于FileManager卸载残留导致的。 懒人专用附件 下载解压上面附件,双击导入可以清理FileManager软件残留 参考: 双击此电脑出现找不到应用程序,但是右键点击可以-其他-优快云问答https://ask.csdn.net/questions/7631439 电脑上的文件夹双击都提示找不到应用程序,但是右击打开就能打开,该怎么解决? - 知乎 (z

webmasterqpwou的博客 1万+

模板引擎与 XSS 防御

在当前流行的 MVC 框架中,View 层常用的技术是使用模板引擎对页面进行渲染,比如在“跨站脚本攻击”一章中所提到的 Django,就使用了 Django Templates 作为模板引擎。但是正如前文所述,最好的 XSS 防御方案,在不同的场景需要使用不同的编码函数,如 果统一使用这 5 个字符的 HtmlEncode,则很可能会被攻击者绕过。同时在模板系统中,搜索不安全的 变量也有了依据,甚至在代码检测工具中,可以自动判断出需要使用哪一种安全的编码方法, 这在安全开发流程中是非常重要的。

A526847的博客 763

保姆级教程:在SIwave 2024 R2中搞定TDR仿真,手把手教你分析USB 3.0差分线阻抗

本文提供了一份详细的SIwave 2024 R2 TDR仿真教程,重点讲解如何分析USB 3.0差分线阻抗。从项目准备、参数配置到结果分析,逐步指导工程师完成完整的仿真流程,并分享实战经验和高级技巧,帮助提升信号完整性分析能力。

weixin_33670786的博客 494

现代控制理论(4)——李雅普诺夫稳定性理论

文章目录

wang7301的博客 5万+

Velocity事件

    在模板渲染的过程中,为了支持用户监听其中的事件并且做出相应的处理,Velocity提供了事件模型。Velocity一共提供了三种事件模型:NullSetEventHandler、MethodExceptionEventHandler、ReferenceInsertionEventHandle   1. NullSetEventHandler      接口路径:org.apache....

faith_all的专栏 279

VLA-JEPA:具身智能中潜空间世界模型的工程落地实践

世界模型是具身智能实现环境理解与因果推演的核心基础,其本质是在状态空间中建模‘动作→结果’的动力学规律。传统基于像素或文本的世界模型因高维、非平稳、弱语义等缺陷,在真实机器人场景中鲁棒性差、部署成本高。JEPA(联合嵌入预测架构)通过构建物理约束的潜空间,将视觉-语言-动作(VLA)信号统一编码为低维、可微、可解释的状态表征,显著提升模型对抖动、遮挡、光照突变等干扰的适应能力,并支持实时闭环控制。该范式已在UR5e、Franka等多构型机械臂及Jetson边缘平台完成实测验证,成为VLA系统从实验室走向产线

weixin_34357928的博客 336

基于Velocity的Web开发指南

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34349320的博客 240

大疆RoboMaster嵌入式面试,电机FOC调不出来当场走人

摘要:大疆RoboMaster嵌入式工程师面试以实战能力著称,重点考察FreeRTOS任务调度、FOC电机控制和CAN总线三大核心技能。FreeRTOS部分涉及优先级调度、栈溢出排查及信号量与互斥锁的区别;FOC控制要求现场编写电流环代码,并解释Clarke/Park变换原理;CAN总线则关注仲裁机制、CANopen协议应用及错误帧排查方法。面试强调工程实践,需具备STM32开发经验,建议搭建实际环境进行练习。该岗位被誉为"硬件版修罗场",充分体现大疆对实际开发能力的严格要求。

郑伟强dev的专栏 150

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+

Velocity模板引擎下 velocity.properties转义(转码)配置

velocity配置文件中的编码配置类: //对html文件编码的配置org.apache.velocity.app.event.implement.EscapeHtmlReference//对javascript文件编码的配置org.apache.velocity.app.event.implement.EscapeJavascriptReference//对sql文件编码的配置org.apa...

cuker919的专栏 471

具身智能:原理、算法与系统 第3章 具身智能的感知-认知-行为框架

具身智能的PCB框架源于对生物智能系统的观察:动物通过感官接收环境信息(感知),基于内部模型进行预测和决策(认知),并通过身体执行动作改变环境(行为),而这一改变又通过感知反馈形成闭环。这一框架在两篇核心文献中得到了深入阐述:提出了系统的数学形式化和工程实现,则从认知科学角度强调了归纳偏置和双过程理论的重要性。

VectorShift的博客 155

velocity源码分析:velocity初始化

velocity初始化类结构图: 描述: 1.RuntimeConstants定义常量,主要是velociyt初始化的配置项的key 2.四个方法实现该接口主要是共用公共定义的常量,发现很多开源框架喜欢继承公共常量定义的接口来公用变量。 3.Runti

madding 8189

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Velocity源码分析

velocity模板渲染的步骤:1) 首先初始化启动Velocity引擎,可以通过Velocity.init()或者新建VelocityEngine类,并调用其中的init()方法;2) 创建一个VelocityContext对象,将变量名与值关联起来,与HashMap对象相类似。可以直接将值传递给页面进行引用;3) 获取一个模板,利用Velocity.getTemplate()获取一个渲染模板,

公众号:微观技术 3735

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

velocity源码分析:初始化之ResourceManager

之前在“velocity源码分析:velocity初始化”文章中粗略地介绍了velocity整体的初始化过程,包括各个系统的初始化,本文主要介绍Resource相关初始化,本文内容涉及到的概念比较多,也是velocity中比较重要的一部分初始化内容,期间设计到代码使用的templ

madding 4705

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

velocity源码分析:初始化之日志系统

之前在“velocity源码分析:velocity初始化”文章中粗略地介绍了velocity整体的初始化过程,包括各个系统的初始化,本文主要介绍日志系统初始化。 日志系统类图: 概要: 1.调用:velocity源码中这种封装方式我个人是比较赞同

madding 3789

velocity源码分析:初始化之指令初始化

之前在“velocity源码分析:velocity初始化”文章中粗略地介绍了velocity整体的初始化过程,包括各个系统的初始化,本文主要介绍指令相关初始化代码,由于指令是使用velocity语言必须掌握的内容,同时也是内部在建立node树时特别区分的节点,是velocity代

madding 1097

velocity源码分析:初始化之配置文件

之前在“velocity源码分析:velocity初始化”文章中粗略地介绍了velocity整体的初始化过程,包括各个系统的初始化,本文主要介绍配置文件初始化。 RuntimeInstance.java 代码: private void initializePrope

madding 2394

使用不同模板引擎beetl、FreeMarker、Velocity动态解析sql的方法

1、 String sql = null;if(null == renderType || renderType.equals(ConstantRender.sql_renderType_beetl)){ if(log.isDebugEnabled()) log.debug("beetl解析sql"); sql = BeetlKit.render(sqlTemplete, param);...

weixin_34347651的博客 2406

Velocity源码分析(一)——概述

原文链接 :http://coderj.org/blog/2011/08/19/velocity_overview/ 一、概述 Velocity模板引擎处理机制分为五个基本步骤: 引擎初始化,通过设置的引擎属性初始化引擎,包括国际化支持,ResourceLoader设置,字符编码等。 获取并解析模板文件,首先通过资源加载器(ResourceLoader)将模板文件加载到内存(转化...

wzhw2008的专栏 276
上一篇: hadoop常见错误
下一篇: velocity源码分析:上下文承载类
「已注销」
博客等级 码龄20年 47粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值