前言:
对于在线操做word文档的OA系统来讲有一个常见问题,就是对于服务端放置的word文档,若是有两我的甚至更多客户端同时打开该文档时,就会存在并发问题。有了并发问题就会出现操做的文档保存内容被覆盖的问题,形成用户编辑数据丢失,这是很致命的,该如何解决呢?javascript
首先咱们能够经过系统业务逻辑来限制系统层次的并发问题。好比张三经过某连接打开了一个文档,同时向后台发送ajax请求将当前系统登陆用户名,文件名,以及是否打开文档的标识存入数据库。等张三关闭文档时再发ajax去将数据库内容更新,或将以前那条数据删除。在李四点击同一个连接时,ajax去数据库查询一下此文件的打开者以及打开状态。若是标识是true,那就提醒李四文档正在被编辑,不让他打开文档。 或者有用shiro作权限验证的,能够直接让有权限的王五在页面看到打开文档的连接,不让没有权限的赵六看到页面打开文档的连接。 html
系统层次解决并发问题有好多方案,可是都仅限于此。想要从word文档层次解决并发问题呢?或者我想要张三打开文档的时候也让李四打开,可是李四只能只读呢?那就必需要获取word文档状态,这个状态必须是office返回的,那就必需要调用office的第三方程序接口了。对于Java开发人员来说,office的接口须要在什么环境运行?须要调用那些接口?这些问题都会带来大量的工做量,甚至对于没接触过VBA的Java工程师来说,简直是一场灾难。java
那就找jar包解决吧!!!这里提供一个pageoffice的插件供你们学习。jquery
先看效果:
张三打开文档,此时是能够编辑的。web
同时,再点击一下李四的请求(这里虽然为两个连接,可是访问的是同一个地址)ajax
此时,会提示张三正在修改,若是点击忽略,依然能够打开文档,而且是只读状态。数据库
部署步骤(只需5步)
1.官网http://www.zhuozhengsoft.com/dowm/下载集成文件,引入jar包,配置web.xml并发
去刚才下载的集成文件中找到lib,将里面的内容放在项目web-inf的lib中引入jar包,而后将web.xml的pageoffice配置引入到本身项目的wb.xml中less
2.在父页面aaa.jsp(须要打开文档的页面)放一个a标签或者button
写a标签以前先引入pageoffice须要的js文件jsp
<script type="text/javascript" src="/jquery.min.js"></script>
<script type="text/javascript" src="/pageoffice.js" id="po_js_main"></script>
而后添加a标签
<div style=" margin-top:50px; height:170px; "> <span style=" color:Red;">操做说明:</span><span>首先点击“张三打开文件”会在弹出窗口中打开Word文档(不要关闭窗口),<br />再点击“李四打开文件”,看并发控制效果。</span><br /><br /> 1:<a href="javascript:POBrowser.openWindowModeless('Word.jsp?userid=1' , 'width=1200px;height=800px;');">张三打开文件</a><br /><br /> 2:<a href="javascript:POBrowser.openWindowModeless('Word.jsp?userid=2' , 'width=1200px;height=800px;');">李四打开文件</a> </div> 3.在父页面同级目录下建立一个名为Word.jsp的文件 <%@ page language="java" import="java.util.*,com.zhuozhengsoft.pageoffice.*" pageEncoding="utf-8"%> <% String userName = "somebody"; String userId = request.getParameter("userid").toString(); if (userId.equals("1")) { userName = "张三"; } else { userName = "李四"; } PageOfficeCtrl poCtrl=new PageOfficeCtrl(request); poCtrl.setServerPage(request.getContextPath()+"/poserver.zz"); poCtrl.addCustomToolButton("保存","Save",1); poCtrl.setSaveFilePage("SaveFile.jsp"); //设置并发控制时间 poCtrl.setTimeSlice(20); poCtrl.webOpen("test.doc",OpenModeType.docRevisionOnly,userName); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>最简单的打开保存Word文件</title> </head> <body> <script type="text/javascript"> function Save() { document.getElementById("PageOfficeCtrl1").WebSave(); } //文档关闭前先提示用户是否保存 function BeforeBrowserClosed(){ if (document.getElementById("PageOfficeCtrl1").IsDirty){ if(confirm("提示:文档已被修改,是否继续关闭放弃保存 ?")) { return true; }else{ return false; } } } </script> <form id="form1" > 当前用户: <%=userName %>。 <div style=" width:auto; height:700px;"> <%=poCtrl.getHtmlCode("PageOfficeCtrl1")%> </div> </form> </body> </html>