如何用delphi做三层结构中的中间层。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用delphi做三层结构中的中间层。相关的知识,希望对你有一定的参考价值。

公司旧产品是delphi开发的,现在想升级为网络产品。
客户端用JSP网站,iosandroid。数据库不变。
想用delphi做一个中间层,做业务处理,这样原有代码就能复用了。
但是不知道如何做,用什么技术,请大神指导。
开发环境为delphi xe3或delphi xe5

  1、调用DataModel中的控件必须在先引用Datemodel的单元,在implementation下面加入以下语句uses DataModel的单元名称;
  2、必须改变窗体的创建顺序,datamodel窗体必须先于引用该窗体控件的窗体创建
三层结构
  应用层:
一、需要三个数据控件:
Adoconnect
AdoQuery
DataSetProvider
  二、联接顺序:
SQL数据库<--Adoconnect<--Adoquery<--DataSetProvider
  三、属性设置:
Adoconnect:
  1、ConnectionString
2、Connected
Adoquery:
  1、connection
2、Active
DataSetProvider:
  1、DataSet
2、option.poAllowCommand:=true
参考技术A B/S就是把原来C/S的客户端用浏览器表现出来而已,如果你原来的软件也是分3层的就好改很多,数据库只跟中间件通信;浏览器只跟中间件通信,一般用http协议。主要是把浏览器的UI做好,尽量和原客户端差不多。追问

我想用delphi做中间的业务处理层,这样很多代码可以复用。
但是不知道用什么方法做,什么技术?什么控件?应学习哪方面的知识?

追答

这太广泛了,说不清楚。比如你做中间层,要用TCP控件监听端口,这个端口是客户端发来数据的端口,接到数据后进行处理,可能需要访问数据库,要用到ADO组件,SQL语句,然后把结果数据发回给客户端。
你可以搜一下简单的delphi 3层架构的例子,照里面学做,慢慢就熟了。

追问

如果走http协议呢,webservice?

追答

http就是tcp、udp。用indy组件,里面有tcpSever、udpSever控件。webservice不清楚了。

参考技术B delphi还是算了吧,公司都倒闭了,没人维护了。

如果真要做,那么就用tcp/ip的报文通讯,不过真的不是很建议。还是修改成java好些。
参考技术C 推荐了解一下 Delphi XE 5,有人知道 Borland 和 Inprise,却不知道 Embarcadero ,不要轻易盲从,Delphi 是大师的艺术,一般的程序员无法接触其精髓,更无法理解其美妙。当你用一份 Object Pascal 代码编译生成 Windows 、Max OS、iOS 甚至 Android 等多个平台的原生可执行程序(APP)时,你就会发现另一个小众世界。至于你所说的中间层,简单理解,就是把业务逻辑封装成 Web Service ,供 JSP 调用即可,当然,需要做一些安全认证和数据交换处理,比如 Request 或 Session 识别和 JSON 数据。实现起来比较复杂一些,但不是你想象得那么难。

为何没有人用DELPHI IDHTTP + WEB做三层应用

---恢复内容开始---

为何没有人用DELPHI IDHTTP + WEB + MYSQL(或其他数据库)做三层应用,我个人觉得这样做也不错。不过这样写需要开发人员懂的范围相对广一些,对于初入门的朋友来说,可能有点困难。需要对PHP或其他WEB框架有所认识,了解并懂得如何使用JSON

现在JSON应用得这么广泛,DELPHI也支持(XE10肯定支持,其他版本不清楚,请自行测试)。

ThinkPHP是一个挺成熟的PHP框架,用它来做WEB层(服务层)是不错的选择,当然可以用其他的,例如JAVAASP.NET

至于数据库,做任意一个都可以。

这个例子用到了的工具有PhpStudynotepad++SQLyogDelphi XE 10

数据库为MySQL,用它的原因是ThinkPHPMySQL支持比较好。而且用php的大多都是搭配使用MySQL

WEB框架用的是ThinkPHP

先上效果图:

 技术分享

 

一、读取

 技术分享

 

点击以上按钮,程序将通过IdHttp1控件,向web服务器post一个请求,该请求将返回一个json字符串,程序将json字符串解释将赋值到对应的Edit控件上。

效果图下图:

 技术分享

 

注:读者自行将1”和“可乐”中的“”符号去掉即可。

 

二、修改

 技术分享

 

点击上图中的按钮,程序将把商品编号为1的价格改为10

程序将通过IdHttp1控件,向web服务器post一个请求修改价格的,参数为商品的ID和价格,该请求将返回一个json字符串,如果成功将弹出一个对话框,如下图:

 

 技术分享

 

 

读取按钮的代码

procedure TForm1.Button1Click(Sender: TObject);

var

  ResponseStream: TStringStream;

  ResponseStr : string;

  Url:string;

  jsonObject: TJSONObject; // JSON

 

  RequestList : TStringList;     //请求信息

begin

  RequestList := TStringList.Create;

  //以列表的方式提交参数

  RequestList.Add(‘type=getGoodsById‘);

  RequestList.Add(‘goodsid=1‘);

 

 

  Url:=‘http://192.168.1.200:81/bwq_test/index.php/Mobile/Index/jiekou‘;

  ResponseStream := TStringStream.Create(‘‘);

  IdHttp1.ReadTimeout := 3000;

  IdHttp1.Post(Url,RequestList,ResponseStream);

  //获取网页返回的信息

  ResponseStr := ResponseStream.DataString;

  //网页中的存在中文时,需要进行UTF8解码

  ResponseStr := UTF8Decode(ResponseStr);

  label_jsonStr.Caption:=ResponseStr;

 

 

  jsonObject := TJSONObject.ParseJSONValue(Trim(ResponseStr)) as TJSONObject;

  Edit_id.Text:=jsonObject.Values[‘id‘].ToString;

  Edit_name.Text:=jsonObject.Values[‘name‘].ToString;

  Edit_price.Text:=jsonObject.Values[‘price‘].ToString;

end;

 

 

修改按钮的代码:

procedure TForm1.Button2Click(Sender: TObject);

var

  ResponseStream: TStringStream;

  ResponseStr : string;

  Url:string;

  jsonObject: TJSONObject; // JSON

 

  RequestList : TStringList;     //请求信息

 

  return_code,return_message:string;//返回的代码,0OK

begin

  RequestList := TStringList.Create;

  //以列表的方式提交参数

  RequestList.Add(‘type=updateGoodsPrice‘);

  RequestList.Add(‘goodsid=1‘);

  RequestList.Add(‘price=‘+Edit_newPrice.Text);

 

  Url:=‘http://192.168.1.200:81/bwq_test/index.php/Mobile/Index/jiekou‘;

  ResponseStream := TStringStream.Create(‘‘);

  IdHttp1.ReadTimeout := 3000;

  IdHttp1.Post(Url,RequestList,ResponseStream);

  //获取网页返回的信息

  ResponseStr := ResponseStream.DataString;

  //网页中的存在中文时,需要进行UTF8解码

  ResponseStr := UTF8Decode(ResponseStr);

  label_jsonStr.Caption:=ResponseStr;

 

 

  jsonObject := TJSONObject.ParseJSONValue(Trim(ResponseStr)) as TJSONObject;

  return_message:=jsonObject.Values[‘message‘].ToString;

  ShowMessage(return_message);

 

 

end;

 

两者其实大同小异,都是利用了IdHttppost功能和对json的利用。

 

至于服务器端的PHP代码是:

<?php

//header("Content-type: text/html; charset=utf-8");

 

namespace Mobile\\Controller;

use Think\\Controller;

use Think\\Model;

class IndexController extends Controller {

 

public function jiekou()

{

if($_GET["type"]=="test")

{

$AAA=$_GET["sss"];

echo $AAA;

}

 

if($_POST["type"]=="test")

{

echo "test_POST......123";

}

 

$action_name=$_POST["type"];

 

//根据ID获取商品资料

if($action_name=="getGoodsById")

{

$goodsid=$_POST[‘goodsid‘];

$m_goods = M(‘goods‘);// 实例化Data数据模型

$list_goods = $m_goods->where("id=".$goodsid)->select();

$result=$list_goods[0];

echo json_encode($result);

}

 

//修改商品的价格

if($action_name=="updateGoodsPrice")

{

$m_goods = M("goods");

// 要修改的数据对象属性赋值

$data[‘price‘] = $_POST["price"];

$i=$m_goods->where(‘id=‘.$_POST["goodsid"])->save($data); // 根据条件保存修改的数据

$result;

if($i<>0)

{

$result[‘code‘]=$i;

$result[‘message‘]=‘success‘;

}

else

{

$result[‘code‘]=0;

$result[‘message‘]=‘faile‘;

}

echo json_encode($result);

}

     }

 }

 

 

---恢复内容结束---

以上是关于如何用delphi做三层结构中的中间层。的主要内容,如果未能解决你的问题,请参考以下文章

Delphi三层开发小技巧:TClientDataSet的Delta妙用

为何没有人用DELPHI IDHTTP + WEB做三层应用

delphi ORACLE三层架构的服务端开发

PHP三层结构(上)——简单三层结构

PHP三层结构(下)——PHP实现AOP

如何用delphi中Data Module 管理数据库连接 和Adoquery 及 datasourse 等