PrettyFaces не работает со Struts 2

Я хочу сделать свои URL-адреса более привлекательными для SEO.

Я настроил фильтр, и он работает со следующим, например:

<url-mapping>
    <pattern value="/index" />
    <view-id value="/index.html" />
</url-mapping>

Но когда я устанавливаю идентификатор представления для некоторого URL-адреса Struts, он не работает.

E.g.:

<url-mapping>
    <pattern value="/index" />
    <view-id value="/application/PunchIt.do" />
</url-mapping>

Он не может найти (или не может выполнить) действия Struts.

Есть ли решение для настройки PrettyFaces вместе с фреймворком Struts 2?

Я использую красивые лица 3.3.3.

Вот конфиг pretty-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<pretty-config xmlns="http://ocpsoft.org/prettyfaces/3.3.3" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xsi:schemaLocation="http://ocpsoft.org/prettyfaces/
               http://ocpsoft.org/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd">

    <!-- doesn't work -->
    <url-mapping>
        <pattern value="/index.html" />
        <view-id value="/application/PunchIt.do" />
    </url-mapping>

    <!-- works -->
    <url-mapping>
        <pattern value="/error" />
        <view-id value="/error.html" />
    </url-mapping>
 </pretty-config>

Вот файл web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="struts_blank" version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>Struts Blank</display-name>

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
      org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
  </filter>

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

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <filter>
    <filter-name>Pretty Filter</filter-name>
    <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
  </filter>

  <filter-mapping> 
    <filter-name>Pretty Filter</filter-name>
    <url-pattern>/* </url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>

</web-app>

person mlorika    schedule 22.04.2015    source источник
comment
Покажите полную конфигурацию неработающего примера, например, файл web.xml (или укажите, что вы используете Servlet 3.0) с неповрежденным порядком фильтров и т. д. Он должен работать как есть... хотя я не уверен, зачем вам это нужно, поскольку вы можете напрямую создавать красивые URL-адреса с помощью Struts 2.   -  person Dave Newton    schedule 22.04.2015
comment
Я обновил пост с файлами конфигурации..   -  person mlorika    schedule 22.04.2015
comment
Если ничего другого, я бы поставил фильтр PrettyFaces перед фильтром S2, чтобы у него была возможность отфильтровать раньше, чем S2.   -  person Dave Newton    schedule 22.04.2015
comment
Нет. Это не решает проблему. :-( Пробовал уже раньше. Но пробовал и сейчас. То же самое. Кажется, можно вызвать только один фильтр. Нет, как бы сказать, очереди фильтров. :-( Если у pretty-filter есть был вызван, struts2 игнорируется.   -  person mlorika    schedule 22.04.2015
comment
Тогда что-то не так либо с самим PrettyFaces, либо с его конфигурацией — фильтры есть фильтры, и их объединение в цепочку является обычным и ожидаемым. В его документах указано, что если URL-адрес не соответствует, он продолжит обработку в обычном режиме, чего я и ожидал. На всякий случай я бы также рассмотрел возможность сопоставления фильтра S2 с другими типами запросов. И опять же, я не уверен, почему бы вам просто не сделать URL-адреса более красивыми в S2 для начала.   -  person Dave Newton    schedule 22.04.2015
comment
Я хотел, чтобы этот URL-адрес: example.com/appliction/strutsaction.do представлялся как example.com/index или example.com/index.html. Я хочу исключить /приложение/ из URL-адреса.   -  person mlorika    schedule 22.04.2015
comment
Я боюсь, что ваши фильтры каким-то образом совпадают (‹загрузка при запуске/› не установлена), попробуйте изменить шаблон URL (struts) на: <url-pattern>*.do</url-pattern>   -  person xerx593    schedule 22.04.2015


Ответы (1)


Вы должны убедиться, что PrettyFilter расположен перед фильтром Struts2 И что фильтр Struts2 настроен на обработку типов диспетчера FORWARD. Итак, попробуйте что-то вроде этого:

<filter>
  <filter-name>Pretty Filter</filter-name>
  <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
</filter>
<filter-mapping> 
  <filter-name>Pretty Filter</filter-name>
  <url-pattern>/*</url-pattern> 
  <dispatcher>FORWARD</dispatcher> 
  <dispatcher>REQUEST</dispatcher> 
  <dispatcher>ERROR</dispatcher>
</filter-mapping>

<filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>FORWARD</dispatcher> 
  <dispatcher>REQUEST</dispatcher> 
</filter-mapping>

Подробное объяснение см. в вопросе №2 здесь:

http://www.ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/FAQ.html

person chkal    schedule 23.04.2015