Java 可访问性与 Web Start 技术详解
1. 可访问性与 PageData 应用
在当今计算机领域,可访问性(Accessibility)对于软件的广泛使用至关重要。可访问性意味着软件能够被各种能力的用户,包括残障人士,方便地使用。下面我们先通过一个简单的示例来了解如何创建带标签的文本字段:
JTextField name = new JTextField(20);
JLabel nameLabel = new JLabel(“Enter Your Name:”);
nameLabel.setMnemonic(‘n’);
name.setLabelFor(nameLabel);
这里,我们创建了一个文本字段
name
和一个标签
nameLabel
,并为标签设置了助记符
'n'
,同时将标签与文本字段关联起来。
接下来,我们介绍一个名为 PageData 的 Java 应用程序,它支持多种可访问性功能。这个应用允许用户输入网页地址,并获取该网页及其服务器的相关信息。该程序主要运用了 Swing 和 Java 网络功能,同时引入了
java.net.URLConnection
类的
getHeaderField(String)
方法。这个方法可以从通过
URLConnection
对象发送信息的 Web 服务器中检索信息。例如,HTTP 协议中的
Server
头部信息,用于标识运行 Web 服务器的软件,我们可以通过以下代码获取:
String serv = pipe.getHeaderField(“Server”);
如果服务器配置为提供该信息,
serv
将存储服务器软件的名称;否则,返回值为
null
。
PageData 程序通过以下几种方式实现了可访问性:
- 使用
super()
方法为应用的主框架设置标题 “Page Data”。
- 每个按钮都有明确标识其用途的文本标签。
- 利用
setLabelFor()
方法将标签与文本字段关联。
- 为每个命令按钮设置工具提示(ToolTips)和键盘助记符。
以下是 PageData.java 的完整源代码:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
public class PageData extends JFrame implements ActionListener, Runnable {
Thread runner;
String[] headers = { “Content-Length”, “Content-Type”, “Date”, “Public”, “Expires”, “Last-Modified”, “Server” };
URL page;
JTextField url;
JLabel[] headerLabel = new JLabel[7];
JTextField[] header = new JTextField[7];
JButton readPage, clearPage, quitLoading;
JLabel status;
public PageData() {
super(“Page Data”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pane = new JPanel();
pane.setLayout(new GridLayout(10, 1));
JPanel first = new JPanel();
first.setLayout(new FlowLayout(FlowLayout.RIGHT));
JLabel urlLabel = new JLabel(“URL:”);
url = new JTextField(22);
urlLabel.setLabelFor(url);
first.add(urlLabel);
first.add(url);
pane.add(first);
JPanel second = new JPanel();
second.setLayout(new FlowLayout());
readPage = new JButton(“Read Page”);
clearPage = new JButton(“Clear Fields”);
quitLoading = new JButton(“Quit Loading”);
readPage.setMnemonic(‘r’);
clearPage.setMnemonic(‘c’);
quitLoading.setMnemonic(‘q’);
readPage.setToolTipText(“Begin Loading the Web Page”);
clearPage.setToolTipText(“Clear All Header Fields Below”);
quitLoading.setToolTipText(“Quit Trying to Load the Web Page”);
readPage.setEnabled(true);
clearPage.setEnabled(false);
quitLoading.setEnabled(false);
readPage.addActionListener(this);
clearPage.addActionListener(this);
quitLoading.addActionListener(this);
second.add(readPage);
second.add(clearPage);
second.add(quitLoading);
pane.add(second);
JPanel[] row = new JPanel[7];
for (int i = 0; i < 7; i++) {
row[i] = new JPanel();
row[i].setLayout(new FlowLayout(FlowLayout.RIGHT));
headerLabel[i] = new JLabel(headers[i]+”:”);
header[i] = new JTextField(22);
headerLabel[i].setLabelFor(header[i]);
row[i].add(headerLabel[i]);
row[i].add(header[i]);
pane.add(row[i]);
}
JPanel last = new JPanel();
last.setLayout(new FlowLayout(FlowLayout.LEFT));
status = new JLabel(“Enter a URL address to check.”);
last.add(status);
pane.add(last);
setContentPane(pane);
}
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source == readPage) {
try {
page = new URL(url.getText());
if (runner == null) {
runner = new Thread(this);
runner.start();
}
quitLoading.setEnabled(true);
readPage.setEnabled(false);
} catch (MalformedURLException e) {
status.setText(“Bad URL: “ + page);
}
} else if (source == clearPage) {
for (int i = 0; i < 7; i++)
header[i].setText(“”);
quitLoading.setEnabled(false);
readPage.setEnabled(true);
clearPage.setEnabled(false);
} else if (source == quitLoading) {
runner = null;
url.setText(“”);
quitLoading.setEnabled(false);
readPage.setEnabled(true);
clearPage.setEnabled(false);
}
}
public void run() {
URLConnection conn = null;
try {
conn = this.page.openConnection();
conn.connect();
status.setText(“Connection opened ...”);
for (int i = 0; i < 7; i++)
header[i].setText(conn.getHeaderField(headers[i]));
quitLoading.setEnabled(false);
clearPage.setEnabled(true);
status.setText(“Done”);
runner = null;
} catch (IOException e) {
status.setText(“IO Error:” + e.getMessage());
}
}
public static void main(String[] arguments) {
PageData frame = new PageData();
frame.pack();
frame.setVisible(true);
}
}
运行 PageData 应用程序需要有活跃的互联网连接,用户在使用 Java 解释器运行该程序前,应先登录到网络服务提供商。该程序的工具提示、选择性启用组件等功能,使得它易于学习和使用。如果输入的网页地址无法加载,用户可以使用 “Quit Loading” 按钮停止连接尝试。
2. Java Web Start 技术
Java 程序员面临的一个重要问题是如何将软件提供给用户。在 Java 2 版本 1.4 中,Sun 引入了 Java Web Start 技术,这是一种通过点击网页链接来下载和运行程序的协议。使用 Java Web Start,用户可以像运行小程序(applets)一样运行应用程序。
2.1 Java 程序的分发方式
Java 应用程序需要 Java 解释器,用户可以选择安装 Java 运行时环境(Java Runtime Environment,JRE)。最简单的方法是要求用户从 Sun 的网站(http://java.sun.com/getjava/)下载并安装 JRE。应用程序可以通过 CD、网站等方式分发,用户可能需要运行安装程序或手动复制文件和文件夹。
小程序相对更容易分发,因为它们可以由 Web 浏览器(如 Microsoft Internet Explorer、Netscape Navigator 和 Mozilla)直接运行。但 Java 2 小程序要求用户的浏览器安装 Java 插件,该插件也可以从 Sun 网站随 JRE 一起下载。不过,小程序存在一些缺点,例如默认的安全策略限制了它们对用户计算机上数据的读写操作。
2.2 Java Web Start 的工作原理
Java Web Start 的工作流程如下:
1. 程序员将应用程序的文件打包成 Java 归档(JAR)文件,并创建一个使用 Java 网络启动协议(JNLP)的文件。
2. 将这些文件发布到 Web 服务器上,并在网页中添加指向 JNLP 文件的链接。
3. 用户使用浏览器打开网页并点击链接。
4. 如果用户没有安装 JRE,会弹出对话框询问是否下载并安装。完整安装包目前大小为 5.7M,在 56K 网络连接下可能需要 30 - 45 分钟下载。
5. JRE 安装并运行程序,打开新的窗口和界面组件,程序会被缓存,下次运行无需再次安装。
我们可以访问 Sun 的 Java Web Start 网站(http://java.sun.com/products/javawebstart),点击 “Demos” 链接,测试一些示例应用程序。
2.3 使用 Java Web Start 准备应用程序
要使用 Java Web Start 运行应用程序,需要完成以下步骤:
1.
打包 JAR 文件
:使用以下命令将应用程序的类文件打包成 JAR 文件:
jar -cf PageData.jar PageData.class
这里创建了一个名为
PageData.jar
的 JAR 文件,包含
PageData.class
文件。
2.
创建图标
:为应用程序创建一个 64x64 像素的图标,可以是 GIF 或 JPEG 格式。如果不想创建新图标,可以从指定网站下载
pagedataicon.gif
文件,并保存到与
PageData.jar
相同的文件夹中。
3.
创建 JNLP 文件
:JNLP 文件是一个 XML 格式的文件,用于指定应用程序的主类文件、JAR 存档等信息。以下是 PageData 应用的 JNLP 文件示例:
<?xml version=”1.0” encoding=”utf-8”?>
<!-- JNLP File for the PageData Application -->
<jnlp codebase=”http://www.cadenhead.org/book/java21pro/java” href=”PageData.jnlp”>
<information>
<title>PageData Application</title>
<vendor>Rogers Cadenhead</vendor>
<homepage href=”http://www.java21pro.com”/>
<icon href=”pagedataicon.gif”/>
<offline-allowed/>
</information>
<resources>
<j2se version=”1.4”/>
<jar href=”PageData.jar”/>
</resources>
<application-desc main-class=”PageData”/>
</jnlp>
在创建 JNLP 文件后,需要将第 4 行的
codebase
属性修改为存储应用程序 JAR 文件、图标文件和 JNLP 文件的 Web 服务器文件夹。然后将这三个文件上传到该文件夹,使用浏览器通过完整 Web 地址加载 JNLP 文件。如果 Web 服务器配置为支持 Java Web Start,应用程序将被加载并运行。
2.4 服务器对 Java Web Start 的支持
如果服务器不支持 Java Web Start,可能会直接显示 JNLP 文件的文本内容,而无法运行应用程序。为了让服务器识别 JNLP 文件并启动 Java 应用程序,需要设置 MIME 类型。在 Apache Web 服务器中,服务器管理员可以在
mime.types
或
.mime.types
文件中添加以下行:
application/x-java-jnlp-file JNLP
如果无法在自己的服务器上实现 Java Web Start,可以在指定的官方网站上测试项目。
2.5 JNLP 文件的其他元素
JNLP 格式还有其他元素可以影响 Java Web Start 的性能。例如,
security
元素可以用于运行具有不同安全权限的签名应用程序:
<security>
<all-permissions/>
</security>
description
元素可以为应用程序提供更多信息,有四种不同类型的描述:
-
kind=”one-line”
:简洁的单行描述,用于 Web Start 应用程序列表。
-
kind=”short”
:段落长度的描述,在有足够空间时显示。
-
kind=”tooltip”
:工具提示描述。
- 无
kind
属性:默认描述。
另外,
icon
元素可以指定应用程序加载时显示的图标和启动画面。
2.6 运行小程序
Java Web Start 不仅可以运行应用程序,还可以运行小程序。与浏览器运行小程序不同,Java Web Start 运行的小程序具有与应用程序相同的默认安全策略,并且在独立窗口中运行。要使用 Java Web Start 运行小程序,需要使用
applet-desc
元素代替
application-desc
元素。以下是一个运行
NewWatch
小程序的 JNLP 文件示例:
<?xml version=”1.0” encoding=”utf-8”?>
<!-- JNLP File for the NewWatch Applet -->
<jnlp codebase=”http://www.cadenhead.org/book/java21pro/java” href=”NewWatch.jnlp”>
<information>
<title>New Watch Applet</title>
<vendor>Rogers Cadenhead</vendor>
<homepage href=”http://www.java21pro.com”/>
<description kind=”one-line”>An applet that displays the current time.</description>
<offline-allowed/>
</information>
<resources>
<j2se version=”1.2+”/>
<jar href=”NewWatch.jar”/>
</resources>
<applet-desc name=”NewWatch applet” main-class=”NewWatch” documentBase=”http://www.cadenhead.org/book/java21pro” width=”345” height=”50”>
<param name=”background” value=”#996633”>
</applet-desc>
</jnlp>
通过以上步骤,我们可以将小程序转换为使用 Java Web Start 运行的形式,为用户提供更方便的使用体验。
总之,可访问性和 Java Web Start 技术为 Java 应用程序的开发和分发带来了新的可能性,使得软件更加易用和易于传播。开发者可以通过合理运用这些技术,提高软件的质量和用户满意度。
3. 可访问性与 Java Web Start 的综合应用及注意事项
在前面我们分别介绍了可访问性和 Java Web Start 技术,接下来我们深入探讨如何将这两者综合应用,以及在实际应用中需要注意的事项。
3.1 可访问性在 Java Web Start 应用中的体现
当使用 Java Web Start 来分发具有可访问性设计的应用程序时,可访问性的优势能够得到进一步的发挥。以 PageData 应用为例,它本身通过设置标签、助记符、工具提示等方式实现了良好的可访问性。当将其通过 Java Web Start 进行分发后,更多的用户可以方便地使用这个应用。
在 JNLP 文件中,虽然没有直接体现可访问性的相关代码,但应用程序本身的可访问性设计会随着程序的运行而展现出来。例如,用户使用屏幕阅读器等辅助技术时,能够清晰地获取到应用程序中各个组件的信息,如按钮的用途、文本字段的提示等。
3.2 综合应用的操作流程
以下是将具有可访问性的应用程序通过 Java Web Start 进行分发的详细操作流程:
1.
开发具有可访问性的应用程序
:
- 像 PageData 应用一样,使用 Swing 组件,为按钮设置助记符和工具提示,为文本字段关联标签。
- 确保应用程序的逻辑清晰,便于各种用户理解和操作。
2.
打包应用程序
:
- 使用
jar
命令将应用程序的类文件打包成 JAR 文件。例如:
jar -cf PageData.jar PageData.class
-
创建 JNLP 文件
:
- 编写 JNLP 文件,指定应用程序的主类、JAR 文件、图标等信息。示例如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for the PageData Application -->
<jnlp codebase="http://www.cadenhead.org/book/java21pro/java" href="PageData.jnlp">
<information>
<title>PageData Application</title>
<vendor>Rogers Cadenhead</vendor>
<homepage href="http://www.java21pro.com"/>
<icon href="pagedataicon.gif"/>
<offline-allowed/>
</information>
<resources>
<j2se version="1.4"/>
<jar href="PageData.jar"/>
</resources>
<application-desc main-class="PageData"/>
</jnlp>
-
上传文件到服务器
:
- 将 JAR 文件、图标文件和 JNLP 文件上传到 Web 服务器的指定文件夹。
-
配置服务器
:
-
如果服务器不支持 Java Web Start,需要设置 MIME 类型。在 Apache 服务器中,在
mime.types或.mime.types文件中添加:
-
如果服务器不支持 Java Web Start,需要设置 MIME 类型。在 Apache 服务器中,在
application/x-java-jnlp-file JNLP
-
测试应用程序
:
- 使用浏览器通过完整的 Web 地址加载 JNLP 文件,测试应用程序是否能够正常运行。
3.3 注意事项
在综合应用可访问性和 Java Web Start 技术时,有以下几点需要注意:
-
界面布局问题
:Java Web Start 应用程序在某些情况下可能会出现界面布局问题。例如,在 Windows 系统中,可能需要适当增加应用程序的高度,以确保文本字段能够正常显示内容。
-
安全问题
:默认情况下,Java Web Start 应用程序的功能会受到一定的限制,除非用户给予权限。如果应用程序的 JAR 文件进行了数字签名,可以使用
security
元素来移除这些安全限制。
-
兼容性问题
:不同版本的 Java 解释器可能会对应用程序的运行产生影响。在 JNLP 文件中,需要明确指定应用程序所支持的 Java 版本。
4. 总结与展望
通过本次对可访问性和 Java Web Start 技术的学习,我们了解到这两项技术对于 Java 应用程序的重要性。可访问性使得软件能够被更广泛的用户使用,包括残障人士,提高了软件的社会价值。而 Java Web Start 技术则为应用程序的分发提供了一种便捷的方式,用户可以通过点击网页链接轻松下载和运行应用程序。
在未来的 Java 开发中,可访问性和 Java Web Start 技术有望得到更广泛的应用。随着互联网的发展,越来越多的应用程序将通过网络进行分发,Java Web Start 技术的优势将更加明显。同时,社会对软件可访问性的要求也会越来越高,开发者需要更加注重软件的可访问性设计。
为了更好地应用这两项技术,开发者可以不断学习和研究相关的知识,关注技术的发展动态。同时,多进行实践,将理论知识应用到实际项目中,提高自己的开发能力。
| 技术 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 可访问性 | 提高软件的可用性,服务更多用户 | 开发成本相对较高 | 面向大众的软件,特别是需要考虑残障人士使用的软件 |
| Java Web Start | 方便应用程序的分发和更新,用户无需复杂操作 | 需要服务器支持,存在一定的安全限制 | 通过网络分发的 Java 应用程序 |
mermaid 流程图如下:
graph LR
A[开发具有可访问性的应用程序] --> B[打包应用程序]
B --> C[创建 JNLP 文件]
C --> D[上传文件到服务器]
D --> E[配置服务器]
E --> F[测试应用程序]
通过以上的学习和实践,我们可以更好地掌握可访问性和 Java Web Start 技术,为 Java 应用程序的开发和分发带来新的活力。
超级会员免费看
1697

被折叠的 条评论
为什么被折叠?



