JSP作為客戶方訪問CORBA服務物件

來源:互聯網
上載者:User
js|對象|訪問  結合J2EE和CORBA可以充分利用兩者的優點建立效能更好功能更強的應用系統,例如可以使用C++實現的CORBA對象作為業務處理構件,形成高效能商務邏輯層,在JSP中訪問CORBA構件建立展現層。 下面我們就一起來看一個在JSP中訪問CORBA服務物件的例子。
   軟體選擇:
  CORBA服務方,我們選擇中創軟體商用中介軟體有限公司(http://www.inforbus.com)的InforBus(一個遵循CORBA規範的分布對象中介軟體),基於C++進行開發。作業系統選擇IBM AIX(當然,你也可以選擇HP UNIX、Linux或者Windows之類的)。
  CORBA客戶方,為了展現CORBA的互操作能力,這裡使用了JDK中包含的ORB。當然,作為一種更好的選擇,您也可以使用InforBus的Java版本來實現CORBA的客戶方。
  JSP運行環境,我們選擇中創軟體商用中介軟體有限公司(http://www.inforbus.com)的InforWeb(一個遵循J2EE規範的應用伺服器)。作業系統選擇Window(當然,你也可以選擇HP UNIX、Linux或者AIX之類的)。

   程式實現
   IDL
  IDL是CORBA服務方和客戶方進行請求調用的協議,只要使用相同的IDL,客戶方和服務方就可以進行無縫的通訊,而與客戶方和服務方的開發語言、作業系統都沒有關係,甚至你可以為客戶方和服務方選擇不同的CORBA中介軟體(只要他們都遵循CORBA規範)。在實現CORBA客戶方程式的時候,你不需要關心服務方的任何細節,你所需要關心的只有IDL!
在這裡我們定義如下所示的IDL(檔案名稱為apptest.idl):
  1. module example {
  2.     interface A {
  3.         long AOperation(in long ilData);
  4.     };
  5. };


   CORBA服務方程式實現
  CORBA服務方實現需要做的工作主要有:將IDL映射到C++,實現IDL中定義的介面(即實現處理邏輯),編寫一個主程式執行個體化服務物件提供服務。
  1. 將IDL映射到C++
  這個只需要調用InforBus的IDL編譯器idl,執行如下命令:
idl apptest.idl
  這個命令將產生四個檔案:apptest.h、apptest.cpp、apptest_skel.cpp、apptest_skel.cpp,其中包含了Skeleton。
  2. 實現IDL中定義的介面
  繼承Skeleton,實現IDL介面定義,在實作類別中完成你的商務邏輯,在這個例子中我們實現一個簡單的邏輯,將接收到的參數乘以2,然後將結果返回,代碼如下:
  1. ////////////////////////////////////////
  2. // 檔案名稱:apptest_impl.h
  3. #ifndef APPTEST_IMPL_H
  4. #define APPTEST_IMPL_H
  5. #include \"apptest_skel.h\"
  6. class A_impl:public POA_example::A, PortableServer::RefCountServantBase {
  7.     public:
  8.         virtual CORBA::Long AOperation(CORBA::Long ilData)
  9.             throw(CORBA::SystemException);
  10. };
  11. #endif
  12. //////////////////////////////////////////////////////
  13. // 檔案名稱:apptest_impl.cpp
  14. // 包含CORBA系統類別庫
  15. #include <STARCORBA.h>
  16. using namespace std;
  17. #include <apptest_impl.h>
  18. // 操作AOperation的實現
  19. CORBA::Long A_impl::AOperation(CORBA::Long ilData)
  20.         throw(CORBA::SystemException) {
  21.     CORBA::Long ret;
  22.     ret = ilData * 2 ;
  23.     return ret;
  24. }


  3. 編寫一個主程式執行個體化服務物件提供服務
  在主程式中,建立CORBA環境,執行個體化服務物件並註冊到名字服務,然後開始等待請求,代碼如下(為了):
  1. ///////////////////////////////////////////
  2. // 檔案名稱:Server.cpp
  3. #include <stdio.h>
  4. #include <STARCORBA.h>
  5. #include <STARCosNaming.h>
  6. #include <stdlib.h>
  7. #include <errno.h>
  8. #include \"apptest_impl.h\"
  9. using namespace std;
  10. int main(int argc, char* argv[], char*[]) {
  11.     CORBA::ORB_var orb;    
  12.     orb = CORBA::ORB_init(argc, argv);
  13.     CORBA::Object_var nameobj = 
  14.         orb -> resolve_initial_references(\"NameService\");
  15.     CosNaming::NamingContext_var nc = 
  16.         CosNaming::NamingContext::_narrow(nameobj.in());
  17.     CORBA::Object_var poaObj = 
  18.         orb -> resolve_initial_references(\"RootPOA\");
  19.     PortableServer::POA_var rootPOA = 
  20.         PortableServer::POA::_narrow(poaObj);
  21.     PortableServer::POAManager_var manager = 
  22.         rootPOA -> the_POAManager();
  23.     
  24.     A_impl* AImpl = new A_impl();
  25.     PortableServer::ServantBase_var servantA = AImpl;
  26.     PortableServer::ObjectId_var Aid = 
  27.         rootPOA -> activate_object(servantA);
  28.     CORBA::Object_var A = 
  29.         rootPOA -> servant_to_reference(servantA);
  30.     CosNaming::Name AName;
  31.     AName.length(1);
  32.     AName[0].id = CORBA::string_dup(\"A\");
  33.     AName[0].kind = CORBA::string_dup(\"OperationA\");
  34.     nc -> rebind(AName, A.in());
  35.     
  36.     manager -> activate();
  37.     orb -> run();
  38.     
  39.     nc -> unbind(AName);    
  40.     return EXIT_SUCCESS;
  41. }


   Web應用實現
  Web應用中主要是通過一個JSP訪問CORBA服務物件並進行展示,在這裡充當CORBA的客戶方。實現Web應用需要完成兩個方面任務:將IDL映射到Java,在JSP中發送請求並展示結果。
  1. 將IDL映射到Java
  這個只需要調用JDK的IDL編譯器idlj,執行如下命令:
idlj apptest.idl
  這個命令將產生五個檔案:A.java、AOperations.java、AHelper.java、AHolder.java和_AStub.java,其中包含了Stub。

  2. 在JSP中發送請求並展示結果。
  為了避免在JSP中包含太多的Script,在這裡將發送請求的代碼從JSP分離到了一個簡單的Java類中。
  Java類的代碼如下(AClient.java):
  1. /*
  2.  * AClient.java
  3.  */
  4. package example;
  5. import org.omg.CORBA.*;
  6. import org.omg.CORBA.ORBPackage.InvalidName;
  7. import org.omg.CosNaming.*;
  8. import org.omg.CosNaming.NamingContextPackage.CannotProceed;
  9. import org.omg.CosNaming.NamingContextPackage.NotFound;
  10. /**
  11.  * @author 公飛
  12.  */
  13. public class AClient {
  14.     public static int opA(int num) throws Exception {
  15.         String[] args = { \"-ORBInitRef\",
  16.                 \"NameService=corbaloc:iiop:192.168.60.158:900/NameService\" };
  17.         ORB orb = ORB.init(args, null);
  18.         org.omg.CORBA.Object objRef;
  19.         objRef = orb.resolve_initial_references(\"NameService\");
  20.         NamingContext ncRef = NamingContextHelper.narrow(objRef);
  21.         NameComponent nc = new NameComponent(\"A\", \"OperationA\");
  22.         NameComponent path[] = { nc };
  23.         org.omg.CORBA.Object objA;
  24.         objA = ncRef.resolve(path);
  25.         A a = AHelper.narrow(objA);
  26.         int out;
  27.         out = a.AOperation(num);
  28.         return out;
  29.     }
  30. }


  JSP檔案的代碼如下(index.jsp):
  1. <%@ page contentType=\"text/html;charset=gb2312\"%>
  2. <%@ page import = \"example.AClient\" %>
  3. <html>
  4.     <head>
  5.         <title>Hello JSP CORBA Client</title>
  6.     </head> 
  7.     <body>
  8.         3*2=<%=AClient.opA(3)%>
  9.     </body>
  10. </html>


  好了,編譯好你的程式,運行名字服務,運行CORBA服務程式,運行應用伺服器InforWeb,部署Web應用,然後就可以通過瀏覽器訪問了。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。