美文网首页SpringBoot
SpringBoot与JSP集成

SpringBoot与JSP集成

作者: 意识流丶 | 来源:发表于2019-01-05 23:56 被阅读2次

    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

    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集成

        本文链接:https://www.haomeiwen.com/subject/vyxjrqtx.html