JAVA與CORBA通訊介面開發
corba(公用物件請求代理體系)是基於物件技術的分佈計算應用軟體體系結構。corba標準主要分為三個部分:介面定義語言(idl),物件請求代理(orb),以及orb之間的互操作協議iiop,核心是物件請求代理。corba與平臺和語言無關。
java idl既是corba的一個實現,它是jdk1.3或更高版本的核心軟體開發包之一,定義在org.omg.corba及其子包中,在java idl的支援下,開發開發人員可以使用如下兩種開發方法 將java和corba整合在一起:
建立java物件並使之可在corba orb中展開;建立java類並作為http://www.makaidong.com
採用java建立corba應用開發,corba物件服務的實現方式分為兩種:物件的命名引用方式和字串化物件引用方式,建立corba應用開發程式的開發過程 大體如下:編寫idl介面定義檔案;將介面定義檔案編譯為相應高階語言原始碼,產生伺服器開發框架與客戶端存根;基於伺服器開發框架,編寫服務物件實現程式;基於客戶端存根,編寫客戶物件呼叫程式;分別編譯客戶物件和服務物件程式;執行服務物件和客戶物件程式。
第一步下載jacorb並配置jacorb
1,解壓jacorb-2.3.0-bin,將jacorb拷貝到c:\jacorb;
2,修改c:\jacorb\bin下的檔案,去掉idl.tpl,idl.bat.tpl,jaco.tpl和jaco.bat.tpl檔案的字尾名".tpl";
3,在jacorb目錄下建立classes資料夾,將etc中的jacorb_properties.template檔案拷貝到classes下,將檔案中(*)orbinitref.nameservice=file:/c:/ns_ref修改為
(*)jacorb.naming.ior_filename=c:/ns_ref,並將檔名改為jacorb.properties
4,在dos下輸入ns即可。
但是在執行期間會出現org.omg.corba.transient: retries exceeded, couldn't reconnect to 127.0.0.1:900vmcid: 0x0minor code: 0completed: no”
所以改用明命令
tnameserv -orbinitialport 30000
原始碼中用指定引數初始化orb的程式碼形如:properties props = system.getproperties();
props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb");
props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton");
// 啟動命名服務需要的引數
props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.5:30000/nameservice");
// 初始化orb
org.omg.corba.orb orb = org.omg.corba.orb.init(args, props);
第二步下載orbstudio
解壓縮從orbstudio/plugins/下面取得 orbstudio_7.7.7.jar 的jar包 放到eclipse/plugins下面,果考入jar包前以前eclipse是執行的請關閉,重新執行。
windows/preferences/出現如下視窗選擇orb studio/idl compiler/ 在右邊選擇jacorb 這裡有5種編譯器我們使用jacorb. 開啟idl compiler 前面的加號選擇,
jacorb 右邊引數idl command: d:\java\jacorb\bin\idl.bat
command options: -d %d% %f% 這樣就配置成功了eclipse下面的corba開發
第三步,編寫idl檔案
hello.idl
module helloapp
{
interface hello
{
string sayhello(in string message);
};
};
右鍵orb-->compile,會產生編譯的原始碼
_hellostub.java:該類是客戶機stub,可為客戶機提供corba功能,它實現hello.java介面。
也可以在idl檔案所在的目錄中使用命令:
idlj -oldimplbase -fall hello.idl
編譯該hello.idl檔案。
hello.java:該介面含有idl介面的java版本,hello.java介面擴充套件org.omg.corba.object並提供標準的corba物件功能。
hellohelper.java:這是一個終態類,可以提供輔助功能,特別是提供將corba物件引用轉換為適當型別所需的narrow()開發方法
helloholder.java:這是一個終態類,其中含有helo型別的公有例項成員,它可為“out”和“inout”變數提供操作,corba有這些變數,但不容易對映為java的語義。
hellooperations.java:這是一個介面類,其中含有開發方法 sayhello()。
helloimplbase.java:該抽象類是一個伺服器開發skeleton,它可為伺服器開發提供基本的corba功能,它實現hello.java介面,伺服器開發類helloservant擴充套件helloimplbase。
要完成該應用開發程式,只需在檔案helloserver.java和helloclient.java中提供伺服器開發和客戶機的實現即可。
、啟動eclipse,新建java專案,一切預設即可,新建檔案new->others->corba wizard->idl files->next->設定idl檔案 路徑及檔名稱(此處以預設值為例)->finish
開啟simple.idl,將看到已經有了預設內容
(大致意思是定義了一個模組,此模組對應到java裡面就是一個 package,此模組(包)中定義了一個名為 myservice 的 interface,此interface定義了一個名為operation1的開發方法 ,此開發方法 還接收一個string型別的傳入引數,大致就是這麼個意 思,至於idm的協議規範,參見具體文件)
8、生成corba框架程式碼,右鍵simple.idl檔案,orb menu->compile,
此時會在src目錄生成一個myserver的包,此包裡面將會生成
_myservicestub.java
myservice.java
myservicehelper.java
myserviceholder.java
myserviceoperations.java
myservicepoa.java
myservicepoatie.java
這幾個檔案,至於具體各是什麼意義,我也理太清楚,只知道
myservice變是idl檔案中定義的介面檔案,後面 會經常用於與org.omg.corba.object打交道
myservicehelper應該是個服務類,後面會經常用到,應該是 將物件的org.omg.corba.object、interface(myservice)之間進行包裝轉換用
myserviceholder 看程式碼,覺得是個載體物件,具體如何用,目前還不太清楚
myserviceoperations字面上看就是定義介面的操作的類,實際 是個介面,myservice就是繼承自它(嚴格的說是介面繼承,因為myservice也是介面)
myservicepoa corba需要的類,我們實現介面(myservice)的類應該從它繼承
myservicepoatie就不太清楚其用處了
9、利用orb外掛為生成實現介面的類,新建檔案
new->other->corba wizard->server->active object map->next->
idl fieldname:選擇/{專案名稱}/simple.idl
interface: 選擇myserver.myservice
package:填寫包名稱(可以任意名稱)
server classname:myserviceserverimpl(可以任意取名)
繼續next,勾選 create server class(勾了會自動生成server端的預設程式碼,程式碼的內容形貌,取決於6的idl compiler選項值及具體的子command和command options)
10、開啟 myserviceserverimpl,實現myserviceoperations介面定義的開發方法
11、編寫服務端程式碼,開啟 server_aom檔案,預設程式碼是使用ior檔案進行通訊的,為了體現corab的跨平臺開發特性,此處使用命名服務的方式執行,
註釋掉 try{...}裡面的程式碼,編寫如下程式碼,其它程式碼保持不變,並
import org.omg.cosnaming.*;
修改後的程式碼
// 啟動命名服務需要的引數 props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); // 初始化orb org.omg.corba.orb orb = org.omg.corba.orb.init(args, props); // 獲取根poa引用 poa poaroot = poahelper.narrow(orb.resolve_initial_references("rootpoa")); // 啟用poa管理器 poaroot.the_poamanager().activate(); // 例項化一個myserviceserverimpl物件 myserviceserverimpl serviceimpl = new myserviceserverimpl(); // 從servant獲得一個物件引用 org.omg.corba.object refobj = poaroot.servant_to_reference(serviceimpl); // 獲得物件介面引用 myserver.myservice service = myserver.myservicehelper.narrow(refobj); // 命名上下文 org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice"); namingcontextext nc = namingcontextexthelper.narrow(ncobj); // 繫結一個服務引用,以便客戶端可以呼叫 nc.rebind(nc.to_name("simple.myservice"), service); system.out.println("myservice is running and waiting......"); // 執行orb orb.run();
有必要說一下自己對corba啟動整體流程的理解,
首先是設定引數,
設定orb的服務端實現類
props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb");
調協orb的單例類
props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton");
設定orb命名服務的初始化引數,具體意思 corbaloc 協議名稱 192.168.0.14 orb伺服器開發地址(也可以是主機名) 30000 orb執行的埠
props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice");
設定了引數後,根據引數初始化一個org.omg.corba.orb的例項
接著從orb例項中獲取一個根
緊接著呼叫poa管理器,將其啟用
伺服器開發端環境設定完成,
進而建立實現介面的物件的例項,
呼叫要根poa將其轉換成一個org.omg.corba.object物件,
再呼叫服務開發方法 得到其介面定義物件
通過orb物件獲得一個命名伺服器開發物件,
通過命名服務輔助類得到一個命名上下文
再通過命名上下文實與服務介面繫結(因為服務介面與實現介面的物件的已建立關係,所以此時命名上下文也與介面的實現物件建立了關係)
繫結完成之後,就可以進行orb例項物件了
至此,服務端的執行完畢,只等待客戶端的呼叫了。
12、編寫客戶端程式碼,還是通過orb 控制元件生成客戶端程式碼,新建檔案
new->other->corba wizard->client->simple implementation,與9是基本一樣,選擇idl檔案,選擇介面檔案、填寫包名稱、客戶端類名稱
13、開啟myserviceclientimpl,找到initorb開發方法 ,註釋預設新增的程式碼,
其程式碼如下:
properties props = system.getproperties(); props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb"); props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton"); // 啟動引數 props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); orb = org.omg.corba.orb.init(args, props); // 獲得命名服務上下文 // 獲得命名服務物件 org.omg.corba.object nsobj = null; try { nsobj = orb.resolve_initial_references("nameservice"); } catch (invalidname e) { // todo auto-generated catch block e.printstacktrace(); } // 通過命名服務物件得到命名服務上下文 namingcontextext nc = namingcontextexthelper.narrow(nsobj); // 從命名服務上下文中獲得特定的命名服務物件 org.omg.corba.object svrobj = null; try { svrobj = nc.resolve_str("simple.myservice"); } catch (notfound e) { // todo auto-generated catch block e.printstacktrace(); } catch (cannotproceed e) { // todo auto-generated catch block e.printstacktrace(); } catch (org.omg.cosnaming.namingcontextpackage.invalidname e) { // todo auto-generated catch block e.printstacktrace(); } // 從將特定命名服務物件中獲得服務介面 myserver.myservice service = myservicehelper.narrow(svrobj); target = service;
客戶端程式碼就比較簡單了,簡單描述一下,
首先還是設定引數,初始化orb,
從orb例項物件中獲取命名服務物件,
通過命名服務物件輔助類從命名服務物件中獲取命名服務上下文物件,
從命名服務上下文物件中獲取指定名稱的服務的org.omg.corba.object物件,
再通過介面服務物件輔助類從org.omg.corba.object型別的介面服務物件中獲取實現該介面服務的例項物件
獲取了介面服務物件後,就可以使用該服務了,至於是誰實現了該介面,如何實現的,這裡根本不關心,儘管使用就是了:)...
另外還需要修改main開發方法 ,取消預設的註釋,這樣才能呼叫服務介面定義的開發方法 !
對於這個客戶端檔案,在原有已匯入名稱空間的基礎上還得匯入如下一些
import org.omg.corba.orbpackage.invalidname; import org.omg.cosnaming.namingcontextpackage.cannotproceed; import org.omg.cosnaming.namingcontextpackage.notfound; import myserver.myservicehelper;
14、說了程式碼層面的,就該啟動服務了,
首先啟動corba,
執行->cmd->ns d:/java/jacorb/ctest/ns_ref -p 30000
再執行server,
右鍵 server_aop->run as->java application
發現了什麼,一大堆的紅色的錯誤資訊,
大致如下:
org.omg.corba.initialize: can't instantiate default orb implementation org.jacorb.orb.orb vmcid: 0x0 minor code: 0 completed: no
at org.omg.corba.orb.create_impl(unknown source)
at org.omg.corba.orb.init(unknown source)
at server_aom.main(server_aom.java:36)
caused by: java.lang.classnotfoundexception: org.jacorb.orb.orb
at java.net.urlclassloader$1.run(unknown source)
at java.security.accesscontroller.doprivileged(native method)
at java.net.urlclassloader.findclass(unknown source)
at java.lang.classloader.loadclass(unknown source)
at sun.misc.launcher$appclassloader.loadclass(unknown source)
at java.lang.classloader.loadclass(unknown source)
at java.lang.classloader.loadclassinternal(unknown source)
at java.lang.class.forname0(native method)
at java.lang.class.forname(unknown source)
... 3 more
一看大致是沒有找到org.jacorb.orb.orb這個類引起的問題,應該是沒有引用相關的類引起的,
於是,專案->properties->java build path->libraries->add library->user library->next->user libraries->new->填寫使用者類庫名稱->選中剛新建的名稱->add jars->瀏覽選擇 d:\java\jacorb\lib\jacorb.jar (注意:此處的d:\java\jacorb視個人環境而定)
再次執行,可惡,又一在段紅色錯誤提示資訊,在此也列出來吧,
org.omg.corba.initialize: can't instantiate default orb implementation org.jacorb.orb.orb vmcid: 0x0 minor code: 0 completed: no
at org.omg.corba.orb.create_impl(unknown source)
at org.omg.corba.orb.init(unknown source)
at server_aom.main(server_aom.java:36)
caused by: java.lang.noclassdeffounderror: org/apache/log/format/formatter
at java.lang.class.getdeclaredconstructors0(native method)
at java.lang.class.privategetdeclaredconstructors(unknown source)
at java.lang.class.getconstructor0(unknown source)
at java.lang.class.newinstance0(unknown source)
at java.lang.class.newinstance(unknown source)
at org.jacorb.util.environment.initlogging(unknown source)
at org.jacorb.util.environment.init(unknown source)
at org.jacorb.util.environment.<clinit>(unknown source)
at org.jacorb.orb.buffermanager.<clinit>(unknown source)
at org.jacorb.orb.orb.<init>(unknown source)
at sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method)
at sun.reflect.nativeconstructoraccessorimpl.newinstance(unknown source)
at sun.reflect.delegatingconstructoraccessorimpl.newinstance(unknown source)
at java.lang.reflect.constructor.newinstance(unknown source)
at java.lang.class.newinstance0(unknown source)
at java.lang.class.newinstance(unknown source)
... 3 more
看 caused by: java.lang.noclassdeffounderror: org/apache/log/format/formatter 這 句,估計以是沒有找到相關的引用類,於是,新增 d:\java\jacorb\lib\logkit-1.2.jar 到使用者類庫,具體開發方法 見上,
再次執行,還錯誤,
org.omg.corba.initialize: can't instantiate default orb implementation org.jacorb.orb.orb vmcid: 0x0 minor code: 0 completed: no
at org.omg.corba.orb.create_impl(unknown source)
at org.omg.corba.orb.init(unknown source)
at server_aom.main(server_aom.java:36)
caused by: java.lang.noclassdeffounderror: org/apache/avalon/framework/logger/logger
at java.lang.class.getdeclaredconstructors0(native method)
at java.lang.class.privategetdeclaredconstructors(unknown source)
at java.lang.class.getconstructor0(unknown source)
at java.lang.class.newinstance0(unknown source)
at java.lang.class.newinstance(unknown source)
at org.jacorb.util.environment.initlogging(unknown source)
at org.jacorb.util.environment.init(unknown source)
at org.jacorb.util.environment.<clinit>(unknown source)
at org.jacorb.orb.buffermanager.<clinit>(unknown source)
at org.jacorb.orb.orb.<init>(unknown source)
at sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method)
at sun.reflect.nativeconstructoraccessorimpl.newinstance(unknown source)
at sun.reflect.delegatingconstructoraccessorimpl.newinstance(unknown source)
at java.lang.reflect.constructor.newinstance(unknown source)
at java.lang.class.newinstance0(unknown source)
at java.lang.class.newinstance(unknown source)
... 3 more
看 caused by: java.lang.noclassdeffounderror: org/apache/avalon/framework/logger/logger 這名,估計還是缺少相關的引用類,於是, 新增 d:\java\jacorb\lib\avalon-framework-4.1.5.jar
到使用者類庫,具體開發方法 見上,
再次執行,終於不是紅色的提示資訊了,而是等待已久的
myservice is running and waiting......
終於成功了!
接下來,就是client運行了,
右鍵myserviceclientimpl->run as->java application
ok, 又輸出一條資訊
a message in the bottle...
此時,console窗口裡面應該只有兩條件資訊,如
myservice is running and waiting......
a message in the bottle...
終於,這個java下的corrb應用開發就算完成了!
最後總結下corba應用開發的大體上的開發過程 吧:
corba的配置、初始化引數就不說了,僅說說它如何應用開發的,
首先定義服務介面 iservice ,
然後實現該介面 serviceimpl,
建立實現該介面物件的例項 implinstance,
通過orb得到一個與該例項相關聯的org.omg.corba.object物件 implinstanceorbobj ,
通過 iservicehelper 從 implinstanceorbobj 中獲取 iservice 型別的 物件 service ,
通過命名服務上下文,將其繫結到 介面服務物件 service , 同時提供一個服務名稱,以便客戶端定位到特定的服務,
繫結完畢,就可以執行orb了,此時server就處於執行狀態(監聽客戶端的呼叫),只等待客戶端呼叫,至此,服務端程式執行完畢!
說了這麼多,感覺還是不如直接帖程式碼來的實在,下面就帖出主要檔案全部程式碼
server_aom.java
import java.io.file; import java.io.fileoutputstream; import java.io.printwriter; import java.util.properties; import org.omg.cosnaming.namingcontextext; import org.omg.cosnaming.namingcontextexthelper; import org.omg.portableserver.idassignmentpolicyvalue; import org.omg.portableserver.lifespanpolicyvalue; import org.omg.portableserver.poa; import org.omg.portableserver.*; public class server_aom { public static void main(string[] args) { properties props = system.getproperties(); props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb"); props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton"); try { // // initialize the orb. // org.omg.corba.orb orb = org.omg.corba.orb.init(args, props); // // // get a reference to the root poa // org.omg.corba.object obj = orb.resolve_initial_references("rootpoa"); // poa poaroot = poahelper.narrow(obj); // // // create policies for our persistent poa // org.omg.corba.policy[] policies = { // poaroot.create_lifespan_policy(lifespanpolicyvalue.persistent), // poaroot.create_id_assignment_policy(idassignmentpolicyvalue.user_id), // poaroot.create_thread_policy(threadpolicyvalue.orb_ctrl_model) // }; // // // create mypoa with the right policies // poa poa = poaroot.create_poa("myserviceserverimpl_poa", poaroot.the_poamanager(), policies); // // // create the servant // myserviceserverimpl servant = new myserviceserverimpl(); // // // activate the servant with the id on mypoa // byte[] objectid = "anyobjectid".getbytes(); // poa.activate_object_with_id(objectid, servant); // // // activate the poa manager // poaroot.the_poamanager().activate(); // // // get a reference to the servant and write it down. // obj = poa.servant_to_reference(servant); // // // ---- uncomment below to enable naming service access. ---- // // org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice"); // // namingcontextext nc = namingcontextexthelper.narrow(ncobj); // // nc.bind(nc.to_name("myserverobject"), obj); // // printwriter ps = new printwriter(new fileoutputstream(new file("server.ior"))); // ps.println(orb.object_to_string(obj)); // ps.close(); // // system.out.println("corba server ready..."); // // // wait for incoming requests // orb.run(); // 啟動命名服務需要的引數 props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); // 初始化orb org.omg.corba.orb orb = org.omg.corba.orb.init(args, props); // 獲取根poa引用 poa poaroot = poahelper.narrow(orb.resolve_initial_references("rootpoa")); // 啟用poa管理器 poaroot.the_poamanager().activate(); // 例項化一個myserviceserverimpl物件 myserviceserverimpl serviceimpl = new myserviceserverimpl(); // 從servant獲得一個物件引用 org.omg.corba.object refobj = poaroot.servant_to_reference(serviceimpl); // 獲得物件介面引用 myserver.myservice service = myserver.myservicehelper.narrow(refobj); // 命名上下文 org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice"); namingcontextext nc = namingcontextexthelper.narrow(ncobj); // 繫結一個服務引用,以便客戶端可以呼叫 nc.rebind(nc.to_name("simple.myservice"), service); system.out.println("myservice is running and waiting......"); // 執行orb orb.run(); } catch(exception ex) { ex.printstacktrace(); } } }
myserviceclientimpl.java
/* * the client implementation is generated by the orb studio. */ import java.io.filereader; import java.io.ioexception; import java.io.linenumberreader; import java.util.properties; import org.omg.cosnaming.*; import org.omg.corba.orbpackage.invalidname; import org.omg.cosnaming.namingcontextpackage.cannotproceed; import org.omg.cosnaming.namingcontextpackage.notfound; import myserver.myservicehelper; class myserviceclientimpl { private myserver.myservice target = null; private org.omg.corba.orb orb = null; /** * constructor for myserviceclientimpl * * @throws ioexception */ public myserviceclientimpl() throws ioexception { initorb(null); } /** * constructor for myserviceclientimpl * * @throws ioexception * @see java.lang.object#object() */ public myserviceclientimpl(string[] args) throws ioexception { initorb(args); } /** * initialize orb. * * @param args * @throws ioexception */ public void initorb(string[] args) throws ioexception { properties props = system.getproperties(); props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb"); props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton"); // // initialize the orb // orb = org.omg.corba.orb.init((string[])args, props); // // // ---- uncomment below to enable naming service access. ---- // // org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice"); // // namingcontextext nc = namingcontextexthelper.narrow(ncobj); // // org.omg.corba.object obj = nc.resolve_str("myserverobject"); // // linenumberreader input = new linenumberreader(new filereader("server.ior")); // string ior = input.readline(); // org.omg.corba.object obj = orb.string_to_object(ior); // // target = myserver.myservicehelper.narrow(obj); // 啟動引數 props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); orb = org.omg.corba.orb.init(args, props); // 獲得命名服務上下文 // 獲得命名服務物件 org.omg.corba.object nsobj = null; try { nsobj = orb.resolve_initial_references("nameservice"); } catch (invalidname e) { // todo auto-generated catch block e.printstacktrace(); } // 通過命名服務物件得到命名服務上下文 namingcontextext nc = namingcontextexthelper.narrow(nsobj); // 從命名服務上下文中獲得特定的命名服務物件 org.omg.corba.object svrobj = null; try { svrobj = nc.resolve_str("simple.myservice"); } catch (notfound e) { // todo auto-generated catch block e.printstacktrace(); } catch (cannotproceed e) { // todo auto-generated catch block e.printstacktrace(); } catch (org.omg.cosnaming.namingcontextpackage.invalidname e) { // todo auto-generated catch block e.printstacktrace(); } // 從將特定命名服務物件中獲得服務介面 myserver.myservice service = myservicehelper.narrow(svrobj); target = service; } /** * obtain orb interface. * * @return */相關推薦
JAVA與CORBA通訊介面開發
corba(公用物件請求代理體系)是基於物件技術的分佈計算應用軟體體系結構。corba標準主要分為三個部分:介面定義語言(idl),物件請求代理(orb),以及orb之間的互操作協議iiop,核心是物件請求代理。corba與平臺和語言無關。 java idl既是corb
Java Swing視覺化介面開發
開發文件地址 踩過的坑: JFrame設定背景色 jf.setBackground(Color.blue); jf.getContentPane().setBack
Java與CORBA技術結合的前景展望
隨著Internet、Intranet及Extranet在全球範圍內的普及和發展,下一代的Web必須能夠處理企業-企業(business-to- business)交易和客戶-企業(consumer-to-business)多步驟交易過程中的複雜需求。為了實現這一目的,Web
Java與PHP對於web開發的八大比較-------阿冬專欄
原文參考來源: 比較PHP和JSP這兩個Web開發技術,在目前的情況是其實是比較PHP和Java的Web開發。(百度主要用PHP) 一、語言本身比較: PHP是解釋執行的伺服器指令碼語言,首先PHP有簡單容易上手的特點。語法和C語言比較像,所以學過C語言的程式設計師可以很快的熟悉P
Java微信分享介面開發
Java微信分享,步驟是1、根據當前的url,獲取signature,nonceStr,timestamp 和appId。 2、通過signature,nonceStr,timestamp 和appId來配置微信 wx.config。 3、通過wx.ready實現微信分享功能
Java後臺框架篇--Spring與Restful風格API介面開發
Restful風格的API是一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器互動類的軟體。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。 在Restful風格中,使用者請求的url使用同一個url而用請求方式:get,post,
Java與groovy混編 —— 一種兼顧介面清晰和實現敏捷的開發方式
有大量平均水平左右的“工人”可被選擇、參與進來 —— 這意味著好招人 有成熟的、大量的程式庫可供選擇 —— 這意味著大多數專案都是既有程式庫的拼裝,標準化程度高而定製化場景少 開發工具、測試工具、問題排查工具完善,成熟 —— 基本上沒有團隊願意在時間緊、任務重的專案
java 微信與支付寶退款介面開發總結
目錄 0、概述 此文件為了指導在wordpress下使用Markdown on Save外掛編寫markdown。 markdown語法說明請參閱:http://wowubuntu.com/markdown/index.html 1、段落 1.1
【java介面開發】---與Android對接註冊介面的session會話保持問題
技術渣,遇到問題記錄一下,好記性不如爛筆頭嘛(應該是好記性不如寫部落格~~~~~~) 【問題】 在java後臺寫了獲取驗證碼和註冊的兩個介面,提供給ios和Android呼叫。ios測試註冊過程中都是一條過,但是Android就出現了很尷尬的問題【第一次
html面頁與JAVA通過Socket 通訊
數據 問題 tcp連接 pri 中文 消息 output 版本支持 引入 (原) 往常前後端通訊基本都是以ajax請求或是表單做數據交互的,這是一種無狀態的http協議,如果要做tcp協議的數據交互,能想到的技術也就socket了,可如果後端是JAVA,前端如何做socke
20165320 Java實驗三:敏捷開發與XP實踐
分析 成員 輸入 學習 mage 技術 雲上 方式 AC 實驗內容: 敏捷開發與XP實踐 一 實驗要求: 安裝alibaba 插件,解決代碼中的規範問題在IDEA中使用工具(Code->Reformate Code)把下面代碼重新格式化,再研究一下Code菜單,找出
PHP開發APP介面之封裝通訊介面
PHP開發APP介面之封裝通訊介面 按json方式輸出通訊資料 /** * 按json方式輸出通訊資料 * @param integer $code 狀態碼 * @param string $message 提示資訊 * @p
java中的AutoCloseable介面與try with resources
try-with-resources引入的背景 很多Java程式都需要操作一些資源,如檔案、流(streams)、套接字(sockets)和資料庫連線(database connections)。操作這些資源的時候得很小心,因為它們操作的時候獲取了作業系統的資源。所以你得保證,即使在發生
JAVA程式設計題解與上機指導 第四版 第8章 Java的圖形使用者介面設計 8.2 建立“My JFrame”
一、簡介:程式設計實現建立並顯示一個標題為“My Frame”,Frame背景為黑色,Panel背景為白色,其中,Panel中加入“開啟”“關閉”“返回”三個按鈕,並一行排開。 二、程式碼如下: import java.awt.*; import javax.swing.*; import ja
(四)NDK開發之 java 與C/C++ 程式碼互相呼叫
java 呼叫c/c++ 的方法,很簡單。我們勾選建立支援C/C++ 專案的時候,就已經生成了一個Demo 下面主要介紹,C/C++ 呼叫 java 的方法。 一、訪問 java 成員非靜態成員變數: JNI 呼叫java非靜態變數的 方法名格式 : Ge
關於java的swing介面開發總結
學習了利用java進行的介面設計。 介面的設計無非就是呼叫java內部自帶的一些包,進行組合,以及引數的設定。 相關包涉及到的標頭檔案需要引用標頭檔案。 幾個基本元件是:JFrame(窗體)、JButton(按鈕)、Jtree(樹形結構)等。 從最基本的窗體構建開始,模仿QQ的登陸介面做一個初步的模仿
PI介面開發之調java WS介面
java提供的WSDL:http://XXX.XXX.XXX.XX/XXXXXXXcrm/ws/financialStatementsService?wsdl 登陸PI,下載Enterprise Services Builder 展開並選擇元件和名稱空間(一般專案會分多個,視情況來做) 1.建立資料夾(
android開發筆記:MainActivity.java與activity_main.xml
https://www.jianshu.com/p/f5e56fb2f215 剛開始開發android的時候,新建一個activity總是會新建兩個檔案,我們已預設命名MainActivity.java與activity_main.xml兩個檔案來給大家介紹。 activity
與其他系統介面對接(java),json格式資料傳遞···OkHttpClient方式
上一種方式HttpURLConnection方式出現了點問題,就是在idea中啟動服務一切正常。當時用tomcat部署專案時候,對方介面接收引數出現中文亂碼問題。用了很多方式都沒有解決,不知有沒有大佬可以解決 引入依賴 <dependency>
與其他系統介面對接(java),json格式資料傳遞···HttpURLConnection方式
這個操作是與****系統進行資料介面的對接,本系統向****系統傳遞幾個引數,****系統接收並返回值。 目錄 post請求方式 @Service層 工具類ResultUtil pom需要新增的依賴 get請求方式 另一種 OkHttpClient 方式 post