麻绳先生

做一些记录性的工作

SpringMVC第一节

SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级web框架,属于Spring FrameWork的后续产品,以及融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全部功能MVC模块,使用Spring可插入的MVC框架,从而在进行Web开发时,选择使用Spring MVC框架或集成其他MVC开发框架,如Struts2等。支持RESTful编程风格的请求。

  • 清晰的角色划分;
  • 分工明确,扩展灵活;

基本组件

DispatcherServlet前端控制器

用户i请求到达前端控制器,相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet降低了组件之间的耦合。

HandlerMapping处理器映射器*

HandlerMapping负责根据用户请求找到Handler,SpingMVC提供了不同的映射器实现不同的映射方式,例如配置文件方式、实现接口方式、注解方式等。

Handler处理器

开发中需要编写的具体业务控制器,由DispatcherServlet把用户的请求转发到Handler,由Handler对具体的用户请求进行处理。

HandlerAdapter处理器适配器*

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

View Resolver视图解析器*

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

View视图

SpringMVC框架提供了很多的View视图类型的支持,包括jstlView, freemarkerView, pdfView等。最常用的是jsp。一般情况下需要通过页面标签或页面模板技术将模型数据通过页面展示给用户。

RequestMapping

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

//可以作用于类和方法,支持分级映射
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {

String name() default "";

//别名path和value通用,用于指定url
@AliasFor("path")
String[] value() default {};

@AliasFor("value")
String[] path() default {};


//public enum RequestMethod {
// GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
//}
RequestMethod[] method() default {};

//限定传递的请求参数
String[] params() default {};

//用于指定限制请求的头条件
String[] headers() default {};

String[] consumes() default {};

String[] produces() default {};
}

请求参数的绑定

支持简单数据类型、对象、列表等。@RequestMapping(param={username=””})

自定义类型转换器

  1. 首先实现Converter接口;
  2. 在spring配置文件中配置自定义类型转换器;

Servlet原生API

HttpServletRequest、HttpServletResponse、HttpSession、ServletContext。

常用注解

  1. @RequestParam
  2. @RequestBody get方法不适用
  3. @PathVariable RESTful风格 WebClient模拟发送请求
  4. @RequestHeader
  5. @CookieValue 获取cookie的值
  6. @ModelAttribute
  7. @SessionAttributes 用于多次执行控制器方法间的参数共享

ResponseBody相应json数据

DispatcherServlet会拦截所有资源,导致静态资源,如image、css、js等也会被拦截,解决方法就是需要配置静态资源不拦截。

Docker

Docker是一个开源的应用容器引擎;支持将软件编译成一个镜像,然后在镜像中做好各种软件的配置工作,随后将镜像发不出去,其他使用者可以直接使用该镜像;运行中的这个镜像成为容器,其优点在于启动速度。

Docker核心概念

Docker主机Host

一个物理或虚拟的机器,用于执行Docker守护进程和容器;

Docker镜像Images

Docker镜像是用于创建Docker容器的模板;

Docker容器Container

容器是独立运行的一个或一组应用;

Docker客户端Client

客户端通过命令行或者其他工具使用Docker API和Docker的守护进程通信;

Docker仓库Registry

Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库,Docker Hub提供了庞大的镜像集合使用;

使用Docker

基本命令

script
1
2
3
4
yum install docker
docker -v
systemctl start docker
systemctl enable docker
script
1
2
3
4
docker search mysql #搜索mysql image
docker pull mysql #拉取镜像
docker images #查看镜像列表
docker rmi images-id #移除镜像

容器操作

script
1
2
3
4
5
6
7
docker run --name mymysql -d mysql:TAG #启动容器
docker ps #查看运行中的容器
docker ps -a #查看所有容器
docker stop container-id #停止容器
docker rm -a # 删除所有容器
docker run --name container-name iamge-name -d -p 1008:8080 #-p进行端口映射
docker logs container-id/container-name

其他命令

spring-boot和web开发

web开发

如何使用spring boot:

  1. 创建spring boot应用,选中需要的模块;
  2. spring boot已经默认将这些场景配置好,只需要在配置文件中指定少量配置就可与运行;
  3. 编写业务代码;

自动配置原理

webjars和静态资源映射规则

  1. 所有/webjars/**,都去classpath:/META-INF/resources/webjars查找资源;
    webjars:以jar包方式引入静态资源。

  2. “/**”访问当前项目的任何资源,静态资源文件夹

    1
    2
    3
    4
    5
    "classpath:/MEAT-INF/resources/",
    "classpath:/resources/",
    "calsspath:/static/",
    "calsspath:/puclic/",
    "/":当前目录的根目录
  3. 欢迎页:静态资源文件夹下的所有index.html页面,被”/**”映射;

  4. 所有的**/favicon.ico都是在静态资源文件夹下查找;

模板引擎

JSP、

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<properties>
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
</properties>

thymeleaf

导入语法空间

thymeleaf语法规则

  • 片段包含:jsp:include
    • th:insert
    • th:replace
  • 遍历:c:forEach
    • th:each
  • 条件判断c:if
    • th:if
    • th:unless
    • th:switch
    • th:case
  • 声明变量c:set
    • th:object
    • th:with
  • 任意属性修改支持prepend,append
    • th:attr
    • th:attrprepend
    • th:attrappend
  • 修改指定属性默认值
    • th:value
    • th:href
    • th:src
  • 修改标签体内容
    • th:text不转义
    • th:utext转义
  • 声明片段
    • th:fragment

thymeleaf表达式

  • Simple expressions:
    • Variable Expressions: ${…}
    • Selection Variable Expressions: *{…}
    • Message Expressions: #{…}
    • Link URL Expressions: @{…}
    • Fragment Expressions: ~{…}
  • Literals
    • Text literals: ‘one text’ , ‘Another one!’ ,…
    • Number literals: 0 , 34 , 3.0 , 12.3 ,…
    • Boolean literals: true , false
    • Null literal: null
    • Literal tokens: one , sometext , main ,…
  • Text operations:
    • String concatenation: +
    • Literal substitutions: |The name is ${name}|
  • Arithmetic operations:
    • Binary operators: + , - , * , / , %
    • Minus sign (unary operator): -
  • Boolean operations:
    • Binary operators: and , or
    • Boolean negation (unary operator): ! , not
  • Comparisons and equality:
    • Comparators: > , < , >= , <= ( gt , lt , ge , le )
    • Equality operators: == , != ( eq , ne )
  • Conditional operators:
    • If-then: (if) ? (then)
    • If-then-else: (if) ? (then) : (else)
    • Default: (value) ?: (defaultvalue)
  • Special tokens:
    • No-Operation: _

Spring Boot自动配置Spring MVC

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans;
  • Support for serving static resourcces, including support for Webjars;
  • Automatic registration of Converter, GenericConverter, Formatter beans;
  • Support for HttpMessageConerters;
  • Automatic registration of MessageCodeResolver;
  • Static index.html support;
  • Custom Favicon support;
  • Automatic use of a ConfigurableWebBindingInitializer bean;

修改Spring Boot默认配置

扩展Spring MVC

Tips

国际化

默认的区域信息是通过浏览器请求报文获取的。可以通过链接提交区域信息。
自己的信息解析器需要实现Localeresolver。

  1. 编写国际化配置文件,抽取页面需要配置的国际化信息;
  2. 使用ResourceBundleMessageSource管理国际化资源信息;
  3. 在页面使用fml:message获取国际化内容;
  4. 可以自己编写区域信息解析器,替换Spring Boot默认的解析器ResourceBundleMessageSource;

模板引擎要实时生效,需要禁用模板缓存,页面修改要ctrl+F9重新编译

登陆状态检查需要拦截器

thymeleaf公共页面元素抽取

  1. 抽取公共片段
  2. 引入公共片段
  3. 不同替换效果有th:insert、th:replace、th:include

错误处理的自动配置

可以参照ErrorMVCAutoConfiguration;容器中有如下组件:

  1. DefaultErrorAttributes
  2. BasicErrorController
  3. ErrorPageCustomizer
  4. DefaultErrorViewResolver

注册Servlet、Filter、Linstener

Spring Boot默认是以jar包的方式启动嵌入式的Servlet容器来启动Spring Boot的web应用,没有web.xml文件;
注册三大组件使用ServletRegistrationBean, FilterRegistrationBean, ServletListenerRegistrationBean。

其他嵌入式Servlet容器

Jetty

适合长连接

Undertow

后置处理器会获取所有容器中的定制器,以此配置Servlet容器,自己定义容器就是将自定义的定制器加到Bean工厂中。

嵌入式Servlet容器启动原理

  1. Spring Boot应用启动运行run方法;
  2. refreshContext(context);Spring Boot刷新IOC容器,创建IOC容器对象,并初始化容器,创建容器中的每一个组件,还判断了是否是web应用;
  3. refresh(context);刷新刚才创建好的ioc容器;
  4. onRefresh();web的IOC容器重写了onRefresh方法;
  5. web IOC容器会创建嵌入式的Servlet容器;createEmbeddedServletContainer();
  6. 获取嵌入式的Servlet容器工厂;TomcatEmbeddedServletContainerFactory创建对象,后置处理器随后获取所有的定制器来定制Servlet容器的相关配置;
  7. 使用容器工厂获取嵌入式的Servlet容器;
  8. 嵌入式的Servlet容器创建对象并启动Servlet容器;先启动嵌入式的Servlet容器,再将IOC容器中剩下的对象获取;

使用外置的Servlet容器

嵌入式Servlet容器优点在于简单、便携,缺点在于默认不支持JSP,优化定制不够复杂;使用定制器、自己编写嵌入式Servlet容器的创建工厂;

  1. 必须创建一个war项目,利用idea创建目录结构;
  2. 将嵌入式的Tomcat指定为provided;
  3. 必须编写一个SpringBootServletInitializer的子类,并调用configure方法;
  4. 启动tomcat;

YAML

  1. YAML Ain’t Markup Language
  2. YAML A Markup Language

.yml是YAML语言的文件,以数据为中心,比json、xml更适合做配置文件。

参考语法规范http://www.yaml.org

1
2
server:
port: 8081

基本语法

key:(空格)value:表示一对键值对,空格是必须的;

以空格的缩进来控制层级关系,只要左对齐,就认为是同一层级。

值的写法

字面值(普通的值,数字、字符串、布尔)

key:(空格)value:字面直接写

  • 字符串默认不用引号
  • 双引号和单引号有区别,前者会对特殊字符转义,后者只会当作普通字符

数组(list、set)

用-值表示数组中的一个元素

1
2
3
4
pets:
- cat
- dog
- pig

行内写法

1
pets: [cat,dog,pig]

对象、Map(属性和值)

方法和前文一致

1
2
3
4
friend:
firstname: zhang
lastname: san
telphone: 136545646

行内写法

1
friend: {firstname: zhang,lastname: san,telphone: 136545646}

解析yml配置文件

spring-boot解析yml文件需要使用注解@ConfigurationProperties(prefix = “index-id””)

ConfigurationProperties和value有区别

默认从全局配置文件中获取值

@PropertySource

解析非全局配置文件

@PropertySource(value = “calsspath:example.properties”)

@ImportResource

@ImportResource导入spring配置文件,使配置文件内容生效。

@ImportResource(location = “classpath:beans.xml”)

springboot推荐的像容器中添加组件的方式:
使用全注解的方式。
使用@Configuration指明一个配置类。

gradle

基于JVM的构建工具,有一些特性

  • 和maven一样基于约定优于配置的构建框架
  • 强大的多工程构建支持
  • 强大的依赖管理,基于apachelvy
  • 支持已有的maven和ivy仓库
  • 支持传递性依赖管理,不需要远程仓库或pom.xml等配置文件

gradle安装

先决条件

  • gradle需要1.5或更高版本的JDK;
  • gradle自带groovy库,忽略已安装grooy

配置环境变量

  • 将GRADLE_HOME/bin添加到PATH变量中
  • 使用命令gradle -v命令测试

构建基础

task

project

groovy中的闭包

就是一段代码块,在gradle中,主要将闭包作为参数使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//定义一个闭包
def bb = {
println "hello, bb"
}
//定义一个方法,方法的参数是闭包类型
def method(Closure closure){
closure()
}
//调用该方法
method(bb)

//定义一个闭包,带参数
def closure2 = {
v -> println "hello, ${v}"
}

//定义一个需要闭包的方法
def method2(Closure closure){
closure("world")
}

method2(closure2)

拆分

聚合

1
2
3
allproject{

}