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可以自动化对每个作用域的引用。
例子:
原句:请把这本书给我。
中文翻译:请把书递给我。
-
- toolbox.xml中是否定义了?
-
- 是每个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()}