2009-01-20 40 views
10

Tôi không chắc liệu có cách nào để thực hiện điều này trong Vận tốc hay không:Làm thế nào để truy cập các thành viên tĩnh trong một mẫu Velocity?

Tôi có POJO người dùng là thuộc tính có tên Trạng thái, trông giống như một enum (nhưng không phải vì tôi bị kẹt trên Java 1.4), định nghĩa trông giống như sau:

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

Và Status là một lớp bên trong tĩnh:

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 
} 

với mô hình này, một tình trạng người sử dụng có thể dễ dàng được kiểm tra trong một ví dụ có điều kiện như

if(User.Status.ADMIN.equals(user.getStatus())) ... 

... mà không cần phải tham khảo bất kỳ hằng cho ID trạng thái, bất kỳ con số ma thuật vv

Tuy nhiên, tôi không thể tìm ra cách để thử nghiệm những điều kiện trong mẫu Velocity của tôi với VTL. Tôi muốn chỉ in một chuỗi đơn giản dựa trên tình trạng của người dùng, chẳng hạn như:

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 

Nhưng điều này ném một ngoại lệ đó trông giống như org.apache.velocity.exception.ParseErrorException: Encountered "User" at webpages/include/dashboard.inc[line 10, column 21] Was expecting one of: "[" ...

Từ the VTL User Guide, không có đề cập đến việc tiếp cận một Java lớp/thành viên tĩnh trực tiếp trong VTL, có vẻ như bên tay phải (RHS) của một điều kiện chỉ có thể là một tham chiếu chữ số, chuỗi ký tự, tham chiếu thuộc tính hoặc tham chiếu phương thức.

Vậy có cách nào để tôi có thể truy cập các thuộc tính/tham chiếu Java tĩnh trong mẫu Velocity không? Tôi biết rằng như một giải pháp, tôi có thể nhúng ID trạng thái hoặc một số định danh khác làm tham chiếu trong bộ điều khiển của tôi (đây là ứng dụng web MVC sử dụng Velocity làm công nghệ Xem), nhưng tôi không muốn nhúng bất kỳ ma thuật nào số hoặc hằng số trong lớp chế độ xem.

Trả lời

8

Tôi đã tìm ra giải pháp cho phép tôi thêm từng đối tượng User.Status vào ngữ cảnh Velocity, tránh mọi loại tham chiếu đến hằng số hoặc số ma thuật trong mẫu.

Về phía điều khiển/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); 

Và sau đó trong mẫu những giá trị này có thể được tham chiếu như vậy:

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

Yeah, Velocity không natively grok lớp và các gói. Bạn có thể làm những gì bạn đã làm, hoặc sử dụng lớp FieldMethodizer để tự động hóa điều đó. Một tùy chọn khác sẽ là FieldTool trong VelocityTools 2.0.

3

Hãy thử sử dụng FieldMethodizer of Velocity, nó không phải là giải pháp tốt nhất nhưng bạn có thể làm điều gì đó.

Với lớp này bạn có thể gọi đến hằng public static, vui lòng xem liên kết:

FieldMethodizer API

Các vấn đề liên quan