html #css #spring #tomcat #thymeleaf
#HTML #css #весна #tomcat #thymeleaf
Вопрос:
Я пытаюсь написать свой веб-сайт с spring framework в back- и thymeleaf во внешнем интерфейсе на локальном сервере tomcat. Я пытаюсь добавить css в свой html-файл. Кажется, что файл Css связан на сервере, но devtools показывает, что он пуст. Знаете, что я мог пропустить?
EDIST: извините за публикацию фотографий, в следующий раз я буду знать лучше. Я оставил минимум, который хотел показать.
index.css
h1{
color: red;
}
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleag.org">
<head>
<meta charset="UTF-8">
<title>Index</title>
<link rel="stylesheet" href="../css/index.css" th:href="@{../css/index.css}"/>
</head>
<body>
<h1>Hello</h1>
<a href="greeting">Greeting</a>
<a href="registration">Registration</a>
</body>
</html>
HomePageController.java
package com.krs.GreatBookOfDiet.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@Controller
public class HomePageController {
@GetMapping("")
public String index(Map<String, Object> model){
return "index";
}
}
GreatBookOfDietConfiguration.java
package com.krs.GreatBookOfDiet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.WebProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import java.util.Locale;
@Configuration
public class GreatBookOfDietConfiguration implements WebMvcConfigurer {
@Autowired
private ApplicationContext applicationContext;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**").addResourceLocations("/WEB-INF/pdf/");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public LocaleResolver localeResolver(){
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor(){
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Bean
public ViewResolver thymeleafResolver(){
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setOrder(0);
return viewResolver;
}
@Bean
public SpringResourceTemplateResolver templateResolver(){
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine(){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
}
Комментарии:
1. прежде всего, попробуйте поставить правильную ссылку на thymeleaf: xmlns:th =» thymeleaf.org »
2. Хорошо, извините за это, я не часто использую stack :/. Я попытался использовать ссылку в html-документе. Ничего не произошло. Тем не менее, я получаю файл на сервере, но он пуст. : c Если вам нужно что-то еще, я могу поделиться проектом.
3. Вам нужно добавить к вашему вопросу свою конфигурацию Spring MVC (
@Configuration
класс или XML-файл). По умолчанию SpringDispatcherServlet
не обслуживает никаких статических ресурсов (см. documentation ), а сервлет Tomcat по умолчанию не обслуживает содержимое/WEB-INF
.
Ответ №1:
Ваши статические ресурсы в /WEB-INF/css
папке не обслуживаются Spring, поэтому запрос на http://example.com/app/css/index.css
возвращает ошибку 404.
Вам необходимо изменить свой addResourceHandlers
метод:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**")
.addResourceLocations("/WEB-INF/pdf/");
registry.addResourceHandler("/css/**")
.addResourceLocations("/WEB-INF/css/");
}
Примечание: учитывая популярность Spring Boot, вы можете рассмотреть возможность использования тех же местоположений для статических ресурсов (см. Документацию), что приводит к следующей конфигурации:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/");
}
Комментарии:
1. Хм, я попытался настроить свой обработчик ресурсов на то, что вы сказали, и он все еще не работает (ошибка 404 при попытке доступа к файлу). Я считаю, что это может быть одной из причин, но все равно не работает. Я не понимаю вторую часть ответа об одних и тех же местах, вы имеете в виду, должен ли я помещать все, например, файлы .pdf и .css, в один каталог?