如果您已经编写了与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:
要获取完整的交付物,您需要从sourceforge.net下载整个JTOpen软件包。 该软件包包括许多JAR文件。 当前,该列表包括以下文件:
请不要担心JAR文件的数量。 这些JAR文件中的许多文件都有特定的用途,普通用户不会使用。 本文不会尝试解释每个JAR文件的用处。 取而代之的是,我们将重点关注两个最新的功能,它们可以为Android操作系统开发应用程序:jt400android.jar和jtopenlite.jar。 我们将与最著名的jt400.jar进行比较和对比。
自从Java的IBM Toolbox诞生以来,这个JAR文件就存在了,正如人们可能从与IBM AS /400®类似的名称中猜到的那样。 它是用于远程访问IBM i的可靠机制,它是许多IBM产品(包括用于i的IBM Navigator,用于IBM i Access Client解决方案和用于网络的IBM i Access)的基础。 它是迄今为止最流行和最著名的交付品,它的名称经常成为工具箱本身的代名词。 但是,此JAR文件与现代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被设计为工具箱系列中精通性能的轻量级成员。 与jt400android.jar不同,该代码不是从jt400.jar的经典工具箱类派生的。 例如,没有用于创建新连接的AS400对象! 将现有的使用jt400的代码迁移到JTOpenLite需要一些重构。
JTOpenLite仅包含jt400.jar和jt400android.jar提供的功能的一个子集,但仍使您能够执行以下重要任务:
其轻巧的性质意味着它可以更快地执行这些操作,并且该工具箱可以在包括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上运行命令并输出结果消息。 在所有示例中,代码均写入名为outputPrintStream
的PrintStream
对象。
这是一个在过去15年中如何使用CommandCall
类的示例。 从AS400对象开始。 该AS400对象表示一个连接,并且需要实例化CommandCall
类型的对象。 然后,将CommandCall
对象用于运行命令。 同样,此代码不支持Android,因为它依赖于不支持Android的jt400.jar。
import java.beans.PropertyVetoException;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Message;
import com.ibm.as400.access.CommandCall;
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执行相同的任务。 您会注意到,实现代码与jt400.jar实现完全相同! 唯一的区别是所需的进口。 请记住,jt400.jar依赖于Android运行时中不存在的某些类,因此jt400android.jar为这些类创建了存根。 这些存根实现位于com.ibm.as400.jtopenstubs包中。 从新位置导入类后,您的代码看起来相同。 大多数现代开发环境都会自动为您执行此操作。 另外,您可以选择仅捕获“ Exception”,该异常将使用java.lang.Exception
类,而无需了解存根类。
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;
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示例。
import com.ibm.jtopenlite.Message;
import com.ibm.jtopenlite.command.CommandConnection;
import com.ibm.jtopenlite.command.CommandResult;
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调用背后的代码。 在这些示例中,代码运行一个简单的SELECT
语句,并将输出写入到PrintStream
对象,并假定某些机制会将输出显示给用户。 相反,您可以轻松使用特定于平台的构造。 例如,在Android上,您可以轻松地将结果插入ListView对象。 在这两个示例中,唯一需要的导入来自java.sql
包(因此import语句可以成为通配符“ import java.sql.*;
”)。
同样,使用jt400.jar和jt400android.jar的代码是相同的。 Class.forName()
调用导致JDBC驱动程序类被初始化,然后可以从DriverManager
类中检索连接。
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,只需进行两个简单的更改:
Class.forName()
指定jtopenlite
类。 jdbc:as400
”语法更改为“ jdbc:jtopenlite
”。 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