[有书共读16]SpringBoot 2 企业应用:第三章

因为部分图在github和牛客讨论贴上无法展示,所以想看图文Markdown格式的同学可以去下载下来用typora软件打开查看。
笔记文本地址:Github上的笔记地址

第3章

3.1 Spring Boot的Web开发支持

graph TD
A(Spring-boot-starter-web)-->|包含|B[Servlet容器];
A-->|引用|C[Spring MVC];
B-->|可选|D[Tomcat];
B-->|可选|E[Jetty];
F[spring-boot-autoconfigure.jar中org.springframework.boot.autoconfigure.web包]-->|配置|A

常见web相关的自动配置支持类

| 方面 | 配置类 |

Http的编码 HttpEncodingAutoConfiguration和HttpEncodingProperties

Jackson的Convertor相关(json) JacksonHttpMessageConvertersConfiguration

上传文件 MultipartAutoConfiguration和MultipartProperties

Servlet容器 ServerPropertiesAutoConfiguration和ServerProperties

Web MVC WebMvcAutoConfiguration和WebMvcProperties

3.2 Thymeleaf 模板引擎

graph LR
A[Spring-boot-starter-web]-->|建议使用|C[Html模板];
C-->|包含并推荐使用|D[Thymeleaf];
A-->|提供完美SpringMvc支持|D;
C-->|包含|E[FreeMarker];
C-->|包含|F[Velocity];
A-->B[Jsp模板];
  • 优点

    • 自然模板——不污染Html,方便开发人员和设计人员衔接,同一份文件,不用在html和jsp之间来回捯饬。
    • 受官方支持——使用Spring生态的程序员还有啥理由不掌握呢?
  • 语法

    • 引入Thymeleaf```
    *   引入url:
    @{url地址}
    ```
    
    | 类型 | 用法 |
    | -------- | ------------------------------------------------------------ |
    | 绝对路径 | http://www.nowcoder.com}">牛客网 |
    | 相对路径 | 相对路径 |
    | 静态文件 | Content路径,默认访问static文件夹下的css文件夹。 |
    • 表达式:用于从WebContent中取 请求参数,请求、会话和应用程序中的属性,和EL表达式非常类似

      • ${x}:将返回存储在thymeleaf上下文中的变量x或作为请求Request作用域中的属性
      • $(param.x):将返回一个名为x的请求参数(可能是多值的)
      • $(session.x):将返回一个名为x的会话HttpSession作用域中的属性。
      • $(application.x):将返回一个名为x的全局ServletContext上下文作用域中的属性。
      • 注1:和EL表达式一样,用$符号获取变量值(用 对象名.属性名 获取JavaBean对象的属性)。
      • 注2:$表达式只能写在th标签内部,否则不会生效。
    • 字符串操作

      • 拼接字符串```
      *   简便写法
      ```
      *   注:简便写法限制较多,|...|中只能包含变量表达式${...},不能包含其他常量、条件表达式等。
    • 运算符

      • 算术运算符:+、-、*、/、%

        th:with="isEven=(${prodStat.count} % 2 == 0)"
      • 逻辑运算符:>、=、<=、==、!=

        • 注:因为Thymeleaf是在Html中使用,所以>和<符号要使用Html转义。th:if=“${prodStat.count} &gt; 1” th:text="'Execution mode is '+((${execMode}=='dev')?'Development':'Production')"
    • 条件判断:

      • th:if:条件成立

        login
      • th:unless条件不成立

        login
      • th:switch,th:case

        User is an administrator    
                    User is a manager    
                    User is some other thing

        注:*表示其他语言中的default(默认项)选项。

    • 循环:th:each

      用于迭代循环,迭代对象可以是java.util.List,java.util.Map或数组等。语法:

      th:each="obj,iterStat:${objList}"

      简单循环可以不用iterStat,如:

      大肥牛带你剑指Offer
          牛晓东
          做大牛不做大肥牛
iterStat表示状态变量,属性如下
| 属性     | 说明                                                   |
| -------- | ------------------------------------------------------ |
| index    | 当前迭代对象的位置,从0开始                             |
| count    | 当前迭代对象的位置,从1开始                            |
| size     | 集合大小或被迭代对象的大小                             |
| current  | 当前迭代变量                                           |
| even/odd | 布尔值,当前是偶数还是奇数,从0开始计算,等同于index%2 |
| first    | 布尔值,当前循环是否是第一个,从1开始算                |
| last     | 布尔值,当前循环是否是最后一个。                       |
  • 内置对象:#号开头,常以s结尾,方便开发的一些常用对象。如dates,lists,numbers等。常用如下:

    | 对象名称 | 作用 |
    | ----------- | ------------------------------------------------------------ |
    | #dates | 日期格式化内置对象,参照java.util.Date |
    | #calendars | 类似于#dates,但是是java.util.Calendar类的方法 |
    | #numbers | 数字格式化 |
    | #strings | 字符串格式化,具体方法可以参照java.lang.String,如startsWith,contains等 |
    | #objects | 参照java.lang.Objects |
    | #bools | 判断boolean类型的工具 |
    | #arrays | 数组操作的工具 |
    | #lists | 列表操作的工具,参考java.util.List |
    | #sets | Set操作工具,参考java.util.Set |
    | #maps | Map操作工具,参考java.util.Map |
    | #aggregates | 操作数组或集合的工具 |
    | #messages | 操作消息的工具 |

    示例:略。

3.3 Spring和Thymeleaf 的整合

最新版本的支持封装在thymeleaf-spring5库中,整合后可以在spring mvc应用中完全替代jsp文件。

  • 使用@Controller注解来映射Thymeleaf的模板文件
  • 在模板中使用SpringEL表达式来替换OGNL。
  • 在模板中创建的表单,完全支持Beans和结果的绑定,包括使用PropertyEditor、转换和验证等。
  • 可以通过Spring来管理国际化文件显示国际化信息

themeleaf 在spring中的方言

graph TD
A[org.thymeleaf.standard.StandardDialect]-->|派生出|B[org.thymeleaf.spring.dialect.SpringStandardDialect]

SpringStandardDialect特点:

  • Thymeleaf不适用OGNL,而是SpringEL实现变量表达式,因此,所有的${...}和*{...}表达式将用Spring的表达式引擎进行处理。
  • 访问应用context中的Beans可以使用SpringEL语法:${@myBean.doSomeThing()};
  • 基于表格处理的新属性:th:field,th:errors和th:errorclass,此外还有一个th:object的新实现,允许它使用表单命令选择器。
  • 在Spring 5.0集成中提供多个新的表达式。
graph TD
A[Thymeleaf]-->|提供|B[org.thymeleaf.spring4.SpringTemplateEngine]
B-->|执行|C[Thymeleaf模板]
A-->D[TemplateResolve]
D-->|设置|E[通用的模板引擎如前缀 后缀]

3.4 Spring Boot的Thymeleaf 支持

spring boot 通过org.springframework.boot.autoconfigure.thymeleaf包对Thymeleaf进行自动配置。

其下最重要两个包:

ThymeleafAutoConfiguration:对集成所需要的Bean进行自动配置,包括templateEngine和templateResolver的配置。

ThymeleafProperties:读取application.properties配置文件,设置Themeleaf的属性以及默认配置。

3.5 Spring Boot的Web开发实例

graph TD
A[本书实例]-->|前端工具包|B[BootStrap]
A-->|js框架|C[jQuery]
A-->|MVC框架|D[Spring MVC]
A-->|项目管理工具|E[Maven]

pom中添加Thymeleaf支持

org.springframework.boot
    spring-boot-starter-thymeleaf
    2.0.4.RELEASE

代码见:OfficialCode03

代码说明:

| 代码 | 说明 |

logintest 用户登录、列表书籍展示。只是集成了Thymeleaf到项目中,没有语法上的应用。

thymeleaftest 测试thymeleaf:url,表达式,条件判断,循环

3.6 Spring Boot对Jsp的支持

  • 修改pom.xml,添加jsp支持:加入Servlet、JSTL、Tomcat依赖

    ```

javax.servlet
javax.servlet-api
provided



javax.servlet
jstl



org.springframework.boot
spring-boot-starter-tomcat
provided



org.apache.tomcat.embed
tomcat-embed-jasper
provided

```
  • 修改application.properties,将默认模板改成jsp。
# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp

3.7 Spring Boot处理JSON数据

一言不合就上图

graph TD    
Z[自动将bean或集合转成json数据]-->|通过|A
A[Spring Boot Json方案]-->|***|B[Jackson]
A-->|四阿哥|C[AlibabaGroup Fastjson]
A-->|其他吃瓜阿哥|D[没有列入书中的其他方案]

本节前提条件:掌握jquery库的ajax方法的使用。

代码地址:jsontest

3.8 Spring Boot文件上传下载

  • 上传下载要求:

| 端 | 要求 |

表单form method="post" enctype="multipart/form-data"

Spring Boot 引入Apache提供的Commons FileUpload组件

  • pom.xml中添加依赖
<!-- Apache Commons FileUpload组件依赖,
        由于不属于Spirng Boot,所以需要加上版本 
        -->

          commons-fileupload
          commons-fileupload
          1.3.3
  • 文件大小限制
# Single file max size  
spring.http.multipart.maxFileSize=50MB
# All files max size  
spring.http.multipart.maxRequestSize=50MB

3.9 Spring Boot的异常处理

  • 异常处理方式

| 方式 | 描述 |

不处理 跳转到error页面,若没有则显示默认异常信息

@ExceptionHandler注解 由Controller中标注了@ExceptionHandler的方法处理异常,常标记在父Controller方法上,子Controller类就不用每个类都写该方法了。

@ControllerAdvice+@ExceptionHandler 因为@ControllerAdvice每个请求都会调用,所以都不用定义父类了

3.10 本章小结

收获满满。

全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务