2011-01-17 27 views
9

Tôi đang triển khai một wiki đánh dấu đơn giản bằng cách sử dụng Apache Wicket. Wiki thường sẽ hiển thị bất kỳ HTML tùy ý nào dựa trên những gì người dùng đã nhập.Thành phần Wicket nào tốt nhất để hiển thị HTML tùy ý?

Tôi hơi bối rối về thành phần Wicket nào phù hợp nhất để hiển thị HTML tùy ý như vậy.

Tôi đã thử thành phần Nhãn nhưng không hiển thị đúng danh sách, cũng không phải MultilineLabel (được đặt thay vì HTML danh sách thông thường).

Cảm ơn bạn đã được trợ giúp.

CẬP NHẬT: Thành phần nhãn hoạt động hoàn hảo. Đó là sai lầm của tôi mà tôi không thể làm cho nó hoạt động sớm hơn. Đó là sự kết hợp của một số bảng định kiểu xấu và mã hóa đêm khuya. Cảm ơn các câu trả lời hữu ích. Như đã đề xuất, tôi cũng sẽ kiểm tra một số trình soạn thảo WYSIWYG, điều này thực sự có thể hoạt động tốt hơn so với đánh dấu. Wicket Visural có vẻ đặc biệt hứa hẹn.

Trả lời

14

Nếu những gì bạn muốn hiển thị không lớn hoặc đã được biểu diễn dưới dạng Chuỗi, Nhãn sẽ hoạt động tốt, chỉ cần gọi label.setEscapeModelStrings(false); để đảm bảo nó in chuỗi như vậy.

Nhưng nếu nội dung HTML của bạn được tạo động hoặc đọc từ InputStream/Reader và bạn không muốn giữ nó trong bộ nhớ, bạn có thể sử dụng WebComponent trực tiếp và ghi đè phương thức onComponentTagBody(). Bằng cách này, bạn viết trực tiếp vào phản hồi, thay vì điền vào bộ đệm trong bộ nhớ, chuyển đổi nó thành một chuỗi và rồi ghi vào phản hồi (điều này xảy ra nếu bạn sử dụng Nhãn).

Mẫu mã, cho cả hai trường hợp:

HomePage.java

public class HomePage extends WebPage { 

    public HomePage() { 

     add(new Label("label", "<ul><li>test</li><li>test</li><li>test</li><li>test</li><li>test</li></ul>") 
      .setEscapeModelStrings(false)); 

     add(new WebComponent("html") { 
      @Override 
      protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { 
       Response response = getRequestCycle().getResponse(); 
       response.write("<ul>"); 
       for (int i = 0; i < 5; i++) 
        response.write("<li>test</li>"); 
       response.write("</ul>"); 
      } 
     }); 
    } 
} 

HomePage.html

<html xmlns:wicket="http://wicket.apache.org"> 
<body> 
    <h2>Label</h2> 
    <div wicket:id="label"></div> 
    <h2>WebComponent</h2> 
    <div wicket:id="html"></div> 
</body> 
</html> 
4

Đó là Label, gọi Component.setEscapeModelStrings(false) mặc dù hiển thị html thô mà mô hình của bạn trả về.

+0

oh, bạn đã nhanh hơn :) ... @Parag: Bạn đã nhìn cho một trình soạn thảo đã tồn tại? – Karussell

+0

Tôi đã thử sử dụng Nhãn với setEscapeModel (sai). Nó hiển thị hầu hết mọi thứ đúng cách, nhưng không hiển thị danh sách. – Parag

+0

Nghe có vẻ kỳ lạ, bạn có thể bao gồm một số mã mẫu trên đó không? – biziclop

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