我正在使用Thymeleaf构建Spring Boot MVC应用,并且在将静态内容(例如CSS)加载到页面时遇到问题。
每当我尝试在模板中加载CSS文件时,请求都会失败,并显示错误代码405 Request method 'GET' not supported
。
我尝试了多种不同的方法来引用css文件,例如
<link href="/css/style.css}" rel="stylesheet" type="text/css"/>
<link href="../static/css/style.css}" rel="stylesheet" type="text/css"/>
<link href="/static/css/style.css}" rel="stylesheet" type="text/css"/>
<link th:href="@{/static/css/style.css}" rel="stylesheet" type="text/css"/>
基本上所有先前的所有可能组合,仍然会得到相同的错误。
我的文件结构如下:
└── src
└── main
├── java
│ └── cz
│ └── company
│ └── nps
│ ├── NpsApplication.java
│ ├── WebConfig.java
│ └── controller
│ └── SurveyController.java
└── resources
├── application.properties
├── messages.properties
├── messages_CZ.properties
├── messages_EN.properties
├── static
│ ├── css
│ │ └── style.css
│ ├── img
│ │ └── favicon.ico
│ └── js
└── templates
├── footer.html
├── header.html
└── survey.html
WebCofig.java:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Bean
public LocaleResolver localeResolver()
{
final SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(new Locale("cs", "CZ"));
return localeResolver;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
我在做什么错?根据我发现的所有材料,这应该可以正常工作。
修改1: build.gradle:
plugins {
id 'org.springframework.boot' version '2.1.5.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'cz.company'
sourceCompatibility = '11'
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.webjars:bootstrap:3.3.7'
implementation 'dom4j:dom4j:1.6.1'
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
implementation 'javax.jws:javax.jws-api:1.1'
implementation 'javax.xml.ws:jaxws-api:2.3.1'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
答案 0 :(得分:0)
这应该为您工作:-
<link rel="stylesheet" type="text/css" th:href="@{/static/css/style.css}" />
更新1:-您的web.xml中是否具有针对js和CSS的Servlet映射? 检查这些行。如果不存在,请添加并再次检查。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
答案 1 :(得分:0)
由于您正在使用批注,因此请将其添加到WebConfig类:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
}
这将创建您的应用程序获取资源文件所需的映射(根据需要更改资源位置)。
答案 2 :(得分:0)
好的,控制器中确实有一个愚蠢的错误。
原始控制器类如下:
@Controller
public class SurveyController {
@GetMapping("/nps")
public String getSurvey() {
return "survey";
}
// TODO
@PostMapping
public String postSurvey() {
return "";
}
}
请注意,我忘记为@PostMapping
注释添加名称。这似乎引起了问题。当我将其更改为@PostMapping("/nps")
时,一切正常。
为防万一,我使用<link href="/css/style.css" rel="stylesheet" type="text/css" />
来引用样式表。