Spring Validation 实现后端数据校验
前言
Web开发中JS校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,本文将要介绍的Validation 来对数据进行校验。
简单叙述下 JSR303/JSR-349,Hibernate Validation,Spring Validation 之间的关系。
JSR303 是一项标准,JSR-349 是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如 @Null,@NotNull,@Pattern,他们位于 javax.validation.constraints 包下,只提供规范不提供实现。
而 Hibernate Validation 是对这个规范的实践(不要将h ibernate和 数据库 orm 框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如 @Email,@Length,@Range 等等,他们位于 org.hibernate.validator.constraints 包下。
而万能的 spring 为了给开发者提供 ...
WebSoket 初探并于 SpringBoot 整合
一、WebSocket
1.1 HTTP与WebSocket
WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
我们知道,HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。
这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。这就注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过轮询请求。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。
为了解决HTTP的这一痛点,WebSocket就被发明出来,它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。
WebSocket具有以下特点:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协 ...
Elasticsearch 初探(5)——与SpringBoot整合
一、环境搭建
采用SpringBoot 2.0 + Elasticsearch 6.4.1。本文只列举了其中一些API,更多API请参考官方文档
1.1 导入依赖
注意SpringBoot 2.0.5.RELEASE 默认依赖的Elasticsearch版本是5.6.11,因此不要使用springboot-starter-data-elasticsearch,需要手动导入相关依赖。
123456789101112131415161718192021222324252627282930313233<!-- elasticSearch版本 --><elasticSearch.version>6.4.1</elasticSearch.version><!-- elasticsearch依赖 --><dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> ...
Elasticsearch 初探(4)——集群
Elasticsearch的一大优势就是能够十分轻松的进行分布式/集群部署,本文将主要讲解Elastic的集群搭建。
一、基础概念
1. 1 节点类型
node.master
node.data
节点类型
true(default)
true(default)
候选主节点 && 数据节点
true
false
候选主节点
false
true
数据节点
false
false
客户端节点
1.1.1 候选主节点(Master-eligible node)
一个节点启动后,就会使用Zen Discovery机制去寻找集群中的其他节点,并与之建立连接。集群中会从候选主节点中选举出一个主节点,主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch中的主节点的工作量相对较轻,用户的请求可以发往任何一个节点,由候选主节点节点负责分发和返回结果,而不需要经过主节点转发。
正常情况下,集群中的所有节点,应该对主节点的选择是一致的,即一个集群中只有一个选举出来的主节点。然而,在某些情况下,比如网络通信出现问题 ...
Elasticsearch 初探(3)——简单查询与中文分词
一、简单查询
1.1 查询全部
请求方式: GET
请求路径: ES服务的IP:端口/索引名/{分组名,可省略}/_search
以上篇文章建立的索引为例,搜索结果如下:
1234567891011121314151617181920212223242526272829303132333435363738{ "took": 0, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1, "hi ...
Elasticsearch 初探(2)——相关概念与索引、数据操作
一、基本概念
由于Elasticsearch也是基于Lucene实现,因此它的许多概念和Luncene相似,关于Lucene的知识,可以参考文章:《Lucene 初探——基于 Lucene 6.6.2》。
1.1 Node、Cluster
Elasticsearch本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
1.2 Index
Elasticsearch会索引所有字段,经过处理后写入一个倒排索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elasticsearch 数据管理的顶层单位就叫做 Index(索引),它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
下面的命令可以查看当前节点的所有 Index。
1http://localhost:9200/_cat/indices?v
当我们插入数据的时候,如果有超出我们结构化的数据的时候,索引默认会自动更新数据,我们可以在创建索引时指定 ...
Elasticsearch 初探(1)——基本介绍与环境搭建
一、Elasticsearch简介
1.1 什么是Elasticsearch
Elasticsearch是一个实时的分布式搜索和分析引擎。它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。
Elasticsearch是一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。
Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。
当然Elasticsearch并不仅仅是Lucene这么简单,它的主要特性包括:
分布式搜索
多租户
查询统计分析
分组和聚合
这里给大家推荐下刘欣老师的两篇文章,通过讲故事的方法从底向上的叙述Lucene和Elasticsearch技术:
搜索之路
搜索之路:Elasticsearch的诞生
1.2 和Solr有啥区别
提到Elasticsearch,就不能不提到Solr,下面通过几个方面来对比这两者。
(1)Elasticsearch基 ...
Java 并发编程——Thread 类的使用
在学习Thread类之前,先介绍与线程相关知识:线程的几种状态、上下文切换,然后接着介绍Thread类中的方法的具体使用。
一、线程的状态
线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。
当需要新起一个线程来执行某个子任务时,就创建了一个线程。但是线程创建之后,不会立即进入就绪状态,因为线程的运行需要一些条件(比如内存资源,程序计数器、Java栈、本地方法栈都是线程私有的,所以需要为线程分配一定的内存空间),只有线程运行需要的所有条件满足了,才进入就绪状态。
当线程进入就绪状态后,不代表立刻就能获取CPU执行时间,也许此时CPU正在执行其他的事情,因此它要等待。当得到CPU执行时间之后,线程便真正进入运行状态。
线程在运行状态过程中,可能有多个原因导致当前线程不继续运行下去,比如用户主动让线程睡眠(睡眠一定的时间之后再重新执行)、用户主动让线程等待,或者被同步块给阻塞,此时就对应着多个状态:time wai ...
Java 并发编程——volatile 关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。
一、内存模型的相关概念
大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
也就是,当程序在运行过程中,会将运算需要的数据 ...
Java 并发编程——线程池的使用
本文基于 JDK 1.6,在高版本 JDK 中源码有所出入。
一、Java中的 ThreadPoolExecutor类
java.uitl.concurrent.ThreadPoolExecutor 类是线程池中最核心的一个类,因此如果要透彻地了解 Java 的线程池,必须先了解这个类。下面我们来看一下 ThreadPoolExecutor 类的具体实现源码。
在 ThreadPoolExecutor 类中提供了四个构造方法:
123456789101112131415public class ThreadPoolExecutor extends AbstractExecutorService { ..... public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); public ThreadPoolExecut ...