Webservice現(xiàn)在已經(jīng)不是什么新技術(shù)了,用java建立webservice是快捷的,但是用java在制作客戶端的感覺上總是不如 Delphi的(個人感覺,java高手們不要笑話我),那我們就用java實現(xiàn)webservice的服務(wù)端程序,delphi制作客戶端。
一.環(huán)境搭建 jdk和tomcat的安裝和配置我在這里不進行行介紹了。說明一點我的tomcat是安裝在D:\tomcat,設(shè)定端口是8099。
安裝Axis
1.可以從http://ws./axis/下載axis的最新版本,我使用的是axis1.2。
2.解壓縮axis-bin-1_2beta.zip,將axis-1_2beta目錄中webapps下的axis目錄全部拷貝到tomcat的安裝目錄中webapps下。
3.將axis\lib中的所有jar文件都添加到classpath系統(tǒng)變量中。
注(用戶需根據(jù)自己的安裝路徑進行更改):
.;
d:\tomcat\webapps\axis\WEBINF\lib\axis.jar;
d:\tomcat\webapps\axis\WEB-INF\lib\saaj.jar;
d:\tomcat\webapps\axis\WEB-INF\lib\commons-logging.jar;
d:\tomcat\webapps\axis\WEB-INF\lib\commons-discovery.jar;
d:\tomcat\webapps\axis\WEB-INF\lib\wsdl4j.jar;
d:\tomcat\webapps\axis\WEBINF\lib\jaxrpc.jar;
4.啟動tomcat訪問http://cbf107:8099/axis/index.html(這里使用的主機名和端口號和使用的tomcat所配置一致)。
可以見到如下頁面:
二.Web Service服務(wù)端開發(fā)
寫一個java小程序:
public class Test{
public int add(int p1, int p2) {
return p1 + p2;
}
public int subtract(int p1, int p2) {
return p1 - p2;
}
}
在D:\Tomcat\webapps\axis 目錄下新建一個test文件夾,將它保存在里面,注意:后綴名改為jws,也就是Test.jws 。
在瀏覽器里訪問:http://cbf107:8099/axis/test/Test.jws可以看到
點擊“Click to see the WSDL”出現(xiàn)

將這頁另存為xml文檔(我們在使用delphi制作客戶端的時候會使用)
三.delphi實現(xiàn)Web Service客戶端開發(fā)
打開delphi新建工程,在form上放置兩個edit和兩個button,button的name命名為
btnadd和btnsubtract,caption命名為add和subtract。
再file->new->other,選擇webservice里的WSDL importer

在search UDDI..里選擇前面我們保存的那個xml文件,點擊next最后finish
全部保存,我們發(fā)現(xiàn)delphi的工程中多了test1.pas
打開發(fā)現(xiàn)有這樣一段接口申明:
Test = interface(IInvokable)
[‘{52882FF0-46E2-6644-A77B-CE714D4CBFD5}‘]
function add(const p1: Integer; const p2: Integer): Integer; stdcall;
function subtract(const p1: Integer; const p2: Integer): Integer; stdcall;
end;
那我們可以直接調(diào)用這個接口了,這時候我們回到界面,從delphi的webservices面版中托放一個soap到form上。
設(shè)置屬性如圖:
最后我們可以完成我們的代碼了:
1.在uses里添加test1因為我們要引用這個單元。
2.添加全局變量t1:test;(t1是一個test接口)
3.為兩個button添加click事件
procedure TForm1.btnaddClick(Sender: TObject);
var
i,j,z:integer;
begin
i:=strtoint(edit1.Text);
j:=strtoint(edit2.Text);
t1:=(HttPRIO1 as test);
z:=t1.add(i,j);
t1._Release;
showmessage(inttostr(z));
end;
procedure TForm1.btnsubstractClick(Sender: TObject);
var
i,j,z:integer;
begin
i:=strtoint(edit1.Text);
j:=strtoint(edit2.Text);
t1:=(HttPRIO1 as test);
z:=t1.subtract(i,j);
t1._Release;
showmessage(inttostr(z));
end;
4.F9運行程序進行測試
看我們有用delphi實現(xiàn)了java寫的那段程序,不是嗎。
5.也許到這里你認為應(yīng)該已經(jīng)完成了,沒錯!不過對webservice還不夠了解的
朋友你再修改一下那個java程序,也就是將Test.jws里的這個方法
public int add(int p1, int p2) {
return p1 + p2;
}
改為
public int add(int p1, int p2) {
return p1 + p2+10;
}
再運行一下你的客戶端程序看看。
四.注:unit1的所有代碼
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Rio, SOAPHTTPClient,Test1;
type
TForm1 = class(TForm)
HTTPRIO1: THTTPRIO;
Edit1: TEdit;
Edit2: TEdit;
btnadd: TButton;
btnsubstract: TButton;
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure btnaddClick(Sender: TObject);
procedure btnsubstractClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
t1:test;
implementation
{$R *.dfm}
//這里是為了讓 兩個edit只能輸入數(shù)字,edit1的onkeypress直接調(diào)用這個就可以了。
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key in [‘0‘..‘9‘]=false then
key:=#0;
end;
procedure TForm1.btnaddClick(Sender: TObject);
var
i,j,z:integer;
begin
i:=strtoint(edit1.Text);
j:=strtoint(edit2.Text);
t1:=(HttPRIO1 as test);
z:=t1.add(i,j);
t1._Release;
showmessage(inttostr(z));
end;
procedure TForm1.btnsubstractClick(Sender: TObject);
var
i,j,z:integer;
begin
i:=strtoint(edit1.Text);
j:=strtoint(edit2.Text);
t1:=(HttPRIO1 as test);
z:=t1.subtract(i,j);
t1._Release;
showmessage(inttostr(z));
end;
end.