Java線上併發控制word文件
前言:
對於線上操作word文件的OA系統來說有一個常見問題,就是對於服務端放置的word文件,如果有兩個人甚至更多客戶端同時開啟該文件時,就會存在併發問題。有了併發問題就會出現操作的文件儲存內容被覆蓋的問題,造成使用者編輯資料丟失,這是很致命的,該如何解決呢?
首先我們可以通過系統業務邏輯來限制系統層次的併發問題。比如張三通過某連結打開了一個文件,同時向後臺傳送ajax請求將當前系統登入使用者名稱,檔名,以及是否開啟文件的標識存入資料庫。等張三關閉文件時再發ajax去將資料庫內容更新,或將之前那條資料刪除。在李四點選同一個連結時,ajax去資料庫查詢一下此檔案的開啟者以及開啟狀態。如果標識是true,那就提醒李四文件正在被編輯,不讓他開啟文件。 或者有用shiro做許可權驗證的,可以直接讓有許可權的王五在頁面看到開啟文件的連結,不讓沒有許可權的趙六看到頁面開啟文件的連結。
系統層次解決併發問題有好多方案,但是都僅限於此。想要從word文件層次解決併發問題呢?或者我想要張三開啟文件的時候也讓李四開啟,但是李四隻能只讀呢?那就必須要獲取word文件狀態,這個狀態必須是office返回的,那就必須要呼叫office的第三方程式介面了。對於Java開發人員來講,office的介面需要在什麼環境執行?需要呼叫那些介面?這些問題都會帶來大量的工作量,甚至對於沒接觸過VBA的Java工程師來講,簡直是一場災難。
那就找jar包解決吧!!!這裡提供一個pageoffice的外掛供大家學習。
先看效果:
張三開啟文件,此時是可以編輯的。
同時,再點選一下李四的請求(這裡雖然為兩個連結,但是訪問的是同一個地址)
此時,會提示張三正在修改,如果點選忽略,依然可以開啟文件,並且是隻讀狀態。
部署步驟(只需5步)
1.官網http://www.zhuozhengsoft.com/dowm/下載整合檔案,引入jar包,配置web.xml
去剛才下載的整合檔案中找到lib,將裡面的內容放在專案web-inf的lib中引入jar包,然後將web.xml的pageoffice配置引入到自己專案的wb.xml中
2.在父頁面aaa.jsp(需要開啟文件的頁面)放一個a標籤或者button
寫a標籤之前先引入pageoffice需要的js檔案
<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>