近期遇到的問題。簡要記之,謹作備忘。
關鍵詞:Delphi7、Eclipse/MyEclipse、AXIS2、Web Service、ocx、XML、Base64、多頁Tiff、ImageEn等
一、Web服務器配置AXIS2服務
到http://ws.apache.org/axis2/ 下載 axis2-1.4.1-war.zip。
或在http://apache.justdn.org/ws/axis2/下載。
解壓後可以得到axis2.war。
把axis2.war以Web應用方式部署到Web服務器,訪問http://127.0.0.1:8888/axis2,如出現AXIS的歡迎頁面,則說明配置成功。
當然axis2.war可以重新命名爲其他的xxxx.war。
二、AXIS2在Eclipse IDE中的配置
需要下載Axis Eclipse plug-in,分別是AXIS2的代碼生成工具和打包工具:
axis2-eclipse-codegen-wizard.zip
axis2-eclipse-service-archiver-wizard.zip
下載地址:http://apache.justdn.org/ws/axis2/tools/1_4_1/
把下載的AXIS2的兩個plug-in解壓縮後放到Eclipse安裝目錄下的plug-in子目錄。
Eclipse啓動後便可在“File->New->Other”中看到這些Wizards工具。
AXIS2在Eclipse中開發Web Service的過程如下:
1. 新建Project
2. 新建Web Service的WSDL文件。
3. 使用Axis2 Code Generator嚮導,分兩次從WSDL建立Web Service的Server端和Client端。
4. 使用Axis2 Services Archive嚮導,把Web Service服務端打包成aar。
5. 發佈aar,把aar文件Copy到Axis2應用的/WEB-INF/services/目錄下面。
訪問對應的web應用可以得到該Web Service的WSDL文檔。
三、AXIS2在MyEclipse6.5報錯的問題
Axis2 Code Generator嚮導生成代碼後,在Finish 時會產生Exception:
An error ocurred while completing process
-java.lang.reflect.InvocationTargetException
問題在於 Code Generator plugin 內缺少了兩個包:
backport-util-concurrent-3.1.jar 包
geronimo-stax-api_1.0_spec-1.0.1.jar 包
解決方法:
1. 關閉 Eclipse
2. copy %AXIS2_HOME%/lib/下的backport-util-concurrent-3.1.jar 和 backport-util-concurrent-3.1.jar
粘貼到 MyEclipse 6.5/eclipse/plugins/Axis2_Codegen_Wizard_1.3.0/lib 文件夾下。
3. 註冊此jar 包:
編輯MyEclipse 6.5/eclipse/plugins/Axis2_Codegen_Wizard_1.3.0/plugin.xml文件。
在 <runtime>內加入如下內容:
<library name="lib/geronimo-stax-api_1.0_spec-1.0.1.jar">
<export name="*"/>
</library>
<library name="lib/backport-util-concurrent-3.1.jar">
<export name="*"/>
</library>
4. 保存plugin.xml文件,重新啓動Eclipse即可。
四、Delphi7客戶端調用AXIS2服務的問題
因爲Delphi7發佈的時候,AXIS2還沒有出生,Delphi7不兼容AXIS2的WSDL文檔。
在默認情況下,D7導入AXIS2的WSDL後,生成的pas文件中沒有對應的Web Service接口方法。
所以默認情況下無法使用D7編寫的客戶端調用AXIS2的Web Service服務。
爲此,花費不少時間研究,幾經磨難才搞定。 ^_^
五、Delphi7+AXIS2 Web Service服務傳送文件
這個問題不大。主要還是BASE64的應用。其核心跟D7調用JBuilder9/10帶的AXIS一樣。
只是多了request和response這樣請求和返回的參數,更具BS程序特性。
六、多頁tif文件的處理
多頁tif的拆分和合成,其處理速度是最頭疼事情。
JAVA處理多頁tif:JAI組件。可以把多頁tif拆分成jpeg,然後再合併成多頁tif,這樣處理速度會稍好一些。
Delphi7處理多頁tif:ImageEn控件,功能強大。
七、使用JDOM生成格式化XML文件
用dom4j生成的XML文件不易做換行縮進等美化格式的操作。
使用jdom可以輕鬆搞定一個換行縮進格式美化且易讀且良構的XML文件。
主要語句參考:
Element root = new Element("aRoot");
Document document = new Document(root);
......
try{
Format format = Format.getCompactFormat();
format.setEncoding("UTF-8"); //設置文件編碼格式UTF-8
format.setIndent(" "); //設置縮進
XMLOutputter XMLOut = new XMLOutputter(format);
XMLOut.output(document, new FileOutputStream(saveFilePath));
} catch (Exception e) {
e.printStackTrace();
}
八、Delphi7生成發佈ocx的問題
D7中新建Active Form,在Type Library中對接口新增一個Property屬性,生成對應的set和get方法。
html頁面嵌入ActiveX後可以向ocx傳遞參數。
主要在ActiveForm的set方法中得到傳入的參數。
ocx對象實例化時,其參數的執行順序和建立順序一致。使用前記得先註冊ocx。
另外,發佈ocx時,Project--Web Deploy等按鈕可能是灰色。可能D7是D版或Bug。
針對這個問題,具體的做法是再New一個Active Form,然後關掉這個新的Active Form,這時候就可以使用Web Deploy了。
九、D7中ImageEn控件版本衝突問題
如下4個bpl可能會與其他控件的bpl衝突:
PKIECtrl7.bpl、PKIEDB7.bpl、DPKIECTRL7.bpl、DPKIEDB7.bpl
可把這些bpl放置到/WINDOWS/system32/目錄下。
十、在IE7中刷新驗證碼圖片
點擊驗證碼圖片域時,把其中的驗證碼圖片刷新一下。在IE6下沒有問題。
因圖片指向引用地址未變,IE7瀏覽器未能自動刷新圖片。
如下,在地址中增加一個Math取得隨機數的方法,即可解決IE7中刷新驗證碼圖片的問題。
<script>
function reflush()
{
document.getElementById('ValidateImg').src="/servlet/ValidateNum?"+Math.random();
}
</script>
十一、Ext.Panel.load()的回調callback()方法
aPanel.load({url: 'test.jsp',
scripts: true,
nocache: true,
discardUrl: false,
timeout: 600000, //10min
callback:function(el, success, response) {
if (!success ) {
var obj = Ext.util.JSON.decode(response.responseText);
alert(obj.msg);
}
}
});
當response返回FAILED時,回調觸發執行:
response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);//設置失敗
十二、動態設置Ext.form.TextField的emptyText屬性
aField.setRawValue('請輸入查詢條件');
aField.emptyText = '請輸入查詢條件';
aField.applyEmptyText();
十三、mms協議的端口
使用Windows Media Service發佈點播服務,對外映射外網IP時,需開放防火牆的554、1755端口和對應的路由器的映射端口。
十四、Web應用絕對路徑
//如果Web應用的絕對路徑中包含中文或空格,則需要處理一下
String realPath = (Thread.currentThread().getContextClassLoader().getResource("")).getPath();
try {
realPath = URLDecoder.decode(realPath,"UTF-8");
} catch (UnsupportedEncodingException e) {
System.out.println(this.getClass().getName()+" throw Exception: "+e.toString());
}
realPath = realPath.substring(1,realPath.length());
十五、連接SQLServer2005的問題
一直用的SQLServer2000,更換到SQLServer2005時,後臺報錯:
------------
[Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]傳入的表格格式數據流(TDS)遠程過程調用(RPC)協議流不正確。
------------
上網搜到原因,連接SQLServer2005需替換微軟新的數據庫驅動程序。
於是下載了sqljdbc.jar。一試果然好使,同時也支持SQLServer2000。
以後可以不用那3個jar驅動了。
數據庫驅動名稱和數據庫鏈接寫法舉例:
SQLServer 2000數據庫驅動的寫法:
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://192.168.100.100:1433;dataBaseName=testdb"
SQLServer 2005數據庫驅動的寫法:
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://192.168.100.100:1433;DatabaseName=testdb"
注意兩者的差異。
By JRQ
2009/06/12 於南昌