2009-01-20 11 views
10

Hızda bunu yapmanın bir yolu olup olmadığından emin değilim:Velocity şablonunda statik üyelere nasıl erişilir?

Durum adlı bir özelliğin, enum gibi görünen bir kullanıcı POJO'm var (ancak bu, sıkışmış olduğumdan değil) Java 1.4) üzerinde, tanım şöyle görünür:

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; 
    } 

Ve Durum statik iç sınıftır: Bu desen ile

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 
} 

, bir kullanıcı durumu kolayca gibi bir koşullu böyle de test edilebilir

Durum kimliği için herhangi sabitleri başvurmak zorunda kalmadan
if(User.Status.ADMIN.equals(user.getStatus())) ... 

..., herhangi sihirli sayılar,

Ancak, ben VTL ile benim Hız şablonunda bu çıkarabilseniz nasıl test çözemiyorum vb. Sadece gibi kullanıcının durumu dayanan basit bir dize yazdırmak istiyorum:

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 

Ama bu the VTL User Guide itibaren org.apache.velocity.exception.ParseErrorException: Encountered "User" at webpages/include/dashboard.inc[line 10, column 21] Was expecting one of: "[" ...

gibi görünen bir İstisna atar, bir Java ulaşma söz edilmez sınıf/statik üye doğrudan VTL'de, bir koşulun sağ tarafının (RHS) yalnızca bir sayı değişkeni, dize değişmezi, özellik referansı veya yöntem referansı olabileceği görülmektedir.

Bir Velocity şablonunda statik Java özelliklerine/referanslarına erişebilmemin herhangi bir yolu var mı? Bir geçici çözüm olarak, denetleyicimde durum kimliği veya başka bir tanımlayıcıyı referans olarak yerleştirebileceğimin farkındayım (bu, View teknolojisi olarak Velocity'i kullanan bir web MVC uygulamasıdır), ancak herhangi bir sihri gömmek istemiyorum. Görünüm katmanındaki sayılar veya sabitler.

cevap

8

Her User.Status nesnesini Velocity bağlamına eklemem için bana bir çözüm buldum, bu da şablondaki sabit veya sihirli sayılara yapılan her türlü başvuruyu engeller. Kontrolör/Java tarafında

:

// 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); 

Ve sonra şablonda bu değerler şöyle başvurulabilir:

#if($user.status == $statusmap.user) 
    You are a regular user 
#elseif($user.status == $statusmap.admin) 
    You are an administrator 
##etc... 
#end 
6

Evet, Hız doğal sınıfları ve paketleri grok etmez. Yaptığınız şeyi yapabilir ya da bunu otomatikleştirmek için FieldMethodizer sınıfını kullanabilirsiniz. Başka bir seçenek VelocityTools 2.0'da FieldTool olacaktır.

3

FieldMethodizer of Velocity kullanmayı deneyin, bu en iyi çözüm değil, ancak bir şeyler yapabilirsiniz.

FieldMethodizer API

: statik kamu dengelerindeki hassas çağırabilir Bu sınıf ile

, bağlantıya bakın lütfen

İlgili konular