Обновление строки URL из веб-приложения для отображения текущего состояния - PullRequest
4 голосов
/ 05 мая 2011

Я бы хотел сделать то, что просил Джейсон здесь

В одном предложении я бы хотел, чтобы строка URL отображала состояние приложения AJAX, чтобы я мог добавить его в закладки, а также позволить пользователю вернуться в предыдущее состояние с помощью кнопок «назад» / «вперед» в браузер.

Разница для меня (из того, что спросил Джейсон) в том, что я использую JSF 2.0. Я читал, что JSF 2.0 добавил возможность использовать get, но я не уверен, как правильно использовать это.

Спасибо за помощь.

Дальнейшее уточнение

Если я правильно понимаю, чтобы иметь возможность отмечать определенные состояния в веб-приложении AJAX, мне придется использовать location.hash. Я прав? Я пытаюсь добиться поведения, подобного gmail, в том смысле, что, хотя приложение полностью AJAXified и не происходит перенаправлений, я все еще могу использовать Back / Forward и закладку (и именно поэтому я хотел бы обновить строку URL с само приложение AJAX, а не через перенаправление)

Обновление

только что нашел этот похожий вопрос

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Разница для меня (из того, что спросил Джейсон) заключается в том, что я использую JSF 2.0. Я читал, что JSF 2.0 добавил возможность использовать get, но я не уверен, какой правильный способ использовать это.

Обратите внимание, что это не то же самое, что поддерживать состояние Ajax. Обычно это происходит по идентификаторам фрагментов (часть, начинающаяся с # в URL, также известная как hashbang). JSF не предлагает встроенные компоненты / функциональность для этого. Насколько я также не видел библиотеку компонентов, которая делает это. Однако этот ответ может оказаться полезным для начала работы с доморощенным обработчиком фрагментов хеша в JSF.

Что касается использования запросов GET, просто используйте <h:link>, <h:outputLink> или даже <a> для создания ссылок GET. Вы можете предоставить параметры запроса в h: компонентах <f:param>. Э.Г.

<h:link value="Edit product" outcome="product/edit">
    <f:param name="id" value="#{product.id}" />
</h:link>

На странице product/edit.xhtml вы можете определить параметры для установки и действия, выполняемые по запросу GET

<f:metadata>
    <f:viewParam name="id" value="#{productEditor.id}" />
    <f:event type="preRenderView" listener="#{productEditor.init}" />
</f:metadata>

В объекте запроса или представлении, связанном с product/edit.xhtml page - в этом примере #{productEditor} - вы просто определяете свойства и метод слушателя. Метод слушателя будет выполнен после того, как все свойства будут собраны, преобразованы, проверены и обновлены в модели.

private Long id;
private Product product;

public void init() {
    product = productService.find(id);
}
0 голосов
/ 05 мая 2011

Обычно вы используете AJAX для предотвращения полного обновления страницы. AFAIK все текущие браузеры будут выдавать обновление страницы, если вы измените базовый URI. Таким образом, вам придется использовать часть хеша, как указано в предложенном вами вопросе.

У нас была похожая проблема, и мы сделали что-то вроде этого:

  1. Мы согласились с тем, что пользователи не могут добавить URL в закладки.
  2. Для URL, которые должны быть уникальными / доступными для закладки, мы использовали разные ссылки, которые вызывают перенаправление. Эти URL приведены в карте сайта.
  3. Для браузера назад мы добавили промежуточную страницу после входа в систему. Эта страница делает навигацию и перенаправление в приложение. Навигация сохраняется в сеансе, и когда сервер получает запрос навигации (который может быть историей назад), соответствующее состояние восстанавливается. Браузер снова открывает эту промежуточную страницу, которая выдает перенаправление вместе с запросом навигации на стороне сервера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...