1功能介绍

  PageOffice的并发控制功能用来解决多个用户在线编辑同一篇文档可能造成的互相覆盖修改结果的技术难题。

  B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面发出请求,这就有可能同一个文档被多个用户同时打开进行编辑。为什么会出现互相覆盖呢?举个简单例子,例如A用户先访问页面打开了一个文档开始编辑,这时B用户访问相同的页面打开了同一个文档也开始编辑,B用户可能很快就完成了文档修改工作并且保存到服务器。随后A用户也完成了工作并保存文档到服务器。这时,服务器上的这个文档已经变成了A用户修改的最后结果,B用户的修改被A的保存操作覆盖从而消失了。

  PageOffice的并发控制能够保证同一时间同一篇文档只能由一个人打开,而这样复杂的控制只需要开发者简单对TimeSlice属性赋值即可实现。无论打开的文档是存放在数据库还是存在物理磁盘里,只要对此文档设置了并发控制,那么实现的效果都是只有当前用户可以对此文档进行编辑、保存等操作,其他用户只能以只读的形式打开。在并发控制期间,其他用户有三个选择,分别是“终止”、“重试”和“忽略”。选择“终止”,则关闭当前提示对话框,对此文档不进行任何操作;选择“重试”,则可以了解当前操作用户的编辑时间是否已经用完,同时可以看到当前操作用户的剩余编辑时间;选择“忽略”,则以只读方式打开此文档,即只能阅读此文档,不能对此文档进行编辑、修改、保存等操作。

2. 如何实现并发控制

  在WebOpen之前设置属性TimeSlice。例如设置PageOfficeCtrl1.TimeSlice = 4;那么登录用户对这个文档的编辑时间即为4分钟。用户必须在编辑时间结束之前,进行编辑、保存等操作,在编辑时间结束之后,用户已经编辑的未保存的内容将无法保存。

  PageOfficeCtrl1.TimeSlice = 4;//对当前文档开启并发控制

  TimeSlice只对当前WebOpen打开的文档有效,如果不赋值,就不进行并发控制。默认值是0,表示不进行并发控制。

  注意:1.这里所说的同一份文档,以WebOpen的第一个参数为判断标准。如果两次WebOpen的第一个参数完全相同则视为同一个文档,如果不同则视为不同文档。

        2.如果两次WebOpen的第一个参数完全相同,第三个参数(用户名)也完全相同,则视为用户修改编辑文档的同时参考原来的文件,属于特殊需要,这时并发控制不起作用。

  WebOpen直接打开文档或打开动态页面输出的文档,都可以实现并发控制:

  (1)直接打开文档,WebOpen的第一个参数是office文件名结尾。

    例如用户a的打开文档的操作如下:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "a");

    用户b的打开文档的操作如下:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b");

    那么如果对doc/abc.doc这个文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才可以对此文档进行编辑。

  (2)通过动态页面打开文档,WebOpen的第一个参数是一个动态页面的地址,还带有参数值。

    例如用户a的打开文档的操作如下:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");

    用户b的打开文档的操作如下:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");

    那么如果对这个a.aspx?id=1地址下载的文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才可以对此文档进行编辑。

3.什么情况下,并发控制不起作用了?

  同一个office文件,有两个不同的url地址都可以下载这个文件,当两个用户使用不同的地址打开同一个office文件的时候,并发控制就不起作用了。

  (1)例如都是两个不同的动态页面地址都可以下载同一个文件:地址a.aspx?id=1和地址b.aspx?id=1下载的是服务器端同一个文档,用户a的打开文档的代码是:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType.docAdmin, "a");

    用户b的打开文档的代码是:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("b.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");

    这样虽然“a.aspx?id=1”和“b.aspx?id=1”打开的是同一个文档,但是因为WebOpen的第一个参数值不同,对于PageOffice来说打开文档的URL也不同,PageOffice认为是两个不同的文件,这种情况并发控制就不起作用了。

  (2)例如一个用动态页面地址和一个用文档名结尾的URL地址:访问“a.aspx?id=1”下载的文件就是doc/abc.doc,用户a的打开文档的代码是:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");

    用户b的打开文档的代码是:

    PageOfficeCtrl1.TimeSlice = 4;

    PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b",);

    还是因为WebOpen的第一个参数值不同,虽然打开的是同一个文档,但是因为PageOffice认为两个文档的URL不一样,所以并发控制也不起作用。

[原创]Java在线编辑word文档调用PageOffice实现并发控制的更多相关文章

  1. 在线编辑word文档 可保存到服务器

    使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...

  2. [原创]Java动态生成word文档(图文并茂)

    很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功 ...

  3. [原创]Java动态填充word文档并上传到服务器

    一. 需求背景 在一些特殊应用场合,客户希望在服务器上生成文档的同时并填充数据,客户端的页面不显示打开文档,但是服务器上生成文档对服务器压力很大,目前服务器上生成文档第一种就是方式是jacob, 但是 ...

  4. java 在线拆分 word文档采用什么技术比较好?

    在Java项目开发中,偶尔会遇到通过程序动态拆分word文档的需求,由于Java本身不能操作Word文档,在网上也都是讨论如何动态合并word,所以这个需求实现起来相当困难,下面就将近期对于Word文 ...

  5. 在线编辑word文档代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. [原创]java在线打开PDF文档

    步骤一:(涉及到的工具) 访问:http://www.zhuozhengsoft.com/dowm/,从官网下载PageOffice for Java. 步骤二:(配置工程) 1. 解压PageOff ...

  7. 如何通过 Java 代码隐藏 Word 文档中的指定段落

    在编辑Word文档时,我们有时需要将一些重要信息保密. 因此,可以隐藏它们以确保机密性. 在本文中,将向您介绍如何通过 Java 程序中的代码隐藏 Word 文档中的特定段落.下面是我整理的具体步骤, ...

  8. 编辑word文档过程中输入法无法正常使用

    编辑word文档过程中输入法无法正常使用怎么办??有的朋友在使用Word 2010过程中,遇到了这样的问题.每次打开word文档,程序就自动变成英文输入法,中文输入法就退出了,特别是搜狗输入法.即使在 ...

  9. Java 后台创建word 文档

    ---恢复内容开始--- Java 后台创建 word 文档 自己总结  网上查阅的文档 分享POI 教程地址:http://www.tuicool.com/articles/emqaEf6 方式一. ...

随机推荐

  1. C++中一些个函数的使用

    函数:sprintf的使用 函数功能:把格式化的数据写入某个字符串 函数原型:int sprintf( char *buffer, const char *format [, argument] … ...

  2. MFC开发小技巧总结

    1.在类向导里面可以为对话框添加方法. 2.如要添加变量,直接右击添加变量即可. 3.若对某个控件添加方法或者称之为消息处理函数,直接右击添加事件处理程序即可.  

  3. MySQL -进阶

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用 SELECT * FROM(SELE ...

  4. python爬虫,从hao123爬取网址信息

    最近研究python的爬虫,小小程序,拿下来分享,本人使用python3.7,纯粹兴趣爱好,希望能帮助大家激发兴趣.从hao123,爬取各种网址信息,代码如下. import urllib.reque ...

  5. scapy windows install

    最近有点扫描网络的需求,都说scapy好,但是安装是个事(当然指的是windows安装)有个scapy3k,支持python3,可惜需要powershell,也就是说windows xp是没有戏了. ...

  6. Cannot create __weak reference in file using manual reference counting

    Xcode更新到7.3后会出现NSObject+MJProperty.h报Cannot create __weak reference in file using manual reference c ...

  7. 【LeetCode】Balanced Binary Tree 解题报告

    [题目] Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bi ...

  8. Android中的android:layout_width和android:width

    最近在看android的东西,发现很多和web前台的东西一样(思想).只是看到很多属性的写法和前台有差别,刚刚看到这样的属性: android:width 其实是定义控件上面的文本(TextView) ...

  9. Ajax学习笔记(2)--load()方法

    <head runat="server"> <title></title> <script src="http://localh ...

  10. 九度OJ 1010:A + B (字符串处理)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7166 解决:3646 题目描述: 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. ...