Лучший способ экстрадиции HTML в приложениях GWT?
Какой лучший способ вытеснить большие количества HTML в приложении GWT? У нас довольно сложное приложение GWT около 30 "страниц"; на каждой странице есть своего рода руководство внизу, это несколько абзацев разметки HTML. Я бы хотел вытеснить HTML-код, чтобы он мог оставаться как можно более "unescaped".
Я знаю и понимаю, как использовать файлы свойств в GWT; что, конечно, лучше, чем встраивание содержимого в классы Java, но все-таки уродливое для HTML (вам нужно сбрасывать все, а также кавычки эвакуации и т.д.).
Обычно это то, что вы бы поставили в JSP, но я не вижу эквивалента в GWT. Я рассматриваю возможность написания виджета, который просто извлекает содержимое из html файлов на сервере, а затем добавляет текст в HTML-виджет. Но кажется, что это должен быть более простой способ.
Ответы
Ответ 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, сгенерированными и привязанными во время выполнения, без компиляции-времени.
Ответ 13
Взгляните на
http://code.google.com/intl/es-ES/webtoolkit/doc/latest/DevGuideClientBundle.html
Ответ 14
Не зная GWT, но не можете ли вы определить и привязать тег div в своем приложении html, тогда выполните команду get против файлов HTML, которые вам нужны, и добавьте в div? Насколько отличается это от микро-шаблон?
UPDATE:
Я только нашел этот приятный плагин jQuery в ответ на другой вопрос fooobar.com/info/266434/....