前面我们说过Spring Boot的部署方式,可以通过jar和war包两种,其中打成jar包通过java -jar方式启动是不支持jsp的,所以若要在Spring Boot中使用jsp,需要打成war包部署到web容器中。
1.pom文件配置
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 打包将不会吧这个包打进去 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
设置为达成wa包,添加jsp所需要的依赖,且spring-boot-starter-tomcat依赖的作用域设置为provided,表示打包不会将这个依赖打进去。
2.继承SpringBootServletInitializer
因为为要打war包运行在外部tomcat中所以,需要继承SpringBootServletInitializer重写configure方法
@SpringBootApplication
public class SpringbootLearnDemo3DevtoolsApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringbootLearnDemo3DevtoolsApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootLearnDemo3DevtoolsApplication.class);
}
}
3.application.yaml配置
spring:
mvc:
view:
prefix: /template/ #jsp位置
suffix: .jsp # 后缀名
6.controller
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(Model model) {
model.addAttribute("say", "hello jsp");
return "index";
}
}
5.jsp的位置
jsp如果放到resources目录及其子目录里面默认是访问不到的。
解决方案:将其设置成web资源目录,如下:
File -->Project Structure
按照下图顺序进行配置
重启项目访问:
现在我们再次按照上图方式在resources同级目录配置一个webapp目录,这时候转发的是哪个jsp呢?
目录结构如下:
重启项目,再次访问:
显示的是resource目录下的jsp;
现在修改上图中配置的顺序,将webapp路径放入第一条,resources路径放入第二条。
可见jsp路径的优先级,是根据配置的先后顺序,配置在前面的优先级更高。