Ajax 实现文件上传(解决upload.parseRequest为空问题)
一、fileupload
这种方式也是目前网上主要绝大部分 Ajax 文件上传的方法,前台代码如下:
123<!-- 定义上传按钮 --><input type="file" id="uploadFile"><button onclick="uploadFile()" >上传文件</button>
12345678910111213141516171819202122232425262728293031323334353637383940414243<script> var fileSize; var fileName; // 动态获取文件名和文件大小,如果要做判断的话 $("#uploadFile").change(function(){ var file = this.files[0]; fileName = file.name; fileSize = file.si ...
Java8 Optional 详解
在Java8中新增了一个Optional类,官方描述是该类是一个容器对象,其中可能包含一个空或非空的值。如果存在一个值,isPresent()将返回true,get()将返回该值。
错误使用姿势
简单的根据描述,我们认为Optional可以帮我们解决NPE问题,假设任务需求为获取用户的性别,那么可以这样写:
123456Optional<User> user = ...if(user.isPresent()) { return user.get().getSex();} else { return null;}
其实这样并没有改变原本的思维, 只是本能的认为该类是 User 实例的包装, 这与下面的写法没有本质的区别:
123456User user = ...if(user != null) { return user.getSex();} else { return null;}
正确使用姿势
想要正确的使用,得知道有哪些方法,下面我列出一些常用的API:
Modifier and ...
JDK 动态代理与 Cglib 动态代理
一、前言
AOP(Aspect Oriented Programming),即面向切面编程,最主要的思想就是纵向重复,横向抽取。要想实现 AOP,其底层实现是使用了动态代理技术,在 Spring 中,动态代理技术分为传统的 JDK 动态代理和 Cglib 动态代理。这两种代理机制区别是:
JDK 动态代理:针对实现了接口的类进行代理
Cglib 动态代理:针对没有实现接口的类进行代理,底层是字节码增强技术,生成当前类的子类对象。
假设我们有一个 UserService 接口,其中具有 CRUD 方法:
123456public interface UserService { void save(); void delete(); void update(); void query();}
它有一个实现类,只是简单的输出了信息:
123456789101112131415161718192021public class UserServiceImpl implements UserService { @Overri ...
Solr 初探(1)——Solr 介绍
一、Solr 简介
1.1 Solr 简介
Solr 是 Apache 下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr 提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr 可以独立运行,运行在Jetty、Tomcat等 Servlet 容器中。Solr 不提供构建 UI 的功能,Solr 提供了一个管理界面,通过管理界面可以查询 Solr 的配置和运行情况。
Solr 索引的实现方法很简单,用 Post 方法向 Solr 服务器发送一个描述Field及其内容的JSON文档,Solr根据JSON文档添加、删除、更新索引。Solr搜索只需发送 Get 请求,然后对 Solr 返回的JSON等格式的查询结果进行解析,组织页面布局。
1.2 Solr 与 Lucene 区别
Lucene 是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene 提供了完整的查询引擎和索引引擎,目的是为开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者以 Lu ...
Lucene 初探——基于 Lucene 6.6.2
一、Lucene简介
Lucene是Apache Jakarta家族中的一个开源项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎、索引引擎和部分文本分析引擎。
Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具,是目前最为流行的基于 Java 开源全文检索工具包。
的数据总体分为两种:
结构化数据:指具有固定格式或有限长度的数据,如数据库、元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件、word文档等磁盘上的文件。
对于结构化数据的全文搜索很简单,因为数据都是有固定格式的,例如搜索数据库中数据使用SQL语句即可。
对于非结构化数据,有以下两种方法:
顺序扫描法(Serial Scanning)
全文检索(Full-text Search)
1.1 顺序扫描法
如果要找包含某一特定内容的文件,对于每一个文档,从头到尾扫描内容,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件 ...
Redis 初探(5)——Redis 的持久化
Redis 的高性能是由其将所有数据都存储在了内存中,需要使用时直接从内存调用即可。为了使 Redis 在重启之后仍然能保证数据不丢失,需要将数据从内存同步到内存中,这一过程就是持久化。
Redis 支持两种持久化方式,一种是 RDB方式,一种是 AOF方式。可以单独使用其中一种或将两种结合使用。
RDB (默认) 在指定的时间间隔内将内存中的数据快照写入磁盘。
AOF 以日志的形式记录服务器处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。
一、RDB
1.1 实现步骤
Redis 执行 fork 命令创建子进程。
父进程继续处理 client 请求,子进程负责将内存内容写入到临时文件。由于 OS 的写时复制机制父子进程会共享相同的物理页面,当父进程处理写请求时OS会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是 fork 时刻整个数据库的一个快照。
当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
需要注意的是,每次 RDB ...
Redis 初探(4)——Redis 的特性
一、多数据库
每一个 Redis 实例可以包括多个数据库,客户端可以指定连接某个 Redis 实例的某个数据库。一个Redis实例最多可以提供 16 个数据库,下标从 0 到 15,客户端默认连接第 0 号数据库。
含义
方法
选择第 n 号数据库
select n
将当前库的 key 转移到第 n 号数据库
move key n
123456789101112131415161718wxs@ubuntu:/usr/local/redis/src$ ./redis-cli #默认进入0号数据库127.0.0.1:6379> keys *1) "myList"2) "mySet3"3) "mySet1"4) "myListB"5) "userName"6) "mySet2"7) "int_num"8) "float_num"127.0.0.1:6379> move userName 1 #将u ...
Redis 初探(3)——Redis 的数据类型
在《Redis 初探(1)——Redis 的安装》中,我们说过,Redis支持以下五种数据类型,本章进行详解:
String类型
List类型
Set类型
SortedSet类型
Hash类型
存储极限
大小
String类型的value大小
512M
Hash类型key的键值对个数
4294967295
List类型key个数
4294967295
Set/SortedSet类型key个数
4294967295
一、String(字符串)类型
在前面两章中,我们存储的都是 String 类型。该类型增加和删除一个键值对十分简单,如下:
含义
方法
获取值
get key
添加一个键值对
set key value
获取并重置一个键值对
getset key value
删除一个键值对
del key
前面两个我们之前都使用过了,getset key value 有点陌生,它是先获取 key 的 value,然后将该 key 修改为输入的 value,相当于将 get key 和 set key value这两步合为 ...
Redis 初探(2)——Jedis 的使用
2.1 准备工作
首先我们在Linux中开启redis服务:
123wxs@ubuntu:/usr/local/redis/src$ ./redis-server ../redis.conf wxs@ubuntu:/usr/local/redis/src$ ps auxc | grep rediswxs 5278 0.0 0.4 51828 8408 ? Ssl 20:12 0:00 redis-server
上一节中我们只是在Linux主机中简单的测试了下 Redis 的使用,但是那样并没有什么实际用处,我们可以在程序中去远程的访问 Redis。
我们以 Java 为例,想要在 Java 程序中使用 Redis,首先我们需要借助第三方库 jedis,导入需要的包:
jedis 点我下载
commons-pool 点我下载
为了方便测试,还需导包:
junit 点我下载
hamcrest-all(可能用到) 点我下载
2.2 第一个Jedis程序
导完包后,我们编写第一个 Jedis 程序,代码如下:
123456789101112 ...
Redis 初探(1)——Redis 的安装
1.1 什么是 Redis
Redis 是使用 C 语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,Redis 支持以下五种数据类型:
String 类型
List 类型
Set 类型
SortedSet 类型
Hash类型
1.2 Redis 应用场景
缓存
分布式集群架构中session分离
任务队列
…
1.3 安装 Redis
从Redis官网上下载即可,我使用的是4.0.8,点我下载。
我将其放在了/usr/local 目录中:
12wxs@ubuntu:/usr/local$ lsbin etc games include lib man redis-4.0.8.tar.gz sbin share src
解压到当前文件夹,并将其重命名为redis
1234567wxs@ubuntu:/usr/local$ sudo tar zxvf redis-4.0.8.tar.gzwxs@ubuntu:/usr/local$ sudo mv redi ...