#
轉(zhuǎn)載自:
http://hi.baidu.com/parryblog/blog/item/2d1ae59a72b043bcc9eaf4a0.html 本篇開始之前先扯點(diǎn)閑話,商業(yè)應(yīng)用系統(tǒng)開發(fā)經(jīng)歷了三個(gè)階段:
第一個(gè)階段以計(jì)算為中心,分析設(shè)計(jì)圍繞程序的運(yùn)行效率,算法優(yōu)劣,存貯優(yōu)化來進(jìn)行。90年代的大學(xué)課程講的都是這些。
第二階段以數(shù)據(jù)為中心,分析設(shè)計(jì)圍繞數(shù)據(jù)流進(jìn)行,以數(shù)據(jù)流程來模擬業(yè)務(wù)流程。這也就是所謂的面向過程的分析模式。
第三階段以人為中心,分析設(shè)計(jì)圍繞人的業(yè)務(wù)需求,使用要求,感受要求進(jìn)行。這也就是現(xiàn)在的面象對象分析模式。
使用OO方法建立商業(yè)模型必須先定義涉眾。商業(yè)系統(tǒng)無論多復(fù)雜,無論什么行業(yè),其本質(zhì)無非是人,事,物,規(guī)則。人是一切的中心,人做事,做事產(chǎn)生物,規(guī)則限制人事物。人驅(qū)動(dòng)系統(tǒng),事體現(xiàn)過程,物記錄結(jié)果,規(guī)則則是控制。無論OO也好,UML也好,復(fù)雜的表面下其實(shí)只是一個(gè)簡單的規(guī)則,系統(tǒng)分析員弄明白有什么人,什么人做什么事,什么事產(chǎn)生什么物,中間有什么規(guī)則,再把人,事,物之間的關(guān)系定義出來,商業(yè)建模也就基本完成了。這時(shí)候可以說,系統(tǒng)分析員已經(jīng)完全了解了用戶需求,可以進(jìn)入系統(tǒng)建模階段了。
書歸正傳,上篇筆者歸納了一些典型的涉眾類型及他們的普遍期望。接下來,就是要將他們這些期望定義出來。這個(gè)過程,就是業(yè)務(wù)用例獲取的過程。筆者可以跟大家分享的經(jīng)驗(yàn)是通過以下步驟進(jìn)行,這些步驟并非唯一正確,對于經(jīng)驗(yàn)不多的系統(tǒng)分析員來說,這些步驟很有指導(dǎo)意義。
筆者做了一個(gè)建模實(shí)例,有需要有讀者請到筆者的BLOG資源中心下載,實(shí)例以上一篇所述網(wǎng)上圖書館需求為藍(lán)本建立了業(yè)務(wù)用例模型,之后的概念模型、系統(tǒng)模型則抽取了其中的借閱過程作為例子。不記得了可以后頭找找。
建模第一步,從涉眾中找出用戶。并定義這些用戶之間的關(guān)系。在ROSE中,應(yīng)該使用business actor 類型。參考上一篇的需求描述,下載實(shí)例
第二步,找出每個(gè)用戶要做的事,即業(yè)務(wù)用例,在ROSE中應(yīng)使用Business use case類型。請參考《用例的類型與粒度》一文以幫助確定用例的粒度。筆者強(qiáng)烈建議為每一個(gè)business actor繪制一個(gè)業(yè)務(wù)用例圖,這能很好的體現(xiàn)以人為中心的分析模式,并且不容易漏掉business actor需要做的事。至于以參與者為中心的視圖容易漏掉某個(gè)業(yè)務(wù)用例的參與者的擔(dān)心,可以在第四步中得到消除。下載實(shí)例
第三步,利用業(yè)務(wù)場景圖幫助分析業(yè)務(wù)流程,在ROSE中,這個(gè)階段最好使用活動(dòng)圖Activity diagram。在這個(gè)階段,業(yè)務(wù)場景圖非常重要,在繪制過程中,系統(tǒng)分析員必須采用第一步中定義的用戶名字作為泳道名,使用第二步中定義的業(yè)務(wù)用例名作為活動(dòng)名來繪制。必須這么做的原因是,如果你無法把利用已經(jīng)定義出來的 business actor 和 business use case完備的描繪業(yè)務(wù)流程,那么一定是前面的定義出問題了,你需要回頭審視是否 business actor 和 business use case定義不完善或錯(cuò)誤。如果不是所有的business actor 和 business use case 都被用到,要么應(yīng)該檢查業(yè)務(wù)流程調(diào)研時(shí)漏了什么,要么應(yīng)該檢查是否定義了一些無用的business actor 和 business use case 。同時(shí),繪制業(yè)務(wù)場景圖也非常有助于選擇合適的用例粒度并保持所有的用例都是同一粒度。下載實(shí)例
第四步,繪制用例場景圖。與業(yè)務(wù)場景圖不同的是,用例場景圖只針對一個(gè)用例繪制該用例的執(zhí)行過程。筆者仍然強(qiáng)烈推薦使用activity diagram。在用例場景圖的繪制中,必須使用第一步中定義的業(yè)務(wù)用戶作為泳道。必須這么做的原因是,它能幫助你發(fā)現(xiàn)在定義業(yè)務(wù)用例圖時(shí)的錯(cuò)誤,比如是否漏掉了某個(gè)業(yè)務(wù)用例的潛在使用者。不是每個(gè)業(yè)務(wù)用例都需要繪制場景圖,只有兩三個(gè)步驟的業(yè)務(wù)用例是不必一定繪制業(yè)務(wù)用例圖的,但仍然需要在業(yè)務(wù)用例規(guī)約文檔中寫明。下載實(shí)例
第五步,從第三步或第四步中繪制的活動(dòng)圖中找到每一步活動(dòng)將使用到的或產(chǎn)生的結(jié)果。這是找到物的過程。找到后,應(yīng)當(dāng)建立這些物之間的關(guān)系。在ROSE中,這稱為業(yè)務(wù)實(shí)體模型。應(yīng)該使用business entity 類型。下載實(shí)例
第六步,在上述過程中,隨時(shí)補(bǔ)充詞匯表Glossary。將此過程中的所有業(yè)務(wù)詞匯,專業(yè)詞匯等一切在建模過程中使用到的需要解釋的名詞。這份文檔將成為模型建立人與讀者就模型達(dá)成一致理解的重要保證。
第七步,根據(jù)上一篇中提到的業(yè)主,老板等涉眾的期望審視建立好的模型,確定業(yè)務(wù)范圍,決定哪些業(yè)務(wù)用例在系統(tǒng)建設(shè)范圍內(nèi)。那些不打算納入建設(shè)范圍內(nèi)的業(yè)務(wù)用例有兩種情況,一種是該業(yè)務(wù)用例是被調(diào)用一方,那么應(yīng)該把它改為 boundary 類型,意味著將來它是一個(gè)外部接口。另一種是該業(yè)務(wù)用例主動(dòng)調(diào)用系統(tǒng)內(nèi)業(yè)務(wù)用例,那么應(yīng)該將它改為business actor類型。與普通business actor不同的是,由業(yè)務(wù)用例轉(zhuǎn)換而成的business actor不是人,而通常是一個(gè)外部系統(tǒng)進(jìn)程,因此應(yīng)該在被調(diào)用的系統(tǒng)內(nèi)業(yè)務(wù)用例與它之間增加一個(gè)boundary元素,意味著我們的系統(tǒng)將為這樣一個(gè)外部進(jìn)程提供一個(gè)接口。嚴(yán)格來說,那些需要納入建設(shè)范圍的business use case 應(yīng)當(dāng)對應(yīng)的生成一個(gè) business use case realization, 以后的設(shè)計(jì)工作將歸納到這些實(shí)現(xiàn)用例中。但筆者覺得這一步并非很關(guān)鍵的,實(shí)際中本人也經(jīng)常省略這一步,而將協(xié)作圖,象活動(dòng)圖,類交互圖等直接在business usecase下說明。不過本實(shí)例中筆者還是按照正規(guī)方法來建模的。下載實(shí)例
需要說明的是,上述的步驟并非一次性完成的,在每一個(gè)步驟中都可能導(dǎo)致對以前步驟的調(diào)整。即使建模已經(jīng)完成,當(dāng)遇到變化或發(fā)現(xiàn)新問題時(shí),上述步驟應(yīng)當(dāng)從頭到尾再執(zhí)行一次。這也是RUP倡導(dǎo)的迭代開發(fā)模式。
經(jīng)過以上的步驟,我們已經(jīng)建立了一個(gè)完整的業(yè)務(wù)模型。但這決不是建模工作的全部,以上過程只說明了建立一個(gè)完整業(yè)務(wù)模型的過程,不能說這樣就建立了一個(gè)很好的業(yè)務(wù)模型。因?yàn)樯鲜龅倪^程中并沒有提及業(yè)務(wù)分析過程。分析過程全憑系統(tǒng)分析員的經(jīng)驗(yàn),對OO的理解和對行業(yè)業(yè)務(wù)的把握能力,對原始業(yè)務(wù)模型進(jìn)行歸納,整理,抽象,重構(gòu),以建立一個(gè)更高效,合理,擴(kuò)展性更強(qiáng)的模型。這個(gè)過程無法以步驟說明。或許以后筆者會(huì)專門針對模型分析寫點(diǎn)東西。另外除了模型,還至少需要寫業(yè)務(wù)架構(gòu)文檔、用例規(guī)約和補(bǔ)充用例規(guī)約三種文檔。因?yàn)槟P碗m然可以較好的體現(xiàn)業(yè)務(wù)架構(gòu),但很不好表達(dá)業(yè)務(wù)規(guī)則和非業(yè)務(wù)需求,這些需要在文檔中說明。例如用例的前置條件和后置條件就是一種業(yè)務(wù)規(guī)則。讀者可以在RUP文檔中找到這些文檔的模板。
http://hi.baidu.com/parryblog/blog/category/%CF%B5%CD%B3%B7%D6%CE%F6
http://hi.baidu.com/parryblog/blog/category/%D0%E8%C7%F3%B7%D6%CE%F6
通過@PathVariabl注解獲取路徑中傳遞參數(shù)JAVA
@RequestMapping(value = "/{id}/{str}")
public ModelAndView helloWorld(@PathVariable String id, @PathVariable String str) {
System.out.println(id);
System.out.println(str);
return new ModelAndView("/helloWorld");
}
用@ModelAttribute注解獲取POST請求的FORM表單數(shù)據(jù)JSP
<form method="post" action="hao.do">
a: <input id="a" type="text" name="a"/>
b: <input id="b" type="text" name="b"/>
<input type="submit" value="Submit" />
</form>
JAVA pojo
public class Pojo{
private String a;
private int b;
}
JAVA controller
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pojo") Pojo pojo) {
return "helloWorld";
}
直接用HttpServletRequest獲取JAVA
@RequestMapping(method = RequestMethod.GET)
public String get(HttpServletRequest request, HttpServletResponse response) {
System.out.println(request.getParameter("a"));
return "helloWorld";
}
用注解@RequestParam綁定請求參數(shù)a到變量a當(dāng)請求參數(shù)a不存在時(shí)會(huì)有異常發(fā)生,可以通過設(shè)置屬性required=false解決,
例如: @RequestParam(value="a", required=false)
JAVA
@RequestMapping(value = "/requestParam", method = RequestMethod.GET)
public String setupForm(@RequestParam("a") String a, ModelMap model) {
System.out.println(a);
return "helloWorld";}
Collection是List和Set兩個(gè)接口的基接口
List在Collection之上增加了"有序"
Set在Collection之上增加了"唯一"
而ArrayList是實(shí)現(xiàn)List的類...所以他是有序的.
它里邊存放的元素在排列上存在一定的先后順序
而且ArrayList是采用數(shù)組存放元素
另一種List LinkedList采用的則是鏈表。
Collection和Map接口之間的主要區(qū)別在于:Collection中存儲(chǔ)了一組對象,而Map存儲(chǔ)關(guān)鍵字/值對。
在Map對象中,每一個(gè)關(guān)鍵字最多有一個(gè)關(guān)聯(lián)的值。
Map:不能包括兩個(gè)相同的鍵,一個(gè)鍵最多能綁定一個(gè)值。null可以作為鍵,這樣的鍵只有一個(gè);可以有一個(gè)或多個(gè)鍵所對應(yīng)的
值為null。當(dāng)get()方法返回null值時(shí),即可以表示Map中沒有該鍵,也可以表示該鍵所對應(yīng)的值為null。因此,在Map中不能由get()方法來判斷Map中是否存在某個(gè)鍵,而應(yīng)該用containsKey()方法來判斷。
繼承Map的類有:HashMap,HashTable
HashMap:Map的實(shí)現(xiàn)類,缺省情況下是非同步的,可以通過Map Collections.synchronizedMap(Map m)來達(dá)到線程同步
HashTable:Dictionary的子類,缺省是線程同步的。不允許關(guān)鍵字或值為null
當(dāng)元素的順序很重要時(shí)選用TreeMap,當(dāng)元素不必以特定的順序進(jìn)行存儲(chǔ)時(shí),使用HashMap。Hashtable的使用不被推薦,因?yàn)镠ashMap提供了所有類似的功能,并且速度更快。當(dāng)你需要在多線程環(huán)境下使用時(shí),HashMap也可以轉(zhuǎn)換為同步的。
為什么要使用集合類
當(dāng)你事先不知道要存放數(shù)據(jù)的個(gè)數(shù),或者你需要一種比數(shù)組下標(biāo)存取機(jī)制更靈活的方法時(shí),你就需要用到集合類。
理解集合類
集合類存放于java.util包中。
集合類存放的都是對象的引用,而非對象本身,出于表達(dá)上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。
集合類型主要有3種:set(集)、list(列表)和map(映射)。
(1)集 (Set):口袋
集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋里放東西。
對集中成員的訪問和操作是通過集中對象的引用進(jìn)行的,所以集中不能有重復(fù)對象。
集也有多種變體,可以實(shí)現(xiàn)排序等功能,如TreeSet,它把對象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對象序列中。它實(shí)現(xiàn)的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個(gè)升序的對象集合。
(2)列表 (List):列表
列表的主要特征是其對象以線性方式存儲(chǔ),沒有特定順序,只有一個(gè)開頭和一個(gè)結(jié)尾,當(dāng)然,它與根本沒有順序的集是不同的。
列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊(duì)列。
關(guān)于實(shí)現(xiàn)列表的集合類,是我們?nèi)粘9ぷ髦薪?jīng)常用到的,將在后邊的筆記詳細(xì)介紹。
(3)映射 (Map):鍵值對
映射與集或列表有明顯區(qū)別,映射中每個(gè)項(xiàng)都是成對的。映射中存儲(chǔ)的每個(gè)對象都有一個(gè)相關(guān)的關(guān)鍵字(Key)對象,關(guān)鍵字決定了對象在映射中的存儲(chǔ)位置,檢索對象時(shí)必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的。
關(guān)鍵字本身并不能決定對象的存儲(chǔ)位置,它需要對過一種散列(hashing)技術(shù)來處理,產(chǎn)生一個(gè)被稱作散列碼(hash code)的整數(shù)值,散列碼通常用作一個(gè)偏置量,該偏置量是相對于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對象對的存儲(chǔ)位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個(gè)關(guān)鍵字應(yīng)得到不同的散列碼。
集合類簡介
java.util中共有13個(gè)類可用于管理集合對象,它們支持集、列表或映射等集合,以下是這些類的簡單介紹
集:
HashSet: 使用HashMap的一個(gè)集的實(shí)現(xiàn)。雖然集定義成無序,但必須存在某種方法能相當(dāng)高效地找到一個(gè)對象。使用一個(gè)HashMap對象實(shí)現(xiàn)集的存儲(chǔ)和檢索操作是在固定時(shí)間內(nèi)實(shí)現(xiàn)的.
TreeSet: 在集中以升序?qū)ο笈判虻募膶?shí)現(xiàn)。這意味著從一個(gè)TreeSet對象獲得第一個(gè)迭代器將按升序提供對象。TreeSet類使用了一個(gè)TreeMap.
列表:
Vector: 實(shí)現(xiàn)一個(gè)類似數(shù)組一樣的表,自動(dòng)增加容量來容納你所需的元素。使用下標(biāo)存儲(chǔ)和檢索對象就象在一個(gè)標(biāo)準(zhǔn)的數(shù)組中一樣。你也可以用一個(gè)迭代器從一個(gè)Vector中檢索對象。Vector是唯一的同步容器類??當(dāng)兩個(gè)或多個(gè)線程同時(shí)訪問時(shí)也是性能良好的。(同步的含義:即同時(shí)只能一個(gè)進(jìn)程訪問,其他等待)
Stack: 這個(gè)類從Vector派生而來,并且增加了方法實(shí)現(xiàn)棧??一種后進(jìn)先出的存儲(chǔ)結(jié)構(gòu)。
LinkedList: 實(shí)現(xiàn)一個(gè)鏈表。由這個(gè)類定義的鏈表也可以像棧或隊(duì)列一樣被使用。
ArrayList: 實(shí)現(xiàn)一個(gè)數(shù)組,它的規(guī)模可變并且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。
映射:
HashTable: 實(shí)現(xiàn)一個(gè)映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實(shí)現(xiàn)hashcode()方法和equal()方法。這個(gè)類是前面java實(shí)現(xiàn)的一個(gè)繼承,并且通常能在實(shí)現(xiàn)映象的其他類中更好的使用。
HashMap: 實(shí)現(xiàn)一個(gè)映象,允許存儲(chǔ)空對象,而且允許鍵是空(由于鍵必須是唯一的,當(dāng)然只能有一個(gè))。
WeakHashMap: 實(shí)現(xiàn)這樣一個(gè)映象:通常如果一個(gè)鍵對一個(gè)對象而言不再被引用,鍵/對象對將被舍棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命周期,盡管使用映象的程序不再有對鍵的引用,并且因此不能檢索對象。
TreeMap: 實(shí)現(xiàn)這樣一個(gè)映象,對象是按鍵升序排列的。
下圖是集合類所實(shí)現(xiàn)的接口之間的關(guān)系:
Set和List都是由公共接口Collection擴(kuò)展而來,所以它們都可以使用一個(gè)類型為Collection的變量來引用。這就意味著任何列表或集構(gòu)成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因?yàn)榭梢詮挠成浍@得一個(gè)列表。)所以說,把一個(gè)列表或集傳遞給方法的標(biāo)準(zhǔn)途徑是使用Collection類型的參數(shù)。
List接口
List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來訪問List中的元素,這類似于Java的數(shù)組。
和下面要提到的Set不同,List允許有相同的元素。
除了具有Collection接口必備的iterator()方法外,List還提供一個(gè)listIterator()方法,返回一個(gè)ListIterator接口,和標(biāo)準(zhǔn)的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。
實(shí)現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。
ArrayList類
ArrayList實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步。
size,isEmpty,get,set方法運(yùn)行時(shí)間為常數(shù)。但是add方法開銷為分?jǐn)偟某?shù),添加n個(gè)元素需要O(n)的時(shí)間。其他的方法運(yùn)行時(shí)間為線性。
每個(gè)ArrayList實(shí)例都有一個(gè)容量(Capacity),即用于存儲(chǔ)元素的數(shù)組的大小。這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加,但是增長算法并沒有定義。ArrayList當(dāng)需要插入大量元素時(shí),在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。
Map接口
請注意,Map沒有繼承Collection接口,Map提供key到value的映射。一個(gè)Map中不能包含相同的key,每個(gè)key只能映射一個(gè)value。Map接口提供3種集合的視圖,Map的內(nèi)容可以被當(dāng)作一組key集合,一組value集合,或者一組key-value映射。
HashMap類
HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。,但是將HashMap視為Collection時(shí)(values()方法可返回Collection),其迭代子操作時(shí)間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當(dāng)重要的話,不要將HashMap的初始化容量設(shè)得過高,或者load factor過低。
----------------------------------------------------------------------------
1.-------------------->
List是接口,List特性就是有序,會(huì)確保以一定的順序保存元素.
ArrayList是它的實(shí)現(xiàn)類,是一個(gè)用數(shù)組實(shí)現(xiàn)的List.
Map是接口,Map特性就是根據(jù)一個(gè)對象查找對象.
HashMap是它的實(shí)現(xiàn)類,HashMap用hash表實(shí)現(xiàn)的Map,就是利用對象的hashcode(hashcode()是Object的方法)進(jìn)行快速(Hash)散列查找.(關(guān)于散列查找,可以參看<<數(shù)據(jù)結(jié)構(gòu)>>)
2.-------------------->
一般情況下,如果沒有必要,推薦代碼只同List,Map接口打交道.
比如:List list = new ArrayList();
這樣做的原因是list就相當(dāng)于是一個(gè)泛型的實(shí)現(xiàn),如果想改變list的類型,只需要:
List list = new LinkedList();//LinkedList也是List的實(shí)現(xiàn)類,也是ArrayList的兄弟類
這樣,就不需要修改其它代碼,這就是接口編程的優(yōu)雅之處.
另外的例子就是,在類的方法中,如下聲明:
private void doMyAction(List list){}
這樣這個(gè)方法能處理所有實(shí)現(xiàn)了List接口的類,一定程度上實(shí)現(xiàn)了泛型函數(shù).
3.--------------------->
如果開發(fā)的時(shí)候覺得ArrayList,HashMap的性能不能滿足你的需要,可以通過實(shí)現(xiàn)List,Map(或者Collection)來定制你的自定義類
通常工作流系統(tǒng)是獨(dú)立的一個(gè)系統(tǒng),必須以業(yè)務(wù)系統(tǒng)和工作流系統(tǒng)的觀點(diǎn)才能比較好的理解業(yè)務(wù)系統(tǒng)。工作流系統(tǒng)負(fù)責(zé)節(jié)點(diǎn)的流轉(zhuǎn),即狀態(tài)的改變。
- 業(yè)務(wù)系統(tǒng)如果增加一個(gè)業(yè)務(wù)對象,須增加一堆的服務(wù)方法,工作流系統(tǒng)面向的是流程,增加流程無需增加代碼,因此啟動(dòng)流程的第一步,就要業(yè)務(wù)系統(tǒng)告訴工作流系統(tǒng)要管理哪個(gè)流程,即流程ID,然后工作流系統(tǒng)就記錄下此流程實(shí)例
- 工作流系統(tǒng)面向的是流程配置文件,即bpmn20.xml,用TASK表示業(yè)務(wù)系統(tǒng)中的步驟,如果這一節(jié)點(diǎn)為USER TASK,則表示工作流系統(tǒng)會(huì)等待業(yè)務(wù)系統(tǒng)的觸發(fā)而改變狀態(tài),業(yè)務(wù)系統(tǒng)會(huì)向客戶端展示頁面,收集信息并驗(yàn)證通過后才讓工作流系統(tǒng)改變流程實(shí)例的狀態(tài);如果是自動(dòng)任務(wù),則工作流系統(tǒng)會(huì)自行改變狀態(tài),流轉(zhuǎn)到下一節(jié)點(diǎn)。
- 由于處理USER TASK時(shí),需業(yè)務(wù)系統(tǒng)自行判斷,因此新增業(yè)務(wù)對象(表單)時(shí),需新增業(yè)務(wù)代碼,有別于OA系統(tǒng),新增表單時(shí),不用新增代碼。
- USER TASK中允許配有頁面展示的鏈接,業(yè)務(wù)系統(tǒng)可以從這里取得鏈接而返回給客戶端。靜態(tài)網(wǎng)頁處理時(shí),只需向客戶端傳實(shí)體HTML文件,由客戶端解釋成文本內(nèi)容,動(dòng)態(tài)網(wǎng)頁實(shí)際上由服務(wù)器端生成文本內(nèi)容再發(fā)給客戶端。
- 首先用IDE建一個(gè)web工程。(這個(gè)就不詳細(xì)介紹了)
- 引入響應(yīng)的jar包
- web.xml
<?xml version="1.0" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- Spring 服務(wù)層的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Spring 容器啟動(dòng)監(jiān)聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--為DispatcherServlet建立映射 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- SpringMVC另外一個(gè)重要的配置文件。
DispatcherServlet會(huì)根絕web.xml中配置的<servlet-name>去找<servlet-name>-servlet.xml的文件來加載spring的一些配置信息。我這里就應(yīng)該取名叫springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!--對web包中的所有類進(jìn)行掃描,以完成Bean創(chuàng)建和自動(dòng)依賴注入的功能 -->
<context:component-scan base-package="com.liba.spring.mvc"/>
<!-- 啟動(dòng)Spring MVC的注解功能,完成請求和注解POJO的映射 請求映射-->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!--以下三種視圖配置根據(jù)需要任選一種即可 -->

<!-- 一般的視圖配置 -->
<!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/view/" p:suffix=".jsp"/>-->
<!-- 針對freemarker的視圖配置 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="requestContextAttribute" value="request" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
</bean>
<!-- View resolvers can also be configured with ResourceBundles or XML files.
If you need different view resolving based on Locale, you have to use the
resource bundle resolver. -->
<!-- 這個(gè)是針對返回視圖還是json值的視圖配置 來分別處理同步和異步請求 -->
<!--<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="html" value="text/html" />
<entry key="json" value="application/json" />
</map>
</property>
<property name="favorParameter" value="true" />
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="requestContextAttribute" value="request" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
</bean>
</list>
</property>
<property name="defaultContentType" value="text/html" />
</bean>
-->
</beans>
- 如果是使用freemarker最為視圖模板需要再spring的配置文件applicationContext.xml中加入以下配置
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/view/" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="number_format">0.##########</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
</bean>
- Controller建立
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller

public class SpringMvcController
{


@RequestMapping(value="/welcome",method=
{RequestMethod.GET})

public ModelAndView getFirstPage(HttpServletRequest request)
{
//welcom就是視圖的名稱(welcom.ftl)
ModelAndView mv = new ModelAndView("welcom");
mv.addObject("name", "My First Spring Mvc");
return mv;
}
} 在url上敲http://localhost:8080/welcome就會(huì)到WEB-INF/view/welcom.ftl頁面渲染數(shù)據(jù)
- welcom.ftl頁面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Hello ${name}
</body>
</html>
頁面出來的效果:
Hello My First Spring Mvc
架構(gòu)師最基本的素質(zhì),總結(jié)出兩點(diǎn),1是技術(shù)知識廣度,2是業(yè)務(wù)行業(yè)深度。
1 架構(gòu)師是技術(shù)領(lǐng)導(dǎo)。 架構(gòu)師必須要有技術(shù),而且還是領(lǐng)導(dǎo)。架構(gòu)師要帶領(lǐng)自己團(tuán)隊(duì)完成自己的任務(wù),完全憑借自己的能力做事情,完全是匹夫之勇,根本不提倡。
2 架構(gòu)師理解軟件流程。 架構(gòu)師必須了解軟件流程,否則無法驅(qū)動(dòng)整個(gè)團(tuán)隊(duì)前進(jìn),如果一個(gè)架構(gòu)師不熟悉開發(fā)流程,無法協(xié)調(diào)產(chǎn)品線相關(guān)人員進(jìn)行高效工作,也無法指導(dǎo)團(tuán)隊(duì)成員完成自己的工作。所以來說架構(gòu)師一般不是空降兵(除非是全新的部門),因?yàn)榭战当话悴粫?huì)熟悉新公司的開發(fā)流程,即使是同一個(gè)行業(yè)的,各個(gè)公司的差別還是很大。所以說聽說某某去某某公司做首席架構(gòu)師或者首席科學(xué)家,一般是高風(fēng)險(xiǎn)的事情,即使他對這個(gè)行業(yè)很了解。
3 架構(gòu)師必須熟悉業(yè)務(wù)領(lǐng)域。 如果一個(gè)架構(gòu)師不熟悉自己的行業(yè),做的架構(gòu)就是紙上談兵,熟悉業(yè)務(wù)領(lǐng)域的架構(gòu)師,才能很好的理解需求,做出合適的方案。互聯(lián)網(wǎng)和網(wǎng)絡(luò)安全是完全不同的兩個(gè)方向,即使你熟悉里面的各種具體技術(shù),但是以互聯(lián)網(wǎng)的架構(gòu)來做網(wǎng)絡(luò)安全產(chǎn)品,肯定是100%的失敗。
我做PKI的時(shí)候,項(xiàng)目最初的使用.net,使用微軟的crytoAPI,開發(fā)的很順利。后來來了一位新的架構(gòu)師,覺得.net不能跨平臺,決定?用java,做出產(chǎn)品后,發(fā)現(xiàn)找不到arm cpu的jdk,使用平臺有限。再次決定使用openssl做,最后這個(gè)項(xiàng)目以失敗而告終。后來我想過arm cpu都是嵌入式設(shè)備用的,根本沒有任何嵌入式設(shè)備提供CA服務(wù)。
4 架構(gòu)師必須要有廣度的知識。 架構(gòu)師考慮的問題必須全面,必須了解的要廣,具體的細(xì)節(jié)可以不關(guān)注,因?yàn)榧?xì)節(jié)變化很快。很多具體技術(shù)人員出身的架構(gòu)師,只關(guān)注于具體的細(xì)節(jié),某些方面做的很好,整體的性能很差。
下面這個(gè)項(xiàng)目的成功可以理解為一個(gè)笑話。某公司的兩個(gè)部門都做c程序的,A部門做的平臺使用的x86和mips,B部門使用平臺是x86和 arm,后來A部門的一個(gè)模塊要給B部門用,最后發(fā)現(xiàn)根本不能運(yùn)行。最后A部門發(fā)現(xiàn)arm平臺使用big endian模式,這樣A部門的20多名員工,檢查代碼中所有非零整數(shù),經(jīng)過數(shù)個(gè)月苦戰(zhàn),才修改完畢。其實(shí)解決方法很簡單,因B部門的代碼也是首先在 x86做的,做的時(shí)候他們考慮了cpu的endian模式。這并不能說B部門架構(gòu)師很牛,從另一個(gè)方面說他的無知。因?yàn)榘遄佑刑€,專門切換cpu的是 big endian還是little endian,這樣兩個(gè)部門都可以不修改程序。
5 架構(gòu)師必須是寫程序的高手。
架構(gòu)師一般都是?發(fā)人員出身,一般都是團(tuán)隊(duì)的核心。優(yōu)秀的架構(gòu)師應(yīng)該了解團(tuán)隊(duì)使用各種技術(shù),有了這些知識,才能和開發(fā)人軟進(jìn)行有效溝通。
有一個(gè)項(xiàng)目架構(gòu)使用xml做配置,因?yàn)椴《編旌荦嫶螅詈髮?dǎo)致xml 達(dá)30多兆,服務(wù)端的java程序使用dom 進(jìn)行過濾的時(shí)候,30兆xml加載很慢,頻繁出現(xiàn)out of memory。這個(gè)項(xiàng)目后來擱淺。根據(jù)以前的經(jīng)驗(yàn)發(fā)現(xiàn) msxml加載30多M的xml 不過幾秒,而且msxml的xpath速度很快,后來專門為此寫了JNI處理xml的。
6架構(gòu)師是優(yōu)秀的溝通人員。 架構(gòu)師一定要會(huì)忽悠,至少要扯淡。架構(gòu)師不但要指導(dǎo)本部門員工的工作,也要協(xié)調(diào)其他部門的資源,還要向用戶收集需求,制定規(guī)格說明書,重要的把用戶的不合理要求砍掉,合理需求遵循自己的思路
如下是在window win7旗艦版環(huán)境下使用mysql數(shù)據(jù)庫的安裝實(shí)錄:
一)下載 activiti-5.6.zip(http://activiti.org/downloads/activiti-5.6.zip)
二)將activiti-5.6zip解壓到指定目錄,假設(shè)為“D:\activiti”,注意下面提到的路徑均是相對于該路徑而言
三)修改數(shù)據(jù)庫類型為mysql
打開文件“setup\build.properties”修改db=mysql(默認(rèn)為h2)。
四)配置mysql數(shù)據(jù)庫
創(chuàng)建名稱為activiti的空數(shù)據(jù)庫,url要改為:“jdbc:mysql://localhost:3306/activiti?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true“,否則報(bào)編碼錯(cuò)誤,連接帳號設(shè)為activiti,密碼也設(shè)為activiti。(如果不喜歡默認(rèn)的連接配置,可以修改文件“setup\build.mysql.properties”中相應(yīng)的屬性值)
五)預(yù)下載一些必需的文件到“C:\downloads”
“D:\downloads”這個(gè)路徑是在build.properties中通過屬性“downloads.dir”定義的,也可以手動(dòng)修改指定其他位置(默認(rèn)值為:downloads.dir=../../downloads)。
如果確保網(wǎng)絡(luò)環(huán)境很順暢,這一步也可以不做,安裝腳本會(huì)自動(dòng)下載,由于之前的版本我安裝時(shí)經(jīng)常下載中斷,導(dǎo)致文件損壞、安裝異常,所以我習(xí)慣了先預(yù)先下載,保證安裝順暢點(diǎn)。主要下載如下2個(gè)文件,左側(cè)為下載地址,右側(cè)為下載后保存的文件名:
1) http://mirrors.enquira.co.uk/apache/apache-tomcat-6.0.29.zip –> apache-tomcat-6.0.29.zip (2.71MB)
若有tomcat可以不用下載,將tomcat復(fù)制到該目錄下,如果tomcat的版本不是6.2.29則需要修改setup\build.properties文件中的tomcat.version=6.0.xx
修改為當(dāng)前的tomcat版本
2) http://activiti.org/downloads/activiti-modeler-5.6.war –> activiti-modeler-5.6.war (31.8MB)
此war文件就是activiti演示的web程序war包必須下載。
3)為了改變演示安裝里KickStart使用的數(shù)據(jù)庫,產(chǎn)生一個(gè)新的activiti.cfg.jar,并將它放置到apps/apache-tomcat-6.x/webapps/activiti-kickstart/WEB-INF/lib文件夾。
4)將JDBC DRIVER JAR拷貝到setup\files\dependencies\libs中,并將類似libs.webapp.administrator的所有配置文件中如有對H2JAR引用的都增加對JDBC DRIVER JAR的引用
六)修改瀏覽器的可執(zhí)行文件路徑
打開文件“setup\build.xml”修改屬性windows.browser的值為瀏覽器的啟動(dòng)文件對應(yīng)的位置。如我一直使用chrome,配置如下:
<property name=”windows.browser” value=”C:/Documents and Settings/dragon/Local Settings/Application Data/Google/Chrome/Application/chrome.exe” />
修改這個(gè)的目的是方便下面的”ant demo.start”結(jié)束后自動(dòng)打開瀏覽器訪問相關(guān)演示模塊的首頁。
注:在我的win7下系統(tǒng)上,使用chrome瀏覽器配置成了C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe但是在demo.start啟動(dòng)后沒有打開瀏覽器,配置成Firefox瀏覽器啟動(dòng)路徑也沒有生效,原因有待查明中。
七)檢查一下你的電腦是否已經(jīng)使用了tomcat服務(wù)
如果使用了tomcat服務(wù),得停掉,否測會(huì)沖突。順便檢查一下8080端口有沒有被占用,否測也會(huì)沖突導(dǎo)致安裝失敗。
八)安裝ant1.7和jdk1.5+環(huán)境
主要是設(shè)置環(huán)境變量ANT_HOME和JAVA_HOME,并將%ANT_HOME%\bin、%JAVA_HOME%\bin設(shè)置到path環(huán)境變量中。
九)一切就緒后就可以開始體驗(yàn)了
命令行切換到“setup/”,運(yùn)行”ant demo.start”,等待整個(gè)安裝過程自動(dòng)完成吧,安裝完畢后默認(rèn)會(huì)自動(dòng)打開瀏覽器。若沒有啟動(dòng)瀏覽器,需自己手動(dòng)打開瀏覽器在地址欄中輸入訪問地址。
可訪問web應(yīng)用如下:
演示用戶
用戶Id |
密碼 |
角色 |
Kermit |
Kermit |
管理員 |
gonzo |
gonzo |
經(jīng)理 |
fozzid |
fozzid |
用戶 |
十)新建一個(gè)流程并演示。
訪問:http://localhost:8080/activiti-modeler/

訪問后會(huì)看到左側(cè)菜單欄中是當(dāng)前workspace中自帶的一些示例流程。
點(diǎn)擊上方菜單new->Business process diagram菜單項(xiàng),瀏覽器會(huì)打開activiti建模器

如圖,此圖中描述了一個(gè)編寫每月財(cái)務(wù)報(bào)告—>審批財(cái)務(wù)報(bào)告的簡單流程。(此處用自帶的FinancialReportProcess流程做演示)
圖中看到的是一個(gè) none start event (左邊的圓圈),其次是兩個(gè) user tasks: “撰寫財(cái)務(wù)報(bào)告“和”批準(zhǔn)財(cái)務(wù)報(bào)告“,以 none end event (右邊邊框加粗型的圓圈) 結(jié)束。
以用戶fozzie(他是一個(gè)會(huì)計(jì)師)身份登錄到Activiti Explorer(http://localhost:8080/activiti-explorer/),選擇PROCESSES頁簽,在列表的Action列中點(diǎn)擊流程“Monthly financial report’”的“Start Process”鏈接來啟動(dòng)一個(gè)流程實(shí)例。如下圖所示:

由于我們是以用戶fozzie登錄,故在我們啟動(dòng)了這個(gè)流程實(shí)例后,可以看到一個(gè)新的候選任務(wù)。我們這是切換到TASKS頁簽頁去看看這個(gè)新任務(wù)(如下圖),可以發(fā)現(xiàn)就算其他人啟動(dòng)的流程實(shí)例,所有屬于用戶組accountancy的用戶都可以看到這個(gè)新的候選任務(wù)。

領(lǐng)取任務(wù):
通過Activiti Explorer界面點(diǎn)擊claim按鈕將執(zhí)行相同的領(lǐng)取任務(wù)操作。現(xiàn)在這個(gè)任務(wù)將顯示在任務(wù)領(lǐng)取者的個(gè)人任務(wù)列表中,領(lǐng)取任務(wù)后,可以在my tasks中查看并點(diǎn)擊頁面上的complete按鈕提交。

現(xiàn)在注銷掉fozzi用戶并以kermit(他是管理者)用戶登錄,第二個(gè)任務(wù)現(xiàn)在就顯示在待指定任務(wù)列表中了。Kermit用戶和上一步的操作一樣,可以對該任務(wù)進(jìn)行領(lǐng)取和提交,至此,該流程就走完了。如下圖所示:

我在安裝使用過程中遇到如下一些問題:
1)activiti-modeler-5.6.war不會(huì)自動(dòng)發(fā)布,導(dǎo)致訪問不了
解決辦法:自己將activiti-modeler-5.6.war手工解壓到apps\apache-tomcat-6.0.29\webapps\activiti-modeler,并刪除apps\apache-tomcat-6.0.29\webapps\activiti-modeler-5.6.war
2)tomcat控制臺顯示的中文亂碼
解決辦法:修改文件apps\apache-tomcat-6.0.29\conf\logging.properties,增加如下一行的配置:
java.util.logging.ConsoleHandler.encoding = GBK
3)使用activiti-modeler保存流程圖前后臺均會(huì)報(bào)錯(cuò)
解決辦法:創(chuàng)建目錄apps\apache-tomcat-6.0.29\endorsed,并將jar文件”apps\apache-tomcat-6.0.29\webapps\activiti-modeler\WEB-INF\lib\jaxb-api.jar”復(fù)制到該目錄下。
4)第一次安裝后,新建流程中出現(xiàn)中文會(huì)出錯(cuò),網(wǎng)上找了下沒有找到解決方法,我又重新安裝了一遍,沒有該問題了,目前尚不清楚是由何引起的。
安裝eclipse designer插件:
需要eclipse版本為:Eclipse IDE for java EE developers(Helios Service)
打開Help->Install New software。在如下面板中,點(diǎn)擊Add按鈕,然后填寫下列字段:
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/

添加完成后,eclipse會(huì)搜索到BPMN designer插件,選中后,按提示操作完成即可。
由于是在線安裝,插件可能偏大,我在安裝的過程中等待了很長時(shí)間,大約半個(gè)小時(shí),所以如果安裝此插件請耐心等待。
安裝完成后,重啟eclipse, 導(dǎo)入activiti自帶的examples,在src/main/process/路徑下,隨便找個(gè)后綴名為bpmn20.xml的文件打開,就可以看到該插件的效果了,如圖:

終于安裝完成了,總結(jié)一下,在安裝過程中,遇到了或多或少的問題,發(fā)現(xiàn)activiti的用戶數(shù)不是那么多,因?yàn)楹枚鄦栴}網(wǎng)絡(luò)上都搜索不到解決辦法,都得自己再鉆研一下,很是痛苦,不知啊現(xiàn)在國內(nèi)有那個(gè)項(xiàng)目用activiti5的成功經(jīng)驗(yàn)是否可以拿出來分享一下。
- 下載代碼:http://signavio-core-components.googlecode.com/svn/trunk
- 修改build.properties
# This is the Signavio Core Components configuration file. Most users only have to configure this file.
# The path to your Apache Tomcat webapps folder這里就是生成WAR后,會(huì)自動(dòng)拷貝過去的目錄
dir-tomcat-webapps = /apache-tomcat-6.0.16/webapps
# The path to your jBoss deployment folder
dir-jboss-webapps = /jboss-5.1.0/server/default/deploy
# The folder the war file(s) is/are stored
target = target
# The version of the application. If you want to integrate the Signavio Core Components into
# your own software product, you can align the version number.
version=5.0-SNAPSHOT
# The name of the war file, if you use the all-in-one-war build target
war = activiti-modeler
# The configuration you want to use. This is the name of the folder in the 'configuration' project
# that contains the configuration and skin files. The following configurations are available:
# default, Activiti, jBPM
# You can also add your own configuration in the 'configuration' project.
configuration = Activiti
# The URL of your server. Format: http(s)://<domain>(:<port>)這里要填實(shí)際的IP
# Do not add a trailing slash here!
host = http://10.5.12.248:8180/
# The path on your system the directories and diagram files are created.這里就是圖形文件保存的地方
# Do not use \ ! Always use / !
fileSystemRootDirectory = ../../../workspace/activiti-modeler-examples
- 要特別注意編碼,否則會(huì)編譯失敗,修改EDITOR中的build.properties
<java dir="${build}" jar="${root}/lib/yuicompressor-2.4.2.jar" fork="true" failonerror="true" output='${compress.temp}'>
<!-- add a row as follow -->
<sysproperty key="file.encoding" value="UTF-8"/> <arg file='${build}/oryx.debug.js' />
</java>
- 運(yùn)行命令
ant build-and-deploy-all-in-one-war-to-tomcat
- 打開瀏覽器輸入網(wǎng)址:http://10.5.12.248:8180/activiti-modeler即可
一、環(huán)境下載
- Activiti5.4.zip
- activiti-modeler-5.4.war
- apache-tomcat-6.0.20.zip
- jdk 1.6full22
- ant1.8.2
- oracle 10g rc2
二、環(huán)境準(zhǔn)備
- 安裝jdk1.6full22 配置JAVA_HOME,CLASS_PATH,PATH
- 安裝ant1.8.2,配置ANT_HOME,PATH
- 安裝oracle 10g rc2,創(chuàng)建用戶:activiti/activiti(建議為其創(chuàng)建獨(dú)立表空間和臨時(shí)表空間),分配create session,resource,dba權(quán)限;
- 解壓Activiti5.4.zip->../activiti-5.4(即activiti_home)
- 將activiti-modeler-5.4.war和apache-tomcat-6.0.20.zip放到activiti_home/downloads
三、activiti5.4 demo相關(guān)配置
- 指定demo數(shù)據(jù)庫為oracle 10g
修改activiti_home/setup/build.properties:db=H2->db=oracle
- 指定自選版本的tomcat(建議6.0以上,這里用的是6.0.2.0,以下為測試過)
修改activiti_home/setup/build.properties:tomcat.version=6.0.32->tomcat.version=6.0.2.0
- 指定自己下載的activiti-modeler-5.4.war和apache-tomcat-6.0.20.zip(這里必須與tomcat.version一致)
修改downloads.dir=../../downloads->downloads.dir=activiti_home/downloads
- 配置oracle數(shù)據(jù)庫信息,主要修改activiti_home/setup/build.oracle.properties:
db=oracle
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL
jdbc.username=activiti
jdbc.password=activiti
- 修改tomcat的8080為80端口,主要修改activiti_home/setup/build.xml配置(兩處):
<replacetoken><![CDATA[port="8080"]]></replacetoken>
<replacevalue><![CDATA[port="80" URIEncoding="UTF-8"]]></replacevalue>
注意:如果修改了默認(rèn)端口,需要修改配置文件里所有默認(rèn)端口為指定端口
- 指定自己的瀏覽器,這里用的是firefox,如果配的瀏覽器不存會(huì)取當(dāng)前系統(tǒng)默認(rèn)瀏覽器
<property name="windows.browser" value="F:/application/Mozilla Firefox/firefox.exe" />
- 指定自己數(shù)據(jù)庫對應(yīng)的jdbc driver默為ojdbc5*.jar,這里指為ojdbc14.jar,修改如下:
<include name="ojdbc1*.jar" if="db.is.oracle"/>
并把ojdbc14.jar放到:activiti_home/setup/files/dependencies/libs和activiti_home/setup/files/webapps所有web工程對應(yīng)的lib里(這個(gè)在安裝發(fā)布相應(yīng)工程為自動(dòng)復(fù)制到相應(yīng)的應(yīng)用里)
- 解決安裝過程中中文顯示亂碼問題(這里不能解決安裝一小段顯示亂碼問題),在activiti_home/setup/files/tomcat/logging.properties添加如下內(nèi)容:
java.util.logging.ConsoleHandler.encoding = GBK
- 在activiti_home/setup運(yùn)行ant cfg.create命令生成修改后的activti配置,這些信息都放在新生成的activiti_home/setup/build文件里
這里最關(guān)鍵的兩個(gè)文件:activiti.cfg.xml和activiti-cfg.jar
- 替換activiti_home/setup/files/cfg.activiti/standalone/activiti.cfg.xml為新生成的activiti.cfg.xml
- 替換activiti_home/setup/files/webapps下所有activiti-cfg.jar為新生成的activiti-cfg.jar
- 修改activiti_home/setup/files/cfg.modeler/configuration.properties里host = http://localhost:8080為host = http://localhost(這里用的是80端口)