数据较大时必须用文件上传,文件上传的本质是IO流的从操做;
客户端:
1)必须使用post,post才能携带大数据
2)必须设置type=“file” name=“f”必需要有名字;
3)必需要设置enctype=“multlpart/form-data”
服务器端:
1)经过request.getInputStream()获取字节输入流读取请求正文内容;
将上传内容获得,保存在服务器端,就完成了文件上传;
2)实际使用直接用框架中的api就能够,commons-fileupload是apache提供的一套文件上传工具;
文件上传实现:
导入commons-io包和commons-fileupload包;放在WEB_INF下的lib文件夹下。
文件下载有两种方法:
1.超连接下载:若是文件能被浏览器解析,点击就会打开文件,若是要下载,须要使用右键另存为,不能被浏览器解析的文件,点击就下载;
⒉.经过服务器流回写到浏览器下载;要设置MIME,即设置setcontentType(String mimeType);浏览器能解析的直接显示,不能解析的直接下载;
获取文件的mimeType类型: String mimeType=this.getServletContext().getMimeType(filename);
若是设置响应头respponse.setHeader("content-disposition","attachment;flename=下载的文件名称");无论浏览器能不能解析,都是下载操做;html
Activiti和JBPM:
JBPM5(Java Business Process Management)和Activiti都支持BPMN2.0规范。
jBPM5推翻了jBPM3和jBPM4的架构,使用了Drools Flow做为工做流的架构,而Activiti更像是jBPM4的延续。
jBPM5采用LGPL开源协议(若是修改LGPL协议的代码或者衍生,则全部修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议,因 此LGPL协议的开源 代码很适合做为第三方类库被商业软件引用,但不适合但愿以LGPL协议代码为基础,经过修改和衍生的方式作二次开发的商业软件采用);
Activiti采用宽松的Apache License2.0协议(鼓励代码共享并尊重原做者的著做权,容许对代码进行修改和发布而无论其用途)。
Git工做流:
Workflow.Net、NetBpm、OSWorkflow前端
订阅方式:
ActiveMQ:点对点(p2p)、广播(发布-订阅);
RabbitMQ:work queue(工做队列)、Publish/Subscribe(发布订阅模式)、Routing(路由模式)、Topic(通配符模式)、Hreader()、RPC();
Kafka:点对点(p2p);
使用:
1)ActiveMQ:
在项目中,咱们使用的是SpringJMS操做activeMQ,已maven操做为例,首先先引用SpringJMS的依赖 及 activeMQ的依赖,而后在spring的配置中,
若是要配置消息的生产者的话,须要配置springjms的链接工厂,经过链接工厂配置 jmsTemplate实例,咱们可使用jmsTemplate进行消息的相关操做,另外咱们也须要配置消息的目的地,也是在spring的配置文件中配置配置队列 或者 主题。
消息的消费者和生产者配置差很少,不一样的是须要配置一个消息的监听器,监听器里面实现onMessage方法,在这个方法里面处理消息
2)RabbitMQ:
在咱们秒杀抢购商品的时候,系统会提醒咱们稍等排队中,而不是像几年前同样页面卡死或报错给用户。
像这种排队结算就用到了消息队列机制,放入通道里面一个一个结算处理,而不是某个时间断忽然涌入大批量的查询新增把数据库给搞宕机,因此RabbitMQ本质上起到的做用就是削峰填谷,为业务保驾护航。
服务间异步通讯
顺序消费
定时任务
请求削峰
Kafka:
日志收集:一个公司能够用Kafka能够收集各类服务的log,经过kafka以统一接口服务的方式开放给各类consumer,例如hadoop、HBase、Solr等。
消息系统:解耦和生产者和消费者、缓存消息等。
用户活动跟踪:Kafka常常被用来记录web用户或者app用户的各类活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,而后订阅者经过订阅这些topic来作实时的监控分析,或者装载到hadoop、数据仓库中作离线分析和挖掘。
运营指标:Kafka也常常用来记录运营监控数据。包括收集各类分布式应用的数据,生产各类操做的集中反馈,好比报警和报告。
流式处理:好比spark streaming和 Flink
消息发送失败如何处理:
1.自动重发
2.系统预警人工处理等
如何防止消息的重复消费:
保证消息的惟一性,就算是屡次传输,不要让消息的屡次消费带来影响;保证消息等幂性;
好比:在写入消息队列的数据作惟一标示,消费消息时,根据惟一标识判断是否消费过;java
SVN解决冲突有三种选择:
A、放弃本身的更新,使用svn revert(回滚),而后提交。在这种方式下不须要使用svn resolved(解决)
B、放弃本身的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行resolved filename并提交(选择文件—右键—解决)。
C、手动解决:冲突发生时,经过和其余用户沟通以后,手动更新目标文件。而后执行resolved filename来解除冲突,最后提交。
Git
1)直接修改文件:
第一步,选择文件鼠标右击选择 Git-commit --提交到本地仓库
第二部,在文件同级空白处鼠标右击选择 tortoisGit --> pull,文件发生改变。
直接修改文件中数据,最后保存文件
第三步,选择文件鼠标右击选择 Git Commit --> 提交 -- >push 发布。
2)经过edit conflicts修改
选中文件,右击菜单选项 tortoiseGit --> Edit conflict
修改编辑区:将Theirs- 或者 Local-中须要的数据添加到Meged中。
保存时 标记冲突解决。linux
postman、jmeter、soupUI、java+httpclient、robotframework+httplibrary等nginx
POI官方推荐解决内存溢出的方式使用CSV格式解析git
ajax(会出现跨域问题)
from表单(此方法在Android端不适用),form的提交不存的跨域的问题,因此能够考虑使用form的action方法来解决。)
经过Java代码调用(Android端适用,导入HttpClientUtil这个工具类,或者也可使用Spring框架的restTemplate来调用,上面有调用接口的方法,分为Get和Post方式的有参和无参调用)web
分布式:一个业务分拆多个子业务,部署在不一样的服务器上;
集群:同一个业务,部署在多个服务器上;
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的,经过接口来实现数据的交互。每一个微服务仅关注于完成一件任务并很好地完成该任务。在全部状况下,每一个任务表明着一个小的业务能力。
分布式属于微服务
分布式:分布压力(集群)
微服务:分布能力ajax
ACID
数据的一致性协议有:
1. 两阶段提交协议 2PC
2. 三阶段提交协议 3PC
3. RWN协议
4. raft协议
5. Paxos协议redis
分布式事务是将各个模块都是单独独立出来的微服务,进行了分布式部署,单系统里的事务将不能保证各个数据库操做的一致性。
基于XA的两阶段提交方案:spring
TCC解决方案:
本地消息表(异步确保)
MQ事务消息:
LCN分布式事务框架:
其中@Transactional用于管理本地事务,而@TxTransaction管理分布式事务,当须要回滚时,调用本地自带的事务管理器进行回滚。
模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它能够生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
模板引擎有哪些:jsp、Velocity、FreeMarker、Thymleaf、Beetl、Enjoy。
FreeMarker:
建立Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例;
使用Configuration实例来生成Template实例,同进须要指定使用的模板文件;
填充数据模型,数据模型就是一个Map对象;
调用Template实例的process方法完成合并。
Thymleaf:
特色:
动静结合:页面采用模板+数据的方式,在前端美工手中,能够展现静态页面。在后台开发人员手中,也能够展现数据返回到页面后的界面。这是由于thymeleaf支持html原型,能够在原型上添加额外的属性,浏览器在解释html时会忽视未定义的属性,当定义的属性有值时就会动态替换静态页面,来实现动态展现。
开箱即用:提供标准和spring标准两种方言,能够直接套用模板实现JSTL、 OGNL表达式效果,
避免天天套模板、改jstl、改标签的困扰。同时开发人员也能够扩展和建立自定义的方言。
多方言支持:
Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,能够快速的实现表单绑定、属性编辑器、国际化等功能。
与springboor完美整合:SpringBoot提供了Thymeleaf的默认配置,而且为Thymeleaf设置了视图解析器,咱们能够像之前操做jsp同样来操做Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。
使用:
最简单的一种:在线程中执行 Thread.sleep(),休眠挂起线程,等待一段时间后再执行;
借助Timer和TimerTask实现定时任务;
借助调度线程池 Executors.newScheduledThreadPool() 实现定时任务;
借助第三方工具,如spring的定时任务; Quartz;
短信:阿里云SMS,百度云SMS,七牛云SMS等
邮件:
进入邮箱设置,将其开启POP3/SMTP服务,以容许咱们经过第三方客户端发送邮件。而且获取受权码(不是登陆密码)
使用JavaMail发送邮件很是简单,也是三步曲:
建立链接对象javax.mail.Session
建立邮件对象 javax.mail.Message
发送邮件
Web Service就能够解决异构系统的通讯的整合。
web Service技术获得了Java的支持,在JDK6之后都给出了相关规范的实现:
JAX-WS(XML web services的Java API)是SOAP方式:简单对象访问协议,他是用于交换XML编码信息的轻量级协议;
JAX-RS即restful方式风格。
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务;
主要功能:反向代理,经过配置文件能够实现集群和负载均衡,静态资源虚拟化
移除依赖:
用于排除某项依赖的依赖jar包;
能够借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,而后在对应标红版本的jar包上面点击execlude,就能够将该jar包排除出去。
手动排除:
手动在pom.xml中使用<exclusion>
标签去排除冲突的jar包(上面利用插件Maven Helper中的execlude方法其实等同于该方法):
mvn dependency:tree
版本锁定原则:
通常用在继承项目的父项目中;
正常项目都是多模块的项目,如moduleA和moduleB共同依赖X这个依赖的话,那么能够将X抽取出来,同时设置其版本号,这样X依赖在升级的时候,不须要分别对moduleA和moduleB模块中的依赖X进行升级,避免太多地方(moduleC、moduleD…)引用X依赖的时候忘记升级形成jar包冲突,这也是实际项目开发中比较常见的方法。
设计1:邻接表,是最多见的设计,能正确的表达菜单的树状结构且没有冗余数据,但在跨层级查询须要递归处理。优势结构简单;缺点:不使用递归状况下没法查询某节点全部父级,全部子集
设计2:路径枚举;在设计1基础上新增一个父部门id集字段,用来存储全部父集,多个以固定分隔符分隔,好比逗号。优势:方便查询全部的子集;也能够所以经过比较字符串dept_parent_ids长度获取当前节点层级。缺点:新增节点时须要将dept_parent_ids字段值处理好;dept_parent_ids字段的长度很难肯定,不管长度多大,都存在不可以无线扩展的状况;节点移动复杂,须要同时变动全部子集中的dept_parent_ids字段值。
设计3:闭包表 是解决分级存储的一个简单而优雅的解决方案,是一种经过空间换取时间的方式;须要额外建立一张TreePaths表,它记录了树中全部节点间的关系;包含两列,祖先列与后代列,即便这两个节点之间不是直接的父子关系;同时增长一行指向节点本身;优势:非递归查询减小冗余的计算时间;方便非递归查询任意节点全部的父集;方便查询任意节点全部的子集;能够实现无限层级;支持移动节点;缺点:层级太多状况下移动树节点会带来关系表多条操做;须要单独一张表存储对应关系,在新增与编译节点时操做相对复杂;
SpringSecurity
Shiro
可行性分析报告;项目开发计划;软件需求说明书(软件规格说明书);概要设计说明书;详细设计说明书;用户操做手册;测试计划;测试分析报告;开发进度月报;软件维护手册;软件问题报告;软件修改报告。