лучший способ для вывода HTML в приложениях GWT? - PullRequest
19 голосов
/ 13 апреля 2009

Каков лучший способ экстернализовать большие объемы HTML в приложении GWT? У нас довольно сложное GWT-приложение размером около 30 страниц; каждая страница имеет своего рода руководство внизу, которое состоит из нескольких абзацев HTML-разметки. Я хотел бы вывести HTML-код наружу таким образом, чтобы он оставался как можно более «скрытым».

Я знаю и понимаю, как использовать файлы свойств в GWT; это, конечно, лучше, чем встраивание контента в классы Java, но все же довольно уродливо для HTML (вам нужно все с обратной косой чертой, а также экранировать кавычки и т.

Обычно это то, что вы бы добавили в JSP , но я не вижу никакого эквивалента этому в GWT. Я подумываю просто написать виджет, который будет просто извлекать содержимое из html-файлов на сервере, а затем добавлять текст в виджет HTML. Но, похоже, должен быть более простой способ.

Ответы [ 14 ]

22 голосов
/ 31 октября 2010

Я использовал ClientBundle в аналогичной настройке. Я создал пакет my.resources и поместил туда свой HTML-документ и следующий класс:

package my.resources;

import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.TextResource;

public interface MyHtmlResources extends ClientBundle {
 public static final MyHtmlResources INSTANCE = GWT.create(MyHtmlResources.class);

 @Source("intro.html")
 public TextResource getIntroHtml();

}

Затем я получаю содержимое этого файла, вызывая из моего кода клиента GWT следующее:

HTML htmlPanel = new HTML();
String html = MyHtmlResources.INSTANCE.getIntroHtml().getText();
htmlPanel.setHTML(html);

См. http://code.google.com/webtoolkit/doc/latest/DevGuideClientBundle.html для получения дополнительной информации.

7 голосов
/ 13 апреля 2009

Вы можете использовать какой-нибудь шаблонизатор. Попробуйте FreeMarker или Velocity шаблоны. Вы будете иметь свой HTML в файлах, которые будут получены с помощью библиотек шаблонов. Эти файлы могут быть названы с соответствующими расширениями, например, .html, .css, .js видимы сами по себе.

5 голосов
/ 05 ноября 2010

В GWT 2.0 вы можете сделать это, используя UiBinder .

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'>
  <div>
    Hello, <span ui:field='nameSpan’/>, this is just good ‘ol HTML.
  </div>
</ui:UiBinder>

Эти файлы хранятся отдельно от вашего Java-кода и могут быть отредактированы как HTML. Они также обеспечивают интеграцию с виджетами GWT, так что вы можете легко получить доступ к элементам в HTML из вашего кода GWT.

5 голосов
/ 22 апреля 2009

Я бы сказал, что вы загружаете внешний HTML через Frame .

Frame frame = new Frame();
frame.setUrl(GWT.getModuleBase() + getCurrentPageHelp());
add(frame);

Вы можете организовать соглашение или поиск для getCurrentPageHelp () для возврата соответствующего пути (например: / manual / myPage / help.html )

Вот пример кадра в действии.

3 голосов
/ 06 июля 2009

GWT 2.0, когда выйдет, должен иметь ClientBundle, который, вероятно, решает эту проблему.

1 голос
/ 19 августа 2009

Структура портлетов GWT (http://code.google.com/p/gwtportlets/) включает в себя WebAppContentPortlet. Он обслуживает любой контент из вашего веб-приложения (статический HTML, JSP и т. Д.). Вы можете поместить его на страницу с дополнительными функциями в других портлетах и все загружается с помощью одного асинхронного вызова при загрузке страницы.

Посмотрите на источник для WebAppContentPortlet и WebAppContentDataProvider, чтобы увидеть, как это делается, или попробуйте использовать сам фреймворк. Вот соответствующие биты источника:

WebAppContentPortlet (на стороне клиента)

((HasHTML)getWidget()).setHTML(html == null ? "<i>Web App Content</i>" : html);

WebAppContentDataProvider (на стороне сервера):

HttpServletRequest servletRequest = req.getServletRequest();
String path = f.path.startsWith("/") ? f.path : "/" + f.path;
RequestDispatcher rd = servletRequest.getRequestDispatcher(path);
BufferedResponse res = new BufferedResponse(req.getServletResponse());
try {
   rd.include(servletRequest, res);
   res.getWriter().flush();
   f.html = new String(res.toByteArray(), res.getCharacterEncoding());
} catch (Exception e) {
   log.error("Error including '" + path + "': " + e, e);
   f.html = "Error including '" + path +
        "'<br>(see server log for details)";
}
1 голос
/ 27 апреля 2009

Почему бы не использовать старый добрый IFRAME? Просто создайте iFrame, в который вы хотите поместить подсказку, и измените его местоположение при изменении «страницы» GWT.

Преимущества:

  • Хиты хранятся в отдельных поддерживаемых файлах HTML любой структуры
  • загрузка в стиле AJAX с без кодирования вообще на стороне сервера
  • При необходимости приложение может взаимодействовать с загруженной информацией

Недостатки:

  • Каждый файл подсказки должен иметь ссылку на общий CSS для общего стиля
  • Трудно интернационализировать

Чтобы сделать этот подход немного лучше, вы можете обработать ошибки загрузки и перенаправить на язык / тему по умолчанию при 404 ошибках. Итак, приоритет поиска будет таким:

  1. Текущая тема для текущего языка
  2. Текущая тема для языка по умолчанию
  3. Тема по умолчанию для текущего языка
  4. Страница ошибки по умолчанию

Я думаю, что довольно легко создать такой компонент GWT для включения взаимодействий iFrame

1 голос
/ 20 апреля 2009

Я проводил аналогичные исследования и пока вижу, что лучший способ решения этой проблемы - через DeclarativeUI или UriBind . К сожалению, это все еще в инкубаторе, поэтому нам нужно обойти эту проблему.

Я решаю это несколькими способами:

  1. Активное наложение, т. Е. Вы создаете свой стандартный HTML / CSS и вводите код GET с помощью тега <script>. Везде, где вам нужен доступ к элементу из кода GWT, вы пишете что-то вроде этого:

    RootPanel.get("element-name").setVisible(false);
    
  2. Вы пишете свой код на 100% GWT, а затем, если требуется большой кусок HTML, вы доставляете его клиенту либо через IFRAME, либо через AJAX, а затем внедряете его через панель HTML следующим образом:

    String html = "<div id='one' "
       + "style='border:3px dotted blue;'>"
       + "</div><div id='two' "
       + "style='border:3px dotted green;'"
       + "></div>";
    HTMLPanel panel = new HTMLPanel(html);
    panel.setSize("200px", "120px");
    panel.addStyleName("demo-panel");
    panel.add(new Button("Do Nothing"), "one");
    panel.add(new TextBox(), "two");
    RootPanel.get("demo").add(panel);
    
1 голос
/ 13 апреля 2009

Вы можете попробовать реализовать Generator для загрузки внешнего HTML из файла во время компиляции и создания класса, который его генерирует. Похоже, в Интернете не так много помощи для создания генераторов, но вот сообщение для группы GWT, которое может помочь вам начать:

0 голосов
/ 22 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...