2009-02-11 10 views
0

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

search.action?q=blah 

Устанавливает параметр Q на объекте критерии (см далее), чтобы:

[ blah, blah ] 

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

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

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

ответ

0

Я не решил странное поведение выше, но мне удалось найти ошибку в перезаписи 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> 
+0

принят собственный ответ, так что он не отображается как неотвеченный – wds

0

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

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