《Velocity用户手册》-第八章

本文深入探讨 Velocity Template Language (VTL) 中的引用概念,包括变量、属性和方法的使用,以及属性查找规则、转换渲染、索引符号和正式引用符号的应用。详细解释了 VTL 如何通过简洁和正式表达符处理引用,并提供了实用示例。
第8章 引用References

VTL中有三种类型的引用:变量,属性和方法。作为VTL的使用者,你必须做到一些特定名称的命名一致性,以便在模板中正常使用。

8.1 变量Variables

变量的简略标记是由一个前导"$"字符后面跟一个 VTL 标识符(Identifier)组成。一个VTL 标识符必须以一个字母开始(a .. z或 A .. Z)。其他的字符只能由下列字符构成:

  • 字母 (a .. z, A .. Z)
  • 数字 (0 .. 9)
  • 连字符 ("-")
  • 下划线 ("_")

下面是正确的变量引用的VTL例子:

$foo
$mudSlinger
$mud-slinger
$mud_slinger
$mudSlinger1

当VTL 引用一个变量时,比如 $foo,变量可以从模板的set 指令取得值,也可以从Java代码中取得。例如,如果Java变量 $foo 在模板被请求的时候赋值“bar”,则“bar”将替换页面中的所有 $foo 的实例。如果包含以下的语句:

#set( $foo = "bar" )

所有 $foo 的实例的都将会输出定义的值。

8.2 属性Properties

VTL引用的第二种元素是属性,而属性具有独特的格式。属性的简略标记是前导符$后跟一个VTL标识符,加一个点号(".")后再跟一个VTL 标识符。以下为例子:

$customer.Address
$purchase.Total

首先看第一个例子,$customer.Address它有两种意思。它可以表示查询有customer 标识的哈希表然后返回关键字为Address的值。但是$customer.Address也可能是调用一个方法(如何调用方法的参考例子将会在下个章节讨论)$customer.Address 可能是$customer.getAddress()的缩写。当页面请求时,Velocity将判断是上述哪种情况,然后返回相应的值。

8.3 方法Methods

方法在JAVA代码中所定义,并实现一些功能,比如运行一个计算器或者进行判断。方法实际上也是一种引用,由前导符"$"后跟一个VTL 标识符,然后再跟一个VTL 方法体(Method Body)。VTL 方法体由一个VTL 标识符后跟用双括号包括的可选参数列表。下面是示例:

$customer.getAddress()
$purchase.getTotal()
$page.setTitle( "My Home Page" )
$person.setAttributes( ["Strange", "Weird", "Excited"] )

前面两个例子——$customer.getAddress()$purchase.getTotal()看起来有点像上个章节的属性,$customer.Address$purchase.Total.。你可能会发现这两个例子在某些方面是有关联的。

VTL属性可以认为是VTL方法的缩写,当用 $customer.Address属性表示$customer.getAddress()方法时,它们的效果是一样的。属性和方法的主要区别在于是否可以添加参数列表,只有方法才可以添加参数列表。

缩写可以在以下方法中使用:

$sun.getPlanets()
$annelid.getDirt()
$album.getPhoto()

我们可能想要从太阳系中取出所有行星的名字,喂蚯蚓,或者从相册中获取照片。下面的方法中,只有最长的那个方法是可以运行的:

 $sun.getPlanet( ["Earth", "Mars", "Neptune"] )
## 不能将参数列表传递给 $sun.Planets
 $sisyphus.pushRock()
## Velocity 会认为$sisyphus.getRock()
 $book.setTitle( "Homage to Catalonia" )
## 不能传递一个参数列表

在Velocity1.6中,所有的数列引用都可以很神奇的用固定长度的列表来表示。这样的话,你可以使用调用java.util.List方法来表示数列。假设你对一个数列进行引用(假设数列String[ ]中有3个值),你可以这样做:

$myarray.isEmpty()

$myarray.size()

$myarray.get(2)

$myarray.set(1, 'test')

在Velocity 1.6中,开始有了支持vararg的方法。比如下面的方法: public void setPlanets(String... planets)或者public void setPlanets(String[] planets)(JDK1.5版本之前),现在你就可以在模版中无限的传入参数了。

$sun.setPlanets('Earth', 'Mars', 'Neptune')

$sun.setPlanets('Mercury')

$sun.setPlanets()
## 将会将列表置空,返回一个长度为0的数组

8.4 属性查找规则Property Lookup Rules

之前也已经提过,属性也可以表示对象的方法。Velocity基于不同的命名规则采用合适的策略,可以依据请求的属性项,来找出所匹配的方法。当前查找是依据属性值的首字母的大小写进行排序的。比如属性值的首字母是小写的: $customer.address,排列如下

  1. getaddress()
  2. getAddress()
  3. get("address")
  4. isAddress()

比如属性值的首字母是大写的,比如:$customer.Address会有略微的不同:

1.         getAddress()

2.         getaddress()

3.         get("Address")

4.         isAddress()


8.5 转换Rendering

有关引用的所有参数(无论是变量,属性,方法)都转换成字符串,假如一个$foo对象(整型),Velocity将会调用.toString()方法将此对象转换成字符串。

8.6 索引符号Index Notation

像$foo[0]这样的标识,可以从对象中取得需要索引的值。这样的方式其实和调用get(Object)方法是一样的,等同于$foo.get(0),这样本质上提供了一种简便的方法。以下是用这种简便方法的例子。

$foo[0]       ## $foo 用数字索引查找
$foo[$i]      ## 通过其它引用索引
$foo["bar"]   ## $foo 可能为一个Map,通过一个字符串在Map表里查找

自从Velocity 包装过的数组可以通过get(Integer)方法从对象中获取特定的元素后,使得这类语法可以在Java数组中使用。

       这类语法随处可见,.get 也是可用的,以下为示例:

$foo.bar[1].junk
$foo.callMethod()[1]
$foo["apple"][4]
引用同样可以通过索引符号来赋值:以下为示例:
#set($foo[0] = 1)
#set($foo.bar[1] = 3)
#set($map["apple"] = "orange")

指定的元素会被赋值。Velocity首先会找到元素调用‘set’方法,然后再进行赋值。

8.7 正式引用符号Formal Reference Notation

以上是引用中的简洁表达符的介绍,下面来介绍引用中正式表达符。示例如下:

${mudSlinger}
${customer.Address}
${purchase.getTotal()}

多数情况下,简洁表达符足以满足使用了,但是在特定情况下,还是需要使用正式表达符。

       假设你要造一个句子,句子中一定要包括$vice这个基础词,要实现的目标是用户可以使用这个基础词,生成"Jack is a pyromaniac." 或者"Jack is a kleptomaniac."的其中一句,若使用简洁表达符将会比较难以实现,看看下面的例子:

Jack is a $vicemaniac.

这样就出现问题了,Velocity将会去找的是$vicemaniac,而不是我们设定的基础词 $vice,这样就会找不到相应的值,直接就返回$vicemaniac了。使正式引用符就可以解决这样的问题。

Jack is a ${vice}maniac.

这样Velocity就知道你要找的是 $vice,而不是$vicemaniac,正式表达符一般用于在模版中存在相互连接的文本字段。

8.8 隐藏引用符号Quiet Reference Notation

当Velocity遇到一个不能识别的引用时,一般就会直接输出这个引用的写法。假设,下面的例子是一个VTL模版中的一个段落。

<input type="text" name="email" value="$email"/>

当模版被加载,如果变量$email 值为空,你希望输出的是空白内容而不是"$email"这样一串字符。这时,可以使用隐藏使用符号,只要将$email 改成$!email就可以了。例子如下:

<input type="text" name="email" value="$!email"/>

这样的话,当模版被加载后,如果 $email 是空值的话,输出的话将是空白内容。

正式引用符号和隐藏引用符号可以一起使用,如下:

<input type="text" name="email" value="$!{email}"/>





根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
本系统采用微信小程序作为前端交互界面,结合Spring Boot与Vue.js框架实现后端服务及管理后台的构建,形成一套完整的电子商务解决方案。该系统架构支持单一商户独立运营,亦兼容多商户入驻的平台模式,具备高度的灵活性与扩展性。 在技术实现上,后端以Java语言为核心,依托Spring Boot框架提供稳定的业务逻辑处理与数据接口服务;管理后台采用Vue.js进行开发,实现了直观高效的操作界面;前端微信小程序则为用户提供了便捷的移动端购物体验。整套系统各模块间紧密协作,功能链路完整闭环,已通过严格测试与优化,符合商业应用的标准要求。 系统设计注重业务场景的全面覆盖,不仅包含商品展示、交易流程、订单处理等核心电商功能,还集成了会员管理、营销工具、数据统计等辅助模块,能够满足不同规模商户的日常运营需求。其多店铺支持机制允许平台方对入驻商户进行统一管理,同时保障各店铺在品牌展示、商品销售及客户服务方面的独立运作空间。 该解决方案强调代码结构的规范性与可维护性,遵循企业级开发标准,确保了系统的长期稳定运行与后续功能迭代的可行性。整体而言,这是一套技术选型成熟、架构清晰、功能完备且可直接投入商用的电商平台系统。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值