2009年2月20日 星期五

在Windows平台使用JSP Solution時, 如何引用Com元件,增加系統功能?

問題說明:
最近開發一套Windows平台Web Application 的單一簽入系統,須要讓JSP引用已開發好的單一簽入開發端元件;免得重寫開發端元件,也有利於系統的維護。因此,尋找相關的解決方案。
在ASP Solution中有Server.CreateObject("元件名稱")可以引用COM元件。
在PHP Solution中有new COM("元件名稱")可以引用Com元件。
JSP Solution引用Com元件的解決方案如下:
1.須取得JACOB套件,安裝於JAVA 2 SDK中。
2.使用JACOB套件的new ActiveXComponent("元件名稱")或new Dispatch("元件名稱")功能。
由於此元件的搜尋與安裝有些複雜,因此記錄於此,隨時提供備忘索引;也分享給有此需求的網友。

JACOB簡介:
JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java.
官方網站:http://danadler.com/jacob/

JACOB下載:
下載JACOB1.7版
下載JACOB1.14.3版

JACOB安裝:
1.在j2sdk所在資料夾,建立一次目錄:com;再將下載檔案解縮後的jacob.dll複製至此目錄。
2.將下載檔案解縮後的jacob.jar複製到j2sdk所在資料夾的lib次目錄。
3.CLASSPATH環境變數加入,jacob.jar所在路徑。
4.PATH環境變數加入,jacob.dll所在路徑。
注意1:設定上面環境變數時,需要保留原來的設定值;也就是說是附加不是取代。如果取代了上面的環境變數,可能會引起系統運作不正常。
注意2:JACOB如果安裝1.14.3版,web server使用Resin時,須升級至:3.2以上版本。
下面環境變數設定是以JDK1.6.0-12為例:
CLASSPATH=.;C:\Program Files\Java\jdk1.6.0_12\lib\tools.jar;C:\Program Files\Java\jdk1.6.0_12\lib\dt.jar
Path=C:\Program Files\Java\jdk1.6.0_12;C:\Program Files\Java\jdk1.6.0_12\bin;C:\Program Files\Java\jdk1.6.0_12\com
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_12

接著就可以開始撰寫JSP程式囉:
引用ActiveXCom元件時,使用:new ActiveXComponent("元件名稱.Class名稱")
引用一般Com元件時,使用:new Dispatch("元件名稱.Class名稱")
JOCA官方網站,範例程式碼如下:
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
Object xlo = xl.getObject();
try {
System.out.println("version="+xl.getProperty("Version"));
System.out.println("version="+Dispatch.get(xlo, "Version"));
xl.setProperty("Visible", new Variant(true));
Object workbooks = xl.getProperty("Workbooks").toDispatch();
Object workbook = Dispatch.get(workbooks,"Add").toDispatch();
Object sheet = Dispatch.get(workbook,"ActiveSheet").toDispatch();
Object a1 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
new Object[] {"A1"},
new int[1]).toDispatch();
Object a2 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
new Object[] {"A2"},
new int[1]).toDispatch();
Dispatch.put(a1, "Value", "123.456");
Dispatch.put(a2, "Formula", "=A1*2");
System.out.println("a1 from excel:"+Dispatch.get(a1, "Value"));
System.out.println("a2 from excel:"+Dispatch.get(a2, "Value"));
Variant f = new Variant(false);
Dispatch.call(workbook, "Close", f);
} catch (Exception e) {
e.printStackTrace();
} finally {
xl.invoke("Quit", new Variant[] {});
}

個人自行開發元件引用程式碼如下:
Dispatch ctsso= new Dispatch("SSOUtilNoneAspx.CTSSOUtil");
Variant cookieDomain=Dispatch.call(ctsso,"GetCookieDomain",new Variant(true));
Variant cookieName=Dispatch.call(ctsso,"GetCookieName",new Variant(true));
Variant result= Dispatch.call(ctsso,"IsAuthenticated", new Variant(kValue),new Variant(""));

沒有留言: