wicket: отображение разных путей к одному и тому же классу по запросу для создания разного контента в разметке - PullRequest
0 голосов
/ 29 марта 2012

Я разработал систему магазинов. есть страница продукта, на которой перечислены доступные элементы, отфильтрованные по некоторым меню выбора. Существует также одна страница сведений об элементе для просмотра содержимого каждого продукта. содержимое этой страницы будет загружено из файла свойств xml. если щелкнуть ссылку в виде списка элемента, чтобы просмотреть некоторые подробности, устанавливается параметр GET для конкретного элемента. со значением параметров я могу динамически загружать содержимое для этого конкретного элемента из моих свойств, изменяя имя загруженных ключей.

пока все хорошо, но не очень хорошо. так много на заднем плане. давайте перейдем к некоторым деталям.

больше всего, это некоторые вещи, мотивированные SEO. до сих пор существует также проблема с идентификатором экземпляра страницы в URL для страниц с полным состоянием, не только из-за нестабильного URL, но и из-за того, что wicket выполняет 302 перенаправления для управления URL. возможно, я решу эту проблему с помощью компонентов Statefull, чтобы решить эту проблему.

так что теперь на продаваемых товарах есть QR-код, содержащий ссылку на мою страницу с подробностями. эти ссылки не разработаны мной, и, как вы можете себе представить, они выглядят очень по-разному, как фактический URL. допустим, URL-адрес QR-кода будет "/ shop / item1", где item1 будет названием продукта. мой класс страницы будет ItemDetailPage. Я написал IRequestMapper, который монтирую в своем WebApplication # init (), который разрешает URL-адрес входящих запросов и проверяет, должен ли он быть разрешен этим IRequestMapper. Если это так, я создаю свою страницу с помощью PageProvider и возвращаю обработчик запросов для нее.

public IRequestHandler mapRequest(Request request) {
                if(compatibilityScore>0) {
                    PageProvider provider = new PageProvider(ItemDetailPage.class, new ItemIDUrlParam(request.getUrl().getPath().split("/")[1]));
                    provider.setPageSource(Application.get().getMapperContext());
                    return new RenderPageRequestHandler(provider);
                }
                return null;
            }

Итак, как вы можете видеть, я создаю параметр, который может обрабатывать моя страница сведений. Но полученный URL не очень хорош. Я хотел бы сохранить исходный URL-адрес, сопоставляя его с закладками, без какого-либо перенаправления. Моей первой мыслью было реализовать URLCodingStrategy для перестройки URL-адреса с его параметрами в форме пути. Я думаю, что HybridUrlCodingStrategy делает что-то подобное. После разрешения пути URL-адреса "/ shop / item1 /" с помощью IRequestMapper он будет выглядеть как "/ shop / item? 1? Id = item1", где первый параметр вне курса - это идентификатор экземпляра страницы калитки, который, скорее всего, будет удален как Я перестрою страницу с подробной информацией, чтобы она не имела состояния :( после применения HybridURLCodingStrategy он может выглядеть как "/ shop / item / 1 / id / item1" или "/ shop / item / id / item1" без идентификатора экземпляра страницы. другой идеей было бы удалить вторую часть пути и имя параметра и использовать только значение параметров, чтобы URL выглядел как «/ shop / item1», то есть тот же URL, что и в запросе.

Ребята, у вас есть опыт с этим или какие-нибудь умные идеи? Reuuirements являются

  1. Имея один фиксированный URL для каждого продукта, бот SE может индексировать
  2. без параметров
  3. без гражданства и закладка
  4. нет 302. Перенаправляет в любом случае.
  5. удостоверение личности запрашиваемого предмета должно быть доступно для подробной страницы

с наилучшими пожеланиями из Германии Marcel

1 Ответ

6 голосов
/ 30 марта 2012

Как сказал Берт, ваш сценарий использования должен быть покрыт обычным монтированием страницы, см. Также страницу MikiMapper вики , для вашего конкретного примера:

mountPage("/shop/${id}", ShopDetailPage.class);

Учитывая, что "item1 "- это идентификатор элемента (который мне не очень понятен), теперь вы можете получить его как именованный параметр страницы id в Wicket.Другой пример, часто встречающийся в SEO-ссылках, содержащих как уникальный идентификатор, так и (неуникальный, изменяющийся) заголовок:

mountPage("/shop/${id}/${title}", ShopDetailPage.class);

Что касается идентификатора экземпляра страницы, то существует несколько способов избавиться от него, возможно.лучший способ - сделать страницу без сохранения состояния, как вы сказали, другой простой способ - настроить IRequestCycleSettings.RenderStrategy.ONE_PASS_RENDER в качестве стратегии рендеринга (см. документацию API).

...