Проблема с возвратом просмотров с нескольких URL - PullRequest
1 голос
/ 16 марта 2011

Я создаю веб-приложение, используя Spring MVC, и у меня возникла проблема.

В настоящее время, если я захожу в систему и захожу на домашнюю страницу веб-приложения, тогда она правильно отображает домашнюю страницу пользователя (обычный профиль материалаизображение, подробности и т. д.) - это все здорово.

Однако я пытаюсь встроить эту функциональность так, чтобы, если кто-то заходит на сайт с URL-адресом / пользователем / именем пользователя, он будет перенаправлен на контроллер ипопытаться найти пользователя с именем пользователя "username" - если он найден, он загружает представление профиля выбранного пользователя.

Пока все работает нормально, но я хотел проверить, что если вывойдите в систему и перейдите в / user / mycurrentusername, затем не загружайте страницу обычного профиля, просто загрузите страницу, которую видите при первом входе в систему. Проблема в том, что когда я возвращаю то же представление, что и для домашней страницы, то, что я есть сейчасв url / user / * ни один из ресурсов страницы не может быть найден (images / css), поэтому я получаю страницу, но без форматирования / images ..

Что бы блучший способ обойти это?Есть ли лучший способ справиться с этим?

(У меня также есть проблемы, что при поиске images / css в / url / images .. он снова запускает запрос в мой пользовательский контроллер :()

Помощь очень ценится!

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Для первой проблемы вы, вероятно, указываете свои источники изображений и CSS как относительные пути.Поскольку представление отображается с другого пути, этот относительный путь также отличается.См. Ответ Мелва, чтобы узнать, как их правильно указать.

Что касается второй проблемы, ознакомьтесь с разделом 15.12.4 в документации spring mvc , чтобы узнать, как статические запросы проходят черезСервлет-диспетчер.

1 голос
/ 16 марта 2011

У вас есть три варианта:

  1. Не меняйте свой веб-контекст.Сделайте все ваши URL-адреса как http://myapp/myrequest?par1=val1.Я делал такие приложения некоторое время назад, но когда есть много возможных операций, URL не будут организованы.URL-адреса в стиле «REST» более симпатичны и являются тем, к чему стремится мир.

  2. Используйте <c:url> во ВСЕХ ваших внутренних URL-адресах.Я думаю, что это не плохой вариант, но много стандартного кода, больше, чем кажется на первый взгляд.Если вы звоните по URL-адресам с помощью javascript, вы должны знать, какой из них является правильным и может быть неуклюжим.

  3. В моей текущей разработке я использую тег <BASE>.Вы должны включить <base href="http://myhost:8080/myapp/" /> в заголовок всех своих страниц.Затем вы можете сделать все ваши URL-адреса относительно базового пути вашего приложения.Есть некоторые недостатки, но я предпочитаю.

РЕДАКТИРОВАТЬ : отвечая на ваш вопрос.Вместо параметризации вашего приложения вы можете получить корневой URL-адрес приложения следующим образом:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />
1 голос
/ 16 марта 2011

URL-адреса, которые вы создаете для своих таблиц стилей и т. Д., В идеале должны создаваться с помощью своего рода тега перезаписи URL-адреса, чтобы обеспечить их соответствие контексту корневого приложения, а не текущему URL-адресу.Какую технологию просмотра вы используете?JSP?Если так, то вы захотите что-то вроде этого <link rel="stylesheet" href="<c:url value='/css/styles.css'/>" type="text/css"/>.Тег <c:url/> создаст URL-адрес, который по сути постоянен и не изменится при запросе текущей страницы.

Что касается попадания контроллера в запросы на css / images и т. Д., Проверьте thisвопрос .Короче говоря, в идеале вы хотите использовать что-то вроде фильтра Tuckey Url Rewrite, чтобы убедиться, что ваш DispatcherServlet не вызывается для запросов статического содержимого.

Edit: на самом деле похоже, что Spring 3.04 имеет более хорошее решение, чемФильтр Такки.<mvc:resources/> выглядит намного проще в настройке.

...