2012-05-09 38 views
8

Có, tôi biết rằng thishasbeenaskedbefore. Nhưng hầu hết các câu hỏi là hai năm trước, và hôm nay phải có một câu trả lời tốt hơn.Ngôn ngữ mẫu tốt hơn cần

Tôi cần ngôn ngữ mẫu để hiển thị HTML. Yêu cầu:

  1. Phải được gọi từ Java.

  2. Không được là Freemarker, Velocity hoặc StringTemplate. Chúng tôi đã sử dụng Freemarker trong một năm và quá chậm. Nó tiêu thụ 50% chu kỳ CPU của chúng tôi dưới tải. Vận tốc tồi tệ hơn Freemarker, và StringTemplate có vấn đề riêng.

  3. Nó phải tiêu thụ JSON hoặc tương đương Java của nó, tức là Bản đồ, Danh sách và nguyên thủy.

Tôi bắt đầu ghen tị với Node.js. Đã có một tấn hoạt động mẫu cho Javascript trong năm qua, nhưng ít cho Java (mà tôi biết).

Ngôn ngữ lý tưởng sẽ trông giống như Liquid, chỉ tồn tại cho Rails.

Jade tồn tại cho Java, nhưng tôi không muốn tất cả định dạng HTML đi kèm với nó.

Cập nhật

tôi cuối cùng đã giải quyết trên Handlebars, cũng là available for Java. Cả hai đều tuyệt vời.

+0

Đã tranh luận trong tuyên bố câu hỏi. Làm thế nào điều này có thể mang tính xây dựng? –

+0

Đã sửa lỗi. Không có ý định tranh luận. – ccleve

+0

Bạn có thể giải thích một chút về lý do tại sao bạn coi Velocity là tồi tệ hơn Freemarker? Tôi chưa bao giờ gặp phải sự tiêu thụ hệ thống như vậy với nó. –

Trả lời

4

Chunk thân thiện với môi trường. JSON có thể được sử dụng như một giá trị thẻ trong mã điều khiển của bạn hoặc trong các bản mẫu cho các cuộc gọi exec/macro.

{% exec %} 
    {% data @json %} 
    { name: "whatever", 
     vitals: ["an","array","of","data"], 
     friends: [{name: "bob"},{name: "crystal"}] 
    } 
    {% enddata %} 

    <div>Name: {$name}</div> 

    {% if ($friends) %} 
    <div>Friends: 

     <ul> 
     {% loop in $friends as $friend %} 
     <li>{$friend.name}</li> 
     {% endloop %} 
     </ul> 

    </div> 
    {% endif %} 

{% endexec %} 

Hoặc, chỉ cần sử dụng mẫu bên trong và chèn json từ phía java.

src/themes/example.chtml

<div>Name: {$name}</div> 

    {% if ($friends) %} 
    <div>Friends: 

    <ul> 
    {% loop in $friends as $friend %} 
    <li>{$friend.name}</li> 
    {% endloop %} 
    </ul> 

    </div> 
    {% endif %} 

MyController.java

Theme theme = new Theme(); 
Chunk html = theme.makeChunk("example"); 

html.set("name", "whatever"); 
html.set("vitals", getJsonArray()); 
html.set("friends", getJsonFriendObjects()); 

html.render(out); 

Chừng nào các getJsonXXX() phương pháp trở về một cái gì đó mà thực hiện Danh sách và Bản đồ, Chunk sẽ dán nó vào trong mẫu chính xác (ngay cả khi các Danh sách và Bản đồ đó tổ chức nhiều Danh sách và Bản đồ).

Output:

<div>Name: whatever</div> 

<div>Friends: 

    <ul> 
    <li>bob</li> 
    <li>crystal</li> 
    </ul> 

</div> 
+0

Chunk là những người tốt nhất! – dns

0

Java+ là một giải pháp tiền xử lý đơn giản.Nó chỉ stringifies đánh dấu:

System.out.println({{ 
<html> 
    <body> 
    ... 
    </body> 
</html>}}) 

Nó có delimiters cấu hình và đi qua mã Java chứ không phải là tiêu thụ nó:

System.out.println({{ 
<xmlExample> 
    <name>{{fpp}}</name> 
    <number>{{bar}}</number> 
</xmlExample> 
}}); 

Tài liệu tham khảo

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