// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Java Card 开发快速入门指南
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Java Card 开发快速入门指南 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Java Card 开发快速入门指南

image::images/java-smart-card-sm.jpg[]

_编写人：Tim Boudreau，维护人：Ruth Kusterer_

Java Card 是一个使用起来非常有趣的平台 - 在link:http://en.wikipedia.org/wiki/Smart_card[+智能卡+]上运行的 JVM 以及手掌大小的微型设备，无不令开发过程充满乐趣。Java Card 自版本 3.0 起分为两种类型：

*传统*：:: 这种类型与 Java Card 的早期版本一样。平台功能极其受限。例如，不存在  ``java.lang.String`` ，也没有  ``java.lang.Object.hashCode()``  方法和浮点数。
*扩展*：:: 适用于更新、更强大的智能卡 - 这是 Java Card 3.0 中的新增功能。它支持 Java 平台更为全面的实现。最酷的恐怕就是它在本机支持 Servlet 的功能了 - 实际上，您使用熟悉的 API 就能编写在智能卡上运行的 Web 应用程序！





== 要求

*要学完本教程，您需要具备以下软件和资源：*

image::../../../images_www/articles/69/netbeans-stamp.gif[title="此页上的内容适用于 NetBeans IDE 6.8 和 6.9"]

|===
|软件或资源 |要求的版本 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |6.9 

|link:http://java.sun.com/javacard/downloads/index.jsp[+Java Card SDK+] |3.02 

|适用于 NetBeans 的 Java Card 插件 |1.3 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发工具包+] (JDK) |版本 6 
|===


== 设置项目环境

由于智能卡没有用户界面，因此您需要一个用于在卡上读写数据的智能卡读卡器，或者使用 Java Card 引用实现 (RI) 中包含的仿真器。本教程将使用仿真器。

*注：*Java Card 插件适用于任何操作系统，但 Java Card 引用实现仿真器只可用于 Windows。不过，您也可以在其他操作系统上将其设置为 Java 平台，方法是将 NetBeans 指向 RI 在 Mac 或 Linux 系统上的 Windows 分区中的安装，但您不能使用此设置运行项目。


=== 在 NetBeans IDE 中安装插件

1. 下载并安装 NetBeans IDE 6.9。
2. 安装完成后，转至 "Tools"（工具）> "Plugins"（插件）菜单。
3. 在 "Available Plugins"（可用插件）下，有两个与 Java Card 相关的插件：Java Card 和 Java Card 运行时包。
* Java Card 插件用于在 NetBeans IDE 中添加 Java Card 项目支持。
* 仅当您尚未安装 Java Card 引用实现的副本时，才需要 Java Card 3.0.2 运行时包。

image::images/install-javacard-plugins.png[]


[start=4]
. 安装插件后，需要重新启动 IDE 才能继续执行下面的教程步骤。


=== 注册 Java Card 平台

如果从插件管理器下载了 Java Card 3.0.2 运行时包，则已将 Java Card SDK 设置为平台。但是，如果从 link:http://java.sun.com/javacard/devkit/[+java.sun.com+] 下载并安装了平台，则可以使用 "Tools"（工具）> "Java Platforms"（Java 平台）菜单将 Java Card 平台添加到 IDE 中，具体的操作方法与注册任何 Java 平台相同。

image::images/installPlatform.png[]

设置 Java Card 平台后，IDE 的 "Services"（服务）标签中会列出该平台。如果未显示 "Services"（服务）标签，请从菜单中选择 "Windows"（窗口）> "Services"（服务）。

image::images/services-tab.png[]

一个“平台”可以有多台“设备”。您可以将项目部署到特定平台的特定设备上。


== 了解 Java Card 项目类型

从菜单中选择 "File"（文件）> "New Project"（新建项目），然后单击 "Java Card" 类别。此处有多种 Java Card 项目可供您创建。所有这些项目与 NetBeans Java SE 项目一样，都使用 link:http://ant.apache.org/[+Apache Ant+] 构建。

image::images/choose-project-type.png[]

传统的小应用程序项目为较小的设备创建传统的 Java Card 小应用程序，这与 Java Card 2.0 和更早版本中使用的小应用程序类似。传统的库项目类似于传统的小应用程序项目，它没有小应用程序，是您希望存放在设备上且可在小应用程序之间共享的一些代码。

扩展的小应用程序和库项目使用 Java Card 3.0 中的扩展 API，以便您能够使用 java.lang.String 等。传统项目和扩展项目的引导类路径有所不同，例如，传统项目的代码完成不显示 java.lang.String，但扩展项目的代码完成却显示 java.lang.String。

image::images/create-applet-app.png[]

Web 应用程序项目或许是 Java Card 3.0 最酷的功能。您可以获得实现 Servlet 的框架项目，并且可以访问完整 Servlet API。这比使用任一类型的小应用程序式应用程序要简单得多 - 您在客户端上无需任何特殊代码，即可与设备上运行的应用程序进行交互，此操作只需一个 Web 浏览器而已！您可以使用引用实现和桌面 Web 浏览器在本地测试应用程序。

image::images/create-web-app.png[]


== 使用项目

对于本教程，我们将创建一个新的 Web 项目。

在新的 Web 项目中，输入 "Card Web Application" 作为项目名称，并将项目位置设置为 NetBeansProjects 目录。单击 "Finish"（完成）后，该项目出现在 "Project"（项目）标签中。

右键单击 "Project"（项目）标签中的项目节点，然后从上下文菜单中选择 "Properties"（属性）。在 "Project Properties"（项目属性）窗口的 "Run"（运行）部分中，您可以更改项目所部署到的平台和设备。单击 "Close"（关闭）以保存更改。

Java Card Web 应用程序的使用与部署到 Servlet 容器的任何其他 Web 应用程序类似。按工具栏上的 "Run"（运行）按钮，以运行 "Hello World" 样例。运行 Java Card Web 应用程序时，将打开一个 Web 浏览器窗口，其中显示 Servlet 的输出： ``Hello from webapplication1.MyServlet`` 。

image::images/editor.png[]

运行小应用程序类型的项目时，NetBeans IDE 将提供两个有用的界面：命令行输出和 Java Card 控制台。使用此控制台可与小应用程序进行交互：您可以发送十六进制数据并读取回复。

提示：RI 包含可在 NetBeans IDE 中打开和运行的更多样例项目。

image::images/run-customizer.png[]


== 使用特殊的插件功能

Java Card 有两个令人不可思议的特性，这在其他 Java 平台中都不曾遇到过：

*应用程序标识符 (AID)*:: 这些唯一标识符类似于 //aid//720A75E082/0058AEFC20。十六进制数值的第一部分是供应商 ID（需从link:http://iso.org/[+国际标准化组织 (ISO)+] 获得）；第二部分是您想出来的一个唯一值。AID 用来标识小应用程序类、Java 包（仅传统的小应用程序和库项目）以及小应用程序的唯一实例（您可以在一个设备上多次部署相同的小应用程序，使用实例 AID 可以选择要将信息发送给哪个小应用程序）。
*APDU 脚本*:: 这些脚本用于向小应用程序发送数据。它包含过多需手动键入的十六进制数值；该脚本需要选择一个特定的小应用程序实例，然后向该实例发送数据。您也可以使用 Java Card 控制台，而不是发送预先编写的脚本。

这两项特性都有些复杂，不过，NetBeans 插件可以最大限度地简化其操作，如下所示：

* 当创建项目时，将会自动为小应用程序 AID、传统的包 AID 和实例 AID 生成合理的值。

* 在 "Project Properties"（项目属性）对话框中选择 "Applets"（小应用程序）标签后，项目将扫描其类路径，以查找所有 Java Card 小应用程序子类：

image::images/customize-applets-pre.png[]

* 找到子类后，便可以在该对话框中选择实际部署的小应用程序，并定制所用的 AID 值、部署参数等。IDE 会验证您输入的所有数据，以便确保不存在任何无效数据：

image::images/customize-applets.png[]

* 如果要部署同一小应用程序的两个实例，则可以进行此设置；但是，对于仅需部署一个小应用程序实例的简单情况，则不需要考虑此设置：

image::images/customize-instances.png[]

* 要测试处于运行状态的小应用程序，您无需手动编写整个 APDU 脚本，使用内置控制台即可直接与部署的小应用程序进行交互：

image::images/open-console.png[]

image::images/shell.png[]

* 传统项目（这些项目只允许包含一个 Java 包）的“包 AID”也由 IDE 生成，不过可以定制。

image::images/create-project-package-aid.png[]

* 项目中的所有 AID 值有一部分将是 ISO 指定的供应商 ID（称为 RID）。为快速着手操作，IDE 会生成一个随机 RID 值，以便进行开发和测试。如果您有正式的 RID，则可以在 "Tools"（工具）> "Options"（选项）中输入该 RID，以便将其用于所有的新项目。单击 "Project Properties"（项目属性）中的 "Generate"（生成）按钮，可以更新现有项目中的值。

image::images/global-rid.png[]


== 集成第三方 SDK

目前，工具仅支持 Java Card 3.0.2 引用实现，但是，这些工具有一个可扩展的 API，可用于集成供应商卡。平台和设备定义仅仅是由构建脚本导入的属性文件。

部署将通过由卡供应商提供的一组 Ant 任务来完成。这意味着创建的项目可以在 IDE 外部运行，而不存在任何锁定。Ant 任务的源文件（Java Card RI 的一部分）以及现成的 NetBeans 样例项目可以从 link:http://kenai.com/projects/javacard[+Java Card 项目门户+]下载。

您是创建 Java Card 部署工具的卡供应商吗？请联系插件的创建者 link:mailto:tboudreau@sun.com[+Tim Boudreau+]，以获取有关link:http://wiki.netbeans.org/JavaCardPlatformIntegration[+如何集成卡+]的详细信息！根据您要在 IDE 内为卡提供多少支持，可以在多个级别进行集成。

link:/about/contact_form.html?to=6&subject=NetBeans%20Java%20Card%20Development%20Quick%20Start%20Guide[+发送有关此教程的反馈意见+]



== 相关链接

* 这些模块大多归功于 link:https://blogs.oracle.com/javacard/[+Anki Nelaturu+] 以及 Java Card 团队的其余成员。
* link:http://java.sun.com/javacard[+Sun 的官方 Java Card 门户+] - 新闻、开发工具包、参考资料、规范、常见问题解答。
* link:http://kenai.com/projects/javacard/pages/Home[+Java Card 项目门户+] - 源文件、样例项目、论坛、文档。
* link:http://wiki.netbeans.org/JavaCardPlatformIntegration[+卡供应商的平台集成+]
* link:http://java.sun.com/developer/technicalArticles/javacard/javacard-servlets/[+在智能卡上部署 Servlet：具有 Java Card 3.0 的可移植 Web 服务器+]
