Velocity でこれを行う方法があるかどうかはわかりません:
列挙型のように見える Status という名前のプロパティを持つ User POJO があります (ただし、Java 1.4 で立ち往生しているため、そうではありません)。定義は次のようになります。
public class User {
// default status to User
private Status status = Status.USER;
public void setStatus(Status status) {
this.status = status;
}
public Status getStatus() {
return status;
}
Status は静的内部クラスです。
public static final class Status {
private String statusString;
private Status(String statusString) {
this.statusString = statusString;
}
public final static Status USER = new Status("user");
public final static Status ADMIN = new Status("admin");
public final static Status STATUS_X = new Status("blah");
//.equals() and .hashCode() implemented as well
}
このパターンを使用すると、次のような条件でユーザーのステータスを簡単にテストできます。
if(User.Status.ADMIN.equals(user.getStatus())) ...
...ステータスID、マジックナンバーなどの定数を参照する必要はありません。
ただし、VTL を使用して Velocity テンプレートでこれらの条件をテストする方法がわかりません。次のように、ユーザーのステータスに基づいて単純な文字列を出力したいと思います。
Welcome <b>${user.name}</b>!
<br/>
<br/>
#if($user.status == com.company.blah.User.Status.USER)
You are a regular user
#elseif($user.status == com.company.blah.User.Status.ADMIN)
You are an administrator
#etc...
#end
しかし、これは次のような例外をスローします org.apache.velocity.exception.ParseErrorException: Encountered "User" at webpages/include/dashboard.inc[line 10, column 21] Was expecting one of: "[" ...
VTL ユーザー ガイドから、VTLで Java クラス/静的メンバーに直接アクセスすることについて言及されていません。条件の右辺 (RHS) は、数値リテラル、文字列リテラル、プロパティ参照、またはメソッドのみにできるようです。参照。
Velocity テンプレートで静的 Java プロパティ/参照にアクセスする方法はありますか? 回避策として、ステータス ID またはその他の識別子を参照としてコントローラーに埋め込むことができることは承知しています (これは、View テクノロジとして Velocity を使用する Web MVC アプリケーションです)。ビューレイヤーの数値または定数。