SpringBoot与JSP集成

SpringBoot内嵌Web容器的,推荐打成jar包不是war包,如果使用JSP打成war包使用外部容器,这就相当于失去了一些SpringBoot的特性了,所以官方并不推荐使用JSP。

模板引擎其实都差不多,jsp也可以算是模板引擎,SpringBoot推荐的Thymeleaf主要嵌入到html的标签属性,这样对前端很友好,确实要使用的话可以这样。

引入依赖,包括使用jstl标签依赖和支持jsp模板的依赖

    org.springframework.boot
    spring-boot-starter-web


    javax.servlet
    jstl


    org.apache.tomcat.embed
    tomcat-embed-jasper

注:tomcat-embed-jasper依赖中不要添加provided
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" %>


    hello,welcome


hello,welcome


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

image.png

启动后访问http://localhost:8080/hello

image.png

webapp改为WEB-INF就会出现

image.png

如果以上配置都没问题的情况下还是显示404,可以用spring-boot:run的方式启动

image.png

总结: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

你可能感兴趣的:(SpringBoot与JSP集成)