此文已由作者易国强授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

解决问题

  • 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架,方便在后续新项目中继续使用。

  • 本章主要介绍了如何采用Spring Boot改造传统的jsp项目。

难点

  • 首先,Spring Boot + JSP的方式肯定是可以使用的。不过官方早就说过不推荐使用jsp来进行前端页面的开发,官方推荐的是Themeleaf,更加符合现在前后端分离的开发模式。

  • 使用Spring Boot + JSP 的方式,主要是注意一下配置上的变化,下面一起来看下。

使用介绍

  • 既然我们选择Spring Boot的框架,还是比较推荐采用jar的形式进行打包部署,这样开发人员可以更方便的控制tomcat容器(内置默认容器)的参数配置,应用部署也更加简单。

  • 首先,项目pom.xml文件中的packaging类型确保是jar类型。示例如下:

<groupId>com.netease.ms</groupId><artifactId>common-ms</artifactId><packaging>jar</packaging><version>1.0.0</version>
  • spring boot的版本可根据使用需求而定,这里我使用的是目前最新的稳定版本1.5.9.RELEASE。示例如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version></parent>
  • 然后,引入starter-web组件,这个组件中会包含内置的tomcat容器。示例如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId></dependency>
  • 此外,还需要加入内置tomcat对jsp文件解析的支持,如果有用到jstl标签的话,也一并加入相关的依赖。示例如下:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId></dependency><dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>${jstl.version}</version></dependency>
  • 加入上述依赖后,注意在build插件中加入如下配置,需要注意的是,这里spring-boot-maven-plugin插件的版本指定的是1.4.2.RELEASE,自己有测试使用默认的1.5.9.RELEASE或其他1.5.x版本不行(IDEA直接运行启动没问题,打成jar包单独运行就会报404的错误,找不到相关的jsp页面),至于除1.4.2.RELEASE版本外其他版本是否可行,笔者并未尝试,有清楚原因的读者欢迎指教。另外一个比较关键的是,打成jar包后,实际上是识别不了webapp目录的,所以我们把webapp目录下的相关文件copy到META_INF/resources下面了。这样spring boot的fat jar在启动时是能够识别这个资源路径的。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.4.2.RELEASE</version>
                <configuration>
                    <mainClass>test.Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <!-- spring热部署,非必须 -->
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.6.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
            <!-- 忽略无web.xml警告 如果打包成war则需要-->
            <!--<plugin>-->
                <!--<groupId>org.apache.maven.plugins</groupId>-->
                <!--<artifactId>maven-war-plugin</artifactId>-->
                <!--<configuration>-->
                    <!--<failOnMissingWebXml>false</failOnMissingWebXml>-->
                <!--</configuration>-->
            <!--</plugin>-->
        </plugins>
        <resources>
            <!-- 打包时将jsp文件拷贝到META-INF目录下 -->
            <resource>
                <!-- 指定resources插件处理哪个目录下的资源文件 -->
                <directory>src/main/webapp</directory>
                <!--注意必须要放在此目录下才能被访问到 -->
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <include>**/**</include>
                </includes>
            </resource>
             <!-- 其他资源的拷贝 -->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/**</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
  • 完成上述配置后,pom.xml文件的必要配置就ok了,接下来我们把项目中用到的静态资源由原来的webapp目录移到src/main/resources目录下,主要的目录结构如下图所示。

  • 最后,我们在application.properties文件中配置上jsp的解析前缀和后缀,以及静态资源的映射路径,如下所示,这里因为我的jsp存放路径是WEB-INF/views,所以前缀加上了这个路径,如果你自己项目下并无此路径,做相应的修改即可,如spring.mvc.view.prefix=/

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#定义静态资源的映射路径
spring.mvc.static-path-pattern=/resources/**
  • 另外传统的web项目中,肯定是有web.xml文件的,关于这个文件,我们主要是配置了一些servlet、filter以及listener,改成代码的方式配置也很简单,大家可以参照前面系列文章中介绍进行相应的改写即可,在此不再赘述。

  • 还有一个需要提下的地方,就是把我们传统的项目改造成spring boot 项目时,往往会觉得很麻烦,其原因主要是在于spring boot的去xml化,如果把已有的xml中的配置再一点点的改成java代码的实现方式,确实会令人崩溃。所以,对于已有项目的改造,尽可能的保留原有的xml配置方式,这样更简单方便。示例如下:

@ImportResource("classpath:spring/application-context.xml")@SpringBootApplication(scanBasePackages = {"......"})public class CommonMsApplication {
    ......
}

最后

  • 改造完成后,发现其实spring boot + jsp的方式使用并不复杂,只是在改造传统项目时,相应的配置需要做些变更。当然,每个项目使用的组件不尽相同,也许在实际的改造过程中,会遇到这样或那样的问题,耐下心来一步步找到问题原因,相信也能很快解决的。

  • 不足之处,欢迎指正,谢谢~

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 聊一聊数据分析师这个职业

Spring Boot 学习系列(10)—SpringBoot+JSP的使的更多相关文章

  1. spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战

    SpringBoot + Redis +SpringSession 缓存之实战 前言 前几天,从师兄那儿了解到EhCache是进程内的缓存框架,虽然它已经提供了集群环境下的缓存同步策略,这种同步仍然需 ...

  2. Spring boot(二) springboot + jsp

    官方不推荐JSP在Spring Boot中使用! 一.添加依赖 在pim.xml 里面添加以下 jsp依赖 <dependency> <groupId>org.springfr ...

  3. Spring Boot 学习系列(03)—jar or war,做出你的选择

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...

  4. Spring Boot 学习系列(09)—自定义Bean的顺序加载

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...

  5. Spring Boot 学习系列(08)—自定义servlet、filter及listener

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...

  6. Spring Boot 学习系列(07)—properties文件读取

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...

  7. Spring Boot 学习系列(04)—分而治之,多module打包

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...

  8. Spring Boot 学习系列(序)—Spring Boot

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...

  9. Spring Boot 学习系列(06)—采用log4j2记录日志

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...

随机推荐

  1. [leetcode]560. Subarray Sum Equals K 和为K的子数组

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  2. nginx反向代理架构与安装配置(一)

    这里我们准备四台虚拟机,二台负载均衡(LB01,LB02),二台web服务器(WEB01,WEB02).   这里默认所有软件都安装在/data目录下.   四台虚拟机的初始安装是centos7的最小 ...

  3. linux下xampp(apache)中配置域名访问,以及遇到的问题

    xampp中apache使用域名访问 一.首先找到/opt/lampp/etc/httpd.conf: # Virtual hosts Include etc/extra/httpd-vhosts.c ...

  4. Laravel Eloquent Model->isDirty() Function

    1 引言 introduction 有时,我们需要在 Model 某些属性发生变化时,作出相应的处理. 这时,我们可以使用 Model->isDirty() 方法进行判断. 2 场景 比如,姓名 ...

  5. 01 Linux 网络配置和克隆

    Linux 网络配置和克隆 一.配置 Linux 网络 当在 VMware 中安装完 Linux 以后需要通过一些网络配置才能使 Linux 能够连能网络: 首先如果是在虚拟机上安装的 Linux 必 ...

  6. canvas标签的基本用法

    1.canvas和其他标签一样使用,但是IE8以下是不支持的,可以在canvas里面加一个span用来提示,例如: <canvas> <span>IE8不支持canvas< ...

  7. android textview settext卡顿深层次原因

    最近在公司项目里面发现listview里面的textview在调用settext函数的时候非常耗时,当时都有点不敢相信,这是因为如果你把textview设置成wrap_content,则每次调用set ...

  8. C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)

    ( 原书第四章,General Concepts) 只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述. namespace std:新的std子空间包括: std::tr1, ...

  9. 2018.09.15 hdu3018Ant Trip(欧拉路)

    传送门 显然答案等于各个连通分量的笔画数之和. 因此我们dfs每个连通分量计算对答案的贡献. 对于一个连通分量,如果本来就有欧拉回路那么只需要一笔. 否则需要寄点数/2那么多笔才能画完. 知道这个结论 ...

  10. linux CentOS 7 安装 RabbitMQ Erlang 21.0

    1. 安装erlang 安装依赖环境 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixO ...