ibm http 访问_结合使用JTOpen和Android来访问IBM i

如果您已经编写了与IBM i通信的Java应用程序,那么您已经知道IBM Toolbox for Java允许您从桌面和Web应用程序访问服务器的数据和资源并与之交互。 但是您是否知道Java工具箱可以为Android设备带来相同的功能? 有了最新的产品,它可以!

IBM Java工具箱已经存在了一段时间。 实际上,它自V4R2M0(1998)起就存在。 您可以想象,在其存在的15年中,该工具箱已经发展和壮大,可以满足各种各样的需求。 当然,其中一些需求已经存在于移动设备领域。 例如,当Java ME推动移动设备上Java的市场需求时,该工具箱发布了与ME应用程序兼容的.jar文件。 现在,随着Android操作系统的增长,该工具箱已经扩展了新产品,以支持在该平台上进行应用程序开发。

您可能还记得,可以通过以下两种方式来获取IBM Toolbox for Java:

  • 在V6R1中,最重要的JAR文件包含在IBM i上的可安装许可程序产品(LPP)中。 该LPP名为5761-JC1,并且完全免费。 在V7R1中,JAR文件现在包含在5770-SS1的选项3中。 这些JAR文件的更新是通过临时修订提供的。
  • 可以从sourceforge.net下载开源软件包(称为JTOpen)。

要获取完整的交付物,您需要从sourceforge.net下载整个JTOpen软件包。 该软件包包括许多JAR文件。 当前,该列表包括以下文件:

  • composer.jar
  • jt400.jar
  • jt400android.jar
  • jt400Micro.jar
  • jt400Native.jar
  • jt400Proxy.jar
  • jt400Servlet.jar
  • jtopenlite.jar
  • jui400.jar
  • outputwriters.jar
  • reportwriter.jar
  • tes.jar
  • uitools.jar
  • util400.jar

请不要担心JAR文件的数量。 这些JAR文件中的许多文件都有特定的用途,普通用户不会使用。 本文不会尝试解释每个JAR文件的用处。 取而代之的是,我们将重点关注两个最新的功能,它们可以为Android操作系统开发应用程序:jt400android.jar和jtopenlite.jar。 我们将与最著名的jt400.jar进行比较和对比。

jt400.jar(“ jt400”)

自从Java的IBM Toolbox诞生以来,这个JAR文件就存在了,正如人们可能从与IBM AS /400®类似的名称中猜到的那样。 它是用于远程访问IBM i的可靠机制,它是许多IBM产品(包括用于i的IBM Navigator,用于IBM i Access Client解决方案和用于网络的IBM i Access)的基础。 它是迄今为止最流行和最著名的交付品,它的名称经常成为工具箱本身的代名词。 但是,此JAR文件与现代Android设备的运行时环境不兼容。

jt400android.jar(“ jt400-android”)

jt400.jar文件与Android不兼容,因为它是使用在Android运行时中没有对应类的Java类构建的。 提供了jt400android.jar可交付结果以直接解决该问题。 通过使用jt400.jar代码库并使用“存根”类代替了Android缺少类来做到这一点。 还进行了调整以弥补其他缺点(例如,Android运行时不具有Java Swing或AWT类)。 简而言之,该代码完全来自jt400.jar,但进行了一些细微的调整以使其可用于Android。

这对开发人员意味着什么? 这意味着可以轻松地将代码从使用Android的jt400.jar迁移到使用Android的jt400android.jar。 稍后我们将遍历代码示例,但这通常是一个小任务。 尽管此程序包是最容易迁移现有代码的程序,但它可能仍然过于繁重,无法在某些设备上实现最佳性能。

jtopenlite.jar(“ JTOpenLite”)

最后,在jtopenlite.jar中提供了JTOpenLite。 JTOpenLite被设计为工具箱系列中精通性能的轻量级成员。 与jt400android.jar不同,该代码不是从jt400.jar的经典工具箱类派生的。 例如,没有用于创建新连接的A​​S400对象! 将现有的使用jt400的代码迁移到JTOpenLite需要一些重构。

JTOpenLite仅包含jt400.jar和jt400android.jar提供的功能的一个子集,但仍使您能够执行以下重要任务:

  • 访问集成文件系统(IFS)。
  • 运行命令。
  • 调用程序或服务程序。
  • 使用分布式数据管理(DDM)或Java数据库连接(JDBC)访问数据库。

其轻巧的性质意味着它可以更快地执行这些操作,并且该工具箱可以在包括Android手机和平板电脑在内的许多设备上以最高效率运行。 尽管JTOpenLite是性能最快的蜂窝电话解决方案,但请记住, JTOpenLite并非“仅适用于移动设备”。 桌面和Web应用程序还显示出具有JTOpenLite中的某些功能更好的性能。 实际上,创建JTOpenLite的目的是为企业应用程序提供更快的数据库访问权限。

JTOpenLite还具有磁盘占用量少的优点。 截止到今天,整个JAR文件的大小仅为560 KB。 同时,jt400.jar和jt400android.jar的重量分别约为4.5 MB和3.3 MB。 这在Android开发期间可能很重要,因为这会增加应用程序包的大小。

当然,这些性能和占用空间的好处需要权衡取舍。 例如,包含的JDBC驱动程序缺少一些高级功能。 缺少功能的示例包括ResultSet定位,SQLArray类型和双向编码字符集标识符(CCSID)。

代码示例–运行命令

让我们研究一下如何使用这些软件包执行一项非常基本的任务:在IBM i上运行命令并输出结果消息。 在所有示例中,代码均写入名为outputPrintStreamPrintStream对象。

jt400.jar

这是一个在过去15年中如何使用CommandCall类的示例。 从AS400对象开始。 该AS400对象表示一个连接,并且需要实例化CommandCall类型的对象。 然后,将CommandCall对象用于运行命令。 同样,此代码不支持Android,因为它依赖于不支持Android的jt400.jar。

清单1a:用于使用jt400.jar运行命令的导入
import java.beans.PropertyVetoException;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Message;
import com.ibm.as400.access.CommandCall;
清单1b:使用jt400.jar运行命令的代码
AS400 as400 = new AS400("MySystem", "myUser", "myPassword");
    try {
        as400.setGuiAvailable(false);
    } catch (PropertyVetoException e) {
        log(e);
    }
    CommandCall cc = new CommandCall(as400);
    try {
        boolean isSuccessful = cc.run("CRTLIB FRED");
        outputPrintStream.println("Success? "+isSuccessful);
        // getMessageList returns an array of AS400Message objects
        for(AS400Message msg : cc.getMessageList()){
            outputPrintStream.println(
             "  msg: "+msg.getID() +": "+msg.getText());
        }
    } catch (Exception e) {
        log(e);
    }

jt400android.jar

现在,让我们使用jt400android.jar执行相同的任务。 您会注意到,实现代码与jt400.jar实现完全相同! 唯一的区别是所需的进口。 请记住,jt400.jar依赖于Android运行时中不存在的某些类,因此jt400android.jar为这些类创建了存根。 这些存根实现位于com.ibm.as400.jtopenstubs包中。 从新位置导入类后,您的代码看起来相同。 大多数现代开发环境都会自动为您执行此操作。 另外,您可以选择仅捕获“ Exception”,该异常将使用java.lang.Exception类,而无需了解存根类。

清单2a:用于使用jt400android.jar运行命令的导入
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Message;
import com.ibm.as400.access.CommandCall;
import com.ibm.as400.jtopenstubs.javabeans.PropertyVetoException;
清单2b:使用jt400android.jar运行命令的代码
AS400 as400 = new AS400("MySystem", "myUser", "myPassword");
    try {
        as400.setGuiAvailable(false);
    } catch (PropertyVetoException e) {
        log(e);
    }
    CommandCall cc = new CommandCall(as400);
    try {
        boolean isSuccessful = cc.run("CRTLIB FRED");
        outputPrintStream.println("Success? "+isSuccessful);
        // getMessageList returns an array of AS400Message objects
        for(AS400Message msg : cc.getMessageList()){
            outputPrintStream.println(
             "  msg: "+msg.getID() +": "+msg.getText());
        }
    } catch (Exception e) {
        log(e);
    }

jtopenlite.jar

最后,让我们检查一下如何使用JTOpenLite完成此任务。 您会注意到代码完全不同。 首先,没有CommandCall类,而是CommandConnection类。 此类表示连接,并且还提供了用于运行命令的框架。 JTOpenLite类是从com.ibm.jtopenlite包中导入的。

com.ibm.jtopenlite.samples包中的项目源代码中包含更多JTOpenLite示例。

清单3a:用于使用jtopenlite.jar运行命令的导入
import com.ibm.jtopenlite.Message;
import com.ibm.jtopenlite.command.CommandConnection;
import com.ibm.jtopenlite.command.CommandResult;
图3b:使用jtopenlite.jar运行命令的代码
try {
        // This can throw an IOException, so put it inside a try block
        CommandConnection cc = CommandConnection.getConnection("MySystem", "myUserid", "myPassword");

        // no GUI owned by jtopenLite, so there's no equivalent to
        // setGuiAvailable(false)

        // CommandConnection does both program calls and command calls.
        // commands are done with the execute() method. Instead
        // of returning a set of AS400Message objects, it returns
        // a CommandResult.
        CommandResult result = cc.execute("CRTLIB FRED");

        // CommandResult contains exit code, success/fail indication,
        // and messages (as Message objects, not AS400Message).
        outputPrintStream.println("Success? "+result.succeeded());
        for(Message msg : result.getMessages()){
            outputPrintStream.println(
             "  msg: "+msg.getID() +": "+msg.getText());
        }
    } catch (Exception e) {
        log(e);
    }

代码示例–使用JDBC查询数据库

再举一个例子,让我们看一个简单的JDBC调用背后的代码。 在这些示例中,代码运行一个简单的SELECT语句,并将输出写入到PrintStream对象,并假定某些机制会将输出显示给用户。 相反,您可以轻松使用特定于平台的构造。 例如,在Android上,您可以轻松地将结果插入ListView对象。 在这两个示例中,唯一需要的导入来自java.sql包(因此import语句可以成为通配符“ import java.sql.*; ”)。

jt400.jar或jt400android.jar

同样,使用jt400.jar和jt400android.jar的代码是相同的。 Class.forName()调用导致JDBC驱动程序类被初始化,然后可以从DriverManager类中检索连接。

清单4:将JDBC与jt400.jar或jt400android.jar一起使用的代码
Class.forName("com.ibm.as400.access.AS400JDBCDriver");
    Connection connection = DriverManager.getConnection("jdbc:as400://MYSYSTEM", user, password);
    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery(
        "SELECT CURRENT USER FROM SYSIBM.SYSDUMMY1");
    while (rs.next()) {
        outputPrintStream.println(rs.getString(1));
    }
    connection.close();

jtopenlite.jar

对于jtopenlite.jar,只需进行两个简单的更改:

  • 必须为Class.forName()指定jtopenlite类。
  • URL已从“ jdbc:as400 ”语法更改为“ jdbc:jtopenlite ”。
清单5:将JDBC与jtopenlite.jar一起使用的代码
Class.forName("com.ibm.jtopenlite.database.jdbc.JDBCDriver");
    Connection connection = DriverManager.getConnection("jdbc:jopenlite://MYSYSTEM", user, password);
    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery(
        "SELECT CURRENT USER FROM SYSIBM.SYSDUMMY1");
    while (rs.next()) {
        outputPrintStream.println(rs.getString(1));
    }
    connection.close();

什么适合我?

通常,如果您是从头开始编写Android应用程序,或者需要关注性能,请查看JTOpenLite。 如果尝试将现有的Java应用程序移植到Android应用程序,请使用jt400android.jar。 您可能会遇到以下情况:JTOpenLite似乎是正确的答案,但没有包含您要查找的所有功能。 在这种情况下,请根据需要退回到使用jt400android.jar。

另外,请不要忘记JTOpenLite不仅限于移动设备。 在性能至关重要的任何情况下,甚至在台式机或企业应用程序中,都可能需要进行评估。

尽管jt400.jar仍然是许多现代Java应用程序背后的可靠工具,但有两个新增功能将JTOpen系列带入了手机和平板电脑领域。 他们绝对值得一试!

翻译自: https://www.ibm.com/developerworks/ibmi/library/i-using-jtopen/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值