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

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

解决问题

  • 随着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. 无法更新 EntitySet 因为它有一个 DefiningQuery

    DbFirst 使用 MVC+EF+仓储+ADO.NET实体数据模型 无法更新 EntitySet“Book”,因为它有一个 DefiningQuery definingqueryentityfram ...

  2. 使用threejs点云秀出酷炫的图片效果(一)

    来源:http://blog.csdn.net/srk19960903/article/details/70214556 使用了点云拼凑出了照片轮播十分有趣,于是用threejs实现这个效果. 首先这 ...

  3. Gitlab不小心关闭了sign-in,无法登录web的坑。。。

    手贱一不小心用root在gitlab后台把登录功能给关了,当时我就懵逼了. 解决方法如下: #进入数据库修改配置[root@gitlab-server ~]# gitlab-psql gitlabhq ...

  4. Linux下使用openssl生成证书

    利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件. 参考:http:// ...

  5. pycharm中的常用快捷键

    查找 Ctrl + F  替换 Ctrl + R 注释 Ctrl + /  去掉注释 Ctrl + / Function   Shortcut Use this shortcut to... Clos ...

  6. BZOJ4407 于神之怒加强版 - 莫比乌斯反演

    题解 非常裸的莫比乌斯反演. 但是反演完还需要快速计算一个积性函数(我直接用$nlogn$卷积被TLE了 推荐一个博客 我也不想再写一遍了 代码 #include<cstring> #in ...

  7. [Selenium] jsclick

    SeleniumUtil.jsClick(driver, saveButtonEl);

  8. 树结构(三)----平衡二叉树(AVL树)

    将二叉排序树的的缺点优化,继承二叉排序的树的优化 左子树和右子树的高度差的绝对值不超过1

  9. 2018.07.08 NOIP模拟 第K小数(二分)

    第K小数 题目背景 SOURCE:NOIP2016-AHSDFZ T1 题目描述 有两个正整数数列,元素个数分别为 N 和 M .从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 ...

  10. gj2 python中一切皆对象

    2.1 python中一切皆是对象 动态语言和静态语言的区别,Python的面向对象更彻底 同时动态语言,代码的灵活性高 没有编译(检查)的过程,错误只有在运行起来后才会发现 函数和类也是对象,属于p ...