Вопрос

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

search.action?q=blah

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

[ blah, blah ]

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

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

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

Это было полезно?

Решение 2

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

Редактировать:В конце концов я проследил это до проблемы с настройкой urlrewritefilter для прослушивания как запроса, так и ПЕРЕСЫЛКИ.По-видимому, это приводит к тому, что параметры GET анализируются дважды.Однако я по-прежнему не включаю параметры запроса (поскольку это обычно все равно все запутывает), так что это может не решить проблему полностью.Хотя это наиболее вероятный виновник.

В частности, мое сопоставление фильтров теперь выглядит следующим образом:

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

Другие советы

На всякий случай, если вас все еще может заинтересовать дополнительная информация, знаете ли вы, что самые последние версии 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>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top