Spring - переписать один URL-адрес на другой

У меня есть приложение Spring 2.5, содержащее Flash-баннер. У меня нет исходного кода для компонента Flash, но в нем жестко запрограммированы ссылки на определенные страницы, которые заканчиваются на .html. Я хочу иметь возможность перенаправлять эти страницы .html на существующие страницы jsp. Как я могу заставить Spring преобразовать несколько страниц .html в страницы .jsp?

Мой проект выглядит так:

WebContent
 |
 -sample.jsp
 -another.jsp
  WEB-INF
  |
  -myapp-servlet.xml
  -web.xml

Я хочу, чтобы localhost:8080/offers.html перенаправлял на localhost:8080/sample.jsp

Могу ли я сделать это с помощью Spring? У меня уже есть SimpleUrlHandlerMapping и UrlFilenameViewController, определенные в myapp-servlet.xml, которые должны продолжать обслуживать уже существующие страницы.

В моем web.xml у меня есть

<servlet-mapping>
  <servlet-name>myapp</servlet-name>
  <url-pattern>*.htm</url-pattern>
</servlet-mapping>

Обновить

Вот преобразователь URL. Если я добавлю контроллер, как мне вернуть представление jsp, которое находится в каталоге WebContent, поскольку преобразователь представлений включает каталог /WEB-INF/jsp.

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
    <props>
      <prop key="/page1.htm">page1Controller</prop>
      <prop key="/page2.htm">page2Controller</prop>
    </props>
  </property>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
</bean>

person George    schedule 25.02.2010    source источник
comment
UrlFilenameViewController разрешает только шаблон URL-адреса в имя файла, вы не можете сопоставить URL-адрес с другим файлом. Если вы хотите сопоставить /offers.html с представлением sample.jsp, вам понадобится контроллер, который обрабатывает шаблон /offers.html и возвращает sample.jsp в качестве представления. Можете ли вы опубликовать свой SimpleUrlHandlerMapping из myapp-servlet.xml?   -  person Rob Beardow    schedule 25.02.2010
comment
@Rob Beardow - обновлено с помощью SimpleUrlHandlerMapping и InternalResourceViewResolver   -  person George    schedule 25.02.2010


Ответы (3)


Я думаю, вы могли бы извлечь выгоду из библиотеки перезаписи URL с открытым исходным кодом, созданной tuckey.org. Ребята из SpringSource поддерживают эту библиотеку, так как она настраивается автоматически, если вы используете Spring Roo для создания проекта, поэтому она хорошего качества. Я успешно использовал его в ряде проектов.

См. здесь его домашнюю страницу. И Скаффман прав, вы хотите, чтобы он «пересылал» вместо перенаправления, что является поведением по умолчанию.

Настройте его в web.xml следующим образом:

<filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

Затем в WEB-INF/urlrewrite.xml есть такой элемент:

<rule>
    <from>offers.html</from>
    <to>offers.jsp</to>     
</rule>
person Hans Westerbeek    schedule 25.02.2010
comment
@mirror303 - Спасибо. Это сработало отлично, и настройка заняла около 10 секунд. - person George; 25.02.2010

Я бы использовал для этого OCPsoft PrettyFaces или OCPsoft Rewrite:

С помощью PrettyFaces:

создать WEB-INF/pretty-config.xml

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

С помощью перезаписи:

ConfigurationBuilder.begin()
   .addRule(Join.path("/offers.html").to("/offers.jsp"));

Надеюсь, это поможет.

~ Линкольн

person Lincoln    schedule 27.10.2011
comment
Вы также можете использовать существующую конфигурацию Tuckey с Rewrite через модуль rewrite-integration-tuckey. - person Lincoln; 23.11.2011
comment
Линкольн — основатель OCPsoft, автор PrettyFaces и Rewrite. Вы должны упомянуть, что ваш ответ предвзят. - person Janning; 10.07.2013

Во-первых, я предполагаю, что когда вы говорите «перенаправить», вы действительно имеете в виду «переслать». HTTP-перенаправления здесь неуместны.

Итак, учитывая это, вот несколько вещей, которые можно попробовать:

  • Нельзя ли просто переместить файлы JSP из WebContent в /WEB-INF/jsp/? Тогда вам не придется менять определение ViewResolver.

  • Вы можете попытаться заставить контроллеры возвращать имя представления, например ../../another.jsp, и надеяться, что контейнер сервлета разрешается от /WEB-INF/jsp/../../another.jsp до /another.jsp.

  • С ViewResolver консультируются только в том случае, если контроллеры возвращают имя представления. Ваши контроллеры не должны возвращать имя представления, они могут напрямую возвращать объект View, в данном случае JstlView. Это может указывать на любой JSP, который вам нравится. Некоторые контроллеры могут возвращать имена представлений, а некоторые возвращать View объектов.

  • Удалите свойство prefix из вашего преобразователя представления. Это означает, что вам также придется изменить каждый существующий контроллер, чтобы к каждому имени представления, которое они возвращают, добавлялся префикс /WEB-INF/jsp/. Затем вы можете ссылаться на JSP под WebContent по имени.

person skaffman    schedule 25.02.2010