SpringBoot 干货教程 | 第五章:SpringBoot 与 JSP

原创 springboot

现在有很多架构是基于微服务、前后端分离的形式来做,不过对于传统的应用和团队,后端模板的使用依然是最便捷的,毕竟要组件一个多工种的开发团队要投入不小的时间和其它资源成本。

我们在 SSH 盛行的阶段,使用 FreeMarker 模板和 jsp 的工程是最多的,也是比较合适的。

那么 SpringBoot 应该搭配什么后端视图模板呢?其实 SpringBoot 官方推荐和推行的视图是 Thymeleaf,这在后面我们会讲。

本章主要讲解 jsp 在 SpringBoot 下的配置和应用。为什么?考虑到目前使用 JSP 作为视图的开发团队还是比较多的,而 SpingBoot 对 jsp 的支持并不理想,默认情况下,SpringBoot 配置的视图是 Thymeleaf,我们需要手动修改配置才能支持 jsp 视图。

不过选用什么视图,对使用 SpringBoot 影响并不大,所以这里只讲配置搭建,后面的教程可能会使用 Thymeleaf 作为视图。

我们本章的目标就是整合 SpringBoot Web 项目使用 jsp 作为视图输出。

构建工程

首先按照前面的教程,任选一种自己喜欢的方式构建 SpringBoot 工程,工程名为 springboot-jsp

需要注意的是,使用 jsp 作为视图的话,maven Packaging 只能选择 War,是不支持以 Jar 包的方式来启动的。

选择一个 Web 模块依赖就够了,然后选择 Finish 完成工程初始化。

对比上图,我们可以看到它比往常的项目多了一个 ServletInitializer 类,并且继承自 SpringBootServletInitializer,默认重写了父类的 configure 方法。

这里就是创建工程的时候选择 War 构建包和 Jar 的区别之一,SpringBoot jar 包启动方式都是直接从包含 main 方法,并且被 @SpringBootApplication 注解的 Application 主类开始的,但是 jsp 工程不能通过 jar 包的方式启动,只能通过外部 tomcat 容器来运行。

SpringBootServletInitializer 这个类是 SpringBoot 提供的另一个 web 程序初始化的入口,当我们使用外部容器(下一章讲解使用外部 tomcat 容器)运行项目时会自动加载并且装配的。

实现了 SpringBootServletInitializer 的子类需要重写一个 configure 方法,方法内自动根据 SpringbootJspApplication.class 的类型创建一个 SpringApplicationBuilder 交付给 SpringBoot 框架来完成初始化运行配置。

这里 SpringbootJspApplication 类就是被 @SpringBootApplication 注解修饰的入口类,但是我们使用 jsp 作为视图的时候不能通过它来直接启动项目,因为它不能识别 jsp 工程结构。

至于为什么不能识别,那就是 SpringBoot 没有实现这块的加载器。至于为什么没有实现,那原因肯定有很多的,造轮子的事情需要适可而止嘛,而且 SpringBoot 本身就不愿意在 jsp 身上再投入资源,转而推广 Thymeleaf,这是一个认知和选择的问题。

配置 SpringBoot 依赖

打开 pom.xml(maven 配置文件)可以看到我们之前构建项目时已经添加了 web 模块,而 SpringBoot 给我们自动添加了 spring-boot-starter-web 配置引入。

SpringBoot 默认在 spring-boot-starter-web 模块中引入了 tomcat 组件依赖,这里我们就不需要重复引入 tomcat 组件了。

引入 jsp 依赖

要使用 jsp 作为视图输出,首先需要添加 jsp 的 maven 依赖。

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

引入 servlet 依赖

虽然 SpringBoot 默认包含了 tomcat 运行容器,但是我们在编译包含 jsp 文件的工程的时候,依然是需要提供 servlet 的依赖的,这只在编译时有用,所以 scope 设置为 provided

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

引入 JSTL 标签库依赖

除了上面的 jsp、servlet 支持以外,如果你还需要在 jsp 页面使用 jstl 标签来处理界面逻辑,那么需要引入 jstl maven 依赖。

<!-- JSTL (JSP standard Tag Library) JSP 标准标签库 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

配置视图

使用过 maven 创建 web 工程的同学肯定清楚项目的结构是什么样子的:

+ src
    + main
        + java
        + resources
        + webapp

创建 webapp

webapp 目录就是用来存放视图和其它文件的,这算是一种约定吧,其实你如果知道容器的加载原理的话,放在哪里都是可以的。

我们这里就按这种约定来做,首先在 main 下创建 webapp 目录,然后在 webapp 目录下创建 WEB-INF。你应该记得 WEB-INF 下的文件是不能够直接访问的,必须通过 servlet 或者 controller 去访问,所以是 “安全的”,我们把视图文件放在这个神奇的 “安全目录” 下,在里面创建 view 目录,顾名思义,存放视图用的,我们把 jsp 文件集中放置在 view 目录中。

创建 index.jsp

view 目录下创建一个 jsp 文件,作为我们演示的终极目标,没有复杂的功能,就是一个基本结构的 jsp 文件。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
Hello SpringBoot JSP!
</body>
</html>

创建 controller

com.daimafans.springbootjsp 包下创建 controller 包,然后创建 IndexController

@Controller
public class IndexController
{
    @RequestMapping(value = "index", method = RequestMethod.GET)
    public String index()
    {
        return "index";
    }
}

@RequestMapping value 中的 index 为页面访问子地址,return 中的 index 为对应视图文件的名称,也就是让 SpringBoot 使用 index.jsp 来输出 /index 请求。

配置 application.properties

这是让 SpringBoot 支持 jsp 的关键,我们需要配置使 SpringBoot 识别和找到 jsp 文件。

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

spring.mvc.view.prefix 指向视图文件逻辑目录,spring.mvc.view.suffix 定义了视图文件后缀。

运行项目

工程的开发和配置到这里就算完成了。

现在运行这个工程有两种方式,一种是打包放到 tomcat 里,然后重启 tomcat 容器;另一种是通过 IDEA 来启动,这在开发过程中是首选。下面简单介绍这两种方式。

Tomcat 容器运行

如果喜欢 mvn,进入工程项目根目录,使用 mvn clean package -DskipTests 把工程编译打包为 war 包。

我们的工程打包后为 springboot-jsp-0.0.1-SNAPSHOT.war,这有点忒长!

一种方法是不管名称,把 war 解压后,里面的文件全部拷贝到 tomcat webapps/ROOT 下,这样访问的时候就可以不带工程名,直接以 http://locahost:8080/index 来访问。index 是 controller 映射的名称。

另一种方法是在放到 tomcat webapps 目录下的时候,把 war 包名称手动改短一点,比如 demo.war。当然这是比较麻烦的,可以在 pom.xml 中配置打包名称做到一劳永逸。

<!-- 在 pom.xml 的 build 下添加 finalName -->
<build>
    <finalName>demo</finalName>
</build>

在 maven 中这样配置,使用 mvn 打包的时候就可以生成如 demo.war 或 demo.jar 的包了。

把 demo.war 放到 tomcat/webapps 下,启动 tomcat,通过 http://127.0.0.1:8080/demo/index 来访问。

IDEA 运行

菜单 File->Project Structure,或者从工具栏直接进入。选择 Modules->Web,如果没有 Web 的话,点击上方的绿色加号添加一个 Web,配置 Deployment DescriptorsWeb Resource DirectoriesWeb Resource Directory 指向工程 webapp 目录, Path Relative to Deployment Root/

然后在 Artifacts 中新建一个 Web Application: Exploded 类型的 artifacts,选择 From Module...,选择我们的 Maven 工程。

然后我们在启动项目按钮边上下拉点击 Edit Configurations...,配置一个本地的 Tomcat。

完成之后就可以使用 Tomcat 来启动项目了,开发的时候尽量选择 Debug 方式启动,这样可以方便断点调试。


本文收录在 SpringBoot 干货系列教程:SpringBoot 干货教程 | 第一章:教程目录大纲和前戏

教程代码下载:https://github.com/liuqianfei/springboot-course-code

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论