Spring 4 - MVC - параметр URL и путь к статическому ресурсу

У меня есть приложение spring mvc, на странице я перечисляю данные «Группы» в таблице, извлеченной из базы данных. URL-адрес каждой группы устанавливается в «/viewgroup/410», где 410 — это идентификатор группы, который будет загружаться из базы данных и отображаться на странице viewgroup.jsp.

<td><a href="viewgroup/${group.groupid}">${group.name}</a></td>

Итак, метод контроллера имеет

@RequestMapping("/viewgroup/{groupid}") 
public String viewGroup() {
    ...
}

нравится. Страницы jsp не могут загружать статические ресурсы, которые у меня есть в структуре каталогов.

+webapp
  +resources
     +css
     +js
     +images
  +views
    +login.jsp

Страницы jsp имеют указанный ниже путь для image/js/css.

<link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">

я пытался добавить

@Controller
@RequestMapping("/viewgroup/**")
public class ViewGroupController {
   ...
}

а это в jsp

<link href="viewgroup/resources/css/bootstrap.css" rel="stylesheet" media="screen">

Тем не менее загрузка страницы jsp не могла загрузить статические ресурсы. Как указать путь к статическим ресурсам на страницах jsp, когда я передаю параметры в URL-адресе?


person Vijay Veeraraghavan    schedule 18.08.2014    source источник


Ответы (1)


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

<link href="/resources/css/bootstrap.css" rel="stylesheet" media="screen">

Разрешение таких статических ресурсов совершенно не зависит от страницы, которую вы сейчас просматриваете, будь то /viewgroup/410 или /foo/bar. Вот почему вам не нужна «группа просмотра» в начале href вашей ссылки.

Но вам нужно сообщить Spring MVC, как он должен обращаться к таким статическим ресурсам. Обычно это делается в конфигурации Spring. Например, если вы используете конфигурацию Java Spring MVC через WebMvcConfigurer, вы должны переопределить addResourceHandlers следующим образом:

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }


РЕДАКТИРОВАТЬ: Плохо, я думал, что Spring MVC + любая технология просмотра (JSP, Thymeleaf и т. д. и т. д.) будет автоматически разрешать href ссылки по корневому пути веб-приложения, но это, очевидно, нет true для необработанного HTML, href относительной ссылки которого разрешается относительно текущего пути. Таким образом, в конце концов, как было обнаружено OP, ссылки должны разрешаться только по корневому пути, если они обрабатываются с использованием используемой технологии просмотра (в примере с JSP: <c:url value="/resources/css/bootstrap.css"/>)

person m4rtin    schedule 18.08.2014
comment
Я уже настроил это, register.addResourceHandler(/resources/**) .addResourceLocations(/resources/) ; - person Vijay Veeraraghavan; 18.08.2014
comment
Но это работает ‹link href=../resources/css/bootstrap.css rel=stylesheet media=screen› - person Vijay Veeraraghavan; 18.08.2014
comment
Хм, должно работать без '..' в начале, но в любом случае, если это работает :) - person m4rtin; 18.08.2014
comment
Это работает, но у меня возникает другая проблема: header.jsp, включенный в этот jsp, не может загружать статические ресурсы! Эээ... - person Vijay Veeraraghavan; 18.08.2014
comment
Можете ли вы опубликовать код? Также укажите URL-адрес вашего файла bootstrap.css, разрешенный на вашей странице JSP, и скопируйте/вставьте его в свой браузер, чтобы убедиться, что разрешение статических ресурсов работает нормально (URL-адрес должен выглядеть примерно так: localhost:8080/resources/css/bootstrap.css и не должен возвращать ошибку 404) - person m4rtin; 18.08.2014
comment
Теперь я ссылаюсь на все статические файлы из jsp как ‹link href=‹c:url value=/resources/css/bootstrap.css/› rel=stylesheet media=screen›. это работает - person Vijay Veeraraghavan; 18.08.2014
comment
О боже, href необработанной HTML-ссылки относится только к вашему текущему пути! Это объясняет, почему «..» работало: потому что вы возвращались в корень своего веб-приложения перед доступом к пути, подобному «resources/**». Я отредактирую свой не очень правильный ответ... - person m4rtin; 18.08.2014