Какой самый лучший компонент Wicket для рендеринга произвольного HTML? - PullRequest
9 голосов
/ 17 января 2011

Я реализую простую уценку вики с использованием Apache Wicket. Вики обычно отображают любой произвольный HTML-код на основе того, что ввел пользователь.

Я немного озадачен тем, какой компонент Wicket лучше всего подходит для рендеринга такого произвольного HTML.

Я попробовал компонент Label, но он не отображает списки должным образом, как и MultilineLabel (который ставит разрывы вместо обычного списка HTML).

Спасибо за любую помощь.

ОБНОВЛЕНИЕ: Компонент Label работает отлично. Это была моя ошибка, что я не смог заставить его работать раньше. Это была комбинация плохих таблиц стилей и кодирования поздней ночи. Спасибо за полезные ответы. Как и предполагалось, я также собираюсь проверить некоторые редакторы WYSIWYG, которые на самом деле могут работать лучше, чем уценка. Visural Wicket кажется особенно многообещающим.

Ответы [ 2 ]

14 голосов
/ 17 января 2011

Если то, что вы хотите визуализировать, невелико или уже представлено в виде строки, метка будет работать хорошо, просто вызовите label.setEscapeModelStrings(false);, чтобы убедиться, что она печатает строку как есть.

Но если ваш HTML-контент генерируется динамически или читается из InputStream / Reader и вы не хотите хранить его в памяти, вы можете напрямую использовать WebComponent и переопределить метод onComponentTagBody(). Таким образом, вы пишете непосредственно в ответ, вместо того, чтобы заполнять буфер в памяти, преобразовывать его в строку и затем затем записывать в ответ (что происходит, если вы используете метку).

Пример кода, для обоих случаев:

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 голосов
/ 17 января 2011

Это Label, вызовите Component.setEscapeModelStrings(false), хотя для рендеринга необработанного HTML, возвращаемого вашей моделью.

...