Подтвердить что ты не робот

Лучший способ экстрадиции HTML в приложениях GWT?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Я использовал 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.

Ответ 3

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

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

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

Здесь example кадра в действии.

Ответ 4

В 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

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

Ответ 6

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

Ответ 7

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

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

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

    RootPanel.get("element-name").setVisible(false);
    
  • Вы пишете свой код 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);
    

Ответ 8

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

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

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

Недостатки:

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

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

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

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

Ответ 9

Рамка портлетов 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)";
}

Ответ 10

Вы можете использовать сервлеты с jsps для html-частей страницы и по-прежнему включать javascript, необходимый для запуска приложения gwt на странице.

Ответ 11

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

GWT 2.0 имеет UiBinder, который позволяет вам определять GUI в необработанном HTML-шаблоне, и вы можете вводить значения в шаблон из мира Java. Прочитайте dev guide, и это дает довольно хороший набросок.

Ответ 12

Вы можете попробовать приложение GWT с шаблонами html, сгенерированными и привязанными во время выполнения, без компиляции-времени.

Ответ 14

Не зная GWT, но не можете ли вы определить и привязать тег div в своем приложении html, тогда выполните команду get против файлов HTML, которые вам нужны, и добавьте в div? Насколько отличается это от микро-шаблон?

UPDATE:

Я только нашел этот приятный плагин jQuery в ответ на другой вопрос fooobar.com/info/266434/....