最近做了一个标签式的选择输入框,数据源动态获取、可过滤,效果请看下图:

应用程序与 Office Web Apps 整合
关于部署的细节,可以参考我的另一篇文章《在线浏览 Office 文档之 Office Web Apps》。
关于 Wopi 协议,可以参考如下的链接:
[MS-WOPI]:Web Application Open Platform Interface Protocol
https://msdn.microsoft.com/en-us/library/hh622722(v=office.12).aspx
IntroducingWOPI
http://blogs.msdn.com/b/officedevdocs/archive/2013/03/21/introducing-wopi.aspx
Buildingan Office Web Apps (OWA) WOPI Host:
https://code.msdn.microsoft.com/office/Building-an-Office-Web-f98650d6

在线浏览 Office 文档之 Office Web Apps
Office Web Apps 由 Microsoft 提供,对于在线浏览、编辑office文档的能力,那自然是其它类似产品不能比的,参照 office online。我自然也被其吸引了,相信在很多公司里面在线浏览、编辑office文档是一个刚需。在没接触这个之前,我就是写了一个相应的东西来满足此类要求(肯定是远远不能与此相比的,后续也会在另一篇文章(在线浏览 Office 文档的实现)里面总结出来,有兴趣可以留意)。由于其如此华丽,自然要去探探底,在失败了多次之后,总算是成功部署了,这里就总结下来方便大家参考。

存储过程调用-DistProcedure
项目地址:https://github.com/DistChen/distprocedure
文档地址:https://distchen.gitbooks.io/distprocedure/content/
DistProcedure 是我为了方便调用存储过程而写的,它能简化存储过程的调用和返回结果的映射,只需要通过简单的配置就可以满足各种要求,基本不用编写任何代码,它有如下特性:
- 热部署;存储过程修改后,后台不用重启即可完成存储过程的动态更新。
- 结果自动映射;对于简单的数据,比如一个数字,不需要任何的映射,而对于多字段的一条记录,可以自动映射成配置的model类。
- 接口支持;存储过程调用后,传递出来的数据不会经过任何的业务处理,通过相应的接口可以满足数据的二次业务处理。
- 规则引擎;通过接口可以满足数据的二次业务处理,这种情况下需要编码,需要重启服务器,而通过编写一个规则文件来处理数据,不需要编写任何的代码,而且也不用重启就可完成数据的二次业务处理。
- 规则缓存;不会重复编译规则文件。
- ……

1、DistProcedure - 配置方式
DistProcedure 提供了一个监听类(dist.common.procedure.define.listener.ProcedureListener),用于在程序启动时,加载存储过程配置文件(后面的文档会介绍此部分)中所定义的存储过程。一个最基本的配置如下:

2、DistProcedure - 添加存储过程配置文件
之前反复提到了存储过程配置文件,那这个文件是干嘛用的,该怎么写?在数据库里编写了一个存储过程之后,DistProcedure 能够帮助你不用编写任何代码来完成调用及结果映射过程,其与数据库沟通的桥梁就是这个配置文件,这个配置文件相当于告诉DistProcedure:你可以调用哪些存储过程,它们各自的参数是什么,返回类型是什么,数据是否需要二次业务处理等信息。
配置规范
此配置文件的编写规范写在了这个 XML Schema 中。
在IDE中使用这个XML Schema可以简化编写过程并校验配置文件,可以智能提示及实时的错误提示,如下所示:

3、DistProcedure-数据的二次业务处理
通过 DistProcedure 得到的数据,特别是通过游标返回来的数据,如果没有二次处理,那么结果就是一个List,成员就是与记录所对应的model类(通过配置文件的vo属性来将记录映射到类的实例)。但是很多时候,数据是需要二次组合之后才能用的,或者说只需要部分数据。所以DistProcedure还提供了一些接口来满足这些要求。
executeClass
这个属性指定了当DistProcedure从数据库得到结果之后,需要再执行的类,此类需要继承dist.common.procedure.define.ProcedureExecutor,也就是说在DistProcedure层面就进行了拦截。上一章节给过这么一个示例:

4、DistProcedure-启用规则引擎
上一章节所说的通过添加 executeClass 和 executeMethod 来进行二次业务处理是一种常规的方式,但是这样有一个很不好的地方:如果下次要求补上1而不是0,就需要重新编写代码并发布。也就是说代码与业务逻辑严重耦合了,为了解耦代码与业务逻辑,在 DistProcedue 引入了规则引擎Drools。当业务逻辑再次变更时,不需要修改修改代码,不需要重新发布,只修改规则文件即可满足变更的需求。
添加规则文件
之前有这样一个示例的配置片段:
|
|

5、DistProcedure-调用方式
调用的方式很简单。当DistProcedure加载完所有的存储过程配置文件后,会将所有的配置信息存到dist.common.procedure.define.ProcedureRepository类的静态属性procedures中,该属性声明如下:
|
|
此属性的初始化由DistProcedure完成。加载完成后,通过ProcedureRepository提供的如下方法去获取指定的存储过程模型类dist.common.procedure.define.ProcedureModel,此类的实例是调用存储过程时的必需参数:
|
|

文件断点续传与下载
此 Demo 简单演示了如何利用多线程来对文件进行断点续传、下载。目前很多下载工具都支持文件的持续下载:即使上一次下载未完成,下次下载的时候还会继续上次的下载,已经下载过的数据就不会重复下载了,可以避免重复下载。这在与文档有关的应用中特别重要,在磁盘稀缺的移动应用中也非常重要,不仅可以省流量,还能减少磁盘的开销。
如何使用
|
|