一、前言
上一篇《Spring Boot 入门之基础篇(一)》介绍了 Spring Boot 的环境搭建以及项目启动打包等基础内容,本篇继续深入介绍 Spring Boot 与 Web 开发相关的知识。
二、整合模板引擎
由于 jsp 不被 SpringBoot 推荐使用,所以模板引擎主要介绍 Freemarker 和 Thymeleaf。
2.1 整合 Freemarker
2.1.1 添加 Freemarker 依赖
1 | xml复制代码<dependency> |
2.1.2 添加 Freemarker 模板配置
在 application.properties 中添加如下内容:
1 | ini复制代码spring.freemarker.allow-request-override=false |
上述配置都是默认值。
2.1.3 Freemarker 案例演示
在 controller 包中创建 FreemarkerController:
1 | typescript复制代码@Controller |
在 templates 目录中创建名为 hello.ftl 文件,内容如下:
1 | dust复制代码<!DOCTYPE html> |
结果如下:
2.2 整合 Thymeleaf
2.2.1 添加 Thymeleaf 依赖
在 pom.xml 文件中添加:
1 | xml复制代码<dependency> |
2.2.2 添加 Thymeleaf 模板配置
在 application.properties 中添加如下内容:
1 | ini复制代码spring.thymeleaf.cache=true |
上述配置都是默认值。
2.2.3 Thymeleaf 案例演示
在 controller 包中创建 ThymeleafController:
1 | typescript复制代码@Controller |
在 template 目录下创建名为 hello.html 的文件,内容如下:
1 | dust复制代码<!DOCTYPE html> |
结果如下:
三、整合 Fastjson
3.1 添加依赖
1 | xml复制代码<dependency> |
3.2 整合 Fastjson
创建一个配置管理类 WebConfig ,如下:
1 | java复制代码@Configuration |
3.3 演示案例:
创建一个实体类 User:
1 | haxe复制代码public class User { |
getter 和 setter 此处省略。
创建控制器类 FastjsonController :
1 | pgsql复制代码@Controller |
打开浏览器,访问 http://localhost:8080/fastjson/test,结果如下图:
此时,还不能看出 Fastjson 是否正常工作,我们在 User 类中使用 Fastjson 的注解,如下内容:
1 | kotlin复制代码@JSONField(format="yyyy-MM-dd") |
再次访问 http://localhost:8080/fastjson/test,结果如下图:
日期格式与我们修改的内容格式一致,说明 Fastjson 整合成功。
四、自定义 Servlet
4.1 编写 Servlet
1 | scala复制代码public class ServletTest extends HttpServlet { |
4.2 注册 Servlet
将 Servelt 注册成 Bean。在上文创建的 WebConfig 类中添加如下代码:
1 | typescript复制代码@Bean |
结果如下:
五、自定义过滤器/第三方过滤器
5.1 编写过滤器
1 | pgsql复制代码public class TimeFilter implements Filter { |
5.2 注册过滤器
要是该过滤器生效,有两种方式:
1) 使用 @Component 注解
2) 添加到过滤器链中,此方式适用于使用第三方的过滤器。将过滤器写到 WebConfig 类中,如下:
1 | reasonml复制代码@Bean |
结果如下:
六、自定义监听器
6.1 编写监听器
1 | typescript复制代码public class ListenerTest implements ServletContextListener { |
6.2 注册监听器
注册监听器为 Bean,在 WebConfig 配置类中添加如下代码:
1 | csharp复制代码@Bean |
当启动容器时,结果如下:
针对自定义 Servlet、Filter 和 Listener 的配置,还有另一种方式:
1 | aspectj复制代码@SpringBootApplication |
七、自定义拦截器
7.1 编写拦截器
使用 @Component 让 Spring 管理其生命周期:
1 | pgsql复制代码@Component |
7.2 注册拦截器
编写拦截器后,我们还需要将其注册到拦截器链中,如下配置:
1 | scala复制代码@Configuration |
请求一个 controller ,结果如下:
八、配置 AOP 切面
8.1 添加依赖
1 | xml复制代码<dependency> |
8.2 编写切面类
使用 @Component,@Aspect 标记到切面类上:
1 | pgsql复制代码@Aspect |
请求 FastJsonController 控制器的方法,结果如下:
九、错误处理
9.1 友好页面
先演示非友好页面,修改 FastJsonController 类中的 test 方法:
1 | pgsql复制代码@RestController |
浏览器请求:http://localhost:8080/fastjson/test,结果如下:
当系统报错时,返回到页面的内容通常是一些杂乱的代码段,这种显示对用户来说不友好,因此我们需要自定义一个友好的提示系统异常的页面。
在 src/main/resources 下创建 /public/error,在该目录下再创建一个名为 5xx.html 文件,该页面的内容就是当系统报错时返回给用户浏览的内容:
1 | xml复制代码<!DOCTYPE html> |
路径时固定的,Spring Boot 会在系统报错时将返回视图指向该目录下的文件。
如下图:
上边处理的 5xx 状态码的问题,接下来解决 404 状态码的问题。
当出现 404 的情况时,用户浏览的页面也不够友好,因此我们也需要自定义一个友好的页面给用户展示。
在 /public/error 目录下再创建一个名为 404.html 的文件:
1 | xml复制代码<!DOCTYPE html> |
我们请求一个不存在的资源,如:http://localhost:8080/fastjson/test2,结果如下图:
9.2 全局异常捕获
如果项目前后端是通过 JSON 进行数据通信,则当出现异常时可以常用如下方式处理异常信息。
编写一个类充当全局异常的处理类,需要使用 @ControllerAdvice 和 @ExceptionHandler 注解:
1 | livescript复制代码@ControllerAdvice |
其中,方法名为任意名,入参一般使用 Exception 异常类,方法返回值可自定义。
启动项目,访问 http://localhost:8080/fastjson/test,结果如下图:
我们还可以自定义异常,在全局异常的处理类中捕获和判断,从而对不同的异常做出不同的处理。
十、文件上传和下载
10.1 添加依赖
1 | xml复制代码<!-- 工具 --> |
10.2 实现
编写一个实体类,用于封装返回信息:
1 | typescript复制代码public class FileInfo { |
编写 Controller,用于处理文件上传下载:
1 | reasonml复制代码@RestController |
基本上都是在学习 javaweb 时用到的 API。
文件上传测试结果如下图:
十一、CORS 支持
前端页面:
1 | xml复制代码<!DOCTYPE html> |
通过 http 容器启动前端页面代码,笔者使用 Sublime Text 的插件启动的,测试结果如下:
从图中可知,前端服务器启动端口为 8088 与后端服务器 8080 不同源,因此出现跨域的问题。
现在开始解决跨域问题,可以两种维度控制客户端请求。
粗粒度控制:
方式一
1 | typescript复制代码@Configuration |
方式二
1 | scala复制代码@Configuration |
配置后,重新发送请求,结果如下:
细粒度控制:
在 FastJsonController 类中的方法上添加 @CrossOrigin(origins=”xx”) 注解:
1 | pgsql复制代码@RequestMapping("/test") |
在使用该注解时,需要注意 @RequestMapping 使用的请求方式类型,即 GET 或 POST。
十二、整合 WebSocket
12.1 添加依赖
1 | xml复制代码<dependency> |
12.2 实现方式
方式一:
该方式只适用于通过 jar 包直接运行项目的情况。
WebSocket 配置类:
1 | typescript复制代码@Configuration |
WebSocket 处理类:
1 | typescript复制代码@ServerEndpoint(value = "/webSocketServer/{userName}") |
前端页面:
1 | xml复制代码<!DOCTYPE html> |
演示图如下:
如果使用该方式实现 WebSocket 功能并打包成 war 运行会报错:
1 | mipsasm复制代码javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path |
方式二:
该方式适用于 jar 包方式运行和 war 方式运行。
WebSocket 配置类:
1 | typescript复制代码@Configuration |
WebSocket 处理类:
1 | java复制代码public class WebSocketServer extends TextWebSocketHandler { |
运行结果与上图一致。
十三、整合 Swagger2
13.1 添加依赖
1 | xml复制代码<dependency> |
13.2 配置
重新创建一个配置类,如下:
1 | less复制代码@Configuration |
为了能更好的说明接口信息,我们还可以在 Controller 类上使用 Swagger2 相关注解说明信息。
我们以 FastJsonController 为例:
1 | reasonml复制代码@Api(value = "FastJson测试", tags = { "测试接口" }) |
注意,上边的方法是用 @GetMapping 注解,如果只是使用 @RequestMapping 注解,不配置 method 属性,那么 API 文档会生成 7 种请求方式。
启动项目,打开浏览器访问 http://localhost:8080/swagger-ui.html。结果如下图:
本文转载自: 掘金