其实类似于这种的WEB应用程序用ASP.NET做起来非常方便,因为ASP.NET有强大的C#语言作为后盾。但是今天我上课的时候突发奇想,想利用Delphi的DataSnap来做,第一想到的便是PHP+DataSnap,用JSON作为中间层数据,但是后来仔细一想,有了JSON,那何必用PHP呢,杀鸡焉用牛刀!用JavaScript脚本完全足够了。不多说,直接看操作,首先用Delphi建立一个DataSnap程序,直接File->New->Other,然后看图:

确定后如图:

好了后,首页设置一下DSHTTPService组件的HttpPort属性,也就是设置我们的服务器端口,设为81,免得与我本机的端口相冲突。如图:

然后来到ServerMethodsUnit1单元,先引用单元Math和DBXJson,其中DBXJson是Delphi中Json相关的单元。然后我们在TServerMethods1类里面添加我们需要的方法和函数,单元的完整代码如下:
unit ServerMethodsUnit1;
interface
uses
SysUtils, Classes, DSServer,Math,DBXJson;
type
TServerMethods1 = class(TDSServerModule)
private
{ Private declarations }
public
{ Public declarations }
//*****************高斯投影正算,已知B、L求x、y,B、L为秒值********************
procedure GassBLToxy(B,L:extended;var x,y:extended);
//*****************将角度转换成秒值,如30.20.10转换成秒值**********************
function CoordinateToSeconds(Deg:string):extended;
function BLToxy(B,L:string): TJSONObject;
end;
var
ServerMethods1: TServerMethods1;
implementation
{$R *.dfm}
{ TServerMethods1 }
function TServerMethods1.BLToxy(B, L: string): TJSONObject;
var x,y: Extended;
begin
GassBLToxy(CoordinateToSeconds(B),CoordinateToseconds(L),x,y);
Result := TJSONObject.Create;
Result.AddPair(TJSONPair.Create('x',FloatToStr(x)));
Result.AddPair(TJSONPair.Create('y',FloatToStr(y)));
end;
function TServerMethods1.CoordinateToSeconds(Deg: string): extended;
var deg1,deg2:string;
sum:extended;
temp:string;
begin
sum:=0;
temp:=Deg;
if copy(Deg,1,1)='-' then Deg:=Copy(Deg,2,Length(Deg)-1);//如果为负数则化为正的
if pos('.',Deg)=0 then
begin
sum:=StrToInt(Deg)*3600;
end;
if pos('.',Deg)<>0 then
begin
deg1:=copy(deg,pos('.',deg)+1,length(deg)-pos('.',deg)); //deg1=30.20
deg2:=copy(deg,1,pos('.',deg)-1); //deg2=60
sum:=StrToInt(deg2)*3600; //化成秒
if pos('.',deg1)=0 then
begin
sum:=sum+StrToInt(deg1)*60;
end;
if pos('.',deg1)<>0 then
begin
deg2:=copy(deg1,1,pos('.',deg1)-1);
sum:=sum+StrToInt(deg2)*60;
deg2:=copy(deg1,pos('.',deg1)+1,length(deg1)-pos('.',deg1));
sum:=sum+StrToFloat(deg2);
end;
end;
result:=sum;
if copy(temp,1,1)='-' then result:=-result;
end;
procedure TServerMethods1.GassBLToxy(B, L: extended; var x, y: extended);
var B_r,sinB,cosB,cosB2,l_cha,l_r,N,a0,a4,a6,a3,a5,l2:extended;
begin
B_r := B / 3600 / 180 * PI; //B_r为B的弧度值
sinB := Sin(B_r);
cosB := Cos(B_r);
cosB2 := Sqr(cosB);
l_cha := L - (Round(L / (6 * 3600)) * 6 - 3) * 3600;//按6度带,l为L与中央子午线之差
l_r := l_cha / 3600 / 180 * PI; //l_r为l的弧度值
N := 6399698.902 - (21562.267 - (108.973 - 0.612 * cosB2) * cosB2) * cosB2;
a0 := 32140.404 - (135.3302 - (0.7092 - 0.004 * cosB2) * cosB2) * cosB2;
a4 := (0.25 + 0.00252 * cosB2) * cosB2 - 0.04166;
a6 := (0.166 * cosB2 - 0.084) * cosB2;
a3 := (0.3333333 + 0.001123 * cosB2) * cosB2 - 0.1666667;
a5 := 0.0083 - (0.1667 - (0.1968 + 0.004 * cosB2) * cosB2) * cosB2;
l2 := Sqr(l_r);
x := 6367558.4969 * B_r - (a0 - (0.5 + (a4 + a6 * l2) * l2) * l2 * N) * sinB * cosB;
y := (1 + (a3 + a5 * l2) * l2) * l_r * N * cosB;
end;
end.
好了,现在我们运行我们写好的DataSnap服务程序,如图:

然后我们就可以在IE中访问了,因为我们在前面的设置中设置了有TCP/IP和HTTP两种方式,当然我需要的是HTTP。在IE中输入地址:
http://127.0.0.1:81/datasnap/zaitian/TServerMethods1/BLToxy/11.0/12.0
其中datasnap是固定参数,zaitian是们设置的,在图三中有说明。TServerMethods1是我们的类,BLToxy是我们调用的函数,11.0和12.0是函数的参数,各个参数之间都用/符号分开。访问后浏览器就显示出服务器返回的JSON数据,如下:{“result”:[{“x”:”1218127.4049474″,”y”:”328008.141507914″}]}
然后我们就可以用JavaScript来调出我们的x和y的值了,分别用data.result[0].x和data.result[0].y来调用。

最后我们编写HTML服务端,在后台调用我们的DataSnap程序,得出结果,HTML网页代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>DataSnap坐标转换</title>
<script type="text/javascript" src="JQuery.js"></script>
<script type="text/javascript">
function trans()
{
$.ajax({
type:"get",
url:"http://127.0.0.1:81/DataSnap/zaitian/TServerMethods1/BLToxy/"+$(‘#coor_B’).val()+"/"+$(‘#coor_L’).val(),
dataType:"json",
success:function(data){
$(‘#coor_x’).val(data.result[0].x);
$(‘#coor_y’).val(data.result[0].y);
}
})
}
</script>
</head>
<body>
<div style="text-align:center; margin-top:100px;">
<label>B:</label><input type="text" id="coor_B" value="11"/>
<label>L:</label><input type="text" id="coor_L" value="12"/>
<input type="button" value="转换" onclick="trans()"/>
<label>x:</label><input type="text" id="coor_x" />
<label>y:</label><input type="text" id="coor_y" />
</div>
</body>
</html>
效果如图:

网页代码中须要说明的是,调用AJAX时里面的代码要注意大小写,我刚开始就是把dataType:”json”写成了datatype:”json”才始终不能解释JSON数据。
其实DataSnap还可以做成dll文件,然后与IIS结合起来,或是做成exe的CGI文件,与Apache结合起来。只是在新建项目的时候新建DataSnap WebBroker Application就可以了。我这里就以CGI做实验。


然后写的代码就和上面的一样了。编译后生成我们需要的exe文件,然后我们把该文件放到Apache的cgi-bin目录下面去,然后在IE里面访问就可以了,IE访问地址为:
http://127.0.0.1/cgi-bin/project1.exe/datasnap/rest/TServerMethods1/BLToxy/11/12
注意多了个datasnap这个固定的参数。
实现这个的前提是Apache要配置好支持CGI才行,在Apache的配置文件中相关代码为:
<Directory "E:/www/Apache2.2/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
AddHandler cgi-script .cgi .exe
有了这个小小的实例,就可以发挥想像了,可以做许多的WEB应用程序,都按照这种方式做。由于实现了Winodws应用程序与HTML网页或PHP网页的分离,这种多元化的开发方式非常方便实用,而且实现了数据与前台页面的完全分离,更是网页设计的大势所趋。总之,以后有尽量用这种模式来开发WEB应用程序!