Spring Boot 学习系列(10)—SpringBoot+JSP的使
此文已由作者易国强授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
解决问题
随着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的使的更多相关文章
- spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战
SpringBoot + Redis +SpringSession 缓存之实战 前言 前几天,从师兄那儿了解到EhCache是进程内的缓存框架,虽然它已经提供了集群环境下的缓存同步策略,这种同步仍然需 ...
- Spring boot(二) springboot + jsp
官方不推荐JSP在Spring Boot中使用! 一.添加依赖 在pim.xml 里面添加以下 jsp依赖 <dependency> <groupId>org.springfr ...
- Spring Boot 学习系列(03)—jar or war,做出你的选择
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...
- Spring Boot 学习系列(09)—自定义Bean的顺序加载
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...
- Spring Boot 学习系列(08)—自定义servlet、filter及listener
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...
- Spring Boot 学习系列(07)—properties文件读取
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...
- Spring Boot 学习系列(04)—分而治之,多module打包
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...
- Spring Boot 学习系列(序)—Spring Boot
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...
- Spring Boot 学习系列(06)—采用log4j2记录日志
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...
随机推荐
- handler------post传送方式
package com.qianfeng.gp08_day26_hanlder2; import android.os.Bundle; import android.os.Handler; impor ...
- win 下 apache 虚拟主机配置方式
虚拟主机的配置在apache安装目录下/conf/extra/httpd-vhosts.conf文件中,需要在/conf/httpd.conf中开启. LoadModule vhost_alias_m ...
- Eloquent Observer 的小坑
前言 最近开发新的项目不是基于完整的 laravel 框架,框架是基于 laravel ORM 的简单MVC模式.随着项目的成熟和业务需求,需要引入事件机制.简单地浏览了一下 symfony.lara ...
- part1:7-Linux网络配置
1.虚拟机(Vmware)网络配置 VMware虚拟机对于不同的网络环境提供了三种网卡工作模式: Bridged:网桥模式: 在桥接模式下,计算机A充当路由器与虚拟机之间的“桥”,虚拟机通过计算机A的 ...
- 解决启动nginx时报80端口被占用的问题
如何解决启动nginx时报80端口被占用 最近公司的的一个服务器上需要部署多个项目,但80端口只有一个,所有只有使用Nginx来代理,当访问域名时就可以自动 转到IP:端口号,而不需要在域名后面加端口 ...
- 2018.08.30 bzoj4318: OSU!(期望dp)
传送门 简单期望dp. 感觉跟Easy差不多,就是把平方差量进阶成了立方差量,原本维护的是(x+1)2−x2" role="presentation" style=&qu ...
- 被弃用的php函数以及被那个代替
原文链接 http://blog.csdn.net/a11085013/article/details/8937848 下面列举了部分被弃用的函数: call_user_method ...
- 微信第三方平台解密报错:Illegal key size
今天在交接别人代码的时候遇到的,微信第三方平台解密报的错误,原因: 如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size ...
- 8.7 使用索引-notes
七 正确使用索引 一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这 ...
- hadoop 学习之异常篇
本文旨在给予自己在学习hadoop过程中遇到的问题的一个记录和解决方法. 一. copyFromLocal: java.io.IOException: File /user/hadoop/slaves ...