• SpringBoot第十二篇:整合jsp


    作者:追梦1819
    原文:https://www.cnblogs.com/yanfei1819/p/10953600.html
    版权声明:本文为博主原创文章,转载请附上博文链接!

    引言

      SpringBoot 虽然官方推荐使用 thymelaf 模板引擎,但是也支持jsp,只不过需要做一些修改。本文将讲解 JSP 在 SpringBoot 中的应用。

      说句题外话,本章的话题,比较复杂,也写得比较累。因为 SpringBoot 并不推荐使用 JSP。据我的了解,SpringBoot 和 JSP 整合的项目少之又少。从而,网上这方面的资料比较少。已经存在的资源,内容基本上都是乱七八糟,或者是远离主题的一些东西。

      本章在理解的基础上,做了一一求证,希望不会误导读者,浪费读者的时间。同时,有更加了解这一块的读者,欢迎联系作者一起交流交流。


    版本信息

    • JDK:1.8
    • SpringBoot :2.1.4.RELEASE
    • maven:3.3.9
    • 外部Tomcat : 9.0
    • IDEA:2019.1.1

    使用内嵌Tomcat

    创建项目,我们先看看项目的结构:

    首先,引入 maven 依赖:

    <!--对 web 的支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </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>
        <scope>provided</scope>
    </dependency>
    

      注意,跟 jsp 相关的两个依赖将其设置为 <scope>provided</scope>。这里我们讲解一下 scope 的概念:

      依赖范围就是用来控制依赖和三种classpath(编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围:

    • compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖;
    • test: 测试依赖范围。使用次依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此依赖。典型的例子是Jnuit,它只有在编译测试代码及运行测试的时候才需要;
    • provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时候无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器以及提供,就不需要Maven重复地引入一遍。

    其次,需要在配置文件 application.properties 中配置SpringBoot 对 jsp 的支持,SpringBoot 默认不支持 jsp。

    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
    

    然后,创建测试接口:

    @Controller
    public class JSPController {
        @RequestMapping(value = "/index",method = RequestMethod.GET)
        public String index(Model model){
            model.addAttribute("name","SpringBoot");
            return "index";
        }
    }
    

    启动类不变:

    @SpringBootApplication
    public class JspDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(JspDemoApplication.class, args);
        }
    }
    

      最后,需要注意的是,要运行的是 war,而不是 jar,因为 jar 默认不会将 jsp 复制进去。故,我们需要在 pom.xml 文件中,修改包的类型:

    <packaging>jar</packaging> 修改为 <packaging>war</packaging>

      启动时要注意,项目打包方式是war包,不要通过 main 方法启动。这里用的容器是SpringBoot 内嵌的Tomcat,可以进入 war 包的目录下,通过命令启动:java -jar xxx.war ,访问 http://localhost:8082/index,可以得到对应的页面。


    外部容器

    使用外部的 Tomcat 容器时,不能直接部署上面的 war 包,需要对以上程序进行改造。

    1、修改启动类

    集成 SpringBootServletInitializer ,并继承以下方法:

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    	return application.sources(DemoApplication.class);
    }
    

      外部容器是以类似于web.xml文件配置的方式来启动Spring应用上下文,并非 main 函数。以上的的改造类似在web.xml中配置负责初始化Spring应用上下文的监听器。

    2、修改相关的依赖

    项目部署在外部容器中,会与内嵌的 Tomcat 冲突,需要解决,不然启动会报错。本文列举两个解决方案:

    1) 移出内嵌的 Tomcat

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    并将解析 jsp 的 jar 包 scope 设置为 provided,即:

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    

    2) 添加以下依赖(推荐)

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    

    作者推荐这种解决方案,它同时适合命令行启动,以及部署到外部容器中。


    总结

      本文是分析 SpringBoot 中使用 JSP。JSP相对于模板引擎来说,性能更好。但是,尽管如此,作者并不推荐这种做法,而尽量使用模板引擎 Thymelaf。不了解的读者可以阅读上一章
      源码:我的GitHub


  • 相关阅读:
    16.检查是否为BST
    15.输出单层结点
    14.高度最小的BST
    *13.有向路径检查
    12.二叉树平衡检查
    11.双栈排序
    10.回文链表
    9.链式A+B
    8.链表分割
    7.访问单个节点的删除
  • 原文地址:https://www.cnblogs.com/yanfei1819/p/10953600.html
Copyright © 2020-2023  润新知