SpringBoot与JSP集成
SpringBoot内嵌Web容器的,推荐打成jar包不是war包,如果使用JSP打成war包使用外部容器,这就相当于失去了一些SpringBoot的特性了,所以官方并不推荐使用JSP。
模板引擎其实都差不多,jsp也可以算是模板引擎,SpringBoot推荐的Thymeleaf主要嵌入到html的标签属性,这样对前端很友好,确实要使用的话可以这样。
引入依赖,包括使用jstl标签依赖和支持jsp模板的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
注:tomcat-embed-jasper
依赖中不要添加<scope>provided</scope>
provided
表明对于编译和测试有效,但在运行时候无效,IDEA下默认不提供
servlet-api.jar
时,使用scope=provided
就会缺少对应的jar
包,在下面测试的时候就会发现出现404了,谷歌浏览器下访问会直接下载文件
controller层
@Controller
public class WelcomeController {
@GetMapping("/hello")
public String welcome() {
return "welcome";
}
}
welcome.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello,welcome</title>
</head>
<body>
hello,welcome
</body>
</html>
Springboot配置文件,主要配置jsp文件路径
spring:
mvc:
view:
prefix: /jsp/
suffix: .jsp
前缀后缀写错了控制台会发出警告:Path with "WEB-INF" or "META-INF"
来源于org.springframework.web.servlet.resource.ResourceHttpRequestHandler
类的isInvalidPath
方法
protected boolean isInvalidPath(String path) {
if (!path.contains("WEB-INF") && !path.contains("META-INF")) {
if (path.contains(":/")) {
String relativePath = path.charAt(0) == '/' ? path.substring(1) : path;
if (ResourceUtils.isUrl(relativePath) || relativePath.startsWith("url:")) {
if (logger.isWarnEnabled()) {
logger.warn("Path represents URL or has \"url:\" prefix: [" + path + "]");
}
return true;
}
}
if (path.contains("..") && StringUtils.cleanPath(path).contains("../")) {
if (logger.isWarnEnabled()) {
logger.warn("Path contains \"../\" after call to StringUtils#cleanPath: [" + path + "]");
}
return true;
} else {
return false;
}
} else {
if (logger.isWarnEnabled()) {
logger.warn("Path with \"WEB-INF\" or \"META-INF\": [" + path + "]");
}
return true;
}
}
注:自建webapp
目录,jsp
文件要放在webapp
下,不能放在WEB-INF
下
启动后访问http://localhost:8080/hello
把webapp
改为WEB-INF
就会出现
如果以上配置都没问题的情况下还是显示404,可以用spring-boot:run
的方式启动
总结:SpringBoot与JSP集成后推荐大家使用spring-boot:run
的方式启动,就肯定没问题的
至于原因可以参考:
https://segmentfault.com/a/1190000009785247
注:以上集成的前提是单模块项目,多模块项目不适合使用
如果main
方法所在的项目是maven
顶级项目,则用main
方法运行,可以访问jsp
如果main
方法所在的项目是maven
的子模块项目(如 Main-Parent
项目中,包含maven-A
子模块,正好main
方法就在maven-A
模块中),用main
方法运行,无法访问jsp