Apache Velocity 基础知识总结Apache Velocity基础知识的概要

我在公司内做了一个简单的备忘录,所以直接转载。

基本信息

不同版本可能存在操作差异,但以下链接是非常有参考价值的:
http://www.jajakarta.org/velocity/velocity-1.4/docs-ja/user-guide.html

以下是从上述链接中提取出来的特色内容。

Getter的省略

在Velocity模板中,可以像使用public字段一样使用getter方法。

请关掉电视。

${user.userId}
↓

user → Userクラスのインスタンスの場合、user.getUserId() と同等です。

{}和!

{} : 変数がどこからどこまでかを表します

たとえば $hoge という変数に “あいうえお” という値が入っていたとして、
“あいうえおaiueo” と出力したい場合に、
$hogeaiueo と記載してしまうと、変数 $hoge ではなく $hogeaiueo という変数が参照されます。

これを避けるために ${hoge}aiueo とどこまでが変数かマークします。

! : 変数が空の場合の出力制御

変数が未定義やnullの場合に出力を抑制します。
$hoge が未定義の場合に出力した場合に以下のような差異があります

${hoge} または $hoge … “$hoge” という文字列が出力

$!{hoge} または $!hoge … 何も出力されない

如果在网络上使用的话

我认为您可能也会在使用各种WEB框架时进行结合。
在这种情况下,您将使用名为velocity-tools的工具。
您可以在https://velocity.apache.org/tools/devel/了解更多信息。

使用velocity-struts可以自动化对每个作用域的引用。

例子:

原句:请把这本书给我。
中文翻译:请把书递给我。

    1. toolbox.xml中是否定义了?

 

    1. 是每个servlet类的实例吗?

$request
$session
$application

是否定义了局部变量?
是否在request作用域中存在attribute?
是否在session作用域中存在attribute?
是否在application作用域中存在attribute?

如果你对“为什么它能够执行?”这样思考的话,可能是因为在toolbox.xml中定义了许多内容。

可以在名为 velocity-macro.vm 的文件中定义,并且可以将在视图中频繁出现的相似操作创建为类似函数的形式。

Velocity中有一个解析功能(可以使用其他vm文件的功能),但与宏不同的是,它无法传递参数。

就感觉来说,

    • よりロジック的なもの(if/foreachなどを使う)はマクロ

 

    HTMLの部品化(metaタグとか)はparse

我认为可能性很高。

速度在velocity中没有正确显示!!

我觉得90%的错误基本上都是由于基本的错误。(如果还有其他因素的话,请原谅……)

无论调用多少次form.content.userId,都无法获取值。

确认以下内容:
* 检查表单的值是否已正确填入。
* 检查与表单相关的类中是否存在getContent方法(无参数)。
* 检查与内容相关的类中是否存在getUserId方法(无参数)。

将以下内容以中文进行释义,

HTML转义码

通过使用ReferenceInsertionEventHandler,可以在显示之前干预所有值的显示。

我在这里找到了有用的参考资料:http://blog.physalis.net/2013/05/01/velocity-escape.html

对于上述参考网站的情况,如果希望避免转义,则在变量名称末尾添加特定字符串(NoEscape),以防止转义。

这样也当然没问题,
但是之后就变得有点看不懂了,
所以最好在通过velocity-toolbox调用的函数中准备一个无操作的虚拟函数,
如果被包裹在这个函数中,个人觉得最好避免。

public String noescape(String org) {
  // エスケープ回避用のダミー関数。
  // 詳細はReferenceInsertionEventHandlerの実装クラスを参照
  return org;
}
${utils.noescape(hoge)}

我想调用 enum。

在FieldMethodizer中也不是完全不能使用。
虽然有点强行的方法感觉,所以请自行承担责任。。。

public enum Hoge {
  PIYO,
  FUGA;
}
request.setAttribute("hoge", new FieldMethodizer(Hoge.class.getCanonicalName()));
${hoge.PIYO.name()}
广告
将在 10 秒后关闭
bannerAds