[读书笔记]《Spring Boot 2企业应用实战》第三章
第3章
3.1 Spring Boot的Web开发支持
- spring-boot-starter-web为Web开发提供支持,其中包含一些预定义的常用依赖包,提供嵌入式Tomcat以及Spring MVC的依赖。
- 与Web相关的配置保存在spring-boot-autoconfigure.jar的org.springframework.boot.autoconfigure.web下面,重要的配置如下:
- HttpEncondingAutoConfiguration和HttpEncodingProperties用来自动配置http的编码
- JacksonHttpMessageConvertersConfiguration用来自动配置Jackson相关的Converter
- MutipartAutoConfiguration和MultipartProperties用来自动配置上传文件的属性
- ServerPropertiesAutoConfiguration和ServerProperties用来自动配置内嵌的Servlet容器
- WebMvcAutoConfiguration和WebMvcProperties用来自动胚子Spring MVC功能
3.2 Thymeleaf 模板引擎
- Thymeleaf是面向Web和独立环境的现代服务器端Java模板引擎,能够处理HTML、XML、JavaScript、CSS甚至纯文本,可以作为MVC Web应用层的View层显示数据。
- Thymeleaf是一个扩展性很强的模板引擎,允许开发者自定义模板,并且很好的处理细节。
- Thymeleaf标准方言中大多数处理器都是属性处理器。这样,即使在模板未被处理之前,浏览器也可以正确地显示HTML模板文件,因为浏览器将简单地忽略其不识别的属性。
- 引入Thymeleaf:要像如下所示改写标签
这样才可以在其他标签里面使用th:*这样的语法。<html xmlns:th:"htpp://www.thymeleaf.org">
通过xmlns:th:"htpp://www.thymeleaf.org"命名空间,引入Thymeleaf模板引擎,将静态页面转换为动态页面。需要进行动态处理的元素都使用"th:"为前缀。3.3 Spring和Thymeleaf 的整合
- Thymeleaf与Spring整合后,可以在Spring MVC应用中完全替代JSP文件
- 使用Spring MVC的@Controller注解来映射Thymeleaf的模板文件
- 在模板中使用SpringEL表达式来替换OGNL
- 在模板中创建的表单,完全支持Beans和结果的绑定,包括使用PropertyEditor、转换和验证等
- 可以通过Spring来管理国际化文件显示国际化信息
- Thymeleaf的Spring方言中还有以下特点:
- Thymeleaf不适用于OGNL,而是SpringELse实现变量表达式
- 访问应用context中的Beans可以使用SpringEL语法:${@myBean.doSomething()}
- 基于表格处理的新属性:th:field、th:errors和th:errorclass,此外还有一个th:object的新实现,允许它使用表单命令选择器
- 在Spring5.0集成中提供多个新的表达式
- Thymeleaf提供一个org.thymeleaf.spring4.SpringTemplateEngine类,用来执行在Spring MVC中使用Thymeleaf模板引擎,另外还提供一个TemplateResolver用来设置通用的模板引擎。
3.4 Spring Boot的Thymeleaf 支持
- Spring Boot通过org.springframework.boot.autoconfiguration.thymeleaf包对Thymeleaf进行自动配置。
- Thymeleaf包下最重要的类是ThymeleafAutoConfiguration和ThymeleafProperties
- ThymeleafAutoConfiguration类对集成所需要的Beans进行自动配置,包括templateEngine和templateResolver的配置
- ThymeleafProperties类读取application.properties配置文件,设置Thymeleaf的属性以及默认配置
3.5 Spring Boot的Web开发实例
- pom.xml文件引入thymeleaf依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- 响应Thymeleaf表达式(以表达式访问数据为例)
- index.html中的超链接:
<a th=href="@{regexptest?loginName=Jemi5un&password=123456}">测试表达式访问数据</a>
- IndexController.java实现跳转:
//指示该类为一个控制器 @Controller public class IndexController{ //用于映射请求的URL @RequestMapping("/") public String index(){ return "index"; } }
- ThymeleafController.java来响应index.html中的请求:
success1.html接收参数:@Controller public class ThymeleafController{ @RequestMapping("/regexptest") public String regexptest(HttpServletRequest request,HttpSession session){ // 保存数据到request作用范围域当中 request.setAttribute("book", "疯狂Spring Boot讲义"); // 保存数据到session作用范围域当中 session.setAttribute("school", "疯狂软件"); // 保存数据到ServletContext(application)作用范围域当中 request.getServletContext().setAttribute("name", "Thymeleaf模板引擎"); return "success1"; } }
<p><font color="red">${param.x}将返回一个名为x的请求参数</font></p><br/> 访问页面传递的参数:<span th:text="${param.loginName[0]}">登录名</span> <span th:text="${param.password[0]}">密码</span> <p><font color="red">${x}将返回存储在Thymeleaf上下文中的变量x或作为请求Request作用范围域中的属性。</font></p><br/> 访问request作用范围域中的变量:<span th:text="${book}">图书信息</span><br/> <p><font color="red">${session.x}将返回一个名为x的会话HttpSession作用范围域中的属性。</font></p><br/> 访问session作用范围域中的变量:<span th:text="${session.school}">培训中心</span><br/> <p><font color="red">${application.x}将返回一个名为x的全局ServletContext上下文作用范围域中的属性。</font></p><br/> 访问application作用范围域中的变量:<span th:text="${application.name}">动态页面模板</span><br/>
3.6 Spring Boot对Jsp的支持
添加JSP支持
像先前一样创建Maven项目,选定webapp配置,修改pom.xml添加启动器、spring-boot-starter-web模块依赖、Servlet依赖、JSTL依赖以及Tomcat依赖。创建application.properties配置文件,添加页面配置信息:# 页面默认前缀目录 spring.mvc.view.prefix=/WEB-INF/JSP/ # 响应页面默认后缀 spring.mvc.view.suffix=.jsp
3.7 Spring Boot处理JSON数据
- index.html中的超链接:
- Spring Boot内置了JSON解析功能,默认使用Jackson来自动完成(开发中也可以吧Jackson换成阿里的Fastjson或者其他的JSON解析器),当Controller返回的是一个Java对象或者是List集合时,Spring Boot自动将其转换成JSON数据,使用起来非常简单。
3.8 Spring Boot文件上传下载
- 为了能上传文件,必须将表单的method设置为post,并将enctype设置为multipart/form-data。
- Servlet3.0规范已经提供相关方法来处理文件上传,需要在Servlet中完成。Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver来封装。而Spring Boot的spring-boot-starter-web集成了Spring MVC。
- MultipartFile对象重点方法如下:
- byte[] getByte():获取文件数据。
- String getContentType():获取文件MIME类型,如image/jpeg等。
- InputStream getInputStream():获取文件流。
- String getName():获取表单中文件组件的名字。
- String getOriginalFilename():获取上传文件的原名。
- long getSize():获取文件的字节大小,单位为byte。
- boolean isEmpty():是否有上传的文件。
- void transferTo(File dest):将上传文件保存到一个目标文件当中。
- 默认上传文件大小是1MB,当上传文件超过1MB时就会报错。可以在application.properties中设置上传文件的参数。
//设置单个文件的大小 spring.http.multipart.maxFileSize=50MB //设置总上传的数据大小 spring.http.multipart.maxRequestSize=50MB
3.9 Spring Boot的异常处理
- 在异常抛出的时候,Controller会使用@ExceptionHandler注解的方法去处理异常,而不会抛出给 Servlet 容器