Spring Boot 最佳实践(二)集成Jsp与生产环境部署
一、简介
提起java不得不说的一个开发场景就是web开发,也是java最热门的开发场景之一,说到web开发绕不开的一个技术就是jsp,因为目前市面上仍有很多的公司在使用jsp,所以本文就来介绍一下spring boot 怎么集成jsp开发,以及生产环境的详细部署方法。
二、集成jsp
开发环境
- spring boot 2.0.4 release
- tomcat 9.0.10
- idea(intellij idea简称,下文统一使用)2018.2
- windows 10
jsp集成步骤
- 创建jsp目录
- application.properties配置jsp信息
- pom.xml添加依赖组件
- 编写spring mvc代码
- 运行程序
具体集成方法如下:
1.创建jsp目录
在src/main目录下创建目录webapp/web-inf/jsp用于存放jsp页面,如下图:
2.application.properties配置jsp信息
application.properties为全局配置文件,里面可以设置很多信息,比如设置日志、设置缓存、设置spring、spring session等信息,我们本文只需要设置jsp的目录文件,以及文件后缀,代码如下:
spring.mvc.view.prefix=/web-inf/jsp spring.mvc.view.suffix=.jsp
更多application.properties设置信息,查看官方文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
3.pom.xml添加jsp配置
在pom.xml需要添加3个组件:
- spring-boot-starter-web (用于运行web项目)
- jstl (javaserver pages standard tag library,jsp标准标签库,用于程序中解析jsp)
- tomcat-embed-jasper (内置tocat对jsp支持的依赖,用于编译jsp)
具体代码如下:
<!--web支持--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <!--javaserver pages standard tag library,jsp标准标签库--> <dependency> <groupid>javax.servlet</groupid> <artifactid>jstl</artifactid> </dependency> <!--内置tocat对jsp支持的依赖,用于编译jsp--> <dependency> <groupid>org.apache.tomcat.embed</groupid> <artifactid>tomcat-embed-jasper</artifactid> <scope>provided</scope> </dependency>
注意:tomcat-embed-jasper的scope(作用域)值为provided,表示打包的时候不用打包进去,其他设备会提供,如果打包进去会和外部tomcat提供的jar冲突,导致项目启动失败。
scope(作用域)值列表代表含义解释如下:
- compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去
- test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit
- runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如jdbc驱动,适用运行和测试阶段
- provided:打包不会包含进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
- system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systempath的属性来定义路径
4.编写spring mvc代码
经过前3步的配置,项目配置部分已经完成的差不多了,接下来就是代码的编写了,代码的编写和spring mvc一样,分为两部分java类编写与标识注解,jsp模板创建与编写。为了更好的演示spring boot 的功能,我们会尽可能的简化业务逻辑,在这个示例中我们创建一个cat类,设置标签hi="hello cat",在页面输出标签即可。
a).cat.java代码
package com.hellospringboot.hellospringboot; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.servlet.modelandview; @controller @requestmapping("/cat") //创建路由规则http://xxxx/cat public class cat { /** * 默认路由方法 * * @return */ @requestmapping("") public modelandview index() { modelandview modelandview = new modelandview("/index"); //设置对应jsp的模板文件 modelandview.addobject("hi", "hello,cat"); //设置${hi}标签的值为hello,cat return modelandview; } }
spring mvc注解解读
- @controller 标识在一个类上,标识的类就是spring mvc的控制器类,分发处理器会扫描使用了该注解的类是否使用了@requestmapping 注解,@controller只是定义了一个控制器类,只用使用了@requestmapping 注解,才是真正处理请求的处理器;
- @requestmapping 标识在类或者方法上,用来处理请求地址的注解,一共有6个属性:
- value 对应请求的实际地址
- method 请求的类型:get、post、put、delete 等,ex:@requestmapping(value = "/test", method = requestmethod.put)
- consumes 指定请求上的内容类型,比如application/json、text/html等
- produces 指定返回的数据类型,类型必须是request headers中accept包含的类型
- params 过滤请求,只有请求中包含某个参数,才会执行,比如@requestmapping(value = "",params = "flag"),只有参数中包含flag才会执行,不然不能访问,http://localhost:8080/cat?true=flag这个地址是访问不到的,正确的地址是http://localhost:8080/cat?flag=true才可以正常访问
- headers 和params类似,只有请求headers里面包含某个key才可以访问方法
b).jsp端代码
<%@ page contenttype="text/html;charset=utf-8" language="java" %> <html> <head> <title>title</title> </head> <body> <h1> ${hi} </h1> </body> </html>
这个jsp只做了一件事,把java类里面的${hi}标签的值显示出来。
5.运行程序
到此为止,如果您使用的是idea开发工具,那么现在就可以运行调试程序了,直接运行index.jsp或者启动文件,或者启动文件(application.java)即可,然后在浏览器输入:http://localhost:8080/cat 即可查看。
三、生产环境部署
部署步骤
- 下载安装tomcat
- 入口类继承springbootservletinitializer重写configure方法
- 配置pom.xml
- idea生成war文件
- 配置tomcat运行项目
1.下载安装tomcat
下载地址:https://tomcat.apache.org/download-90.cgi
如下图所示:
windows下载:64-bit windows zip | linux下载:tar.gz
注意:如果是windows版下载的免安装版如果放到c盘的话,注意给文件夹分配足够的权限,不然启动之后访问页面显示400或者505类似的问题。
2.入口类继承springbootservletinitializer重写configure方法
如果要进行生产环境部署,需要单独配置一下spring boot 的入口类,需要继承springbootservletinitializer类,重写configure方法,因为默认情况外部tomcat不能读取到spring boot 入口类的main方法启动程序加载,使用需要继承,代码如下:
package com.hellospringboot.hellospringboot; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.boot.builder.springapplicationbuilder; import org.springframework.boot.web.servlet.support.springbootservletinitializer; /** * 启动类,程序入口 */ @springbootapplication public class hellospringbootapplication extends springbootservletinitializer{ /** * 重写configure方法,加载启动类 * @param application * @return */ @override protected springapplicationbuilder configure(springapplicationbuilder application) { return application.sources(hellospringbootapplication.class); } /** * spring boot 默认main方法 * @param args */ public static void main(string[] args) { springapplication.run(hellospringbootapplication.class, args); } }
3.配置pom.xml
需要配置一下pom.xml,排除一下内置tomcat的jar包,防止打包之后与外面tomcat jar 包冲突,导致项目启动失败,配置如下:
<!--排除内置tomcat jar包--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> <scope>provided</scope> </dependency>
主要的代码是
4.idea生成war文件
步骤一:修改生成jar为war格式
找到:
jar
修改为:
war
为什么需要修改jar包格式为war,因为如果打包为jar包的时候,不会包含jsp文件,所以访问的时候回404,而打包为war的时候回包含jsp文件,所以需要把打包格式修改为war.
jar和war的区别?
- jar(java application archive)java应用程序库,通常为开发引用的通用类
- war(web application archive)web应用程序
所以从jar和war的区别来看,网页程序打包成war格式也是很合适的。
如果需要修改生成文件的文件名称,可以设置build下的finalname属性,代码如下:
<build> <finalname>name</finalname> </build>
步骤二:使用idea生成war包
选择菜单栏build => build artifacts.. => 点击rebuild,即可生成war包,如图:
生成完之后,在项目的target目录下找到生成war文件,如下图:
5.配置tomcat运行项目
步骤一:把war文件复制到tomcat的webapps目录下
步骤二:配置conf/server.xml
在host标签内添加context设置,docbase属性填写war文件名称,配置如下:
<host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true"> <context path="" docbase="springbootjsp" debug="0" privileged="true" reloadable="true" /> <!-- 其他代码 --> </host>
步骤三:启动tomcat
运行bin/shutdown.bat文件,启动tomcat
输入地址:http://localhost:8080/cat 访问。
到此项目部署成功,虽然本人部署到windows服务器了,linux也是一样的步骤。
四、知识扩展:spring boot 模板推荐
虽然上文我们详细介绍了jsp在spring boot 中使用,但是spring boot官方并不推荐使用jsp(原因见下文)。
spring boot推荐模板引擎:
- thymeleaf
- freemarker
- mustache
- groovy templates
如下图所示:
spring为什么不推荐使用jsp?
spring官方不推荐使用jsp的原因有这么几个:
- 官方文档jsp没有thymeleaf好;
- thymeleaf健康的开源项目,几乎每个月都有更新,而jsp已经好几年没有实质性的进展;
- thymeleaf有迅速响应的用户论坛。
更多详情,点击查看:https://spring.io/blog/2012/10/30/spring-mvc-from-jsp-and-tiles-to-thymeleaf
总结:按照官方的说法,如果你有数百个jsp页面,我们并不建议您应该立即抛弃它们,重新使用thymeleaf,但是,如果您开始开发一个新项目,强烈鼓励您比较其他模板引擎和jsp,以确认哪一个更适合您。
五、参考资料
开发web应用之jsp篇:http://tengj.top/2017/03/13/springboot5/
欢迎扫码,加入圈子讨论交流