我在Spring-MVC中显示jsp页面时遇到问题。 这是具有Gradle和IntelliJ CE的基本 hello world Spring-MVC:
我得到以下错误页面:
这是我的build.gradle:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.5.RELEASE")
}
}
plugins {
id 'java'
}
group 'com.helloct'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
bootJar {
baseName = 'gs-serving-web-content'
version = '0.1.0'
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-devtools")
compile("org.springframework.boot:spring-boot-starter")
compile("org.springframework:spring-jdbc")
compile("com.h2database:h2")
compile("com.fasterxml.jackson.core:jackson-databind")
compile('javax.servlet:jstl')
compile('org.apache.tomcat.embed:tomcat-embed-jasper')
compile 'javax.servlet.jsp:javax.servlet.jsp-api'
testCompile("junit:junit")
}
视图解析器文件:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "hello")
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
控制器页面:
@Controller
public class JSPController {
@GetMapping("/jspPage")
public String home(){
return "jspPage";
}
}
jsp page的位置:
application.properties文件的内容:
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
使用默认模板引擎,页面可以正确显示,但使用jsp则无法正常工作
记录错误:
https://hastebin.com/lijekesoti.apache
注意:我知道Thymleleaf是Spring的推荐模板,但出于某种原因我想使用JSP
UPDATE
在this post答案的帮助下阅读paulsm4后,删除以下行:
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
并删除视图解析器文件解决了我的问题。
答案 0 :(得分:3)
事实证明,让JSP与Spring Boot一起使用并非易事。事实证明,Spring Boot 1.x(Spring Boot / JSP的大多数教程都写到了)和Spring Boot 2.x之间有显着变化。
我发现这些资源很有帮助:
我让JSP可以同时使用Maven和Gradle的Spring Boot 1.x和2.x。我的项目在GitHub上:
这些是我需要做的重点:
我使用Eclipse STS创建了我的入门项目。
指定“战争”包装非常重要(与默认“战争”相比)
我在build.gradle
中添加了以下依赖项:
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile('javax.servlet:jstl')
compile('javax.servlet:javax.servlet-api')
compile('org.apache.tomcat.embed:tomcat-embed-jasper')
compile('org.webjars:bootstrap:4.1.0')
testImplementation('org.springframework.boot:spring-boot-starter-test')
事实证明,'tomcat-embedded'不需要指定 (默认情况下,它包含在spring-boot-starter-web中)。
但是事实证明,除非您明确包含tomcat-embed-jasper
,否则嵌入式Tomcat不会处理JSP。
不指定“百里香”依赖关系,它将与“碧玉”冲突。
根据其他教程,我在application.properties
中添加了以下几行:
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
我添加的这些行也添加到了我的根类:
@SpringBootApplication
public class Test7Application extends SpringBootServletInitializer {
...
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Test7Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Test7Application.class, args);
}
不幸的是,“其他教程”经常说要创建文件夹src/main/webapp/WEB-INF/jsp/
。这将不起作用。
相反,我将test.jsp
文件放在文件夹src/main/resources/META-INF/resources/WEB-INF/jsp
中。
这些链接说明了原因:
这时,我已经能够使用Spring Boot成功显示静态页面和.jsp页面。
希望对您有帮助!