Попросите Spring DispacherServlet разрешить правильный URL-адрес

В моем проекте Tomcat-Spring-Java я хочу иметь следующие URL-адреса

/ index - для отображения страницы входа
/ login - страницы входа

/ cars / - список доступных автомобилей
/ cars / {id} - показать конкретную машину
/ cars / {id} / action - выполнить действие с этой конкретной машиной

/ people / - список доступных людей
/ people / {id} - показать конкретного человека
/ people / {id} / action - выполнить действие с этим конкретным человеком

У меня есть карта диспетчера-сервлета, подобная этой, в web.xml.

    <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/login</url-pattern>
    <url-pattern>/logout</url-pattern>
    <url-pattern>/index</url-pattern>
    <url-pattern>/cars/*</url-pattern>
    <url-pattern>/people/*</url-pattern>
</servlet-mapping>

И моя карта dispatcher-servlet.xml вроде:

        <bean id="urlMap"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="urlMap">
        <props>
            <prop key="/login">loginController</prop>
            <prop key="/logout">logoutController</prop>
            <prop key="/index">welcomeController</prop>
            <prop key="/cars">listCarsController</prop>
            <prop key="/cars/">listCarsController</prop>
            <prop key="/cars/*">showCarController</prop>
            <prop key="/cars/*/action">actionCarController</prop>
            <prop key="/people">listPeopleController</prop>
            <prop key="/people/">listPeopleController</prop>
            <prop key="/people/*">showPersonController</prop>
            <prop key="/people/*/action">actionPersonController</prop>
        </props>
    </property>
</bean>

Это работает не так, как ожидалось, поскольку, когда я, например, посещаю / people / 1 / action, сервлет сервлета Dispacher говорит, что ищет обработчик для [1 / action], и, конечно, это не поиск, а люди / впереди, чтобы отделить Идентификатор народов к идентификатору автомобилей.

Это похоже на то, что "*" будет единственным введенным URL.

Кстати, я хочу, чтобы расширение моего URL-адреса было меньше, я знаю, что сопоставление диспетчера с * .htm в файле web.xml решило бы проблему.
Но это должен быть способ решить эту проблему. отобразить диспетчер или заставить диспетчер искать полное определение URL-адреса.


person JorgeO    schedule 15.07.2010    source источник


Ответы (1)


Вы можете установить свойство alwaysUseFullPath:

<bean id="urlMap" 
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 

    <property name = "alwaysUseFullPath" value = "true" />

    ...
</bean>

В качестве альтернативы вы можете установить один <url-pattern> для сервлета диспетчера. Поскольку это не может быть /*, вам необходимо используйте UrlRewriteFilter.

person axtavt    schedule 16.07.2010
comment
Готовимся попробовать alwaysUseFullPath. Я уже пробовал UrlRewriteFilter, чтобы создать URL-адрес без расширения .spring, но выглядит ужасно, если заполнить мои URL-карты с помощью .spring в конце, кроме того, что он действительно работает с / people /, поскольку нет файла для добавления расширения ... - person JorgeO; 16.07.2010
comment
UrlRewriteFilter. Я опробовал его, используя этот пост в блоге. ericdaugherty.com/2010/03/web-file-extensions-are-bad.html - person JorgeO; 16.07.2010
comment
Работал! Я не знаю, почему это не поведение по умолчанию. Или лучше задокументировано. Спасибо - person JorgeO; 16.07.2010