2012-10-01 41 views
10

Có ai biết nếu có thể lấy mẫu từ các đường dẫn khác nhau với vận tốc không? Sau khi khởi tạo, Velocity từ chối thay đổi "file.resource.loader.path".Vận tốc, các đường dẫn mẫu khác nhau

Đây là mã của tôi:

public Generator(){   
    Properties p = new Properties(); 
     p.setProperty("resource.loader", "file"); 
     p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader"); 
     p.setProperty("file.resource.loader.path", ""); 

    Velocity.init(p); 
} 

Các mẫu có thể được đặt tại các địa điểm khác nhau (người dùng có thể chọn một với một hộp thoại tập tin). Vì vậy, tôi có mã này khi tìm nạp mẫu ra khỏi vận tốc

private Template fetch (String templatePath) { 
    out_println("Initializing Velocity core..."); 
    int end = templatePath.lastIndexOf(File.separator); 

    Properties p = new Properties(); 
     p.setProperty("file.resource.loader.path", templatePath.substring(0, end)); 
    Velocity.init(p); 

    return Velocity.getTemplate(templatePath.substring(end+1)); 
} 

Điều này không hoạt động. Có vẻ như một khi Velocity được khởi tạo, nó không thể được thiết lập lại với các thuộc tính khác nhau. Bất kỳ đề xuất nào về cách giải quyết vấn đề này?

thể dòng chảy Chương trình:

  1. tài chọn nhóm mà cần phải được điền vào mẫu
  2. tài chọn một mẫu để sử dụng (có thể được đặt ở bất cứ đâu trên hdd)
  3. ép tài tạo ra

Trả lời

18

Vận tốc có thể được sử dụng theo hai cách: singleton model or the separate instance model. Bạn hiện đang sử dụng mô hình singleton, trong đó chỉ có một thể hiện của động cơ Velocity trong JVM được cho phép.

Thay vào đó, bạn nên sử dụng mô hình cá thể riêng biệt cho phép bạn tạo nhiều phiên bản Velocity trong cùng một JVM để hỗ trợ các thư mục mẫu khác nhau.

VelocityEngine ve = new VelocityEngine(); 
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, "path/to/templates"); 
ve.init(); 
Template t = ve.getTemplate("foo.vm"); 
+0

Tôi thấy điều này ngay sau .. nó đơn giản như vậy. Cảm ơn bạn! – Arninja

2

Cân nhắc thay vì sử dụng singleton Velocity tạo và khởi tạo lớp mới VelocityEngine trước bước 3.

0

Trong trường hợp của tôi, tôi đang sử dụng Velocity với Servlets trong Dự án web động của Eclipse.
Tôi thực sự không thể đặt lại đường dẫn, nhưng tôi có thể đặt thư mục con trong thư mục/WebContent và sau đó sắp xếp các mẫu của tôi theo cách đó ... và cũng có các thư mục con lồng nhau.

RequestDispatcher requestDispatcher = 
request.getRequestDispatcher("/velocity_templates/index.vm"); 

giải pháp đơn giản này là tất cả những gì cần thiết ... không cần phải gây rối với velocity.properties trong web.xml hoặc thiết lập chúng theo chương trình (trong mỗi trường hợp, không phải phương pháp làm việc cho tôi không may khi tôi đã cố gắng) .

Lưu ý rằng khi tôi làm mẫu có lệnh #parse (..), tôi cần sử dụng cùng tiền tố đường dẫn bên trong tệp .vm mẫu như tôi đã làm trong mã ví dụ cho servlet của mình.

2

Thêm vào các điểm trên:

Thậm chí nếu một người sử dụng mô hình phi singleton tức là sử dụng VelocityEngine đối tượng. Có thể định cấu hình nhiều đường dẫn bằng cách cung cấp các giá trị được phân cách bằng dấu phẩy cho thuộc tính.

[file.resource.loader.class=path1,path2] 

Trong trường hợp này động cơ vận tốc sẽ tìm kiếm những mẫu trong path1 đầu tiên và sau đó trong path2

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