Объединение UrlRewriteFilter и Struts 2 с параметрами получения - PullRequest
0 голосов
/ 11 февраля 2009

В ответ на мой старый вопрос мне удалось заставить URL перезапись работать корректно для моего проекта Struts, где URL-адреса, подобные search?q=blah, конвертируются в запросы search.action?q=blah. Для этого мы используем UrlRewriteFilter . Похоже, это пересылает штраф в распорки (если он проверяет соответствие фильтра с FORWARD), но при запуске ParametersIntercepter кажется, что он перехватывает каждый параметр дважды и добавляет запятую между ними Итак, следующее:

search.action?q=blah

Устанавливает параметр q для объекта Критерии (см. Далее):

[ blah, blah ]

Параметры задаются с помощью ModelDriven<Criteria> Где Criteria - это простой класс с набором свойств, которые должны быть установлены из строки GET.

Я затрудняюсь объяснить, почему это происходит. Кто-нибудь видел что-нибудь подобное? Я делаю что-то не так с фильтрами / перехватчиками?

edit: кажется, ParametersInterceptor просто устанавливает параметры, содержащиеся в объекте ActionContext. Я не уверен (и не вижу никаких сообщений отладки, которые указывают), где эти значения устанавливаются в ActionContext. Кто-нибудь хочет уточнить, как это все должно работать?

Ответы [ 2 ]

0 голосов
/ 19 марта 2009

На тот случай, если вас может заинтересовать дополнительная информация, знаете ли вы, что самые последние версии Struts2 (то есть 2.1.?) Не навязывают расширение .action вашим действиям? На самом деле, вам вообще не нужно никакого расширения!

Если мои воспоминания мне не изменяют, единственное требование - в web.xml вы сопоставляете свой фильтр Struts2 (org.apache.struts2.dispatcher.FilterDispatcher) с URL-шаблоном: /*

<filter-mapping>
   <filter-name>action2</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

С тех пор тег <s:url>, появляющийся на странице с пустым расширением, будет, в свою очередь, генерировать URL без расширения ...

0 голосов
/ 24 февраля 2009

Я не разрешил странное поведение, описанное выше, но мне удалось обнаружить ошибку в переписывании URL-адресов, страницы которых перенаправляются не в «mySearch.action», а в «mySearch.action?». Использование переписывания URL теперь с фиксированным правилом и без учета параметров запроса, кажется, работает нормально.

EDIT: Я в конечном итоге проследил это до проблемы с настройкой urlrewritefilter для прослушивания как REQUEST, так и FORWARD. Очевидно, это приводит к тому, что параметры GET анализируются дважды. Однако я по-прежнему не включаю параметры запроса (поскольку это обычно так или иначе сбивает с толку), так что это может не решить проблему полностью. Хотя это наиболее вероятный виновник.

В частности, мое отображение фильтра теперь выглядит так:

<filter-mapping>
     <filter-name>UrlRewriteFilter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>
</filter-mapping>
...