Одной из основных целей разработки Wicket является использование простых файлов разметки HTML в качестве шаблонов представления. Следовательно, файлы JSP или JSF нельзя использовать в приложении Wicket. Однако могут быть ситуации, в которых мы хотели бы использовать некоторый код из существующих (возможно, устаревших) страниц JSP / JSF непосредственно на наших страницах Wicket.
Создание сосуществования Wicket со страницами JSP / JSF может быть кошмаром, но теперь новый подпроект от Wicketstuff под названием JEE Web Integration (созданный Тобиасом Солощенко) способен преодолеть разрыв между Wicket и этими технологиями стандартного представления, что делает их интеграцию довольно простой.
Исходный код, используемый в этой статье, доступен по адресу https://github.com/bitstorm/WicketExperiment/tree/master/JspIntegration .
ПРИМЕЧАНИЕ : в этой статье мы увидим примеры, использующие страницы JSP, но те же понятия применимы и в том случае, если мы хотим использовать страницы JSF.
Вставить страницы JSP в страницы Wicket.
Этот проект Wicketstuff поставляется с пользовательскими тегами, которые можно использовать для встраивания в страницу / панель Wicket разметки, созданной либо JSP, либо JSF, либо даже сервлетом. Чтобы использовать эти теги с нашим приложением Wicket, нам сначала нужно зарегистрировать компонент-преобразователь JEEWebResolver во время инициализации приложения:
@Override public void init() { super.init(); getPageSettings().addComponentResolver(new JEEWebResolver()); }
Теперь мы можем включить страницу JSP, используя специальный тег <wicket: jsp>. Следующий код взят из HomePage.html:
<body> The following content is from a JSP page: <wicket:jsp file="/FormPage.jsp"/> </body>
Относительный к контексту путь к странице JSP должен быть указан с обязательным атрибутом «файл».
ПРИМЕЧАНИЕ : страница Wicket хостинга должна быть с состоянием. Если Wicket не помечает вашу страницу автоматически с сохранением состояния, вы должны вызвать ‘setStatelessHint (false);’ в своем конструкторе или в методе inizializer.
Форма поддержки
Со страниц JSP мы можем создавать ссылки, которые указывают на страницы Wicket или формы, которые отправляют данные на страницы Wicket. Это возможно, используя библиотеку тегов, предоставляемую этим модулем:
<%@ taglib prefix="wicket" uri="http://wicketstuff-jee-web.org/functions/jsp" %>
После того, как мы включили указанную выше библиотеку в нашу JSP, мы можем указать в атрибуте формы ‘action’, какая страница Wicket будет получать данные, записывая полное имя класса:
<body> Send a parameter to Wicket page. Click submit. <form action="<wicket:url page="org.javalobby.ShowParameter"/>" method="POST"> <input type="text" name="textvalue" value="testvalue"> <input type="submit" value="Submit"> </form> </body>
Обратите внимание, что имя класса страницы должно быть внутри специального тега <wicket: url>.
Поддержка ссылок
Ссылки со встроенных страниц JSP на страницы Wicket могут быть созданы с использованием того же тега <wicket: url>, который мы видели для форм:
<a href="<wicket:url page="org.javalobby.ShowParameter" query="name=theName"/>">Link rendered by tag</a>
В приведенном выше примере вы можете увидеть, как мы использовали атрибут ‘query’, чтобы указать параметры запроса для отправки по нашей ссылке. В качестве альтернативы мы можем также реализовать ссылки, использующие EL-функции вместо тегов, сохраняя JSP-страницы действительными:
<a href="${wicket:urlWithQuery('mypackage.MyPage','param1=value1')}">EL link</a>
Поддержка Ajax
Встроенные страницы JSP также могут отправлять данные на страницу хостинга через AJAX, используя ссылки и формы. Чтобы использовать поддержку AJAX, мы должны сначала настроить в нашем приложении глобальную ссылку на ресурс типа JEEWebGlobalAjaxHandler. Для этого мы используем статический метод configure:
@Override protected void init() { super.init(); getPageSettings().addComponentResolver(new JEEWebResolver()); JEEWebGlobalAjaxHandler.configure(this); }
Когда мы используем AJAX, страница хостинга получает данные через инфраструктуру событий Wicket с пользовательским событием JEEWebGlobalAjaxEvent. Исходный экземпляр AjaxRequestTarget, используемый для запроса AJAX, можно извлечь из самого события:
@Override public void onEvent(IEvent<?> event) { JEEWebGlobalAjaxEvent castedEvent = JEEWebGlobalAjaxEvent.getCastedEvent(event); if (castedEvent != null) { AjaxRequestTarget ajaxRequestTarget = castedEvent.getAjaxRequestTarget(); StringValue paramVal = castedEvent.getPostParameters().getParameterValue("textvalue"); paramLabel.setDefaultModelObject("Last submitted value: " + paramVal); ajaxRequestTarget.add(paramLabel); } }
Поддержка формы Ajax
Если мы хотим отправить форму через AJAX, мы должны вызвать функцию ‘ajaxFormSubmit’ в ее атрибуте submit, используя выражение EL, как показано ниже:
<form id="form" method="post" onsubmit="${wicket:ajaxFormSubmit('POST')}"> <input type="text" name="textvalue" value="testvalue"> <input type="submit" value="Submit"> </form>
В приведенном выше примере форма отправляется методом POST, но мы также можем использовать GET.
Поддержка Ajax-ссылок
Ссылки AJAX работают так же, как и формы. В этом случае мы используем функцию «ajaxGetWithQuery» с атрибутом onclick:
<a href="#" onClick="${wicket:ajaxGetWithQuery('textvalue=theLinkName')}">Click here</a> to send parameter 'textvalue=theLinkName'.
Чтобы прочитать параметры запроса на странице хостинга, мы должны использовать параметры страницы вместо параметров публикации:
@Override public void onEvent(IEvent<?> event) { JEEWebGlobalAjaxEvent castedEvent = JEEWebGlobalAjaxEvent.getCastedEvent(event); if (castedEvent != null) { AjaxRequestTarget ajaxRequestTarget = castedEvent.getAjaxRequestTarget(); StringValue paramVal = castedEvent.getPageParameters().get("textvalue"); paramLabel.setDefaultModelObject("Last submitted value: " + paramVal); ajaxRequestTarget.add(paramLabel); } }
Вывод
Wicket — отличная альтернатива технологиям JSP / JSF. С новым модулем Wicketstuff ‘JEE Web Integration’ теперь у вас есть возможность постепенно перейти от JSP / JSF к Wicket, избегая риска и стоимости однократной миграции.