起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1242|回复: 6

[分享]在X3中调用远程Java**

[复制链接]
发表于 2006-10-24 16:35:23 | 显示全部楼层 |阅读模式
部署
在X3中可以通过Hessian协议,调用部署在Web服务器上的Serverlet。在Serverlet的web.xml中提供出远程调用的接口与实现类即可。

在这个案例中,web.xml提供了Sample接口(源码:src\java\com\justep\hessian\Sample.java),指定了Sample接口的实现类:SampleImpl(源码:src\java\com\justep\hessian\SampleImpl.java)
打开X3 Studio,复制src\x3\ SampleFunc到任意目录,修改主窗体中TMainForm.BizFormCreate方法,将:FServer := THessianSever.Create('http://localhost/HessianCallSample/');这行中的'http://localhost/HessianCallSample/'根据实际情况修改即可运行。
调用约定
ReturnValue := FServer.Call('methodName', [Parameter1, Parameter2, ..., ParameterN]);
传入参数个数不限,只读。
返回值类型为object。
可以传递的参数类型与返回值的类型
在本案例中,调用了FServer.Call('methodName', [Parameter1, Parameter2, ..., ParameterN])这样的方法,这个就是调用Serverlet中提供的接口。
其可以传递的参数包含(括号中是java类型):
1.        基础类型:Byte(byte)、Integer(int)、Double(double)、Int64(long)、string(String)
2.        数组:元素类型为1、3的数组
3.        类:以1、2为域的类型
类映射
在X3中的类,与Java中的类作为参数类型与返回值类型的时候,需要做类型映射,方法:FServer.JavaClassMapping.Add('com.justep.hessian.InParameter', InParameter);
第一个参数为完整的Java class name,第二个参数为X3中的类
案例如何导入X3

点击上图按钮

选中我的电脑,确定。

展开我的电脑

展开到案例所在目录,选中测试功能,右键复制,然后粘贴到业务模型下的任意目录中。

这样就成功了,然后可以运行了。运行之前不要忘记部署Serverlet启动Web服务启动。

JavaRPC.zip

631.92 KB, 下载次数: 296

回复

使用道具 举报

 楼主| 发表于 2006-10-24 16:36:36 | 显示全部楼层
平台上调用例子:
unit MainForm;

interface

uses
  Business.System, Business.Forms,
  HessianRPC;

type
  TMainForm = class(TForm)
    btnHelloWorld: TButton;
    btnAdd: TButton;
    btnObject: TButton;
    procedure BizFormCreate(Sender: TObject);
    procedure btnHelloWorldClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnObjectClick(Sender: TObject);
  private
    FServer: THessianSever;
  public
    {public declarations}
  end;

  InParameter = class
  public
    intField: Integer;
    stringField: string;
  end;

  OutParameter = class
  public
    intField: Integer;
    stringField: string;
  end;

implementation

procedure TMainForm.BizFormCreate(Sender: TObject);
begin
  FServer := THessianSever.Create('http://localhost/HessianCallSample/');

  // 注册类型映射
  FServer.JavaClassMapping.Add('com.justep.hessian.InParameter', InParameter);
  FServer.JavaClassMapping.Add('com.justep.hessian.OutParameter', OutParameter);
end;

procedure TMainForm.btnHelloWorldClick(Sender: TObject);
begin
  JSDialogs.ShowMsg(FServer.Call('helloWorld', []) as System.String, 'Hessian Call Sample');
end;

procedure TMainForm.btnAddClick(Sender: TObject);
var
  o: object;
  i: Integer;
begin
  o := FServer.Call('add', [1, 2]);
  i := Integer(o);
  JSDialogs.ShowMsg(SysUtils.IntToStr(i), 'add');
end;

procedure TMainForm.btnObjectClick(Sender: TObject);
var
  inObj: InParameter;
  outObj: OutParameter;
begin
  inObj := InParameter.Create;
  inObj.intField := 1;
  inObj.stringField := 'a';
  outObj := FServer.Call('objectParamterCall', [inObj]) as OutParameter;
  JSDialogs.ShowMsg('intField: ' + SysUtils.IntToStr(outObj.intField) +
    #13#10'stringField: ' + outObj.stringField, 'objectParamterCall');
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-24 16:38:12 | 显示全部楼层
java实现代码:
package com.justep.hessian;

public class SampleImpl implements Sample {
        public String helloWorld() {
                return "Hello world!";
        }

        public int add(int a, int b) {
                return a + b;
        }

        public OutParameter objectParamterCall(InParameter in) {
                OutParameter r = new OutParameter();
                r.intField = in.intField;
                r.stringField = in.stringField;
                return r;
        }
}
回复 支持 反对

使用道具 举报

发表于 2007-4-10 11:14:05 | 显示全部楼层
调用两个Jar的实现方法:
    首先一个原则是,除非不得已,系统原理上通过重载机制基本上都可以用一个Servlet来实现的。
    调用多个Servlet与调用一个Servlet在配置上的差别是在Web.xml中下面这个片段
        <servlet-mapping>
                <servlet-name>HessianCallSample1</servlet-name>
                <url-pattern>/Hessian</url-pattern>
        </servlet-mapping>
基本url-pattern>中必须各自有各自的名子并且不能与ServletName重复。
Servlet片段如下:
        <servlet>
                <description>A sample of hessian call.</description>
                <display-name>HessianCallSample1</display-name>
                <servlet-name>HessianCallSample1</servlet-name>
                <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
                <init-param>
                        <param-name>home-class</param-name>
                        <param-value>One.One.One</param-value>
                </init-param>
                <init-param>
                        <param-name>home-api</param-name>
                        <param-value>One.One.OneI</param-value>
                </init-param>
        </servlet>
这样调用方法如下:
var
  lServer: THessianServer;
  lR: string;
begin                                                                  
  lServer := THessianServer.Create('http://192.168.1.123:84/x3/Hessian');
  try
    lR := lServer.Call('getOne', [])as System.String;
    jsDialogs.ShowMsg(lR, '');
  finally
  end;

再来看第二个Servlet
        <servlet>
                <description>A sample of hessian calldsf</description>
                <display-name>AAAA</display-name>
                <servlet-name>AAAA</servlet-name>
                <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>                                                          
                <init-param>
                        <param-name>home-class</param-name>
                        <param-value>two.two.Two</param-value>
                </init-param>
                <init-param>
                        <param-name>home-api</param-name>
                        <param-value>two.two.TwoI</param-value>
                </init-param>
        </servlet>


ServletMapping

        <servlet-mapping>
                <servlet-name>AAAA</servlet-name>
                <url-pattern>/AA</url-pattern>
        </servlet-mapping>

调用如下:

var
  lServer: THessianServer;
  lR: string;
begin
  lServer := THessianServer.Create('http://192.168.1.123:84/x3/AA');
  try
    lR := lServer.Call('getTwo', [])as System.String;
    jsDialogs.ShowMsg(lR, '');
  finally
  end;


One、OneI、Two、TwoI中的代码与例子中的代码原理上一样只是返回了一个简单的字符串。

[U][B]重点第二个Servletmapping中的urlpattern不能与其它重复![/B] [/U]
回复 支持 反对

使用道具 举报

发表于 2007-4-10 11:51:14 | 显示全部楼层
接上篇:
     系统中按上述做法之后并系统数据并没有,加密压缩传输,如果系统中想用加密压缩传输这个特性的话,Serverlet的Class可以用BizServer的ServletClass,这样就可以用X3自带的加密压缩功能了,但调用方法也要改成如下:
var
  lServer: THessianBizServer;
  lR: string;
begin
  lServer := THessianBizServer.Create();
  try
    lServer.AddURL('http://192.168.1.123:84/x3/AA');
    lR := lServer.Call('getTwo', [])as System.String;
    jsDialogs.ShowMsg(lR, '');
  finally
  end;

注意: 这里THessianServer 改成了THessianBizServer并且传入URL的方式 也变了!
回复 支持 反对

使用道具 举报

发表于 2007-7-9 17:49:54 | 显示全部楼层
这样调用是不是太麻烦了!?!?
回复 支持 反对

使用道具 举报

发表于 2010-4-16 13:50:49 | 显示全部楼层
相当麻烦
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-9 15:22 , Processed in 0.048678 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表