81. Spring Boot集成JSP疑问【从零开始学Spring Boot】
【原创文章,转载请注明出处】
针对文章:
(19)Spring Boot 添加JSP支持【从零开始学Spring Boot】
有网友提了这么一些疑问:
1、Spring Boot使用jsp时,仍旧可以打成jar包的形式吗?
2、Spring Boot使用jsp时,比如说css,image,js 等三种静态资源文件,应该放在什么目录下?这些静态资源映射,在spring boot中具体应该怎么做?
例如,下面是spring中做的静态资源映射,但是在spring boot中不知道怎么处理:
<!-- springmvc.xml 资源映射 -->
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/image/" mapping="/image/**"/>
3、下面这个tomcat的包必须导入吗,spring-boot-starter-web中不是有一个内嵌的tomcat吗?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<1>、针对第一个问题,答案是不可以的。
我们先看一段英文描述,如下:
When running a Spring Boot application that uses an embedded servlet container (and is packaged as an executable archive), there are some limitations in the JSP support.
- With Tomcat it should work if you use war packaging, i.e. an executable war will work, and will also be deployable to a standard container (not limited to, but including Tomcat). An executable jar will not work because of a hard coded file pattern in Tomcat.
- Jetty does not currently work as an embedded container with JSPs.
- Undertow does not support JSPs.
原文的大体意思就是:Tomcat支持war的打包方式,spring boot支持war打包方式。Jetty现在不支持JSP嵌入容器。Undertow根本就不支持JSP。
所以答案就是打包成war,jsp会自然按照servlet的标准部署。但也就意味着你不可以用嵌入式的方式运行,而是Tomcat Server + war的部署方式。
看到这里有些网友肯定会有疑问那什么是嵌入式的web服务器?我们这边就拿jetty来说明下。
Jetty 可以非常容易的嵌入到应用程序当中而不需要程序为了使用 Jetty 做修改。
从某种程度上,你也可以把 Jetty 理解为一个嵌入式的Web服务器。所以我们经常会说嵌入式jetty。
Jetty有一个口号:不要把你的应用部署到Jetty中,把Jetty部署到你的应用中。Jetty可以在Java应用程序中向其他POJO一样被实例化,换句话说,以嵌入式的模式运行Jetty是指将Http模块放入你的应用程序中,而非部署你的程序到一个HTTP服务器。这就是所谓的嵌入式jetty。
另外在说明一点就是JSP解析是需要JSP引擎处理的,tomcat就提供了JSP处理引擎。所以很显然JSP是依赖容器而存在的,不然就没法访问了。那么既然是依赖于tomcat的话。好了第一个问题就解说到这里,不知道是否对你有帮助?留言评论!
出了这篇文章之后,有一网友找到一支持打成jar包运行的插件:
Using Spring Boot with JSPs in Executable Jars
https://github.com/ghillert/spring-boot-jsp-demo
经过java -jar xxx.jar运行后,可以正常访问网页。(博主没有具体的尝试)
这也可以说明原本是不支持的,但是如果非要支持的话,那么需要进行使用插件进行支持。
<2>针对第二个问题
对于第二个问题,如果看过之前的文章就很好解决了,只需要在src/main/resouces下新建一个static目录,然后在static下新建子目录:css,images,js目录,在images放入一张test.jpg图片,那么访问路径是:http://127.0.0.1:8080/images/test.jpg
当前目录结构应该是这样子的:
(1)--src/java/resources
(2)-- static
(3)-- css
(3)-- images
(3)-- js
那么有人会有疑问这个,打包的时候能打上嘛,答案是可以的,请看实际打包解压图:
更多说明看:(13)处理静态资源(默认资源映射)【从零开始学Spring Boot】
<3>第三个问题
是的,Spring Boot内嵌了Tomcat,那么以下的配置是必须的嘛:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
如果没有这个配置的话,那么打包出来会包含tomcat的jar包,整个war文件都会变大,第二就是如果版本是一样的,比如我这里是8.0的,那么是不会报错的,如果是7.0的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>
当然具体的,这个可以看:http://www.it610.com/article/3598864.htm 有一定的参考价值。
以上7.0,8.0是我自己尝试了才发表的言论。
结束语
出去打了2小时的羽毛球,1个小时的游泳,实在是爽。
好吧,这里我们还是必要总结下,上面说了那么多,其实就是两三句就可以概括了。
第一就是:Spring Boot使用jsp的话,是不可以打包成jar包的,需要打包成war成文件。
第二就是:静态资源存放在resources的static下,新建images,js,css目录即可,当然出了static还可以是resources下创建resources文件存放资源,还有就是public。具体看我的第13篇博客文章。
第三就是:spring-boot-starter-tomcat是必须添加的嘛,我只能说在我的这个demo中我的这个是必须添加的,不然第一占导出包大小,其次就是可能tomcat jar包会冲突,导致无法启动程序。另外要说明的就是还有别的方式使用tomcat的方式,大家可以参考别的文章进行学习。另外这是原创文章,大家有什么自己的疑问都可以给我留言,各抒己见。好了,那本章就到此为此吧。拜拜!
【Spring Boot 系列博客】
76. Spring Boot完美解决(406)Could not find acceptable representation原因及解决方法
75. Spring Boot 定制URL匹配规则【从零开始学Spring Boot】
71.mybatis 如何获取插入的id【从零开始学Spring Boot】
67. @Transactional的类注入失败【从零开始学Spring Boot】
63.JPA/Hibernate/Spring Data概念【从零开始学Spring Boot】
61. mybatic insert异常:BindingException: Parameter 'name' not found【从零开始学Spring B】
60. Spring Boot写后感【从零开始学Spring Boot】
59. Spring Boot Validator校验【从零开始学Spring Boot】
58. Spring Boot国际化(i18n)【从零开始学Spring Boot】
57. Spring 自定义properties升级篇【从零开始学Spring Boot】
56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】
55. spring boot 服务配置和部署【从零开始学Spring Boot】
54. spring boot日志升级篇—logback【从零开始学Spring Boot】
52. spring boot日志升级篇—log4j多环境不同日志级别的控制【从零开始学Spring Boot】
51. spring boot属性文件之多环境配置【从零开始学Spring Boot】
50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
49. spring boot日志升级篇—理论【从零开始学Spring Boot】
48. spring boot单元测试restfull API【从零开始学Spring Boot】
47. Spring Boot发送邮件【从零开始学Spring Boot】
46. Spring Boot中使用AOP统一处理Web请求日志
45. Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】
43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
42. Spring Boot多数据源【从零开始学Spring Boot】
41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
40. springboot + devtools(热部署)【从零开始学Spring Boot】
39.4 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.3 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】
38 Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】
37 Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】
36 Spring Boot Cache理论篇【从零开始学Spring Boot】
35 Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
34Spring Boot的启动器Starter详解【从零开始学Spring Boot】
33 Spring Boot 监控和管理生产环境【从零开始学Spring Boot】
32 Spring Boot使用@SpringBootApplication注解【从零开始学Spring Boot】
31 Spring Boot导入XML配置【从零开始学Spring Boot】
更多查看博客: http://412887952-qq-com.iteye.com/