天的項目經歷使我終身難忘
有喜有悲
有付出更有收獲
從web service
Tomcat
Eclipse
Ajax
Spring都在這
天的辛勤努力中克服了
時間轉眼過去一年多了
我離開H公司也已經一年多了
往事不堪回首
世事也總是以成敗論英雄
因為我知道前面的一個接口項目先後導致
個人離職
個人被處罰;而這個項目只有我一個人
在項目割接的當天我總算不辱使命完成了;我既是成功者
也是失敗者;我證明了自己是可以笑著離開H公司的
其實我一直不太想寫出來
畢竟申請離職也不是一件很光彩的事情
年是全國號碼百事通風起雲湧的一年
而Z電信公司正是第一個勇於吃螃蟹的人且率業界之先的公司;我就是
年初被派到Z電信公司跟著另外一個項目經理討論接口需求的(原因很簡單
為了避免壟斷
Z電信公司把省中心業務給了Q公司
而
個地市給了H公司
所以在省中心和地市之間需要通過Web Service接口進行互連)
其實在這之前的一年內我是做BI和數據庫優化的
對於所謂的接口和
是一竅不通的
估計看出了點苗頭
項目經理當了甩手掌櫃
只好由我一個人來負責此事了
月
號
春節還沒過完
我便來到了H市
經過反復的討論和調研
其實我做的工作只是號碼百事通業務的一部分
即實現對現有知識庫的智能訪問
當然訪問是需要通過接口來完成的
此外還要實現一定的功能
例如發送短信
來電轉接
記錄計費信息
當然也是通過接口來實現
其實我很早就已經有了初步的想法最簡單的就是我自動生成存儲過程和自動生成html網頁(其實基本上已經實現了)但是了解到存儲過程需要在友商的數據庫中創建以及考慮到相關的風險和雙方的劍拔弩張的氣氛這顯然是不可能實現的任務現在只能自己另辟蹊徑建一個獨立的Web Server服務器通過正在流行的Web Service接口來實現這一切功能了
上述的圖片顯示的框架源於我對BI和數據庫的理解只要有一個開放的數據字典基本上就可以實現任何的自定義查詢和自定義組合;如果復雜一點的話甚至可以實現一套簡單的報表系統正是基於這樣的想法和相關數據結構開始和Q公司談相關的接口但是有幾個問題一直纏繞著我:
采用什麼樣的WEB服務器Tomcat還是Resin
采用什麼樣的編程工具Jbuilder還是Eclipse?
Web Service接口到底是什麼如何完成發布和調用
采用什麼樣的Java框架(Struct還是Spring還是純粹的JSP)
Ajax技術
關於樹型目錄的實現(需要高效無延遲)
最難纏的還是和Q公司的談判和交流(要面對對方人的輪番轟炸)
也許對於Java高手而言這根本不算什麼可對於我而言那簡直是一場噩夢我的Java水平和HTML水平僅限於寫一些簡單的JSP頁面和JavaBean完成簡單的封裝我自認為自己水平最高的還是HTML和Javascript水平不管多麼復雜的頁面和frame我都可以整理出一個頭緒出來我從來不是一個唯工具論者我相信任何工具都只是手段而條條馬路都可以通向羅馬的可惜給我留的時間太短了只有周的時間說真的那時候天天對著西湖的美景沒有一絲絲觀看的心情真的想撲通一聲跳下去一了百了
言規正傳首先需要確定系統大體的架構Tomcat和Eclipse都是開源的架構不涉及到版權和費用從網上down的Tomcat呵呵如果Z電信公司知道了非要氣個半死不可按照從網上搜索的資料把Tomcat和Eclipse環境配置完畢然後按照公司的Java高手指點配置Spring框架
關於Spring框架的配置
Spring 是一個開源框架是為了解決企業應用程序開發復雜性而創建的框架的主要優勢之一就是其分層架構分層架構允許您選擇使用哪一個組件同時為 JEE 應用程序開發提供集成的框架
其實在這樣的小型系統裡它提供了一個便於調試和控制的開關;至少在本文中是為了解決無法使用接口環境進行調試的時候改用數據庫接口方式
<! =======如果是和soap接口連接請去掉該bean的注釋===========>
<bean id=QueryData class=comxxxyyyinfSoapInterface>
<property name=endpoint>
<value>;/value>
</property>
<property name=nameSpace>
<value>;/value>
</property>
</bean>
<! ===========如果是和db接口連接測試請去掉該bean的注釋 =====>
<!
<bean id=QueryData class=comxxxyyyinfDBInterface>
<property name=dataSource>
<ref local=DataSource/>
</property>
</bean>
>
關於樹型目錄的框架
嚴格說來寫一個樹型目錄的架構是一項非常復雜的工作樹型目錄的實現有兩種方式:全部畫出所有的樹節點和當觸發時實時畫出下一層節點前一種的實現相對簡單一些但是當節點數量超過之後采用遞歸算法會導致頁面首次顯示時出奇的緩慢我曾經做過對js腳本和相應的存儲過程做過調優但是效果還是不甚理想;觸發時才實時畫出下一層節點技術難度很高還好公司有現成的框架光Java類和接口就有幾個完全閱讀並理解顯然是不現實的只能通過摸索把先有的業務和原來的接口進行不斷的測試花費了一天時間才得以完成
關於Web Service
Web Service是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求輕量級的獨立的通訊技術總體來講它能夠突破平台限制穿越企業防火牆通過開放的接口和認證實現信息的共享和傳遞
WSDL
對於商業用戶來說要找到一個自己需要使用的服務他必須知道如何來調用 WSDL (Web Services Description Language) 規范是一個描述接口語義以及Web服務為了響應請求需要經常處理的工作的XML文檔這將使簡單地服務方便快速地被描述和記錄
對於Net的WSDL調用來說是很簡單的例如一個簡單的VBS腳本
Dim obj
set obj=createobject(MSSOAPSoapClient)
objMSSoapInit QueryServicewsdl
MsgBox objgetPhoneByName( XXX單位)
但是對於Java而言調用一個Net產生的WSDL簡直被折磨了半死Q公司又不肯提供技術支持不斷的進行調試跟蹤最後才發現是一個setEncodingStyle參數設置的問題
public class CpSpInterface {
protected Log logger = LogFactorygetLog(thisgetClass());
private String endpoint = ;
private String nameSpace = GetSPInfo;
public String callGetIndexByType(String strTypeID String strParaListString strResultType)
{
String ret = <?xml version=\\ encoding=\gb\ ?><root status=\\ lines=\\></root>;
try {
String methodName = GetIndexByType;
Service service = new Service();
Call call = (Call) servicecreateCall();
callsetTimeout(new Integer());
callsetTargetEndpointAddress(new URL(endpoint));
callsetUseSOAPAction(true);
callsetSOAPActionURI(nameSpace + /GetIndexByType);
callsetOperationStyle(nstantsStyleWRAPPED);
callsetEncodingStyle(literal);
callsetOperationName(new QName(nameSpace methodName));
StringHolder holder = new StringHolder();
// Set Call Parameter
calladdParameter(new QName(nameSpace strTypeID)
ConstantsXSD_STRING ParameterModeIN);
…………略
//Set back Parameter
callsetReturnType(ConstantsXSD_STRING);
ret = (String) callinvoke(new Object[] { strTypeID strParaList
strResultType });
ret = retreplaceAll(utfgb);
loggerdebug(ret = +ret);
(return errorcode = + holdervalue);
} catch (Exception e) {
loggererror(Error + e);
}
return ret;
}
}
關於Ajax
單純從Ajax本身來說其最主要不過就是解決在網頁上一個無刷新獲取數據的問題再加上減少了數據的傳輸量將數據解析的工作推到了客戶端的確能解決很多傳統的問題很方便的實現一些動態效果Ajax的應用本來是為了增強用戶體驗於是就有了一個新的名詞WEB
其實在該系統的應用很簡單即獲取到COM組件傳過來的主叫號碼和被叫號碼記錄到Session中具體的JSP頁面是一個非常簡單的頁面就不必再寫了呵呵
Xh = new ActiveXObject(MicrosoftXMLHTTP);
var link = /beginSessiondo?callID=+callid+&callerNo=+callerno+&calleeNo=+calleeno;
關於交流
其實整個系統過程中最頭疼的問題還是和Q公司的交流Q公司是一家新型的在電信領域剛剛展露頭腳的公司面對這樣一個揚名立萬的機會當然不會錯過了於是派了個現場人員進行現場開發真不知道他們的項目成本控制是怎麼做的;而我方總計也只有個人參與接口的討論最多也只有個人;每次都要面對對方嗡嗡的一群人的輪番轟炸;最後不得已拉著Z電信公司一起參與討論還好對方也有很多的軟肋(雙方都要提供一些接口)才不至於被折磨的太慘
年月日是個特殊的日子當天下午Q公司終於把接口調試完畢當天晚上我也把相應的功能完善起來終於到了一個milestone彷佛經歷了一場噩夢連續周的時間每天從早點到晚上點不停的寫代碼調試代碼查詢資料討論需求;極度厭煩了這樣的生活最後終於借口身體不好倉惶逃離了這個地方把工作交接給一位新來的同事他又繼續維護了個月我回去後休整了個多月身體仍然比較虛弱再過了一個月就黯然離職了
補記:時年月份便發生了一幕慘劇一位同事因過勞而死…不知道我再呆上幾個月輪到的是不是我…
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19223.html