Wicket и многофункциональный веб-сайт ajax: самый простой способ сделать это?

Я хочу использовать Wicket для создания приложения, но у меня есть несколько дизайнеров, которые хотели бы писать/поддерживать javascript, и они в основном ожидают 1 JS-сегмент на страницу и глобальный JS-файл. Я думаю, что самый естественный способ добавить javascript в калитку — это добавить его для каждого компонента (а не для каждой страницы), что создаст проблемы для этих дизайнеров (фракционированный javascript и необходимость писать его в java-файлах). Есть ли лучший способ решить эту проблему? (конечно, я ожидаю, что все будет работать после частичного обновления.)

И вторая (сопутствующая) вещь, которую они хотели бы (и я хотел бы на самом деле), это возможность запрашивать информацию в формате JSON через статическую ссылку, возможно ли это в Wicket?


person Johan    schedule 17.05.2010    source источник


Ответы (4)


Встроенная в Wicket поддержка AJAX всегда сохраняет состояние и, таким образом, доступна с изменяющимися URL-адресами. Если ваши дизайнеры не планируют использовать JS-библиотеку Wicket, смонтировать страницу JSON довольно просто:

public class JsonReturningPage extends WebPage {
  public JsonReturningPage(PageParameters params) {
    String json = "{foo: 4711}";
    IRequestTarget t = new StringRequestTarget("application/json", "UTF-8", json);
    getRequestCycle().setRequestTarget(t);
  }
}

В качестве альтернативы вы также можете реализовать свой собственный AbstractRequestTargetUrlCodingStrategy, чтобы напрямую возвращать IRequestTarget из IRequestTarget decode(RequestParameters params) и монтировать его в своем приложении.

Что касается файлов JS, я бы попытался научить их использовать один файл для каждого компонента. Это, безусловно, имеет преимущество в виде меньшего количества копируемого кода и более простого обслуживания. Кроме того, я бы определенно не рекомендовал использовать JS в коде Java. Обычно требуется только передать данные или конфигурацию в JS либо в виде определений переменных, либо в виде вызовов методов. Поскольку эти данные обычно находятся на Java, а JS пишут дизайнеры, дизайнерам и программистам пора объединиться.

person sfussenegger    schedule 17.05.2010
comment
Да, эта json-штучка была тем, что я искал (альтернатива тоже звучит красиво, но сложно), и некоторое подтверждение моих мыслей о файлах JS тоже было очень приятно, спасибо. - person Johan; 17.05.2010
comment
@sfussenegger Как мне получить доступ к этой странице?!!! Я не могу найти URL!! Какой URL-адрес этой страницы, если на ней нет HTML. Он возвращает 404 для меня :( Я пробовал все возможные URL-адреса, которые я мог придумать. Пример: localhost: 7001/MyApp/JsonReturningPage - person GabrielBB; 16.10.2015

Я начал с JSON, заставив свои страницы калитки возвращать JSON, но быстро понял, что есть лучшие инструменты для работы, особенно если у вас будет полный уровень веб-сервисов. Если вам просто нужно немного JSON здесь и там, всегда через GET, тогда, конечно, просто создайте страницу Wicket.

В итоге я использовал Jersey с Джексон вместе с Уикетом. Джерси упрощает настройку URL-адресов, которые могут делать разные вещи с помощью разных методов http (GET/POST/PUT/DELETE), а также легко анализировать строки запроса и т. д. Я бы подумал о том, чтобы пойти по этому пути для более тяжелых потребностей JSON.

Вы можете легко запустить Wicket и Jersey в одном и том же веб-приложении с небольшой конфигурацией web.xml.

person Tauren    schedule 02.06.2010

Быстрый ответ на ваш второй вопрос: да, это возможно. Используйте ссылки с закладками для доступа к ресурсу, который возвращает данные JSON.

person Boris Pavlović    schedule 17.05.2010
comment
Хм, я знаю о ссылках с закладками. Но я не знаю, как вернуть JSON на такой URL, у меня должна быть страница для ссылок с закладками, верно? - person Johan; 17.05.2010

Вы можете легко использовать следующий код для динамической связи с Wicket:

AbstractDefaultAjaxBehavior callme = new AbstractDefaultAjaxBehavior(){
        @Override
        protected void respond(AjaxRequestTarget target) {
        }
};
page.add(callme);


//From any ajaxrequesttarget you can simply append the following code:
target.appendJavascript("wicketAjaxGet('"+callme.getCallbackUrl()+");");

Таким образом, у вас может быть ajaxlink и т. д., который будет передавать ajaxrequest на сторону Wicket. Если вы хотите передать данные (хотя статическая ссылка так не звучит), сделайте следующее:

"wicketAjaxGet('"+callme.getCallbackUrl()+"&x='+value_to_pass_back''";
//to Read the value in the respond:
String x = RequestCycle.get().getRequest().getParameter("x");

Таким образом, URL-адрес обратного вызова генерируется динамически (поскольку URL-адрес обратного вызова зависит от сеанса), но он формируется как любой другой URL-адрес....

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

person msj121    schedule 07.06.2010