虽然Spring Boot 不推荐使用JSP,但是有时候有些特殊的老项目不得不用,可是我们又想要使用Spring Boot 的强大自动配置功能,那么该怎么做呢?
这篇博文讲解如何使用Spring Boot 集成JSP.
1.创建项目类型由jar 改为war
2.勾选web模块
3. 检查pom.xml
我们可以看到pom.xml 和之前的差不多都一样,除了打包类型由原来的jar修改成了war
其次我们需要添加web模板支持,所以要添加spring-boot-starter-web由于我们在JSP页面需要使用JSP标签库,所以要加入JSTL标签库依赖
War包部署到外部的Tomcat中已经包含了这些,所以需要添加以下依赖
spring-boot-starter-tomcat 和 tomcat-embed-jasper 否则会和内嵌的Tomcat
容器发生冲突,并且provided不能修改也不能注释掉
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xingyun</groupId>
<artifactId>spring-boot-with-jsp-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-boot-with-jsp-sample</name>
<description>spring boot with jsp sample for Spring Boot</description>
<properties>
<java.version>12</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--编译JSP,包含了tomcat-embed-core,tomcat-embed-el-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--用于编译jsp-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!--如果使用了JSTL标签库则需要添加如下依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 我们还需要一个继承了SpringBootServletInitializer 的类
这个类如果使用的是Intellij Idea ,会发现已经自动为我们创建好了。 这个类是必须的,没有它,我们将无法使用Spring Boot
集成JSP. Spring Boot 是通过启动一个main 方法启动的, 这样做就是在一个serverlet 中启动我们的main 方法
ServletInitializer.java
package com.xingyun.springbootwithjspsample;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringBootWithJspSampleApplication.class);
}
}
5.新建传统的web目录结构
原来的目录结构是这样
我们需要新建几个文件夹目录
index.jsp 用于欢迎页面
home.jsp 位于WEB-INF/views 文件夹下,表示不可以直接访问
index.jsp 简单修改如下:
<%--
Created by IntelliJ IDEA.
User: fairy
Date: 2019/4/20
Time: 10:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Index Page</title>
</head>
<body>
Hello Index Page
</body>
</html>
home.jsp
<%--
Created by IntelliJ IDEA.
User: fairy
Date: 2019/4/20
Time: 10:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Home Page</title>
</head>
<body>
Hello Home Page
</body>
</html>
6.application-dev.properties
由于我们将会使用外部容器,因此之前的
server.port 和server.servlet.context-path=
两个属性将无效
除此之外,我们还需要配置JSP 模板路径
application-dev.properties
# 值得注意的是这两个配置属性将无效,这个属性仅作用于内嵌的容器
#server.port=8080
#server.servlet.context-path=/
# Spring Boot 日志
# SpringBoot默认使用的的日志框架是slf4j + Logback
# Logback 没有 FATAL 级别,对应着 ERROR
# 日志级别从低到高
# TRACE < DEBUG < INFO < WARN < ERROR
## 默认配置INFO、WARN、ERROR级别的日志输出到控制台
logging.level.root=info
##配置自己的应用程序日志级别,com.xingyun 是自己应用程序的根包
logging.level.com.xingyun=debug
##设置其他全部的日志等级
logging.level.*=warn
# 配置Spring Web MVC
# 配置JSP模板前缀
spring.mvc.view.prefix=/WEB-INF/views/
# 配置JSP模板后缀
spring.mvc.view.suffix=.jsp
# 静态资源拦截,多个静态资源路径以逗号分隔
spring.mvc.static-path-pattern=/static/**
7.新建一个Controller
值得注意的是,我们要返回的是JSP页面,因此就不能在这里用@RestController注解了
当然可以新建另外一个类使用返回JSON API 数据是可以的。
package com.xingyun.springbootwithjspsample.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping(value = "/home.do")
public String homePage(){
return "home";
}
}
8.注意我们启动就不能通过main 方法启动了,而是添加一个tomcat 部署到上面
9.启动成功后默认在webapp 文件夹下寻找index.jsp 页面
10.访问URL 可以看到:http://localhost:8014/spring_boot_with_jsp_sample/
11.访问我们的Controller
http://localhost:8014/spring_boot_with_jsp_sample/home.do
好了,本篇教程到此结束~
更多关注我的这个系列的专栏:Spring Boot 2.x 最佳实践手册