Когда мы используем инфраструктуру SpringMVC, статические ресурсы будут перехватываться, и потребуется добавить дополнительную конфигурацию.Ранее небольшой партнер спросил Songge о загрузке статических ресурсов в Spring Boot на WeChat: «Songge, моя HTML-страница, похоже, не имеет стиль?», сегодня я передам статью, чтобы подробно обсудить с вами этот вопрос.
Конфигурация в ССМ
Чтобы рассказать о проблемах в Spring Boot, вернемся к построению среды SSM, вообще говоря, можно пройти мимо<mvc:resources />
Узел, который нужно настроить так, чтобы он не перехватывал статические ресурсы, следующим образом:
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
Поскольку это средство сопоставления путей в стиле Ant,/**
Указывает, что может быть сопоставлен любой уровень путей, поэтому приведенный выше код также можно сократить следующим образом:
<mvc:resources mapping="/**" location="/"/>
Эта конфигурация настроена в XML. Как вы все знаете, конфигурацию SpringMVC можно настроить в коде Java в дополнение к конфигурации XML. Если настроить в коде Java, нам нужно только настроить класс, который наследуется от WebMvcConfigurationSupport. Может:
@Configuration
@ComponentScan(basePackages = "org.sang.javassm")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("/");
}
}
Перепишите метод addResourceHandlers в классе WebMvcConfigurationSupport и настройте расположение статического ресурса в этом методе.Смысл здесь тот же, что и смысл конфигурации xml выше, поэтому нет необходимости говорить больше.
Это наше традиционное решение, в Spring Boot метод настройки фактически такой же, но есть некоторые автоматизированные настройки.
Конфигурация в Spring Boot
В Spring Boot, если мы изhttps://start.spring.io
Проекты, созданные на этом веб-сайте, или проекты, созданные с помощью инструмента инициализации Spring Boot в IntelliJ IDEA, по умолчанию будут находиться в каталоге resources/static.Многие мелкие партнеры также знают, что доступ к статическим ресурсам возможен напрямую, если они размещены в этом каталоге. каталог, кроме здесь. Есть ли другое место для размещения статических ресурсов? Почему к нему можно получить прямой доступ здесь? Именно об этом вопросе и пойдет речь в этой статье.
общий план
Прежде всего, в Spring Boot по умолчанию есть всего 5 мест, где могут быть размещены статические ресурсы, и пять путей следующие:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- /
Первые четыре каталога понятны, они соответствуют разным каталогам в каталоге ресурсов, пятый/
Что это означает? Мы знаем, что в проекте Spring Boot каталога webapp по умолчанию нет, конечно, мы можем добавить его и сами (например, когда нам нужно использовать JSP), тут пятое/
Фактически это означает, что статические ресурсы в каталоге webapp не блокируются. Если один и тот же файл появляется в пяти каталогах, приоритет также указан в порядке, указанном выше.
Однако, несмотря на наличие 5 каталогов хранения, за исключением 5-го, который используется реже, остальные четыре создаются системой по умолчанию.classpath:/static/
, В обычных условиях нам нужно только поместить наши статические ресурсы в этот каталог, и нам не нужно создавать другие каталоги статических ресурсов.classpath:/static/
В каталоге есть картинка с именем 1.png, тогда мой путь доступа:
http://localhost:8080/1.png
Обратите внимание, что static в адресе запроса не требуется, если он будет добавлен, будет сообщено об ошибке 404. Многим это покажется странным, почему бы не добавить статику? Ресурсы четко размещены в статическом каталоге. На самом деле эффект очень хороший, например в конфигурации SSM, если наша конфигурация статического перехвата ресурсов выглядит так:
<mvc:resources mapping="/**" location="/static/"/>
Если мы настроим его таким образом, адрес запроса будетhttp://localhost:8080/1.png
На самом деле система пойдет на/static/1.png
Найдите связанные файлы в каталоге.
Поэтому мы считаем само собой разумеющимся, что в Spring Boot может быть аналогичная конфигурация.
Интерпретация исходного кода
Г-н Ху Шижи сказал: «Смелое предположение, будьте осторожны, чтобы проверить», мы будем использовать интерпретацию исходного кода, чтобы увидеть, как настроены статические ресурсы в Spring Boot.
Во-первых, мы увидели соответствующее содержимое автоматической настройки SpringMVC в классе WebMvcAutoConfiguration и нашли конфигурацию перехвата статических ресурсов следующим образом:
Можно видеть, что определение статических ресурсов здесь очень похоже на конфигурацию в SSM конфигурации Java, о которой мы упоминали ранее.Среди них значение, соответствующее методу this.mvcProperties.getStaticPathPattern(), равно "/**", this. resourceProperties.getStaticLocations() Метод возвращает четыре местоположения, а именно: «путь к классам:/META-INF/resources/», «путь к классам:/resources/», «путь к классам:/static/», «путь к классам:/public/» и затем в методе getResourceLocations In добавляется «/», поэтому здесь 5 возвращаемых значений. Среди них / представляет каталог веб-приложения, то есть статические файлы в веб-приложении также могут быть доступны напрямую. Соответствующие пути статических ресурсов расположены в порядке убывания в соответствии с приоритетом определенных путей. Таким образом, конфигурация здесь точно такая же, как мы упоминали ранее. Таким образом, все знают, почему Spring Boot поддерживает 5 местоположений статических ресурсов, а также понимают, почему путь запроса статического ресурса не обязательно должен быть/static
, потому что он был автоматически добавлен в сопоставление путей/static
.
пользовательская конфигурация
Конечно, это конфигурация системы по умолчанию. Если мы не хотим размещать ресурсы в пяти местах по умолчанию в системе, мы также можем настроить расположение и сопоставление статических ресурсов. Есть два способа их настройки: которые можно определить через application.properties , также можно определить в коде Java, см. ниже отдельно.
application.properties
Способ определения в файле конфигурации относительно прост:
spring.resources.static-locations=classpath:/
spring.mvc.static-path-pattern=/**
Первая строка конфигурации определяет расположение ресурса, а вторая строка конфигурации определяет правило запроса URL. Взяв в качестве примера приведенную выше конфигурацию, если мы определим ее так, это означает, что статические ресурсы могут быть размещены в любом месте в каталоге ресурсов.Конечно, нам также нужно писать полный путь при посещении.Например, в ресурсах /static, есть файл с именем 1.png picture, тогда путь доступаhttp://localhost:8080/static/1.png
, Обратите внимание, что static в настоящее время нельзя опустить.
Определение кода Java
Конечно, в Spring Boot мы также можем настроить его с помощью кода Java, который похож на SSM, настроенный в Java, следующим образом:
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/aaa/");
}
}
Код здесь в основном такой же, как и в предыдущем, который относительно прост и не будет повторяться.
Суммировать
Здесь нужно напомнить, что, увидев, что многие люди используют Thymeleaf, Song Ge также поместит статические ресурсы в каталог ресурсов / шаблонов.Обратите внимание, что каталог шаблонов не является каталогом статических ресурсов, это место для размещения шаблонов страниц. (Хотя шаблон Thymeleaf, который вы видите, имеет суффикс .html, на самом деле это не статический ресурс). Что ж, благодаря приведенному выше объяснению, я считаю, что у всех есть глубокое понимание расположения статических ресурсов в Spring Boot, и в проекте больше не должно быть ошибок!
Обратите внимание на общедоступную учетную запись [Jiangnan A Little Rain], сосредоточьтесь на технологиях с полным стеком, таких как Spring Boot + микросервисы и разделение интерфейса и сервера, делитесь регулярными видеоуроками, отвечайте на Java после того, как уделите внимание, и получайте Сухие товары Java тщательно приготовлены Songge для вас!