10

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 アプリケーションです)。ビューレイヤーの数値または定数。

4

3 に答える 3

8

各オブジェクトを Velocity コンテキストに追加できる回避策を見つけましたUser.Status。これにより、テンプレート内の定数やマジック ナンバーへのあらゆる種類の参照が回避されます。

コントローラー/Java 側:

// put the statuses directly into the model
Map statusMap = new HashMap();
statusMap.put("user", User.Status.USER);
statusMap.put("groupOperator", User.Status.ADMIN);
...
modelAndView.addObject("statusmap", statusMap);

テンプレートでは、これらの値を次のように参照できます。

#if($user.status == $statusmap.user)
   You are a regular user
#elseif($user.status == $statusmap.admin)
    You are an administrator
##etc...
#end
于 2009-01-20T17:37:33.570 に答える
6

ええ、Velocity はクラスとパッケージをネイティブには認識しません。自分が行ったことを行うか、FieldMethodizer クラスを使用してそれを自動化することができます。もう 1 つのオプションは、VelocityTools 2.0 の FieldTool です。

于 2009-02-02T22:39:06.763 に答える
3

VelocityのFieldMethodizerを使用してみてください。これは最善の解決策ではありませんが、何かを行うことができます。

このクラスを使用すると、静的パブリック定数を呼び出すことができます。リンクを参照してください。

FieldMethodizer API

于 2010-05-19T11:04:36.243 に答える