SlideShare ist ein Scribd-Unternehmen logo
1 von 446
Downloaden Sie, um offline zu lesen
本书向读者展示如何使用 Java Applet、Java Servlet、Java Server Pages(JSP)、JavaBean
以及开放源代码的 Web 图表生成引擎——JFreeChart 和 Cewolf 来开发奇妙的 Web 动态图表
应用程序——以一种跨平台、小巧、结构清晰的模式在 Web 上生成动态图表。
    随着计算机网络及编程技术的发展,使得越来越多的应用程序被移植成以 Web 应用程序
(浏览器/服务器)的方式,工作在因特网/局域网环境之中。网络开发人员发现,某些传统
IDE 开发环境,例如:在 Dephi 和 VB 中可以轻而易举地实现的图形界面,而在 Web 程序中却
很难实现,其中一个典型的例子就是 Web 图表(Chart)的生成与处理。即使 Web 程序(ASP、
ASP.NET 等)能够处理一些图表,也基本是采用 ActiveX 或者 COM 组件的结构。这种方法有
三大弊端:
? 开发 ASP 比较简单,但开发 ActiveX 和 COM 却很难;
? 基于 ActiveX 和 COM 构架的 Web 应用程序只能用于微软 Windows 的 Web 服务器 IIS 环境下,
移植性差;
? 由于 ActiveX 和 COM 与 Windows 深度紧密结合,在带来强大功能的同时,也一并带来了
Windows 固有的缺陷——安全性和稳定性差。
PHP 可以用于 Web 图表处理,它具有跨平台、安全性能高、兼容性及扩展性强的优点,但也
有其固有的缺陷,具体表现为以下几点:
? 效率不高,基于解释型,而非编译型,这一点与 ASP 类似。ASP.NET 吸取了 JSP 的优点,
属于编译型,大大提高了运行速度和效率;
? 安装复杂,每一种扩展模块不完全是由 PHP 自身来完成。当图形需要 GD 库,使用类似的扩
展库时,安装和调试是 PHP 的一大问题;
? 因为是开发源代码产品,所以缺乏企业级的商业支持。
    JSP 的出现,使得上述弊端不复存在。随着 Java 对二维图形及三维图像的处理能力越来
越强大,利用 JSP 来简单、高效地开发一个 Web 图表应用程序已经不是一件难事了。为了展
示如何编写 Web 图表应用程序,本书中,我们不仅提供了多个 JSP 图表生成的实例,而且还
将从以下两个方面加以说明 Web 图表编程是如何实现的。
1.利用 Java 自身对图形的处理能力,由开发者编写代码来生成 Web 动态图表。将以大量的
例程,不同的方式(例如:Java Applet、Java Servlet、JSP、JavaBean)      ,从不同的角度来
展示如何编写 Web 图表的 Java 程序。
2. 借助第三方的图表生成引擎来完成图表,              主要利用一些 Java 开放源代码组织开发的作品,
例如:
? 由 www.jfree.org 推出的 JFreeChart;
? 由 cewolf.sourceforge.net 推出的 Cewolf。
    Cewolf 是基于 JFreeChart 的二次开发。    实质上,是基于 JFreeChart 的应用。JFreeChart
没有免费提供开发文档,只有英文版的相关资料,因此 JFreeChart 和 Cewolf 在国内的应用
受到了一定的限制。
    根据我们使用及研究 JFreeChart 和 Cewolf 的经验,将在本书中提供大量的例程和详尽
的讲解,帮助读者轻松地掌握上述两种非常优秀的、基于 Java 的 Web 图表生成引擎。相信阅
读本书,并加以必要的练习,读者将会发现,基于 JSP 的 Web 图表编程是可以轻松完成的。
本书结构及内容
    本书例程丰富、代码简洁、结构清晰、讲解准确、图文并茂。共分九章,各章具体内容
如下:
第 1 章 Java 概述
    本章主要概述 Java 历史及其发展、Java 开发环境的建立,以及编写一个简单的 Java 应
用程序。
第 2 章 Java Applet 与绘图基础
    本章简要介绍 Applet 绘图基础,例如:图形环境、图形对象、基本的字体及颜色控制,
以及如何使用 Applet 绘制一些基本的几何图形。通过本章的学习,读者将掌握基本的 Java
图像编程方法。
第 3 章 Java Applet 图表绘制实例
    本章综合利用绘制基本几何图形的方法来开发以下常见的图表:
? ·垂直柱状图
? ·饼图
    探讨如何以图表的方式生成以下内容:
? ·在 Web 动态图表中加载外部图像文件
? ·支票
? ·如何从 HTML 文档中获取参数生成动态图表
    通过本章的学习,读者将会理解任何复杂的图表都可以分解成一些基本的几何图形;通
过排列组合不同的外部图像文件,以及基本的几何图形,就可以生成复杂的图表。
第 4 章 JSP/Servlet 运行环境的搭建
    本章主要介绍 JSP Web 服务器的安装。在运行 JSP/Servlet 之前,首先需要安装 JSP/
Servlet 的运行环境,它就是我们平常所说的,支持 JSP/Servlet 的 Web 服务器(容器)        。
    目前有很多支持 JSP/Servlet 的 Web 服务器,我们先介绍两种免费的、高性能的、适合
中小企业 JSP/Servlet 的 Web 服务器——Tomcat 和 Resin,并将详细阐述 Tomcat 实现
JSP/Servlet 的运行机制。此外,介绍一种企业级的 J2EE 服务器——Weblogic,学习如何在
这些服务器中部署及发布基于 JSP/Servlet 的 Web 图表应用程序。
第 5 章 基于 Servlet 的 Web 图表编程
    本章讲述 Web 请求/响应机制(get 和 post)  、如何部署 Servlet、如何利用 Servlet 生
成 Web 动态图表,   并且提供了模拟网站投票统计、      生成登录验证码、    普通/3D 甘特图等 Servlet
实例。
第 6 章 JSP Web 图表编程基础
    本章讲述 JSP 绘图基础。 JSP 的环境下,
                       在         如何使用 Java.awt.Graphics 类的各种方法,
包括绘制直线、文本(字符串)          、矩形、椭圆和圆、圆弧、多边形、折线,以及如何加载外部
图像文件,等等。
在绘制基本几何图形的基础上,我们将以圆柱体和立方体为例,展示如何通过绘制多个多边
形并将其组合成复杂几何图形的方法;利用 Java.imageio 包中 ImageIO 类的支持,调用
ImageIO 来执行诸如加载图像,以及对图像进行编码输出等工作。
第 7 章 JSP 与 Java2D Web 图表编程
    本章阐述如何利用 Java2D API 对于高级二维图形的处理能力,例如:笔划属性的设 定、
图形填充、渐变色、图像的透明度、字体处理、图形边缘的反锯齿、图形对象的转换以及变
形,等等,利用 B/S 应用程序中生成 Web 图表的方法,并以二维及三维图表的形式,包括折
线图、水平直方图、垂直柱状图、堆栈图、饼图,以及二次曲线来进行讲解和说明。
    提供了一个绘制复杂图表的例程——股市大盘指数走势图。通过本章的学习,读者可以
不借助任何第三方的程序,编写生成各种风格、复杂的 Web 图表应用程序。
第 8 章 开放源代码与 Web 图表编程
    本章详细讲述了 JFreeChart 和 Cewolf 这两个 Web 图表生成引擎的安装、配置及使用方
法。提供了在 JFreeChart 和 Cewolf 的环境下生成以下类型图表的完整例程及讲解:
? 普通/3D 水平及垂直直方图、普通/3D 饼图、普通/3D 堆栈图
? 线段(曲线)图、区域图、时序图、蜡烛图、移动平均线图
? 罗盘图、温度计图、速度表图、信号图
? 甘特图、多轴图表、组合图表
    此外,还包括如何在 Cewolf 的环境中,创建自定义绘制属性的图表。
第 9 章 Web 图表生成引擎的设计思路与实现
    本章讨论如何开发一个图表生成引擎;             如何设计图表生成引擎         (封装成 JavaBean 的形式)
以达到高效、重复使用的目的。图表生成引擎的设计难点是什么?该如何处理?如何优化引
擎?我们将提供具体的实例加以讲解。通过本章的学习,读者将会感受到,图表引擎的设计
原来可以这么轻松地实现!
本书的适用对象
    本书适合从事 Java 及 Web 编程的开发人员, JSP/Servlet 应用程序中需要提供图表显
                                       在
示及处理功能的 JSP/Servlet 程序开发者,以及编程爱好者阅读。对于初学入门的应用开发
人员,可以作为自学的实践指导书;对于已经从事 Web 编程工作的人员,可以作为一本供随
时翻阅查询的案头参考书。
建议
    我们建议读者在学习期间避免使用可视化的开发工具,                     例如:  JBuilder、JCreator、KAWA、
Visual Cafe、Eclipse、IntelliJ IDEA、BEA WebLogic Workshop、Oracle JDeveloper 等,
所有工作都可以使用 JSP 服务器(Tomcat/Resin)+ WWW 浏览器(IE/Mozilla/Firefox)+文
本编辑器(EditPlus)来完成。附录中,我们向读者介绍了一种优秀的 Java IDE 开发工具—
—Gel。利用 Gel,可以方便地创建、编辑、编译及运行 Java/JSP/Servlet 应用程序。
    为了达到最佳的学习效果,我们建议读者在阅读本书的同时,亲自动手按照本书的示例
去操作。    所有的源程序都可以在 www.broadview.com.cn 网站上下载,            但建议读者最好对照源
程序自己动手录入一次,这样可以加深理解和记忆。
    因本书的例程非常丰富,为节省篇幅,故基本上不列出每个例程的完整清单。本书详尽
地讲解了每个源程序的设计思路、             运行机制及相对应的核心代码段。              建议读者在阅读本书时,
首先用 EditPlus 之类的文本编辑器来打开相应例程的源程序,                   其次阅读其完整的源程序,           最
后再阅读本书的讲解,相信这样会让读者取得事半功倍的效果。
致谢
    本书由钟京馗(City University of New York)执笔主编和最后定稿。唐桓(University
of Bridgeport)参与本书例程的编写与调试工作。
本书出版之际,特别鸣谢钟志祥、李美行、朱晓蕾、朱正才、胡元妹、黄桂玉、武冠军、唐
光富、彭燕给予的大力支持与协助。
    在编写本书的过程中,我们尽力保持内容的科学性、先进性和实用性,同时力求做到讲
解原理,深入浅出,语言通俗易懂。但鉴于作者学识有限,不足之处在所难免,见仁见智,
恳请广大读者指正。我们将在本书的再版中使其更臻完善。
                          钟京馗
                      2005 年 9 月于纽约
第 1 章  Java 概述  1 
1.1  Java 简介  1 
1.1.1  Java 发展简史  1 
1.1.2  Java 的体系  2 
1.1.3  Java 的优点  3 
1.2  Java 开发环境的搭建  4 
1.2.1  Java 运行环境的要求  4 
1.2.2  Java 的安装和配置  6 
1.3  Java/JSP 开发工具  8 
1.3.1  EditPlus 简介  9 
1.3.2  UltraEdit 简介  11 
1.3.3  其他 Java/JSP 开发工具  13 
1.4  第一个 Java 程序  15 
1.5  本章小结  17 
第 2 章  Java Applet 与绘图基础  18 
2.1  Java Applet 概述  18 
2.2  Java Applet 工作流程  20 
2.2.1  组件与容器  20 
2.2.2  Applet 的编译与执行  22 
2.2.3  包含 Applet 的 HTML 23 
2.3  绘制文本(字符串)  23 
2.4  绘制线段  29 
2.5  色彩管理  31 
2.5.1  色彩基础  31 
2.5.2  Java 的色彩管理  34 
2.6  字体控制  36 
2.7  绘制矩形  40 
2.7.1  绘制普通矩形  40 
2.7.2  绘制 3D 矩形  43 
2.8  绘制椭圆  46 
2.8.1  绘制普通(空心)椭圆  46 
2.8.2  绘制实心椭圆  48 
2.8.3  绘制 3D 椭圆  49 
2.8.4  绘制圆柱体  50 
2.9  绘制圆弧  54 
2.9.1  绘制普通(空心)圆弧  55 
2.9.2  绘制实心圆弧  56 
2.9.3  绘制 3D 圆弧  57 
2.10  绘制多边形  59 
2.10.1  绘制空心多边形  59 
2.10.2  绘制实心多边形  61 
2.10.3  绘制折线  61 
2.10.4  绘制三角形(箭头)  62 
2.10.5  绘制平行四边形及立方体  69
2.11  图像的载入与显示  78 
2.11.1  在 Applet 中加载和 
2.11.1  显示图像  78 
2.11.2  使用 MediaTracker 加载并 
2.11.2  显示图像  84 
2.11.3  使用双缓冲技术绘制图像  89 
2.12  本章小结  93 
第 3 章  Java Applet 图表绘制实例  94 
3.1  Java Applet 生成 Web 
3.1  动态图表  94 
3.1.1  垂直柱状图  95 
3.1.2  饼图  102 
3.2  Java Applet 生成单据  109 
3.2.1  带徽标的 Web 动态图表  110 
3.2.2  支票的生成  111 
3.3  从 HTML 文档获取参数 
3.3  生成动态图表  123 
3.3.1  传递参数的 HTML 文档  123 
3.3.2  获取参数并生成图表  124 
3.4  本章小结  126 
第 4 章  JSP/Servlet 运行环境的搭建  128 
4.1  Tomcat 的安装和配置  128 
4.1.1  Tomcat 的安装  129 
4.1.2  测试第一个 JSP 程序  132 
4.1.3  配置 Tomcat 132 
4.1.4  转换后的 JSP 页面文件  145 
4.2  Resin 的安装和配置  147 
4.2.1  Resin 的安装  147 
4.2.2  Resin 的配置  149 
4.3  BEA Weblogic 的安装和配置  150 
4.3.1  BEA Weblogic 的安装  150 
4.3.2  BEA Weblogic 的配置  152 
4.3.3  测试 BEA Weblogic 
4.3.3  的配置  155 
4.3.4  部署第一个 Web 
4.3.4  应用程序  156 
4.4  本章小结  157 
第 5 章 基于 Servlet 的 Web 图表编程  158 
5.1  Servlet 简介及其构架  158 
5.1.1  Servlet 的特点  158 
5.1.2  Servlet 的接口  159 
5.1.3  HttpServlet 类简介  160 
5.1.4  HttpServletRequest 接口  161 
5.1.5  HttpServletResponse 接口  162
5.2  Servlet 处理 HTTP get 请求  163 
5.3  Servlet 处理包含数据的 HTTP 
5.3  get 请求及解决中文乱码  177 
5.4  Servlet 处理 HTTP post 及包含 
5.4  数据的 post 请求  187 
5.5  Servlet 生成 Web 投票统计图  191 
5.6  Servlet 生成登录验证码  198 
5.6.1  Servlet 生成登录验证码 
5.6.1  实例 1 199 
5.6.2  Servlet 生成登录验证码 
5.6.2  实例 2 209 
5.7  Servlet 高级设置  214 
5.7.1  Servlet 初始化参数  214 
5.7.2  Servlet 加载优先级  216 
5.7.3  Servlet 映射  217 
5.8  Servlet 绘制甘特图  218 
5.9  Servlet 绘制 3D 甘特图  222 
5.10  本章小结  228 
第 6 章  JSP Web 图表编程基础  229 
6.1  JSP 概述  230 
6.1.1  JSP 运行机制  231 
6.1.2  JSP 的优点  233 
6.2  JSP 语法简介  234 
6.2.1  JSP 文件结构  234 
6.2.2  JSP 文件中的元素简介  240 
6.3  JSP 调用 Servlet 生成 
6.3  动态图表  257 
6.3.1  JSP 生成验证码  257 
6.3.2  JSP 生成甘特图  258 
6.3.3  JSP 其他相关知识  258 
6.4  JSP 生成基本动态图表  260 
6.4.1  JSP 绘制文本和线段  260 
6.4.2  JSP 与字体控制  266 
6.4.3  JSP 绘制矩形  273 
6.4.4  JSP 绘制椭圆  275 
6.4.5  JSP 绘制圆弧  276 
6.4.6  JSP 绘制多边形和折线  277 
6.4.7  JSP 绘制三角形  277 
6.4.8  JSP 绘制平行四边形和 
6.4.8  立方体  280 
6.4.9  JSP 加载并显示图像  281 
6.5  本章小结  282 
第 7 章  JSP 与 Java2D Web 图表编程  283 
7.1  Java2D 概述  283
7.2  Java AWT 与 Java2D 285 
7.3  Java2D 与填充属性  287 
7.3.1  设置填充属性  287 
7.3.2  填充属性的用法  287 
7.4  Java2D 与笔划属性  291 
7.4.1  线段端点的形状风格  292 
7.4.2  线段转折处的形状风格  292 
7.4.3  虚线风格  293 
7.4.4  BasicStroke 构造器  294 
7.4.5  Java2D Web 图表实例 
7.4.5  之折线图  294 
7.5  创建基本 Java2D 图形  309 
7.5.1  Java2D 图形(Shape) 
7.5.1  接口概述  309 
7.5.2  Point2D 310 
7.5.3  Line2D 311 
7.5.4  Rectangle2D 312 
7.5.5  RoundRectangle2D 314 
7.5.6  Java2D Web 图表实例之 
7.5.6  柱状图  315 
7.5.7  Ellipse2D 333 
7.5.8  Arc2D 334 
7.6  Java2D 实例饼图类图表  337 
7.6.1  普通饼图  338 
7.6.2  圆圈图  342 
7.6.3  3D 饼图  344 
7.7  图形重叠  346 
7.8  alpha 复合  348 
7.8.1  alpha 复合概述  348 
7.8.2  AlphaComposite 类的使用  350 
7.8.3  AlphaComposite 应用实例  352 
7.9  图形对象的转换  357 
7.9.1  图形对象转换(transformation) 
7.9.2  概述  357 
7.9.2  平移(translation)  359 
7.9.3  旋转(rotation)  360 
7.9.4  缩放(scale)  362 
7.9.5  扭曲(shear)  364 
7.10  图形渲染线索  366 
7.11  Java2D 与高级文本处理  368 
7.11.1  空心文本  368 
7.11.2  弯曲文本  369 
7.11.3  单行长文本自动分行  371 
7.12  Java2D 创建复杂图形  373
7.12.1  Area 374 
7.12.2  曲线  375 
7.12.3  通用路径  377 
7.13  Web 图表实例解析  379 
7.13.1  透明 3D 饼图  379 
7.13.2  股市指数走势图  381 
7.14  本章小结  391 
第 8 章 开放源代码作品与 Web 图表编程  392 
8.1  开放源代码作品简介  392 
8.2  JFreeChart 与 JSP 图表编程  394 
8.2.1  JFreeChart 简介  394 
8.2.2  JFreeChart 的安装及其 
8.2.2  核心类  395 
8.2.3  JFreeChart 生成直方图表  398 
8.2.4  JFreeChart 生成饼型图表  411 
8.2.5  JFreeChart 生成线段图表  416 
8.2.6  JFreeChart 生成区域图表  420 
8.2.7  JFreeChart 生成时序 
8.2.7  (Time Series)图表  424 
8.2.8  JFreeChart 生成甘特图表  430 
8.2.9  JFreeChart 生成多轴 
8.2.9  (Multiple Axis)图表  432 
8.2.10  JFreeChart 生成组合 
8.2.10  (Combined Axis)图表  435 
8.2.11  JFreeChart 生成其他类型 
8.2.11  的图表  441 
8.3  JFreeChart 与 Servlet 
8.3  图表编程  444 
8.3.1  简单的 Servlet 图表编程  444 
8.3.2  交互式 Servlet 图表编程  446 
8.4  Cewolf 与 JSP 图表编程  448 
8.4.1  Cewolf 简介  448 
8.4.2  Cewolf 的下载与安装  448 
8.4.3  Cewolf 生成直方图表  450 
8.4.4  Cewolf 生成基于 DefaultCategory 
8.4.4  Dataset 数据集的图表  454 
8.4.5  Cewolf 生成饼图  460 
8.4.6  Cewolf 生成基于 XYDataset 
8.4.6  数据集的图表  462 
8.4.7  Cewolf 生成基于 OHLCDataset 
8.4.7  数据集的图表  465 
8.4.8  Cewolf 生成甘特图表  466 
8.4.9  Cewolf 生成信号图表  467 
8.4.10  Cewolf 生成速度图表  468
8.4.11  Cewolf 生成 OverLay 类型 
8.4.11  的图表  468 
8.4.12  Cewolf 生成组合图表  470 
8.4.13  生成自定义风格的 
8.4.13  Cewolf 图表  472 
8.5  本章小结  473 
第 9 章  Web 图表生成引擎的设计思路与实现  475 
9.1  Web 动态图表生成引擎的 
9.1  设计思路  475 
9.2  Web 动态图表生成引擎的 
9.2  设计模型  480 
9.2.1  生成普通线段图的 
9.3.2  JavaBean 480 
9.2.2  生成 3D 线段图的 
9.3.2  JavaBean 483 
9.2.3  生成普通直方图的 
9.3.2  JavaBean 484 
9.2.4  生成 3D 直方图的 
9.3.2  JavaBean 487 
9.2.5  生成普通饼图的 
9.3.2  JavaBean 488 
9.2.6  生成 3D 饼图的 
9.3.2  JavaBean 490 
9.3  数据分离  491 
9.3.1  创建及调用 CategoryDataset 
9.3.2  类数据集对象  491 
9.3.2  创建及调用 PieDataset 类 
9.3.2  数据集对象  495 
9.4  引擎的优化概述  496 
9.5  本章小结  498 
附录  Gel 使用指南  499
第 1 章  Java 概述 


  Java 是美国 Sun 微系统公司(Sun  Microsystems,  Inc.)开发,近年来飞速发展的一项崭
新的计算机技术。 


1.1  Java 简介 
     Java 既是一种程序设计语言,也是一个完整的平台。作为一种程序语言,它简洁、面向
对象、   安全、   健壮,以及适用于 Internet 技术;而作为一个平台(JRE, 
                                             Java Runtime Environment, 
Java 运行环境或者说是 Java 虚拟机)对于符合 Sun 公司 Java 标准的应用程序,
                            ,                            都可以在 Java 
平台上正确运行,与程序运行的操作系统无关。 
     Java  为什么能够成为目前编写  Web  应用程序的首选设计语言呢?并且具备跨平台的能
力呢?我们先简单地了解一下 Java 的发展历史和体系结构。 


1.1.1  Java 发展简史 

     Java 起初并非叫做 Java,而是叫做 Oak。早期是为了嵌入式系统而设计的一项产品。20 
世纪 90 年代初期,  公司预测微处理器的发展将会对家用电器以及智能化电子消费设备起
                    Sun
到决定性的作用,于是,在 1990 年 12 月,Sun 公司就由 Patrick Naughton、Mike Sheridan 和 
James  Gosling 成立了一个叫做 Green  Team 的小组。其主要目标就是开发一种分布式系统架
构,使其能够在智能化电子消费设备作业平台上执行。例如,PDA、手机、信息家电(IA, 
Internet/Information  Appliance)等。一开始,准备采用 C++,但 C++太过复杂,安全性差。
最后,基于 C++开发出一种新的语言 Oak,Oak 是一种用于网络、精巧而安全的语言。 
     1992 年,Green Team 发表了一款名叫 Star Seven(*7)的机器,它有点像现在我们熟悉
的 PDA,但市面上的 PDA 几乎都不是它的对手,更不要说是早在 10 年前那个计算机还不普
及的时代了。Java 语言的前身 Oak 就这样诞生了,主要目的是用来编写在 Star Seven 上的应
用程序。为什么叫 Oak 呢?原因是 James  Gosling 办公室的窗外,正好有一棵橡树(Oak)              ,
就取了这个名字。至于为什么 Oak 又会改名为 Java 呢?这是因为在 Oak 注册商标时,发现
已经被另外一家公司使用了。那要取什么新名字呢?工程师们边喝着咖啡边讨论着,看着手
中的咖啡,突然灵机一动,就叫  Java  好了。就这样它就变成了大名鼎鼎、如日中天的  Java 
了。
     但是,Green Team 的项目发展却不尽如人意。智能化电子消费设备的市场发展远远低于 
Sun 的预期设想。         Sun 公司曾依此投标一个交互式电视项目,      结果被 SGI 打败了。    可怜的 Oak 
几乎无家可归,就在举步维艰,随时会被取消的时刻,情况却发生了巨大变化。1993 年,因
特网在美国开始大规模的发展,基于因特网的 WWW 也爆炸性地流行起来。Sun 公司发现, 
Green  Team 的项目研究成果——Java 似乎天生就是为因特网而诞生的,因为恰巧就是 Mark 
Andreessen 开发的 Mosaic 和 Netscape 启发了 Oak,他们利用 Java 开发了 HotJava 浏览器,得
到了 Sun 公司首席执行官 ScottMcNealy 的支持,触发了 Java 进军 Internet。
     于是,Java 第一次以 Applet 的形式在因特网上出现了。Applet 不但使 WWW 页面显示
静态的内容,而且可以显示动态的内容和动画。同时实行了本地计算机,从远程联网的服务
器上下载资料并正确地显示出来。这些技术在当时引起了巨大的震撼,促使 Java 在因特网上
得以飞速地发展。 
        1995 年 5 月 23 日,  在 SunWorld’95 上正式发布 Java 和 HotJava 浏览器。 
                        Sun


1.1.2  Java 的体系 

  Java 发展到今天,已从编程语言发展成为全球第一大通用开发平台。Java 技术已被计算
机行业主要公司所采纳。   1999 年,  公司推出了以 Java2 平台为核心的 J2EE、 
                     Sun                        J2SE 和 J2ME 
三大平台。随着三大平台的迅速推进,全球形成了一股巨大的 Java 应用浪潮。 

   1.Java 2 Platform, Micro Edition(J2ME) 
  Java  2 平台微型版。Sun 公司将 J2ME 定义为“一种以广泛的消费性产品为目标、高度
优化的 Java 运行环境”自 1999 年 6 月在 JavaOne Developer Conference 上声明之后, 
               。                                               J2ME 
进入了小型设备开发的行列。      通过 Java 的特性,  遵循 J2ME 规范开发的 Java 程序可以运行在
各种不同的小型设备上。 

   2.Java 2 Platform, Standard Edition(J2SE) 
  Java 2 平台标准版,适用于桌面系统应用程序的开发。本书例程就是利用 J2SE 5.0 版的
相关图形 API 包来开发的。 

   3.Java 2 Platform, Enterprise Edition(J2EE) 
    J2EE 是一种利用 Java 2 平台来简化企业解决方案的开发、                部署和管理等相关复杂问题的
体系结构。J2EE 技术的核心就是 Java 平台或 Java 2 平台的标准版,J2EE 不仅巩固了标准版
的许多优点,例如:        “一次编写、随处运行”的特性、方便存取数据库的 JDBC API、CORBA 
技术,以及能够在  Internet  应用中保护数据的安全模式等,同时还提供了对 EJB(Enterprise 
JavaBeans)、Java Servlets API、JSP(Java Server Pages)
                                                  ,以及 XML 技术的全面支持。
    本书第 4 章,阐述了如何将我们开发的 JSP 图表应用程序,在 J2EE 平台上进行部署和
管理。 


1.1.3  Java 的优点 

  Java 是一种面向对象、分布式、解释、健壮、安全、可移植、性能优异,以及多线程的
语言。下面简单介绍其中的几个优点。 

   1.Write Once, Run Anywhere 
  “一次编写,    随处运行” 这是程序设计师们喜爱 Java 的原因之一,
                 。                      核心就是 JVM(Java 
虚拟机)技术。
  编写好一个 Java 程序, 首先,要通过一段翻译程序,  编译成一种叫做字节码的中间代码。
然后经 Java  平台的解释器,翻译成机器语言来执行——平台的核心叫做 JVM。Java  的编译
过程与其他语言不同。例如,C++在编译的时候,是与机器的硬件平台信息密不可分的。
编译程序通过查表将所有指令操作数和操作码等,转换成内存的偏移量,即程序运行时的
内存分配方式,以保证程序运行。而 Java 却是将指令转换成为一种扩展名为 class 的文件,
这种文件不包含硬件的信息。只要安装了 JVM,创立内存布局后,通过查表来确定一条指
令所在的地址,这就保证了 Java 的可移植性和安全性。
  上述 Java 程序的编译和运行流程,如图 1.1 所示。
Interpreter 编译器   ①:编译
MyApp.java 
                                         ②:运行
 源文件              Ø   装载类
       ①          Ø   生成字节码
                  Ø   及时编译
                  Ø   解释执行 
                               ②


        Java                 Java           Java 
        应用                  应用             应用
        程序                  程序             程序 
       JVM                  JVM            JVM 
      (J2SE)               (J2SE)        (J2ME) 
    Unix/Linux           MS Windows      Palm OS 

           图 1.1  Java 的编译和运行流程 
2.简单
  纯粹的面向对象,加上数量巨大的类所提供的方法(函数)库的支持,使得利用 Java 开
发各种应用程序,可以说是易如反掌。此外,在程序除错、修改、升级和增加新功能等方面,
因其面向对象的特性,使得这些维护也变得非常容易。 

   3.网络功能 
  Java 可以说是借助因特网而重获新生的,自然具备编写网络功能的程序。不论是一般因
特网/局域网的程序,如 Socket、Email、基于 Web  服务器的 Servlet、JSP 程序,甚至连分
布式网络程序,如 CORBA、RMI 等的支持也是非常丰富的,使用起来也很方便。 

   4.资源回收处理(Garbage Collection) 
  Garbage  Collection 是由 JVM 对内存实行动态管理的。程序需要多少内存、哪些程序的
内存已经不使用了,需要释放归还给系统,这些烦琐且危险的操作全部交由  JVM  去管理。
让我们能够更专心地编写程序,而不需要担心内存的问题。内存的统一管理,对于跨平台也
有相当大的帮助。 

   5.异常处理(Exception)
  为了使 Java 程式更稳定、更安全,Java 引入了异常处理机制。能够在程序中产生异常情
况的地方,执行相对应的处理,不至于因突发或意外的错误造成执行中断或是死机。通过这
种异常处理,不仅能够清晰地掌握整个程序执行的流程,也使得程序的设计更为严谨。 


1.2  Java 开发环境的搭建
    现在我们开始搭建 Java 开发环境。本章仅涉及 J2SDK 开发环境的安装与调试,并不涉
及 JSP 及 J2EE 服务器的安装与调试,这部分内容将在第 4 章进行说明。 


1.2.1  Java 运行环境的要求

   首先,需要了解 Java 对计算机主要硬件要求的最低配置,如表 1.1 所示。该表右边部分
为笔者写作本书时所使用的计算机配置。因为涉及大量在计算机内存中进行绘制各种图表的
运算与操作,建议使用较高配置的计算机以及尽可能多的内存,以便流畅地运行本书中的程
序。

                            表 1.1  Java 的计算机硬件配置

  硬     件                 最低要求                                    笔者的配置 

 CPU         Intel 或者兼容微处理器,奔腾 166MHz 及其以上          AMD Athlon 3200+ 

             最低 32MB,可以运行图形界面的 Java Application;    512 MB DDR,Kingston 内存

 内存         最低 48MB,可以运行 Java Applet;内存不足,将会导      (如果读者希望把本书中的例程运行在 J2EE 的

            致系统(尤其是服务器)的性能大幅下降                     服务器,如 WebLogic,最好不低于 256 MB)

 硬盘          242 MB                                 80 GB 

 图形显示卡       无要求                                    Nvidia Ti 4200 64 MB DDR 

 网卡          普通网卡                                   3Com OfficeConnect 10/100 兆位网卡


   其他部件,如图形显示卡、光驱及显示器等,Java 并没有特别的要求。因为本书涉及图
形的实时生成, Java 的图形生成是通过图形显示卡调用 OpenGL 功能来加速图像的渲染和
          而
处理的。因此,如果系统拥有一块高质量的图形显示卡,将会大大地提高系统的性能。目前
市面上的图形显示卡,无论是在计算机主板上集成的显卡,还是普通的独立图形显示卡,都
具有强大的图形处理功能,足以满足流畅地运行本书中的所有例程。 
  Java 具有跨平台的特点,支持所有的主流操作系统,如下所示。 

  1.微软公司  Windows 系列
  Ø  Windows 98 / Me 
  Ø  Windows NT 
  Ø  Windows 2000 / Windows 2000 Server 
  Ø  Windows XP 
  Ø  Windows 2003 Server 

  2.UNIX 系列
  Ø  AIX, 
         IBM 的 UNIX, 是根据 SVR2 以及一部分 BSD 延伸而来, 加上各种硬件的支持。
     具备特有的系统管理功能(SMIT,系统管理接口工具)          。
                           :基于 4.3BSD,包含许多来自 System  V 的东西。Sun 
  Ø  SunOS(680x0,Sparc,i386)
     公司开发的 UNIX 操作系统,该系统对 UNIX 的贡献是:NFS,OpenLook GUI 标准,
     现演变为 Solaris。
  Ø  HP­UX(HP) :惠普公司的 UNIX。
  Ø  SCO UNIX。 

  3.类 UNIX 系列
  Ø  Linux:包括各种版本的 Linux,如 RedHat、Turbo 和 Mandrake Linux。
  Ø  FreeBSD:由美国加州大学伯克利分校计算机系统研究小组设计和维护。
4.其他操作系统
  Ø  Mac OS:苹果电脑公司推出的操作系统,主要用于 Power PC。
  上述操作系统都可以安装 Java。   笔者的操作系统是微软 Windows XP SP2。本书的所有例
程都是在 Windows XP 环境下进行编写和调试的。 


1.2.2  Java 的安装和配置

     本书采用 Sun 公司发布的最新版本,也是近年来 Java 最重要的一个升级版本——Java  2 
Platform Standard Edition 5.0,即 J2SE 5.0 作为我们的 Java 开发平台。至于 J2SE 5.0 具备哪些
新的功能和特性,请读者自行查阅相关资料。本书将尽量使用 J2SE 5.0 中的新特性来增强代
码的性能,如 Image I/O、Java 2D 等,具体将在其他章节中说明。 
     J2SE 5.0 的下载地址:http://java.sun.com/j2se/1.5.0/download.jsp。双击下载文件:jdk­1_ 
5_0­windows­i586.exe 就开始了 J2SE 5.0 开发环境的安装过程,如图 1.2 所示。




                           默认




                    图 1.2    Java 的安装过程者一:改变默认的安装路径

     安装过程如下:
     (1)   安装程序经过自解压后,     就会出现安装协议的对话框, 【I accept the terms in the 
                                        选择
license agreement】并单击【Next】按钮;
     (2)在出现选择安装路径的对话框时,我们改变 J2SE  5.0 的默认安装路径。单击右边
的【Change…】按钮,在出现的路径修改对话框中,输入“c:jdk1.5.0”后退回到先前的对话
框;
     (3)单击【Next】按钮,继续剩余部分的安装。接着 J2SE 5.0 会提示 Java 运行环境(即 
JRE 5.0)的安装路径,这里不做任何的改变,采用其默认设置。
     然后,连续单击【Next】按钮直到完成安装。最后系统会提示重新启动计算机,再重新
启动计算机,需要对运行 Java 的环境变量进行设置。这是非常重要的一个步骤,如果没有设
置成功,在运行 Java 时会出现错误。
     环境变量的设置,如图 1.3、图 1.4 所示。
图 1.3    Java 的安装过程之二:环境参数的设置

  (1)进入【控制面板】,单击【系统】   ,在出现的【系统属性】对话框中,单击【高级】
选项。
  (2)单击【环境变量】按钮。
  (3)在环境变量对话框中,单击位于【系统变量】组中的【新建】按钮。
  (4)新建一个系统变量,  “变量名”为 JAVA_HOME,“变量值”为 C:JDK1.5.0,然后
单击【确定】按钮,如图 1.4 所示。这个 JAVA_HOME 的值就是 J2SE 5.0 的安装路径。




                   图 1.4    Java 的安装过程之三:环境参数的设置
   (5)  重复第 4 步, “变量名”
                 在     中输入“CLASSPATH” 在
                                     , “变量值”中输入           “. 
%JAVA _HOME%lib”。注意,这里的“.”是要求 JAVA 编译器在查找 JAVA class 文件时,首
先从当前目录开始。
   (6)最后是修改系统变量“PATH”的值, PATH”的新值是在原有值前面加上
                                “
“%JAVA_HOME%bin;”。

  提示:在 Java  1.2 版以后,不再需要 CLASSPATH  来设置系统类的路径。CLASSPATH 
是为了设置用户编写的类或者第三方开发的类库而设置的。

  现在,为确保系统环境变量生效,重新启动计算机。重启之后,测试 J2SE 5.0 的安装与
环境变量设置是否正确。单击【开始】→【所有程序】→【附件】→【命令提示符】     ,启动命
令提示符后,在该窗口中输入如下命令:
      echo %java_home% 
      echo %classpath% 
      echo %path%
java –version

    在笔者本机上,得到如图 1.5 所示的结果。




                        图 1.5  测试 Java 运行环境系统参数的设置

    如果读者得到如图 1.5 一样的结果,就说明最新版的 Java 开发环境已经安装成功。

   提示:读者计算机中“Path”值可能同笔者计算机的值不一样,但其中一定要包含
“C:jdk1.5.0bin”的内容。 


1.3  Java/JSP 开发工具
     为了获得 Java 图表编程学习的最佳效果,            本书所有源程序都没有使用任何一种可视化的 
Java  开发环境来进行开发。建议读者在学习期间不要使用可视化的开发工具,如  JBuilder、 
JCreator、KAWA、Visual  Cafe、Eclipse、IntelliJ  IDEA、BEA  WebLogic  Workshop、Oracle 
JDeveloper  等。本书所有的操作,都可以用  JSP  服务器(Tomcat/Resin)+WWW  浏览器
(IE/Mozilla/Firefox)+文本编辑器(EditPlus)来轻松完成。这样,我们才可以深刻地理解
系统的运行机制。等到读者对此非常熟悉的时候,再使用可视化开发工具进行开发,定会达
到事半功倍的效果。此外,在本书的附录中,我们将向读者介绍一款优秀的 Java IDE 开发工
具——Gel。利用 Gel,可以方便地创建、编辑、编译及运行 Java/JSP/Servlet 应用程序。建议
读者循序渐进地学习之后,再来学习 Gel,相信一定会喜欢上这款精巧而强大的 Java 开发环
境。
     基于文本编辑器的 Java/JSP 开发工具有很多种,如记事本、UltraEdit、EditPlus 等。但最
简单及成本最低廉的非  Windows  自带的记事本(NotePad)莫属了。可以直接使用记事本进
行 Java/JSP 的程序设计,     它具有简单、方便的特点。             但其毕竟不是为程序员准备的开发工具,
因此,并不适用于程序设计。
     现在,向读者推荐一款韩国的文本编辑器——EditPlus 作为我们的 Java 及 JSP 编辑器。 


1.3.1  EditPlus 简介 

     EditPlus  是由韩国人编写的一款共享软件,官方网址是  www.editplus.com。最新版本是 
EditPlus 2.12。EditPlus 是功能全面的文本、HTML、程序源代码编辑器。主要特点如下:
     (1)默认支持  HTML、CSS、PHP、ASP、Perl、C/C++、Java、JavaScript  和  VBScript 
的语法高亮显示,通过定制语法文件,可以扩展到其他程序语言。
     (2)EditPlus 提供了与 Internet 的无缝连接,可以在 EditPlus 的工作区域中打开 Intelnet 
浏览窗口。
(3)提供了多工作窗口。不用切换到桌面,便可在工作区域中打开多个文档。
     (4)正确地配置 Java 的编译器“Javac”以及解释器“Java”后,使用 EditPlus 的菜单
可以直接编译执行 Java 程序。
     所谓的文本编辑器,最终还是要归结在文本编辑上。EditPlus  提供了比普通编辑器更加
强大的编辑功能。首先可以无限制地 Undo,其次具有更强大的删除功能,EditPlus 不仅可以
删除一个字,而且还可以删除选择部分、删除整个行等。提供了更强大的复制功能,可以复
制整个行,如单击【Edit】菜单,选择【Duplicate line】命令,即可实现此功能。这些大大地
超越了记事本的功能。 
     EditPlus 查找/替换功能也是一流的。不但可以进行一般的查找和替换,而且支持以正则
表达式的方式进行查找与替换,               甚至可以在磁盘某一目录的所有文件中,       进行字符串的查找。
比如说,笔者要查找 D:webchart 目录(包括其子目录)下,所有的 jsp 文件中,哪些文件包
含了字符串:       “charset=GB2312”,我们就可以单击菜单栏上的【Search】  ,选择【Find in Files】
命令。如图 1.6 所示,在出现的查找对话框中,分别填入以下内容:
     Ø【Find what】填入“charset=GB2312”,表示要查找的内容。
     Ø【File  type】填入“*.jsp”  ,表示要查找所有扩展名为  jsp 的文件,如果这一栏不输入
        任何条件,则表示在所有的文件中查找,而忽略文件的格式。
     Ø【Folder】填入“d:webchart”   ,表示希望查找文件位于 d:webchart 这个目录下。
     Ø 如果要查找  d:webchart  及其子目录下的所有  jsp  文件,就需要选中该对话框中的
        “include subfolders”选项。
     填好上述栏目后,单击该对话框中的【Find】按钮,就可以在  EditPlus  下方的输入输出
窗口中,得到查找的结果了。在输出窗口中,会提供一个被查找到的匹配文件的清单。在此
窗口的左侧,指出与被查找的字符串“charset=GB2312”相匹配文件的所在目录以及文件名,
然后给出字符串在该文件中出现的位置,该位置用行列坐标表示。在输出窗口的最底部, 
EditPlus 会提供一个统计结果——查找到的匹配的文件总数。




                      图 1.6    EditPlus 的 Find in Files 功能

  双击查找结果清单中出现的任一文件名,EditPlus  会在主窗口中显示出该文件的内容,
并将鼠标指针定位到被查找的字符串第一次出现的位置。
  该功能在大量文件中进行查找时,提供了强大的支持。
  前面谈到,设置好 Java 的编译器“Javac”和解释器“Java”后,通过 EditPlus 的菜单可
以直接编译执行 Java 程序。现在就来看看如何在 EditPlus 中设置。单击菜单栏中的【Tools】
→【Configure User Tools】→【Preferences】→【User tools】
                                                 ,如图 1.7 所示。
运行 Java 的配置




                  图 1.7    EditPlus 设置编译与运行 Java 程序的功能

     Ø【Add Tool】     :表示新增一个用户自定义工具。
     Ø【Program】     :表示该工具与程序有关。
     Ø【Menu text】    :表示要求为添加的工具命名。这里填入:编译 JAVA。
     Ø【Command】      :表示该工具运行时,所调用的可执行程序。Java 中的编译命令是 javac,
       所以这里选择 Java 安装目录中 bin 子目录中的 javac.exe 程序。
     Ø【Argument】     :表示执行  javac.exe  程序时,所需要的参数。单击旁边的带有向下三角
       形的按钮来选择“$(FilePath)         ”即可。
     Ø 【Initial  directory】:选择初始化目录。单击旁边的带有向下三角形的按钮来选择“$ 
       (FileDir)   ”即可。
     Ø【Capture output】    :选择捕获屏幕输出。
     通过 EditPlus 来编译 Java 程序完成。现在继续增加一个新的工具,设置通过 EditPlus 来
运行编译成功的 Java  程序。方法同前面讲述的设置编译 Java  程序的过程基本相同。按照图 
1.7 右下方所示的“运行 Java 的配置”内容,进行设定即可。
     正确设置后,无论在 EditPlus 编译还是运行 Java 程序的时候,EditPlus 的输出窗口中都
会显示出相应的编译和运行结果。
     关于 EditPlus 就简要介绍到这里。 


1.3.2  UltraEdit 简介 

     UltraEdit 是共享软件,官方网址是 www.ultraedit.com,最新版本是 v11.00a。与 EditPlus 
类似,UltraEdit  是一款功能强大的文本、HTML、程序源代码编辑器。作为源代码编辑器,
其默认配置可以对 C/C++、VB、HTML、Java 和 Perl 进行语法高亮显示。设计 Java 程序也
很方便,具有复制、粘贴、剪切、查找、替换、格式控制等编辑功能。 
     UltraEdit 同样可以在【Advanced】菜单的【Tool Configuration】菜单项配置 Java 编译器 
Javac 和解释器 Java,直接编译运行 Java 程序。 
     UltraEdit 设置 Java 编译器“Javac”的方法如图 1.8 所示。
图 1.8    UltraEdit 设置编译 Java 程序的功能

    Ø【Command  Line】   :表示命名行的执行方式。n%表示 Java 源程序的文件名,%e 表示 
       Java 源程序的扩展名。因为已经正确设置了 Java 的运行路径,所以使用 javac 就可以
       了,否则就要用 C:jdk1.5.0binjavac.exe。
    Ø【Working Directory】 :表示工作目录。%p 表示工作目录就是当前目录。
    Ø【Menu Item Name】   :要求给添加的工具命名。填入:编译 JAVA。
    Ø【Save Active File】:表示该工具运行之前,首先保存当前 Java 源程序。
    Ø【Output to List Box】:表示将结果输出到列表框中。
    Ø【Capture Output】 :选择捕获屏幕输出。
    Ø【Insert】:Java 编译的工具菜单就做好了。
    同理,设置 Java 解释器“Java”的方法如图 1.9 所示。与前面的步骤类似,只需要更改
第一和第三个步骤即可。           【Command Line】输入“java %n”【Menu Item Name】输入“运行 
                                               ,
Java”。
    关于 UltraEdit 就简单介绍到这里。
图 1.9    UltraEdit 设置运行 Java 程序的功能 


1.3.3  其他 Java/JSP 开发工具

  下面向读者简要介绍两个开放源代码的作品 Eclipse 和 Gel,虽然本书并不使用这两种开
发工具,但笔者觉得有必要向读者介绍一下,目前国外非常流行的 Java IDE 开发工具。 

   1.Eclipse 简介 
     Eclipse 是一个开放源代码的项目,       可以在 www.eclipse.org 免费下载 Eclipse 的最新版本。
一般 Eclipse 提供几种下载版本:Release、Stable Build、Integration Build 和 Nightly Build。建
议下载 Release 或 Stable 版本。Eclipse 本身是用 Java 语言编写的,但下载的压缩包中并不包
含 Java 运行环境,需要用户自行安装 JRE,并且需要在操作系统的环境变量中,指明 JRE 中 
bin 的路径。如果已经安装了 JDK,就不用安装 JRE 了。
     安装 Eclipse 的步骤非常简单,只需将下载的压缩包按原路径直接解压即可。注意,如果
要更新版本,请先删除旧版本重新安装,不能直接解压到原来的路径覆盖旧版本。解压缩之
后,可以到相应的安装路径去找 Eclipse.exe 运行。如果下载的是 Release 或 Stable 版本,并
且 JRE 环境安装正确无误,         一般来说不会有什么问题,         在闪现一个很酷的月蚀图片后,            Eclipse 
会显示它的默认界面。 
     Eclipse 的界面有点像 JBilder,实际操作进程中会发现它更像 IVJ。毕竟开发 Eclipse 的主导
是开发  IVJ  的原班人马(可参考  www.oti.com)    。值得一提的是,Eclipse 项目的参与者除了  IBM 
以外,还有 Borland、Rational Software、RedHat、Merant,以及 BEA 等一大批业界的佼佼者,为 
Eclipse 的未来奠定了良好的基础。 
     Eclipse 不仅可以开发 Java 应用程序,还可以安装 Lomboz 插件,并整合 Tomcat 以实现
对 JSP 以及 Java Servlets 的开发。
     本书不在这里讨论 Eclipse 的下载、安装、使用、开发、各种插件的安装和使用,以及与 
JBoss、Tomcat、WebLogic 等 JSP 或者 J2EE 服务器的整合。有兴趣的读者,请自行查阅相关
资料。

   2.Gel 简介 
   Gel  是由  Gerald  Nunn  发布的一款  Java  IDE  开发工具。Gel  的官方主页是  http:// 
memescape.co.uk/gexperts/index.html。Gel 是完全免费的,读者可到该网站下载。在本书写作
时,Gel 的最新版本是 RC39。目前该 IDE 工具,在国外众多的 Java、JSP 及 J2EE 程序员中
引起了极大的反响,但国内很少有人使用这款优秀的 Java IDE。 
  Gel 的运行环境如下:
  Ø  Windows 95/98/ME/2000/XP 
  Ø  Internet Explorer 4+ 
  Ø  JDK 1.1+ 
  Gel 的特点如下:
  (1)编辑器(Editor)
  Ø 支持对  Java、JSP、HTML、XML、C、C++、Perl、Python,以及更多编程语言的语
     法高亮显示。
  Ø 无限制地取消及恢复功能。
  Ø 整段代码的减少缩进量与增加缩进量。
  Ø 高亮显示配对的大括号。
  Ø 实时地拼写检查。
  Ø 可以显示控制字符。
  Ø 整合的源代码管理及控制,             支持 CVS、VSS、Clearcase、Perforce、QVCS、CS­RCS  以
     及更多的格式。
  Ø 正则表达式搜索。
  Ø 文件查找。
  Ø 将被选择代码完整地输出为 HTML 及 RTF 文件。
  Ø 保持本地程序的更新历史,易于在需要的时候恢复原状。
  (2)代码援助(Code Assistants)
  Ø 自动完成 Java 和 JSP 的编码。
  Ø  Java 和 JSP 的参数提示。
  Ø  Java 和 JSP 的标识符提示。
  Ø 查找声明,并快速跳转到声明所属的变量、方法或类。
  Ø 类浏览器。
  (3)项目管理(Project Management)
  Ø 智能文件夹,当系统文件发生改变的时候,自动同步更新。
  Ø 可以运行 Applications、Applets 以及应用服务器。
  (4)J2EE 
  Ø 直接预览 Servlets 及 JSP。
  Ø 自动完成 JSP 标签,支持 HTML 及自定义 JSP 标签。
  (5)其他
  Ø 支持集成 ANT。
  Ø 支持集成 JUnit。
  Ø 定制工具栏及快捷方式。
  Ø 支持创建自定义工具。
  Ø  Javadoc 浏览器。
  总的来说,Gel 虽然小巧,但速度奇快,更重要的是它拥有许多大型 Java IDE 的完整功
能。本书附录,将详细介绍 Gel 的设置及如何利用 Gel 来开发 JSP 程序。 


1.4  第一个 Java 程序
   前面我们讲解了 J2SE 5.0 的安装及环境变量的设置,现在我们就编写一个很简单的 Java
应用程序 Application 来结束本章的学习。
  在 EditPlus 或 UltraEdit 中输入如下代码(chap01Fig1.4WelcomeJavaChart.java):
       1: // Fig. 1.4: WelcomeJavaChart.java 
       2: // 第一个 Java 程序
       3: 
       4: public class WelcomeJavaChart{ 
       5:   // Java 主程序入口
       6:  public static void main(String args[]){ 
       7: System.out.println("**************************************"); 
       8:     System.out.println("欢迎来到<<精通 Java Web 动态图表编程>>的世界! "); 
       9: System.out.println("**************************************"); 
       10: 
       11:   } //主程序结束
       12: 
       13: } // end class WelcomeJavaChart

  该源程序仅仅在命令窗口显示三条文本。可以用传统的方法,在  DOS  下对该文件进行
编译及运行,也可以在 EditPlus 及 UltraEdit 中进行。
  将 WelcomeJavaChart.java 拷贝到 D:webchartchap01Fig1.4 子目录下,运行如下命令:
       D:webchartchap01Fig1.4>javac WelcomeJavaChart.java 
       D:webchartchap01Fig1.4>java WelcomeJavaChart

  编译及运行结果如图 1.10 所示。
  在 UltraEdit 中,编译和运行的方法是运行【Advanced】→【编译 JAVA】→【运行 JAVA】
工具,如果全部设置正确,就可以看到如图 1.11 所示的结果。




                      图 1.10    WelcomeJavaChart.java 的运行结果
图 1.11    UltraEdit 下 WelcomeJavaChart.java 的运行效果

  在 EditPlus 中,编译和运行的方法是运行【Tools】→【编译 JAVA】→【运行 JAVA】工
具,如果全部设置正确,就可以看到如图 1.12 所示的结果。
图 1.12    EditPlus 下的 WelcomeJavaChart.java 的运行结果 



1.5  本章小结
    本章主要介绍 Java 的历史及其运行机制、技术特点,讲解了各种 Java 开发环境的搭建,
包括 JDK 的下载、安装和环境变量的设置,在 EditPlus 和 UltraEdit 中如何设置编译及运行。
此外,简要介绍了两款目前国外流行的 Java IDE 开发环境:Eclipse 和 Gel。最后用一个简单
的 Java Application 来测试搭建的 Java 开发环境是否成功。
    只有在正确搭建  Java  开发环境的基础上,才能顺利地搭建  JSP  服务器。下面学习  Java 
Applet 的编写和调试,让我们一起进入 Web 图表编程的精彩世界!




              第 2 章  Java Applet 与绘图基础 


  Java 最初在因特网上流行,很大程度上归功于 Java Applet。Java 对图形处理的应用最早
就是从 Applet 开始的,对于希望掌握 Web 动态图表编程的读者来说,从 Applet 着手学习是
一个很好的途径。理解 Applet 的绘图基础,就可以顺利地过渡到如何运用 JSP 来进行图表的
绘制。 


2.1    Java Applet 概述 
  Java 共有两种类型的程序。一种称为 Java  Application,如第 1 章 1.4 节所示的 Welcome
JSPChart.java。本章介绍另外一种 Java 程序,这类程序称为 Java Applet。Java Applet 是一种
可以嵌入 HTML 文档(即 Web 页)中并可以被执行的 Java 程序。支持 Java 的浏览器,在浏
览一个包含有 Java Applet 的 Web 页面时,该 Applet 就被下载到该浏览器中,并被 JVM 解释
执行。
    目前,支持 Java2 的浏览器有:Mozilla、Netscape7 及其以上版本、Opera 和 FireFox。微
软的 Internet  Explorer 或者早期的 Netscape 版本,需要安装 Java 的插件(Plug­in)才可以正
常浏览 Java Applet 的 Web 页面。

  提示:如果读者的计算机中已经安装了 J2SE  5.0 开发环境,那么 IE 就不需要再安装插
件。该插件是作为 J2SE 5.0 的一部分(JRE 5.0)安装在浏览器上的。

    我们先来看 J2SE  5.0 中提供的一些 Applet 范例,展示了 Applet 的强大功能。其中每个 
Applet 还提供了源代码。通过阅读这些源代码,可以了解 Java 最新的、令人激动的新特性及
其用法。 
    J2SE  5.0 提供的范例位于 J2SE  5.0 安装目录中的 demo 子目录下。在 MS  Windows 中,
该范例的默认安装位置是:C:jdk1.5.0demoapplets;在 Unix/Linux/Mac  OS 中,该范例的默
认安装位置是:/usr/local/jdk1.5.0/demo/applets。
    在 applets 子目录下又包含了一些子目录,每一个子目录对应着一个相应的 Java Applet,
每个 Applet 展示了不同的功能。表 2.1 列出了这些范例及其功能。


                             表 2.1    applets 目录中的范例
             范     例                             说   明 

 Animator               演示了四种不同类型的动画 

 ArcTest                演示了圆弧的绘制,可以与该 Applet 交互并改变圆弧的显示属性 

 BarChart               演示了一个简单的条形图 

 Blink                  演示了以不同颜色显示并闪烁的文本 

 CardTest               演示了几个 GUI 的部件及布局方式 

 Clock                  演示了一个可以显示当前日期和时间的时钟 

                        演示了用图形抖动(dithering)技术进行图形绘制,该技术实现的是从一种颜色逐渐转
 DitherTest 
                       变成另一种颜色(渐变色) 

 DrawTest               演示了使用鼠标在 applet 上,用不同的颜色绘制线段和点 

 Fractal                演示了绘制一个不规则图形 

 GraphicsTest           绘制不同的图形,以演示 Java 对图形的处理能力 

                        绘制一个通过直线连接,由许多个节点(用矩形表示)组成的图形。可以拖动其中一个
 GraphLayout 
                       节点,观察其他节点是如何重新调整它们位置的情形,以演示复杂的图形交互 

                        演示了一个有热点的图像。当鼠标移动到热点区域,该区域将会高亮显示,并在 

 ImageMap              appletviewer(或者浏览器)的左下角(状态栏)显示一条消息。当鼠标定位在图像中人像

                       嘴上的时候,会听见 applet 说“hi” 

 JumpingBox             在屏幕上随机移动一个矩形,可以试一试用鼠标去捕获它 

                        演示了几个不同化学分子结构的三维视图,可以拖动鼠标从不同的角度来观察这些化学
 MoleculeViewer 
                       分子的结构 

 NervousText            绘制在屏幕上跳动的文本 

 SimpleGraph            绘制一条复杂的曲线
比较三种不同的排序技术。执行该 Applet 时,会出现三个 appletviewer 窗口。单击其中
  SortDemo 
                          任意一个窗口,都会开始排序,不同的排序技术所花费的时间是不同的 

  SpreadSheet              演示了一个简单的,由行和列组成的电子表格 

  TicTacToe                演示了一个叫做 TicTacToe 的游戏,由计算机和用户互弈 

  WireFrame                演示了四个由许多线段组成的三维图形,分别是立方体、恐龙、直升飞机和军舰


    运行上述例程的方法有两种。我们以运行表 2.1 中所讲述的 ArcTest Applet 程序为例:
    (1)用 Java 自带的 Applet 容器 appletview.exe 来运行上述例程。
    在【命令提示符】下,输入如下命令:
          C:Documents and SettingsJKZhong>cd C:jdk1.5.0demoapplets ArcTest 
          C:jdk1.5.0demoappletsArcTest>appletviewer example1.html

  (2)会看到 ArcTest 的运行结果,再进行如下操作,会看到如图 2.1 所示的结果。
  Ø 在第一个文本框中输入 10,表示圆弧的起始角度。
  Ø 在第二个文本框中输入 145,表示圆弧的终止角度。
  Ø 按钮【Fill】表示绘制并填充这个圆弧,按钮【Draw】表示仅仅绘制圆弧。单击【Fill】
    按钮可以看到,绘制的结果是一个从 10 开始到 145 结束的实心圆弧。
  (3)直接用浏览器打开 C:jdk1.5.0demoappletsArcTest 子目录下的 example1.html 文
档,就可以运行上述 Java Applet 程序,这里以微软的 IE 为例。
  Ø 如果与笔者相同,使用微软 Windows XP SP2 下的 IE,可能会看到如图 2.2 所示的结
    果。IE 可能会有这样一个提示:     “为帮助保护您的安全,Internet Explorer 已经限制此
    文件显示可能访问您的计算机的活动内容。单击此处查看选项…”                   。
  Ø 这时无法看到 Java Applet 的运行结果,因为被 IE 屏蔽了。解决的方法是,在 IE 的提
    示下单击鼠标右键,在弹出的菜单中选择【允许阻止的内容】                   。
  Ø 然后会弹出一个【安全警告】对话框,单击【是】按钮,即可看到运行如图 2.2 所示
    的 Java Applet 结果。




          图 2.1    appltviewer 的运行结果              图 2.2    ArcTest Applet 的运行结果

  提示:如果 appletviewer 命令不能工作,或者收到一条消息,表示没有找到 appletviewer 
命令,则计算机可能没有正确地设置 PATH 的环境变量。     读者需要按照 1.2.2 节讲述的方法重
新设置 PATH 变量,修改 PATH 变量后,需要重新启动计算机。
2.2    Java Applet 工作流程 

2.2.1  组件与容器

   一个组件   (Component)代表可以在屏幕上显示出来的一个图形实例,           也就是 Component 
类的任意一个子类的对象。图 2.3 是以 Component 类为基础类的继承关系结构图,图中箭头
所指向的类为超类。
   从图 2.3 可以看到,JApplet、JFrame、Dialog 等就是一个组件,它们都属于 Component 
类的子类。所有从 Container 派生出来的类都可以包含由 Component 类派生出来的任意一个
类的对象,所以我们称之为容器(Container)      。又因为 Container 类是 Component 类的一个子
类,所以任意一个容器对象同时又是一个 Component 对象,        因此一个容器可以包含其他容器。
下面以 Panel 类对象来说明这个关系。我们把一些图形实例如矩形、椭圆等放置在一个 Panel 
类的对象——panelA 中,   再把另外一些 Component 对象如菜单、    按钮等放置在另外一个 Panel 
类的对象——panelB 中,最后把 panelA 和 panelB 放置在另外一个 Panel 类的对象——panelC 
中。这里的例外是,Windows 类及其子类的对象,不能包含在其他容器中,否则,系统会抛
出一个异常。

                               Component 
                               (抽象类) 



                                Container 
                               (抽象类)                        JComponent 
                                                           (Swing 组件) 


               Panel            Window 
             (旧式容器)          (无边框或标题栏) 


               Applet           Frame 
            (旧式 Applet 类)     (旧式框架类) 
                                                Dialog 
                                             (旧式对话框类) 

                                                              JWindow 
               JApplets          JFrame         JDialog 
                                                           (无边框或标题栏) 
             Applet 的基类         应用程序          对话框的基类
                               窗口的基类

                    图 2.3  以 Component 类为基础类的继承关系结构图 

    JComponent  类是所有在一个窗口中作为  GUI  一部分使用的  Swing  组件的基类。因为 
JComponent 也是从 Container 类继承下来的,故此所有的 Swing 组件也是容器。 
    JApplet 类是所有 Swing Applet 类对象的基类,它由 Component 派生的 Container 类派生
出来。因此,一个 Applet 程序就从 Container 和 Component 类继承所有的方法。此外,它也
继承了旧的 Applet 类的方法。
    这里需要注意以下几点:
    Ø  JApplet 类、JFrame 类、JDialog 类以及 JComponent 类,包含在 javax.swing 包中。
    Ø  Applet 类包含在 java.applet 包中。
    Ø 除此之外的类,包含在 java.awt 包中。 
    java.applet  包很小,它只包含这一个类和三个相关的接口,我们很少直接使用该包中的
方法。在  JApplet  类中,对旧的  Applet  类的方法进行了扩充和改进(旧类与  javax.swing 
包中的 GUI 组件不完全兼容)         。所以本书所有相关的 Applet 类都扩展于 JApplet 类。 
2.2.2  Applet 的编译与执行
    如同 Java Application 程序一样,  在执行前必须对 Applet 类的源程序进行编译,          编译的方
法与 1.4 节讲述的方法相同。 
    Applet 被嵌入到 HTML 页面中,      并由 Applet 容器(appeltviewer 或者 Web 浏览器)执行。 
Applet 的运行由浏览器控制,         不由 Applet 中的代码控制。  当浏览器载入包含有 Applet 的 Web 
页面时,它将生成一个 Applet 类的对象,然后利用 Applet 类对象的五个方法控制 Applet 的
执行。这五个方法都是 public 类型,不返回任何结果,以及不需要任何参数的方法。
    表 2.2 列出了 5 个方法及其执行的相应功能。

                                        表 2.2    Applet 默认的 5 个方法
          方        法                                      说   明 

                              启动 Applet。浏览器总是调用 Applet 类的默认构造器生成对象,然后调用 init()方法进行初始
 void init() 
                             化。一般在这个方法中生成 Applet 运行所需的对象并初始化 Applet 类的所有数据成员 

                              方法由浏览器调用,启动或者重新启动  Applet。当  Applet  第一次启动时,start()方法将紧跟

 void start()                在  init()方法后被浏览器调用。如果用户离开当前的  HTML  页面后,在重新返回到当前  HTML 

                             页面时,Start()方法也将被调用。start()方法一般用来启动 applet 需要的任何附加线程 

                              在 init()方法执行结束, 
                                             start()方法启动后,就调用此画图方法。另外,每次需要重新绘制 Applet 

 void paint( Graphics g )    时,也将调用此方法。本方法的典型应用,包括使用  Applet  容器传递给  paint  方法的  Graphics 

                             对象 g 画图 

                              当用户离开包含有该 Applet 的 HTML 页面时,浏览器调用此方法。stop()方法被调用后,将
 void stop() 
                             立即停止所有在 start()方法中启动的操作 

                              在终止 Applet 运行时,调用 destroy()方法,以便释放 Applet 占用的,由本地操作系统管理的
 void destroy() 
                             任何系统资源。此方法执行之前,总是先调用 stop()方法


  我们编写的 Applet 程序都将继承上述 5 种默认的方法。对于每个 Applet,方法调用的顺
序总是 init、start 和 paint,这就保证了每个 Applet 开始执行时都将调用这些方法。但是,并
非每个 Applet 都需要调用 5 种方法。我们可以重载上述的 5 种方法,也可以重载其中的某种
方法,以便 Applet 实现我们所设计的方法。
  浏览器通过包含有 Applet 的 HTML 页面来运行 Applet 程序。    那么,在执行 Applet 之前,
首先要创建 HTML 文档。
2.2.3  包含 Applet 的 HTML 

    通常,HTML 文档以“.html”或者“htm”的扩展名结尾。一个在 HTML 页面中包含有 
Applet 的 HTML 文档,必须指明 Applet 容器应该装入和执行哪一个 Applet。
    下面是一个完整的包含 Applet 的 HTML 源代码:
       1: <!DOCTYPE HTML PUBLIC "­//W3C//DTD HTML 4.0 Transitional//EN"> 
       2: <HTML> 
       3: <HEAD> 
       4:     <TITLE>包含有 Applet 的 HTML 页面</TITLE> 
       5:  </HEAD> 
       6: 
       7:  <BODY> 
       8:          <APPLET  CODE = "MyAppletName.class" 
       9:                   WIDTH = "Applet_width_in_pixels" 
      10:              HEIGHT = "Applet_height_in_pixels" > 
      11:         </APPLET> 
      12:  </BODY> 
      13: </HTML>

    我们可以看到,代码第 8 行~第 11 行是隶属于<applet>和</applet>标记之间的内容,也
是一个包含 Applet 的 HTML 页面所需的最少内容,其余部分都是标准的 HTML 标记。 
    Applet 标记内的“CODE”属性,表示该 Applet 的.class 文件,它假设 Applet 位于包含
该 Applet 的网页所在的相同目录下。      本例指明 Applet 容器, 载入一个名为  “MyApplet Name”
的  Applet  字节码文件。如果.class  文件和  HTML  文件不在同一目录下,则需要使用一个 
CODEBASE 属性,  它拥有一个 URL 值,  指明 applet 源代码的位置, 
                                             URL 可以是绝对值 (以 http:// 
开头) ,也可以是相对值。属性“WIDTH”表示该 Applet 在网页上显示的宽度,用像素表示。属
性“HEIGHT”表示该 Applet 在网页上显示的高度,也用像素表示。
    了解前面我们介绍的 Applet 的相关知识,就可以编写一些 Applet 程序了。 


2.3  绘制文本(字符串)
    现在,让我们来开发一些  Applet。首先介绍一个简单的  Applet  程序——DrawString 
Applet.java,就是在 Applet 上绘制一段文本(字符串)      “欢迎来到《精通 Java  Web 动态图表
编程》的世界!。      ”
    DrawStringApplet.java 的源程序清单如下(chap02Fig2.3Fig2.3_01):
       1: // Fig. 2.3_01: DrawStringApplet.java 
       2: // 第一个 Java Applet 程序, 绘制文本(字符串) 
       3: 
       4: // 引入相关的包
       5: import java.awt.Graphics; // 引入 Graphics 类
       6: import javax.swing.JApplet; // 引入 JApplet 类
       7: 
       8: public class DrawStringApplet extends JApplet 
       9: { 
      10: 
      11:   // 在 applet 上绘制文本
      12:  public void paint(Graphics g) 
      13:   { 
      14:       // 调用父类的 paint 方法
      15:       super.paint(g); 
      16: 
      17:       g.drawString("欢迎来到 《精通 Java  Web 动态图表编程》的世界!", 
                                                              25, 
                                                                 25);
18: 
        19:     } // paint 方法结束
        20: 
        21: } // DrawStringApplet 类结束

  提示:本书后面的例程将不再列出完整的源代码清单,请读者从 www.broadview.com.cn 网
站下载本书配套代码,查看相关目录下完整的源代码清单。

   包含这个 Applet 的 web 页面文件 DrawStringApplet.html 的源程序清单如下:
        1: <!DOCTYPE HTML PUBLIC "­//W3C//DTD HTML 4.0 Transitional//EN"> 
        2: <HTML> 
        3: <BODY> 
        4:  <APPLET  CODE  "DrawStringApplet.class"  WIDTH  "320  HEIGHT  "45" 
                          =                                =     "      = 
   > 
        5:  </APPLET> 
        6:  </BODY> 
        7:  </HTML>

    提示:本书所有的 Java  Applet 都将使用与本例相类似的 HTML 文档。对于不同的 Java 
Applet,读者只需要修改上述代码第四行的内容,      重新设置“CODE”、
                                         “WIDTH” “HEIGHT”
                                                和
的属性值即可。

    图 2.4 展示了名为 DrawStringApplet 的 Applet 在四个不同的 Applet 容器中的运行结果。
分别是 Appletviewer、 
                 Netscape Web 浏览器(现在更名为 Mozilla) Opera,
                                                、        以及微软的 Internet 
Explorer Web 浏览器。
    该程序说明了 Java 的几个重要特性。程序第 17 行完成的实际工作,即在屏幕上绘制一行文
本“欢迎来到《精通 Java Web 动态图表编程》的世界!。下面我们逐行来分析本程序。
                                           ”
    程序第 1 行~第 2 行:
        // Fig. 2.3: DrawStringApplet.java 
        // 第一个 Java Applet 程序, 绘制文本(字符串)

   是注释。第 1 行说明例程的编号,以及源程序的文件名。第 2 行描述程序所实现的功能。
x 轴                appletviewer 窗口
                          y 轴 
              applet 菜单
   绘制区左上角是(0,0) ,绘
   制区边缘在状态栏上 x 坐标从                                     状态栏显示 applet 
   左向右递增,y 坐标从上向下                                      当前的运行状态
   递增
         文本在该处的坐
         标是(25,25)


          绘制区域在左上角

          坐标是(25,25)

           状态栏




           绘制区域在左上角

          坐标是(25,25)




           绘制区域在左上角

          坐标是(25,25) 

            状态栏




              图 2.4    DrawStringApplet 在四个不同的 Applet 容器中的运行结果

   程序第 5 行:
      import java.awt.Graphics; // 引入 Graphics 类

  是一个 import 声明,   表明 Applet 使用 java.awt 包中的 Graphics 类。Java 包含了很多预定
义的类,并按包(类的集合)的形式进行分组。Graphics  类是一个具备图形处理能力的类,
可以让 Java Applet 能够绘制直线、文本、矩形及椭圆形等图形对象。
  程序第 6 行:
      import javax.swing.JApplet; // 引入 JApplet 类

  也是一个 import 声明,表明 applet 使用 javax.swing 包中的 JApplet 类。在 Java 2 中创建
一个 Applet 时,必须引进 JApplet 类。
   程序第 8 行:
       public class DrawStringApplet extends Japplet

  声明了一个名为 DrawStringApplet 的公有  (public) 并继承了 javax.swing 包中的 JApplet 
                                        类,
类。该类的主体从程序第 9 行的左花括号“{”开始,到程序第 21 行的右花括号“}”结束。
在继承关系中,JApplet 类称为超类(也称为基类或父类)           ,DrawStringApplet 被称为子类或派
生类。因为,DrawStringApplet 继承了 JApplet 类,所以,它不仅具有 JApplet 类的所有属性 
和方法,而且还可以增加新的方法和属性,以及扩展被继承的方法。
  程序第 12 行:
       public void paint(Graphics g)

     声明 Java Applet 的 paint 方法。前面我们提到的 paint 方法是 Java Applet 容器在载入 Applet 
时,自动调用三个方法中的一个(其他两个是 init 和 start 方法)             。如果我们不在 Applet 中重
新定义该方法,那么 Applet 容器将调用继承下来的默认超类的 paint 方法。因为,默认超类
(JApplet)的 init、start 和 paint 方法为空(指明该方法的方法体中没有任何语句)             ,也就是
说,超类的 paint 方法不会在 Applet 上绘制任何东西,所以在屏幕上也就不会有任何显示。 
     void 表示 paint 方法执行完后,不返回任何结果。paint 方法需要一个 Graphics 类的对象 
g(对象也称为“类实例”或者“实例”。paint 方法使用 Graphics 类的对象 g 在 applet 上绘
                                 )
制各种图像对象,        如文本及各种几何图形等。        Graphics 类的对象 g 的创建由 Applet 容器负责。
     为了实现在屏幕上绘制出一段文本,程序第 13 行~19 行,重载(重新定义)了超类的 
paint 方法。
     程序第 15 行:
       super.paint(g);

    调用超类 JApplet 的 paint 方法。该语句是 Java Applet 程序中 paint 方法体的第一个语句。
早期的 Java Applet 在没有该语句的情况下仍然可以正常运行,            但在一个拥有众多绘图组件和 
GUI 组件的复杂 Java Applet 中,  忽略该语句可能会导致严重的错误。          所以,  在编写 Java Applet 
程序的时候,一定在 paint 方法的第一行设置这条语句,这是一个很好的编程习惯。
    程序第 17 行:
       g.drawString(“欢迎来到《精通 Java Web 动态图表编程》的世界!”, 25, 25);

  通过 Graphics 类的对象 g 来调用该类的 drawString 方法,以实现在 Applet 上绘制文本的
功能。drawString 方法的具体使用如表 2.3 所示。

                                            表 2.3    drawString 方法
    方法      public abstract void drawString(String str, int x, int y) 

    说明      用当前的字体和颜色,在指定的坐标(x,y)处,绘制字符串 str 的内容


    调用的具体方法是 Graphics  类的对象名称(这里是  g)加上一个点操作符“.”     ,再加入
所调用的方法名称(这里是 drawString)  。方法名后面跟着一对括号,括号内包含有执行该方
法所需的参数。 
    drawString 方法需要三个参数,第一个是  String 类的字符串参数,表示要绘制的文本。
最后两个是  int  类型的整数型参数,表示要绘制文本的第一个字符左下角所在的位置,该位
置用 Java 的平面坐标系来表示。
    图 2.5 说明了 Java 坐标系。坐标原点位于左上角,以像素为单位。像素是计算机屏幕上
最小的显示单位。在 Java 的坐标系中,第一个是 x 坐标,表示当前位置为水平方向,距离坐
标原点 x 个像素;第二个是 y 坐标,表示当前位置为垂直方向,距离坐标原点 y 个像素。在 
Appletviewer 中,坐标原点(0,0)正好位于 Applet 菜单的下方。在 Web 浏览器中,原点(0, 
0)位于 Applet 执行的矩形区域的左上角(如图 2.5 所示)     。
坐标原点(0,0) 

                                25                   +X 
                                                           X 轴 




                    25
                                       欢迎来到《精
                               (x,y)



                    +Y 


                     Y 轴
                                 图 2.5    Java 坐标系

  计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的
分辨率是 800´600,表示计算机屏幕上的每一行由 800 个点组成,共有 600 行,整个计算机
屏幕共有  480 000  个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显
示更多的像素。Java Applet 在屏幕上的大小,依赖于屏幕的大小与分辨率。对于大小相同的
屏幕来说,分辨率越高,Java Applet 在屏幕上的显示就越小,这是因为屏幕上的像素更多了。
  程序第 17 行,将在坐标(25,25)上绘制“欢迎来到《精通 Java Web 动态图表编程》
的世界!”如图 2.4、图 2.5 所示。 
  Java Applet 可以在 paint 方法中多次调用 drawString 方法,在屏幕的任意位置绘制文本。
我们就可以利用这种方法来显示多行文本。 
  DrawMultiStringApplet.java  演示了如何绘制多行文本(chap02Fig2.3Fig2.3_02)
                                                                  。通过
调用该目录下的 DrawMultiStringApplet.html 的运行结果如图 2.6 所示。




             坐标(25,25)




             坐标(25,40)



                           图 2.6  在 Java Applet 上绘制多行文本

     本例同第一个 Java  Applet 程序相比,仅仅增加了第 18 行。图 2.7 所示的两行文本之所
以能够左对齐,         就是因为第 17 行和第 18 行的 drawString 方法,         都使用了相同的 x 坐标(25)。
此外,两者使用不同的 y 坐标(第 17 行是 25,第 18 行是 40)。因此在 Applet 相同的水平
位置,不同的垂直位置上显示文本,也就实现了左对齐的功能了。如果把第 17 行和第 18 行
的内容相互交换,则运行的结果也是相同的,这说明文本的位置由其坐标决定。
     绘制文本时,不能通过换行符(n)来实现文本换行的功能。如  DrawMultiStringApplet2. 
java(chap02Fig2.3Fig2.3_03)和 DrawStringApplet.java 相比,主要是第 17 行语句不同,如下
所示:
     g.drawString(“欢迎来到《精通 Java Web 动态图表编程》的世界!n 不用不知道,Java
   真奇妙!”, 25, 25);

   即使绘制的文本中包含有换行符(n),运行结果如图 2.7 所示,字符串并没有分行显示。
图 2.7  用n 绘制多行文本

  提示:   在某些 Java 版本中,运行结果会在字符串中的换行符位置处显示一个黑色小方框,
表示 drawString 方法不能识别该字符。 


2.4  绘制线段
    如果要在 Java Applet 中绘制一段直线,就需要调用 Graphics 类的 drawLine 方法。 先来
看 drawLine 的用法,如表 2.4 所示。

                                           表 2.4    drawLine 方法
    方法     public abstract void drawLine(int x1, int y1, int x2, int y2) 

    说明     用当前颜色在端点 1(x1,y1)和端点 2(x2,y2)之间绘制一条直线 


  drawLine 方法需要四个参数,表示该线段的两个端点。第一个端点的 x 坐标和 y 坐标分
别由第 x1、y1 个参数决定;第二个端点的 x 坐标和 y 坐标分别由第 x2、y2 个参数决定。所
有的坐标值都相对于该 Applet 的左上角坐标(0,0)。drawLine 方法就是在这两个端点之间
绘制一条直线。
  程序 drawLineApplet.java(chap02Fig2.4)绘制了 11 条直线、1 个三角形和 1 个矩形。源
程序的运行结果如图 2.8 所示。


                                                                            坐标(160,10)

          坐标(90,10)
          坐标(10,10)                                                           坐标(230,10)


          坐标(90,110)

                                                                            坐标(330,10)




          坐标(110,110)
                                  坐标(210,110) 坐标(230,110) 坐标(330,110)


                                图 2.8    drawLineApplet.java  的运行结果

   程序第 5 行:
      import java.awt.Graphics; // 引入 Graphics 类

  导入 Applet 所需的 Graphics 类(来自 java.awt 包)实际上,
                                         。   如果总是使用完整的 Graphics 
类名(java.awt.Graphics),即包含完整的包名和类名,就不需要第 5 行的 import 语句了。也
就是说,如果没有第 5 条语句,那么第 12 行就可以改写成如下形式:
public void paint(java.awt.Graphics g)

   程序第 6 行:
      import javax.swing.*; // 引入 javax.swing 包中所有的类

  这里告诉编译器,Applet  可以使用  javax.swing 包中所有的类。星号(*)表示  javax.swing 
包中所有的类都可以被编译器所使用。不过,在程序开始运行时,它并不会将该包中所有的
类都载入内存中,而只是装载程序使用的那些类。本例仅加载了 JApplet 类。
  程序第 15 行:
      super.paint(g);

  调用超类 JApplet 的 paint 方法。编写 Java  Applet 程序时,在 paint 方法的第一行设置这
条语句。
  程序第 18 行~第 21 行:
      for (int i = 1; i <= 11 ; i++ ) 
      { 
      g.drawLine(10, 10, 90, i * 10 ); 
      }

    运行了一个循环语句,调用了 11 次 drawLine 方法,在 Applet 上绘制了 11 条线段。这 
11 条线段第 1 个端点的坐标都是相同的,即(10,10)    ,第 2 个端点坐标的 x 坐标也是完全
相同的。只是 y 坐标不同, 每循环一次,y 坐标依次增加 10 像素。该循环的运行结果如图 2.8 
中最左边的图形。
   程序第 24 行~第 26 行:
      g.drawLine(160, 10, 110, 110); 
      g.drawLine(160, 10, 210, 110); 
      g.drawLine(110, 110, 210, 110);

  直接调用 3 次 drawLine 方法,在 Applet 上绘制了由 3 条线段而组成的一个三角形。这
个三角形的三个端点坐标分别是(160,10)(110,110)和(210,110)
                             、                。用 drawLine 方法
在两个端点之间绘制一条直线,运行结果如图 2.8 中的三角形。
   程序第 29 行~第 32 行:
      g.drawLine(230, 10, 230, 110); 
      g.drawLine(230, 10, 330, 10); 
      g.drawLine(330, 10, 330, 110); 
      g.drawLine(230, 110, 330, 110);

  直接调用 4 次 drawLine 方法,在 Applet 上绘制了由 4 条线段组成的一个矩形。这个矩
形的 4 个端点坐标分别是:   (230,10)(330,10)(330,110)和(230,110)
                         、        、                。用 drawLine 
方法绘制该矩形的四条边,运行结果如图 2.8 中右边的矩形。
2.5  色彩管理
    早期的电脑系统是没有色彩管理这个概念的,   直到 90 年代苹果电脑推出了 ColorSync 1.0 
色彩管理,它局限于苹果电脑之间的色彩控制。1993  年国际色彩联盟(Interational  Color 
Consortium)成立,制定了开放式色彩管理规则──ICC,使色彩在不同品牌的电脑输出/输
入设备之间能够互相沟通,产生一致的色彩效果。随后,苹果电脑系统、微软的  Windows 
系统、Sun 微电脑系统等相继支持 ICC 规则。 


2.5.1  色彩基础

  当我们从事设计的时候,最想了解的是如何有效地使用色彩。例如,使用什么色彩会产
生什么效果,用什么色彩代表什么性格,色彩如何搭配才美观,等等。要了解这些内容,首
先要认识色彩,知道色彩具有什么物理特性,以及色彩是如何形成的。 

   1.什么是色彩
  我们生活在一个多彩的世界里。白天,在阳光的照耀下,各种色彩争奇斗艳,并随着照
射光的改变而变化无穷。但是,每当黄昏,大地上的景物无论多么鲜艳,都将被夜幕吞没。
在漆黑的夜晚,我们不但看不到物体的颜色,甚至连物体的外形也分辨不清。同样,在暗室
里,我们什么色彩也感觉不到。这些事实告诉我们,没有光就没有色,光是人们感知色彩的
必要条件。色彩来源于光,所以,光是色彩的源泉,色彩是光的表现。要了解色彩产生的原
理,必须对光做进一步的了解。
  光的物理性质由它的波长和能量来决定。波长决定了光的颜色,能量决定了光的强度。
光映像到我们的眼睛时,波长不同决定了光的色相不同。波长相同能量不同,则决定了色彩
明暗的不同。
  只有波长 380nm~780nm(1nm=10-6 mm)光的辐射才能引起人们的视觉感知,这段光波
叫做可见光。我们看到的色彩,事实上是以光为媒体的一种感觉。色彩是人在接受光的刺激
后,视网膜的兴奋传送到大脑中枢而产生的印象。
  英国科学家牛顿在 1666 年发现,把太阳光经过三棱镜折射,然后投射到白色屏幕上,会
显出一条像彩虹一样美丽的色光带谱,从红色开始,依次是橙、黄、绿、青、蓝、紫七色,
如图 2.9 所示。
   这条依次排列的彩色光带称为光谱。这种被分解过的色
光,即使再通过三棱镜也不会分解为其他的色光,我们把光
谱中不能再分解的色光叫做单色光。由单色光混合而成的光
叫做复色光。自然界的太阳光,白炽灯和日光灯发出的光都                 图 2.9  光谱
是复色光。 
   2.色彩的三属性
  我们不仅观察物体的色彩,同时还会注意到形状、面积、体积,以致该物体的功能和所
处的环境。这些对色彩的感觉都会产生影响。为了寻找规律,人们抽出纯粹色知觉的要素,
认为构成色彩的基本要素是色相、明度、纯度,这就是色彩的三属性。
            Ø 色相(Hue)
            色相指色的相貌与名称。色轮是表示最基本色相关系的色表。色轮上 
        90 度角内的几种色彩称作同类色,也叫做近邻色或姐妹色;90 角以外的色


 图 2.10  色相
彩称为对比色。色轮上相对位置的色叫做补色,也称为相反色,如图 2.10 所示。
  Ø 明度(Value 或 Brightness)
  人眼之所以能够看到物体的明暗,是因为物体所反射色光的光量(热量)存在差异。光
量越多,明度越高,反之明度越低。色料的色彩明度,取决于混色中白色和黑色含量的多少,
如图 2.11 所示。
  Ø 纯度(Chroma)
  所谓色彩的纯度,是指色彩鲜艳与混浊的程度,也称为彩度。色轮上各颜色都是纯色,
纯度最高。色料的混合中,越混合,色彩的纯度越低,如图 2.12 所示。




       图 2.11  明度变化                    图 2.12  纯度变化 

  3.混色理论
   Ø 原色
   无法用其他色彩混合得到的基本色彩称为原色。原色按照一定比例混合可以得到各种色
彩。究竟原色有多少种,又是哪几种颜色?历史上不同的学者有不同的说法,但基本上分为
三原色说和四原色说。
   色彩的混色有两种类型:加法混色和减法混色。
   Ø 加法混色
   色光三原色(红、绿、蓝)按照一定的比例混合可以得到各种色光。三原色光等量混合
可以得到白色。色光混色和色料混色刚好相反,色光混色是越混合越明亮,所以称为加法混
色。我们熟悉的电视机和电脑的 CRT 显示器产生的色彩方式就属于加法混色,如图 2.13A 所
示。

  Ø 减法混色
  色料三原色(品红、黄、青蓝)按照一定的比例混合可以得到各种色彩。理论上三原色
等量混合可以得到黑色。因为色料越混合越灰暗,所以称为减法混色。水彩、油画、印刷等,
它们产生各种颜色的方法都是减法混色,如图 2.13B 所示。 




                 A:加法混色           B:减法混色

                       图 2.13  色彩的混合

  这两种混色方法,通过对相对应的色彩取反操作,就可以相互转换了。
4.色彩空间及色彩模型
    “色彩空间”一词源于英语“Color Space”        ,也称做“色域”    。实际上就是各种色彩的集
合,色彩的种类越多,色彩空间越大,能够表现的色彩范围(即色域)越广。对于具体的图
像设备而言,其色彩空间就是它所能表现色彩的总和。
    自然界中的色彩千变万化,我们要准确地表示色彩空间就要使用到色彩模型。人们建立
了多种色彩模型,以一维、二维、三维甚至四维空间坐标来规范这些色彩。
    最常用的色彩模型有:       HSB、 
                         RGB、  CMYK 以及 CIE Lab 等色彩模型。 其中 RGB、 
                                                             CMYK 
是惟一两种专门面向数码设计和出版印刷的色彩模型。这里我们介绍  RGB、CMYK  色彩模
型,认识这两个色彩模型,有助于我们在设计中准确地把握色彩。
    所谓 RGB 就是:红(Red)    、绿(Green)   、蓝(Blue)三种色光原色。RGB 色彩模型的
混色属于加法混色。每种原色的数值越高,色彩越明亮。R、G、B  都为  0  时是黑色,都为 
255 时是白色。 
    RGB 是电脑设计中最直接的色彩表示方法。电脑中的 24 位真彩图像,就是采用  RGB 
模型来精确记录色彩的。所以,在电脑中利用 RGB 数值可以精确取得某种颜色。 
    R、G、B 数值和色彩的三属性没有直接的联系,不能揭示色彩之间的关系。所以在进行
配色设计时,RGB 模型就不是那么适用了。 
    RGB 色彩模型又有 AdobeRGB、AppleRGB、sRGB 等几种,这些 RGB 色彩模型大多与
显示设备、输入设备(数码相机、扫描仪)相关联。
    Ø“sRGB”是所谓的“标准  RGB  色彩模型”         。这种色彩空间由微软公司与惠普公司于 
      1997 年联合确立,被许多软件、硬件厂商所采用,逐步成为许多扫描仪、低档打印机
      和软件的默认色彩空间。同样采用 sRGB 色彩空间的设备之间,可以实现色彩相互模
      拟,但却是通过牺牲色彩范围来实现各种设备之间色彩的一致性的,这是所有  RGB 
      色彩空间中最狭窄的一个。
    Ø“Apple RGB”是苹果公司早期为苹果显示器制定的色彩模式。             其色彩范围并不比 sRGB 
      大多少。这种显示器已经很少使用,这一标准已逐步被淘汰。
    Ø“Adobe RGB(1998) ”由 Adobe  公司制定。其最早使用在 Photoshop 5.x 中,被称为 
      SMPTE­240M。它具备非常大的色彩范围,绝大部分色彩又是设备可呈现的,这一色
      彩模型全部包含了  CMYK  的色彩范围,为印刷输出提供了便利,可以更好地还原原
      稿的色彩,在出版印刷领域得到了广泛应用。
    Ø“ColorMatch RGB”是由 Radius 公司定义的色彩模型,与该公司的 Pressview  显示器
      的本机色彩模型相符合。       “Wide Gamut RGB”是用纯谱色原色定义的色彩范围的 RGB 
      色彩空间。这种空间的色域包括了几乎所有的可见色,比典型的显示器所显示的色域
      还要宽。但是,由于这一色彩范围中的很多色彩不能在  RGB  显示器或印刷上准确重
      现,所以这一色彩模型并没有太大的实用价值。 
    RGB 只是光色的表示模型,在印刷行业中,使用另外一种色彩模型 CMYK。CMYK 分
别是青色(Cyan)    、品红(Magenta) 、黄色(Yellow)  、黑色(Black)三种油墨色。每一种颜
色都用百分比来表示,而不是 RGB 那样的 256 级度。
    理论上将印刷三原色,即青色(Cyan)          、品红(Magenta)   、黄色(Yellow)混合之后,
应该可以将红绿蓝光全部吸收而得到纯正的黑色,只是现实生活中找不到这种光线吸收,反
射特性都十分完美的颜料,将三种颜色混合后还是会有些许光线反射出来,呈现暗灰色或深
褐色。事实上除了黑色外,用颜料三原色也无法混合出许多暗色系的颜色,为了弥补这个缺
点,在实际印刷的时候,额外加入黑色的颜料,以解决无法产生黑色的问题。因此就有所谓 
CMYK 的色彩模式,K 表示黑色(Black)        。
2.5.2  Java 的色彩管理 

  Java 以跨平台,与硬件无关的方式支持色彩管理。Java 的色彩管理功能来自于 java.awt 
包中的 Color 类。Color 类允许在应用程序中指定自己需要的任意色彩,不用担心因计算机的
硬件设备所支持的绘制方式不同而引起的颜色差别。Java 支持 sRGB 色彩模型,将自动找到
最接近的颜色。 
  Java 对色彩的管理都被封装在 java.awt.Color 类中。 
  Color 类提供了对颜色控制的常量和方法。表 2.5 列出了 Color 类中部分预定义的颜色常
量及其 RGB 值。

                                            表 2.5  部分 Color 颜色常量及其 RGB 值
                                 颜色常量                                         颜   色                 RGB 值 

  public final static Color ORANGE/orange                              橙色              255, 200, 0 

  public final static Color PINK/pink                                  粉红色             255, 175, 175 

  public final static Color CYAN/cyan                                  青色              0, 255, 255 

  public final static Color MAGENTA/magenta                            品红色             255, 0, 255 

  public final static Color YELLOW/yellow                              黄色              255, 255, 0 

  public final static Color RED/red                                    红色              255, 0, 0 

  public final static Color BLACK/black                                黑色              0, 0, 0 

  public final static Color WHITE/white                                白色              255, 255, 255 

  public final static Color LIGHT_GRAY/lightGray                       淡灰色             192, 192, 192 


    颜色常量的名称有两种写法,一种是小写,另一种是大写。我们建议采用大写的形式表
达 Java 的颜色常量,因为它们更符合常量的命名约定。 
    Color  类通过设置不同的三个原色:红、绿、蓝(RGB)的值而创建各种颜色。这三个
原色的合并值称为 RGB 值。RGB 中的每个值又可以表示为 0~255 范围内的某个整数,或者
表示为 0.0~1.0 之间的浮点数。RGB 中的 R 表示颜色中红色的数值,G 表示绿色的数值,而 
B 表示蓝色的数值。数值越大,表示相应的色彩含量就越多。RBG 总共可以产生的颜色总数
为 256´256´256,即 167 77 2 16 种颜色。表 2.6 列出了 Color 的方法以及 Graphics 类中与之相
关的方法。

                                 表 2.6  Color 的方法以及 Graphics 类中与之相关的方法 
                                                             Color 的构造器及部分方法 

    public Color(int r, int g, int b)      // Color class 

    创建一种基于红色、绿色和蓝色的颜色,每种颜色的表示方法为 0~255 之间的一个整数 

    public Color(float r, float g, float b)    // Color class 

    创建一种基于红色、绿色和蓝色的颜色,每种颜色的表示方法为 0~1 之间的一个浮点数 

    public int getRed()  // Color class 

    返回一个 0~255 之间的,表示 RGB 中红色的整数值 

    public int getGreen()  // Color class 

    返回一个 0~255 之间的,表示 RGB 中绿色的整数值 

    public int getBlue()  // Color class 

    返回一个 0~255 之间的,表示 RGB 中蓝色的整数值
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程
Java Web动态图表编程

Weitere ähnliche Inhalte

Was ist angesagt?

移动Web开发框架jqm探讨
移动Web开发框架jqm探讨移动Web开发框架jqm探讨
移动Web开发框架jqm探讨newker
 
Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Justin Lin
 
基于Ivy ant的java构建初探
基于Ivy ant的java构建初探基于Ivy ant的java构建初探
基于Ivy ant的java构建初探Anson Yang
 
高粒度模块化的前端开发
高粒度模块化的前端开发高粒度模块化的前端开发
高粒度模块化的前端开发iddcn
 
Maven in eclipse practices
Maven in eclipse practicesMaven in eclipse practices
Maven in eclipse practicesPei-Tang Huang
 
Responsive Web UI Design
Responsive Web UI DesignResponsive Web UI Design
Responsive Web UI Designjay li
 
淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践jay li
 
深入剖析浏览器
深入剖析浏览器深入剖析浏览器
深入剖析浏览器jay li
 
2021.laravelconf.tw.slides3
2021.laravelconf.tw.slides32021.laravelconf.tw.slides3
2021.laravelconf.tw.slides3LiviaLiaoFontech
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVCjeffz
 
模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京Joseph Chiang
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練Joseph Chiang
 

Was ist angesagt? (12)

移动Web开发框架jqm探讨
移动Web开发框架jqm探讨移动Web开发框架jqm探讨
移动Web开发框架jqm探讨
 
Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝
 
基于Ivy ant的java构建初探
基于Ivy ant的java构建初探基于Ivy ant的java构建初探
基于Ivy ant的java构建初探
 
高粒度模块化的前端开发
高粒度模块化的前端开发高粒度模块化的前端开发
高粒度模块化的前端开发
 
Maven in eclipse practices
Maven in eclipse practicesMaven in eclipse practices
Maven in eclipse practices
 
Responsive Web UI Design
Responsive Web UI DesignResponsive Web UI Design
Responsive Web UI Design
 
淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践
 
深入剖析浏览器
深入剖析浏览器深入剖析浏览器
深入剖析浏览器
 
2021.laravelconf.tw.slides3
2021.laravelconf.tw.slides32021.laravelconf.tw.slides3
2021.laravelconf.tw.slides3
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVC
 
模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練
 

Andere mochten auch

Seed plants characteristics
Seed plants characteristicsSeed plants characteristics
Seed plants characteristicseziennker
 
The Characteristics Of Seed Bearing Plants
The Characteristics Of Seed Bearing PlantsThe Characteristics Of Seed Bearing Plants
The Characteristics Of Seed Bearing PlantsFelipe Galvez
 
Introduction To Plants
Introduction To PlantsIntroduction To Plants
Introduction To Plantsmlong24
 
Plant introduction
Plant introductionPlant introduction
Plant introductionNiroj jena
 
Introduction to Plants - Basic Overview
Introduction to Plants - Basic OverviewIntroduction to Plants - Basic Overview
Introduction to Plants - Basic OverviewCatherine Patterson
 
Life cycle of plants
Life cycle of plantsLife cycle of plants
Life cycle of plantsChio Mora
 
Life Cycle Of A Plant
Life Cycle Of A PlantLife Cycle Of A Plant
Life Cycle Of A Plantwaeltz
 

Andere mochten auch (8)

Seed plants characteristics
Seed plants characteristicsSeed plants characteristics
Seed plants characteristics
 
The Characteristics Of Seed Bearing Plants
The Characteristics Of Seed Bearing PlantsThe Characteristics Of Seed Bearing Plants
The Characteristics Of Seed Bearing Plants
 
Introduction To Plants
Introduction To PlantsIntroduction To Plants
Introduction To Plants
 
Introduction to Plants PPT
Introduction to Plants PPTIntroduction to Plants PPT
Introduction to Plants PPT
 
Plant introduction
Plant introductionPlant introduction
Plant introduction
 
Introduction to Plants - Basic Overview
Introduction to Plants - Basic OverviewIntroduction to Plants - Basic Overview
Introduction to Plants - Basic Overview
 
Life cycle of plants
Life cycle of plantsLife cycle of plants
Life cycle of plants
 
Life Cycle Of A Plant
Life Cycle Of A PlantLife Cycle Of A Plant
Life Cycle Of A Plant
 

Ähnlich wie Java Web动态图表编程

Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletJustin Lin
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 
Java2新觀念教本投影片ch1
Java2新觀念教本投影片ch1Java2新觀念教本投影片ch1
Java2新觀念教本投影片ch15045033
 
GlassFish特性介绍
GlassFish特性介绍GlassFish特性介绍
GlassFish特性介绍Jim Jiang
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南yiditushe
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型裕波 周
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Justin Lin
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web FrameworkFred Chien
 
Struts Mitac(1)
Struts Mitac(1)Struts Mitac(1)
Struts Mitac(1)wangjiaz
 
Java 推荐读物
Java 推荐读物Java 推荐读物
Java 推荐读物yiditushe
 
Terracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTerracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTarget Source
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0Anthony Chen
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練32015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3Duran Hsieh
 
Lab01 cloud project
Lab01 cloud projectLab01 cloud project
Lab01 cloud projectJeff Chu
 

Ähnlich wie Java Web动态图表编程 (20)

Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 
Java2新觀念教本投影片ch1
Java2新觀念教本投影片ch1Java2新觀念教本投影片ch1
Java2新觀念教本投影片ch1
 
GlassFish特性介绍
GlassFish特性介绍GlassFish特性介绍
GlassFish特性介绍
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
J S教材
J S教材J S教材
J S教材
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
Jsp讲义
Jsp讲义Jsp讲义
Jsp讲义
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web Framework
 
Struts Mitac(1)
Struts Mitac(1)Struts Mitac(1)
Struts Mitac(1)
 
Java 推荐读物
Java 推荐读物Java 推荐读物
Java 推荐读物
 
Terracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTerracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering Architecture
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練32015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練3
 
Lab01 cloud project
Lab01 cloud projectLab01 cloud project
Lab01 cloud project
 

Mehr von yiditushe

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要yiditushe
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册yiditushe
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2yiditushe
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1yiditushe
 
性能测试技术
性能测试技术性能测试技术
性能测试技术yiditushe
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术yiditushe
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试yiditushe
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训yiditushe
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程yiditushe
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Luceneyiditushe
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍yiditushe
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Actionyiditushe
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1yiditushe
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demoyiditushe
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析yiditushe
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则yiditushe
 
10 团队开发
10  团队开发10  团队开发
10 团队开发yiditushe
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模yiditushe
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模yiditushe
 

Mehr von yiditushe (20)

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1
 
性能测试技术
性能测试技术性能测试技术
性能测试技术
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Lucene
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Action
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demo
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则
 
10 团队开发
10  团队开发10  团队开发
10 团队开发
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模
 

Java Web动态图表编程

  • 1. 本书向读者展示如何使用 Java Applet、Java Servlet、Java Server Pages(JSP)、JavaBean 以及开放源代码的 Web 图表生成引擎——JFreeChart 和 Cewolf 来开发奇妙的 Web 动态图表 应用程序——以一种跨平台、小巧、结构清晰的模式在 Web 上生成动态图表。 随着计算机网络及编程技术的发展,使得越来越多的应用程序被移植成以 Web 应用程序 (浏览器/服务器)的方式,工作在因特网/局域网环境之中。网络开发人员发现,某些传统 IDE 开发环境,例如:在 Dephi 和 VB 中可以轻而易举地实现的图形界面,而在 Web 程序中却 很难实现,其中一个典型的例子就是 Web 图表(Chart)的生成与处理。即使 Web 程序(ASP、 ASP.NET 等)能够处理一些图表,也基本是采用 ActiveX 或者 COM 组件的结构。这种方法有 三大弊端: ? 开发 ASP 比较简单,但开发 ActiveX 和 COM 却很难; ? 基于 ActiveX 和 COM 构架的 Web 应用程序只能用于微软 Windows 的 Web 服务器 IIS 环境下, 移植性差; ? 由于 ActiveX 和 COM 与 Windows 深度紧密结合,在带来强大功能的同时,也一并带来了 Windows 固有的缺陷——安全性和稳定性差。 PHP 可以用于 Web 图表处理,它具有跨平台、安全性能高、兼容性及扩展性强的优点,但也 有其固有的缺陷,具体表现为以下几点: ? 效率不高,基于解释型,而非编译型,这一点与 ASP 类似。ASP.NET 吸取了 JSP 的优点, 属于编译型,大大提高了运行速度和效率; ? 安装复杂,每一种扩展模块不完全是由 PHP 自身来完成。当图形需要 GD 库,使用类似的扩 展库时,安装和调试是 PHP 的一大问题; ? 因为是开发源代码产品,所以缺乏企业级的商业支持。 JSP 的出现,使得上述弊端不复存在。随着 Java 对二维图形及三维图像的处理能力越来 越强大,利用 JSP 来简单、高效地开发一个 Web 图表应用程序已经不是一件难事了。为了展 示如何编写 Web 图表应用程序,本书中,我们不仅提供了多个 JSP 图表生成的实例,而且还 将从以下两个方面加以说明 Web 图表编程是如何实现的。 1.利用 Java 自身对图形的处理能力,由开发者编写代码来生成 Web 动态图表。将以大量的 例程,不同的方式(例如:Java Applet、Java Servlet、JSP、JavaBean) ,从不同的角度来 展示如何编写 Web 图表的 Java 程序。 2. 借助第三方的图表生成引擎来完成图表, 主要利用一些 Java 开放源代码组织开发的作品, 例如: ? 由 www.jfree.org 推出的 JFreeChart; ? 由 cewolf.sourceforge.net 推出的 Cewolf。 Cewolf 是基于 JFreeChart 的二次开发。 实质上,是基于 JFreeChart 的应用。JFreeChart 没有免费提供开发文档,只有英文版的相关资料,因此 JFreeChart 和 Cewolf 在国内的应用 受到了一定的限制。 根据我们使用及研究 JFreeChart 和 Cewolf 的经验,将在本书中提供大量的例程和详尽 的讲解,帮助读者轻松地掌握上述两种非常优秀的、基于 Java 的 Web 图表生成引擎。相信阅 读本书,并加以必要的练习,读者将会发现,基于 JSP 的 Web 图表编程是可以轻松完成的。 本书结构及内容 本书例程丰富、代码简洁、结构清晰、讲解准确、图文并茂。共分九章,各章具体内容 如下: 第 1 章 Java 概述 本章主要概述 Java 历史及其发展、Java 开发环境的建立,以及编写一个简单的 Java 应 用程序。
  • 2. 第 2 章 Java Applet 与绘图基础 本章简要介绍 Applet 绘图基础,例如:图形环境、图形对象、基本的字体及颜色控制, 以及如何使用 Applet 绘制一些基本的几何图形。通过本章的学习,读者将掌握基本的 Java 图像编程方法。 第 3 章 Java Applet 图表绘制实例 本章综合利用绘制基本几何图形的方法来开发以下常见的图表: ? ·垂直柱状图 ? ·饼图 探讨如何以图表的方式生成以下内容: ? ·在 Web 动态图表中加载外部图像文件 ? ·支票 ? ·如何从 HTML 文档中获取参数生成动态图表 通过本章的学习,读者将会理解任何复杂的图表都可以分解成一些基本的几何图形;通 过排列组合不同的外部图像文件,以及基本的几何图形,就可以生成复杂的图表。 第 4 章 JSP/Servlet 运行环境的搭建 本章主要介绍 JSP Web 服务器的安装。在运行 JSP/Servlet 之前,首先需要安装 JSP/ Servlet 的运行环境,它就是我们平常所说的,支持 JSP/Servlet 的 Web 服务器(容器) 。 目前有很多支持 JSP/Servlet 的 Web 服务器,我们先介绍两种免费的、高性能的、适合 中小企业 JSP/Servlet 的 Web 服务器——Tomcat 和 Resin,并将详细阐述 Tomcat 实现 JSP/Servlet 的运行机制。此外,介绍一种企业级的 J2EE 服务器——Weblogic,学习如何在 这些服务器中部署及发布基于 JSP/Servlet 的 Web 图表应用程序。 第 5 章 基于 Servlet 的 Web 图表编程 本章讲述 Web 请求/响应机制(get 和 post) 、如何部署 Servlet、如何利用 Servlet 生 成 Web 动态图表, 并且提供了模拟网站投票统计、 生成登录验证码、 普通/3D 甘特图等 Servlet 实例。 第 6 章 JSP Web 图表编程基础 本章讲述 JSP 绘图基础。 JSP 的环境下, 在 如何使用 Java.awt.Graphics 类的各种方法, 包括绘制直线、文本(字符串) 、矩形、椭圆和圆、圆弧、多边形、折线,以及如何加载外部 图像文件,等等。 在绘制基本几何图形的基础上,我们将以圆柱体和立方体为例,展示如何通过绘制多个多边 形并将其组合成复杂几何图形的方法;利用 Java.imageio 包中 ImageIO 类的支持,调用 ImageIO 来执行诸如加载图像,以及对图像进行编码输出等工作。 第 7 章 JSP 与 Java2D Web 图表编程 本章阐述如何利用 Java2D API 对于高级二维图形的处理能力,例如:笔划属性的设 定、 图形填充、渐变色、图像的透明度、字体处理、图形边缘的反锯齿、图形对象的转换以及变 形,等等,利用 B/S 应用程序中生成 Web 图表的方法,并以二维及三维图表的形式,包括折 线图、水平直方图、垂直柱状图、堆栈图、饼图,以及二次曲线来进行讲解和说明。 提供了一个绘制复杂图表的例程——股市大盘指数走势图。通过本章的学习,读者可以 不借助任何第三方的程序,编写生成各种风格、复杂的 Web 图表应用程序。 第 8 章 开放源代码与 Web 图表编程 本章详细讲述了 JFreeChart 和 Cewolf 这两个 Web 图表生成引擎的安装、配置及使用方 法。提供了在 JFreeChart 和 Cewolf 的环境下生成以下类型图表的完整例程及讲解: ? 普通/3D 水平及垂直直方图、普通/3D 饼图、普通/3D 堆栈图 ? 线段(曲线)图、区域图、时序图、蜡烛图、移动平均线图
  • 3. ? 罗盘图、温度计图、速度表图、信号图 ? 甘特图、多轴图表、组合图表 此外,还包括如何在 Cewolf 的环境中,创建自定义绘制属性的图表。 第 9 章 Web 图表生成引擎的设计思路与实现 本章讨论如何开发一个图表生成引擎; 如何设计图表生成引擎 (封装成 JavaBean 的形式) 以达到高效、重复使用的目的。图表生成引擎的设计难点是什么?该如何处理?如何优化引 擎?我们将提供具体的实例加以讲解。通过本章的学习,读者将会感受到,图表引擎的设计 原来可以这么轻松地实现! 本书的适用对象 本书适合从事 Java 及 Web 编程的开发人员, JSP/Servlet 应用程序中需要提供图表显 在 示及处理功能的 JSP/Servlet 程序开发者,以及编程爱好者阅读。对于初学入门的应用开发 人员,可以作为自学的实践指导书;对于已经从事 Web 编程工作的人员,可以作为一本供随 时翻阅查询的案头参考书。 建议 我们建议读者在学习期间避免使用可视化的开发工具, 例如: JBuilder、JCreator、KAWA、 Visual Cafe、Eclipse、IntelliJ IDEA、BEA WebLogic Workshop、Oracle JDeveloper 等, 所有工作都可以使用 JSP 服务器(Tomcat/Resin)+ WWW 浏览器(IE/Mozilla/Firefox)+文 本编辑器(EditPlus)来完成。附录中,我们向读者介绍了一种优秀的 Java IDE 开发工具— —Gel。利用 Gel,可以方便地创建、编辑、编译及运行 Java/JSP/Servlet 应用程序。 为了达到最佳的学习效果,我们建议读者在阅读本书的同时,亲自动手按照本书的示例 去操作。 所有的源程序都可以在 www.broadview.com.cn 网站上下载, 但建议读者最好对照源 程序自己动手录入一次,这样可以加深理解和记忆。 因本书的例程非常丰富,为节省篇幅,故基本上不列出每个例程的完整清单。本书详尽 地讲解了每个源程序的设计思路、 运行机制及相对应的核心代码段。 建议读者在阅读本书时, 首先用 EditPlus 之类的文本编辑器来打开相应例程的源程序, 其次阅读其完整的源程序, 最 后再阅读本书的讲解,相信这样会让读者取得事半功倍的效果。 致谢 本书由钟京馗(City University of New York)执笔主编和最后定稿。唐桓(University of Bridgeport)参与本书例程的编写与调试工作。 本书出版之际,特别鸣谢钟志祥、李美行、朱晓蕾、朱正才、胡元妹、黄桂玉、武冠军、唐 光富、彭燕给予的大力支持与协助。 在编写本书的过程中,我们尽力保持内容的科学性、先进性和实用性,同时力求做到讲 解原理,深入浅出,语言通俗易懂。但鉴于作者学识有限,不足之处在所难免,见仁见智, 恳请广大读者指正。我们将在本书的再版中使其更臻完善。  钟京馗 2005 年 9 月于纽约
  • 4. 第 1 章  Java 概述  1  1.1  Java 简介  1  1.1.1  Java 发展简史  1  1.1.2  Java 的体系  2  1.1.3  Java 的优点  3  1.2  Java 开发环境的搭建  4  1.2.1  Java 运行环境的要求  4  1.2.2  Java 的安装和配置  6  1.3  Java/JSP 开发工具  8  1.3.1  EditPlus 简介  9  1.3.2  UltraEdit 简介  11  1.3.3  其他 Java/JSP 开发工具  13  1.4  第一个 Java 程序  15  1.5  本章小结  17  第 2 章  Java Applet 与绘图基础  18  2.1  Java Applet 概述  18  2.2  Java Applet 工作流程  20  2.2.1  组件与容器  20  2.2.2  Applet 的编译与执行  22  2.2.3  包含 Applet 的 HTML 23  2.3  绘制文本(字符串)  23  2.4  绘制线段  29  2.5  色彩管理  31  2.5.1  色彩基础  31  2.5.2  Java 的色彩管理  34  2.6  字体控制  36  2.7  绘制矩形  40  2.7.1  绘制普通矩形  40  2.7.2  绘制 3D 矩形  43  2.8  绘制椭圆  46  2.8.1  绘制普通(空心)椭圆  46  2.8.2  绘制实心椭圆  48  2.8.3  绘制 3D 椭圆  49  2.8.4  绘制圆柱体  50  2.9  绘制圆弧  54  2.9.1  绘制普通(空心)圆弧  55  2.9.2  绘制实心圆弧  56  2.9.3  绘制 3D 圆弧  57  2.10  绘制多边形  59  2.10.1  绘制空心多边形  59  2.10.2  绘制实心多边形  61  2.10.3  绘制折线  61  2.10.4  绘制三角形(箭头)  62  2.10.5  绘制平行四边形及立方体  69
  • 5. 2.11  图像的载入与显示  78  2.11.1  在 Applet 中加载和  2.11.1  显示图像  78  2.11.2  使用 MediaTracker 加载并  2.11.2  显示图像  84  2.11.3  使用双缓冲技术绘制图像  89  2.12  本章小结  93  第 3 章  Java Applet 图表绘制实例  94  3.1  Java Applet 生成 Web  3.1  动态图表  94  3.1.1  垂直柱状图  95  3.1.2  饼图  102  3.2  Java Applet 生成单据  109  3.2.1  带徽标的 Web 动态图表  110  3.2.2  支票的生成  111  3.3  从 HTML 文档获取参数  3.3  生成动态图表  123  3.3.1  传递参数的 HTML 文档  123  3.3.2  获取参数并生成图表  124  3.4  本章小结  126  第 4 章  JSP/Servlet 运行环境的搭建  128  4.1  Tomcat 的安装和配置  128  4.1.1  Tomcat 的安装  129  4.1.2  测试第一个 JSP 程序  132  4.1.3  配置 Tomcat 132  4.1.4  转换后的 JSP 页面文件  145  4.2  Resin 的安装和配置  147  4.2.1  Resin 的安装  147  4.2.2  Resin 的配置  149  4.3  BEA Weblogic 的安装和配置  150  4.3.1  BEA Weblogic 的安装  150  4.3.2  BEA Weblogic 的配置  152  4.3.3  测试 BEA Weblogic  4.3.3  的配置  155  4.3.4  部署第一个 Web  4.3.4  应用程序  156  4.4  本章小结  157  第 5 章 基于 Servlet 的 Web 图表编程  158  5.1  Servlet 简介及其构架  158  5.1.1  Servlet 的特点  158  5.1.2  Servlet 的接口  159  5.1.3  HttpServlet 类简介  160  5.1.4  HttpServletRequest 接口  161  5.1.5  HttpServletResponse 接口  162
  • 6. 5.2  Servlet 处理 HTTP get 请求  163  5.3  Servlet 处理包含数据的 HTTP  5.3  get 请求及解决中文乱码  177  5.4  Servlet 处理 HTTP post 及包含  5.4  数据的 post 请求  187  5.5  Servlet 生成 Web 投票统计图  191  5.6  Servlet 生成登录验证码  198  5.6.1  Servlet 生成登录验证码  5.6.1  实例 1 199  5.6.2  Servlet 生成登录验证码  5.6.2  实例 2 209  5.7  Servlet 高级设置  214  5.7.1  Servlet 初始化参数  214  5.7.2  Servlet 加载优先级  216  5.7.3  Servlet 映射  217  5.8  Servlet 绘制甘特图  218  5.9  Servlet 绘制 3D 甘特图  222  5.10  本章小结  228  第 6 章  JSP Web 图表编程基础  229  6.1  JSP 概述  230  6.1.1  JSP 运行机制  231  6.1.2  JSP 的优点  233  6.2  JSP 语法简介  234  6.2.1  JSP 文件结构  234  6.2.2  JSP 文件中的元素简介  240  6.3  JSP 调用 Servlet 生成  6.3  动态图表  257  6.3.1  JSP 生成验证码  257  6.3.2  JSP 生成甘特图  258  6.3.3  JSP 其他相关知识  258  6.4  JSP 生成基本动态图表  260  6.4.1  JSP 绘制文本和线段  260  6.4.2  JSP 与字体控制  266  6.4.3  JSP 绘制矩形  273  6.4.4  JSP 绘制椭圆  275  6.4.5  JSP 绘制圆弧  276  6.4.6  JSP 绘制多边形和折线  277  6.4.7  JSP 绘制三角形  277  6.4.8  JSP 绘制平行四边形和  6.4.8  立方体  280  6.4.9  JSP 加载并显示图像  281  6.5  本章小结  282  第 7 章  JSP 与 Java2D Web 图表编程  283  7.1  Java2D 概述  283
  • 7. 7.2  Java AWT 与 Java2D 285  7.3  Java2D 与填充属性  287  7.3.1  设置填充属性  287  7.3.2  填充属性的用法  287  7.4  Java2D 与笔划属性  291  7.4.1  线段端点的形状风格  292  7.4.2  线段转折处的形状风格  292  7.4.3  虚线风格  293  7.4.4  BasicStroke 构造器  294  7.4.5  Java2D Web 图表实例  7.4.5  之折线图  294  7.5  创建基本 Java2D 图形  309  7.5.1  Java2D 图形(Shape)  7.5.1  接口概述  309  7.5.2  Point2D 310  7.5.3  Line2D 311  7.5.4  Rectangle2D 312  7.5.5  RoundRectangle2D 314  7.5.6  Java2D Web 图表实例之  7.5.6  柱状图  315  7.5.7  Ellipse2D 333  7.5.8  Arc2D 334  7.6  Java2D 实例饼图类图表  337  7.6.1  普通饼图  338  7.6.2  圆圈图  342  7.6.3  3D 饼图  344  7.7  图形重叠  346  7.8  alpha 复合  348  7.8.1  alpha 复合概述  348  7.8.2  AlphaComposite 类的使用  350  7.8.3  AlphaComposite 应用实例  352  7.9  图形对象的转换  357  7.9.1  图形对象转换(transformation)  7.9.2  概述  357  7.9.2  平移(translation)  359  7.9.3  旋转(rotation)  360  7.9.4  缩放(scale)  362  7.9.5  扭曲(shear)  364  7.10  图形渲染线索  366  7.11  Java2D 与高级文本处理  368  7.11.1  空心文本  368  7.11.2  弯曲文本  369  7.11.3  单行长文本自动分行  371  7.12  Java2D 创建复杂图形  373
  • 8. 7.12.1  Area 374  7.12.2  曲线  375  7.12.3  通用路径  377  7.13  Web 图表实例解析  379  7.13.1  透明 3D 饼图  379  7.13.2  股市指数走势图  381  7.14  本章小结  391  第 8 章 开放源代码作品与 Web 图表编程  392  8.1  开放源代码作品简介  392  8.2  JFreeChart 与 JSP 图表编程  394  8.2.1  JFreeChart 简介  394  8.2.2  JFreeChart 的安装及其  8.2.2  核心类  395  8.2.3  JFreeChart 生成直方图表  398  8.2.4  JFreeChart 生成饼型图表  411  8.2.5  JFreeChart 生成线段图表  416  8.2.6  JFreeChart 生成区域图表  420  8.2.7  JFreeChart 生成时序  8.2.7  (Time Series)图表  424  8.2.8  JFreeChart 生成甘特图表  430  8.2.9  JFreeChart 生成多轴  8.2.9  (Multiple Axis)图表  432  8.2.10  JFreeChart 生成组合  8.2.10  (Combined Axis)图表  435  8.2.11  JFreeChart 生成其他类型  8.2.11  的图表  441  8.3  JFreeChart 与 Servlet  8.3  图表编程  444  8.3.1  简单的 Servlet 图表编程  444  8.3.2  交互式 Servlet 图表编程  446  8.4  Cewolf 与 JSP 图表编程  448  8.4.1  Cewolf 简介  448  8.4.2  Cewolf 的下载与安装  448  8.4.3  Cewolf 生成直方图表  450  8.4.4  Cewolf 生成基于 DefaultCategory  8.4.4  Dataset 数据集的图表  454  8.4.5  Cewolf 生成饼图  460  8.4.6  Cewolf 生成基于 XYDataset  8.4.6  数据集的图表  462  8.4.7  Cewolf 生成基于 OHLCDataset  8.4.7  数据集的图表  465  8.4.8  Cewolf 生成甘特图表  466  8.4.9  Cewolf 生成信号图表  467  8.4.10  Cewolf 生成速度图表  468
  • 9. 8.4.11  Cewolf 生成 OverLay 类型  8.4.11  的图表  468  8.4.12  Cewolf 生成组合图表  470  8.4.13  生成自定义风格的  8.4.13  Cewolf 图表  472  8.5  本章小结  473  第 9 章  Web 图表生成引擎的设计思路与实现  475  9.1  Web 动态图表生成引擎的  9.1  设计思路  475  9.2  Web 动态图表生成引擎的  9.2  设计模型  480  9.2.1  生成普通线段图的  9.3.2  JavaBean 480  9.2.2  生成 3D 线段图的  9.3.2  JavaBean 483  9.2.3  生成普通直方图的  9.3.2  JavaBean 484  9.2.4  生成 3D 直方图的  9.3.2  JavaBean 487  9.2.5  生成普通饼图的  9.3.2  JavaBean 488  9.2.6  生成 3D 饼图的  9.3.2  JavaBean 490  9.3  数据分离  491  9.3.1  创建及调用 CategoryDataset  9.3.2  类数据集对象  491  9.3.2  创建及调用 PieDataset 类  9.3.2  数据集对象  495  9.4  引擎的优化概述  496  9.5  本章小结  498  附录  Gel 使用指南  499
  • 10. 第 1 章  Java 概述  Java 是美国 Sun 微系统公司(Sun  Microsystems,  Inc.)开发,近年来飞速发展的一项崭 新的计算机技术。  1.1  Java 简介  Java 既是一种程序设计语言,也是一个完整的平台。作为一种程序语言,它简洁、面向 对象、 安全、 健壮,以及适用于 Internet 技术;而作为一个平台(JRE,  Java Runtime Environment,  Java 运行环境或者说是 Java 虚拟机)对于符合 Sun 公司 Java 标准的应用程序, , 都可以在 Java  平台上正确运行,与程序运行的操作系统无关。  Java  为什么能够成为目前编写  Web  应用程序的首选设计语言呢?并且具备跨平台的能 力呢?我们先简单地了解一下 Java 的发展历史和体系结构。  1.1.1  Java 发展简史  Java 起初并非叫做 Java,而是叫做 Oak。早期是为了嵌入式系统而设计的一项产品。20  世纪 90 年代初期,  公司预测微处理器的发展将会对家用电器以及智能化电子消费设备起 Sun 到决定性的作用,于是,在 1990 年 12 月,Sun 公司就由 Patrick Naughton、Mike Sheridan 和  James  Gosling 成立了一个叫做 Green  Team 的小组。其主要目标就是开发一种分布式系统架 构,使其能够在智能化电子消费设备作业平台上执行。例如,PDA、手机、信息家电(IA,  Internet/Information  Appliance)等。一开始,准备采用 C++,但 C++太过复杂,安全性差。 最后,基于 C++开发出一种新的语言 Oak,Oak 是一种用于网络、精巧而安全的语言。  1992 年,Green Team 发表了一款名叫 Star Seven(*7)的机器,它有点像现在我们熟悉 的 PDA,但市面上的 PDA 几乎都不是它的对手,更不要说是早在 10 年前那个计算机还不普 及的时代了。Java 语言的前身 Oak 就这样诞生了,主要目的是用来编写在 Star Seven 上的应 用程序。为什么叫 Oak 呢?原因是 James  Gosling 办公室的窗外,正好有一棵橡树(Oak) , 就取了这个名字。至于为什么 Oak 又会改名为 Java 呢?这是因为在 Oak 注册商标时,发现 已经被另外一家公司使用了。那要取什么新名字呢?工程师们边喝着咖啡边讨论着,看着手 中的咖啡,突然灵机一动,就叫  Java  好了。就这样它就变成了大名鼎鼎、如日中天的  Java  了。 但是,Green Team 的项目发展却不尽如人意。智能化电子消费设备的市场发展远远低于  Sun 的预期设想。 Sun 公司曾依此投标一个交互式电视项目, 结果被 SGI 打败了。 可怜的 Oak  几乎无家可归,就在举步维艰,随时会被取消的时刻,情况却发生了巨大变化。1993 年,因 特网在美国开始大规模的发展,基于因特网的 WWW 也爆炸性地流行起来。Sun 公司发现,  Green  Team 的项目研究成果——Java 似乎天生就是为因特网而诞生的,因为恰巧就是 Mark  Andreessen 开发的 Mosaic 和 Netscape 启发了 Oak,他们利用 Java 开发了 HotJava 浏览器,得 到了 Sun 公司首席执行官 ScottMcNealy 的支持,触发了 Java 进军 Internet。 于是,Java 第一次以 Applet 的形式在因特网上出现了。Applet 不但使 WWW 页面显示 静态的内容,而且可以显示动态的内容和动画。同时实行了本地计算机,从远程联网的服务
  • 11. 器上下载资料并正确地显示出来。这些技术在当时引起了巨大的震撼,促使 Java 在因特网上 得以飞速地发展。  1995 年 5 月 23 日,  在 SunWorld’95 上正式发布 Java 和 HotJava 浏览器。  Sun 1.1.2  Java 的体系  Java 发展到今天,已从编程语言发展成为全球第一大通用开发平台。Java 技术已被计算 机行业主要公司所采纳。  1999 年,  公司推出了以 Java2 平台为核心的 J2EE、  Sun J2SE 和 J2ME  三大平台。随着三大平台的迅速推进,全球形成了一股巨大的 Java 应用浪潮。  1.Java 2 Platform, Micro Edition(J2ME)  Java  2 平台微型版。Sun 公司将 J2ME 定义为“一种以广泛的消费性产品为目标、高度 优化的 Java 运行环境”自 1999 年 6 月在 JavaOne Developer Conference 上声明之后,  。 J2ME  进入了小型设备开发的行列。 通过 Java 的特性, 遵循 J2ME 规范开发的 Java 程序可以运行在 各种不同的小型设备上。  2.Java 2 Platform, Standard Edition(J2SE)  Java 2 平台标准版,适用于桌面系统应用程序的开发。本书例程就是利用 J2SE 5.0 版的 相关图形 API 包来开发的。  3.Java 2 Platform, Enterprise Edition(J2EE)  J2EE 是一种利用 Java 2 平台来简化企业解决方案的开发、 部署和管理等相关复杂问题的 体系结构。J2EE 技术的核心就是 Java 平台或 Java 2 平台的标准版,J2EE 不仅巩固了标准版 的许多优点,例如: “一次编写、随处运行”的特性、方便存取数据库的 JDBC API、CORBA  技术,以及能够在  Internet  应用中保护数据的安全模式等,同时还提供了对 EJB(Enterprise  JavaBeans)、Java Servlets API、JSP(Java Server Pages) ,以及 XML 技术的全面支持。 本书第 4 章,阐述了如何将我们开发的 JSP 图表应用程序,在 J2EE 平台上进行部署和 管理。  1.1.3  Java 的优点  Java 是一种面向对象、分布式、解释、健壮、安全、可移植、性能优异,以及多线程的 语言。下面简单介绍其中的几个优点。  1.Write Once, Run Anywhere  “一次编写, 随处运行” 这是程序设计师们喜爱 Java 的原因之一, 。 核心就是 JVM(Java  虚拟机)技术。 编写好一个 Java 程序, 首先,要通过一段翻译程序, 编译成一种叫做字节码的中间代码。 然后经 Java  平台的解释器,翻译成机器语言来执行——平台的核心叫做 JVM。Java  的编译 过程与其他语言不同。例如,C++在编译的时候,是与机器的硬件平台信息密不可分的。 编译程序通过查表将所有指令操作数和操作码等,转换成内存的偏移量,即程序运行时的 内存分配方式,以保证程序运行。而 Java 却是将指令转换成为一种扩展名为 class 的文件, 这种文件不包含硬件的信息。只要安装了 JVM,创立内存布局后,通过查表来确定一条指 令所在的地址,这就保证了 Java 的可移植性和安全性。 上述 Java 程序的编译和运行流程,如图 1.1 所示。
  • 12. Interpreter 编译器 ①:编译 MyApp.java  ②:运行 源文件  Ø 装载类 ① Ø 生成字节码 Ø 及时编译 Ø 解释执行  ② Java  Java  Java  应用 应用 应用 程序  程序  程序  JVM  JVM  JVM  (J2SE)  (J2SE)  (J2ME)  Unix/Linux  MS Windows  Palm OS  图 1.1  Java 的编译和运行流程 
  • 13. 2.简单 纯粹的面向对象,加上数量巨大的类所提供的方法(函数)库的支持,使得利用 Java 开 发各种应用程序,可以说是易如反掌。此外,在程序除错、修改、升级和增加新功能等方面, 因其面向对象的特性,使得这些维护也变得非常容易。  3.网络功能  Java 可以说是借助因特网而重获新生的,自然具备编写网络功能的程序。不论是一般因 特网/局域网的程序,如 Socket、Email、基于 Web  服务器的 Servlet、JSP 程序,甚至连分 布式网络程序,如 CORBA、RMI 等的支持也是非常丰富的,使用起来也很方便。  4.资源回收处理(Garbage Collection)  Garbage  Collection 是由 JVM 对内存实行动态管理的。程序需要多少内存、哪些程序的 内存已经不使用了,需要释放归还给系统,这些烦琐且危险的操作全部交由  JVM  去管理。 让我们能够更专心地编写程序,而不需要担心内存的问题。内存的统一管理,对于跨平台也 有相当大的帮助。  5.异常处理(Exception) 为了使 Java 程式更稳定、更安全,Java 引入了异常处理机制。能够在程序中产生异常情 况的地方,执行相对应的处理,不至于因突发或意外的错误造成执行中断或是死机。通过这 种异常处理,不仅能够清晰地掌握整个程序执行的流程,也使得程序的设计更为严谨。  1.2  Java 开发环境的搭建 现在我们开始搭建 Java 开发环境。本章仅涉及 J2SDK 开发环境的安装与调试,并不涉 及 JSP 及 J2EE 服务器的安装与调试,这部分内容将在第 4 章进行说明。  1.2.1  Java 运行环境的要求 首先,需要了解 Java 对计算机主要硬件要求的最低配置,如表 1.1 所示。该表右边部分 为笔者写作本书时所使用的计算机配置。因为涉及大量在计算机内存中进行绘制各种图表的 运算与操作,建议使用较高配置的计算机以及尽可能多的内存,以便流畅地运行本书中的程 序。 表 1.1  Java 的计算机硬件配置 硬 件 最低要求 笔者的配置  CPU  Intel 或者兼容微处理器,奔腾 166MHz 及其以上  AMD Athlon 3200+  最低 32MB,可以运行图形界面的 Java Application; 512 MB DDR,Kingston 内存 内存 最低 48MB,可以运行 Java Applet;内存不足,将会导 (如果读者希望把本书中的例程运行在 J2EE 的 致系统(尤其是服务器)的性能大幅下降  服务器,如 WebLogic,最好不低于 256 MB) 硬盘  242 MB  80 GB  图形显示卡 无要求  Nvidia Ti 4200 64 MB DDR  网卡 普通网卡  3Com OfficeConnect 10/100 兆位网卡 其他部件,如图形显示卡、光驱及显示器等,Java 并没有特别的要求。因为本书涉及图
  • 14. 形的实时生成, Java 的图形生成是通过图形显示卡调用 OpenGL 功能来加速图像的渲染和 而 处理的。因此,如果系统拥有一块高质量的图形显示卡,将会大大地提高系统的性能。目前 市面上的图形显示卡,无论是在计算机主板上集成的显卡,还是普通的独立图形显示卡,都 具有强大的图形处理功能,足以满足流畅地运行本书中的所有例程。  Java 具有跨平台的特点,支持所有的主流操作系统,如下所示。  1.微软公司  Windows 系列 Ø  Windows 98 / Me  Ø  Windows NT  Ø  Windows 2000 / Windows 2000 Server  Ø  Windows XP  Ø  Windows 2003 Server  2.UNIX 系列 Ø  AIX,  IBM 的 UNIX, 是根据 SVR2 以及一部分 BSD 延伸而来, 加上各种硬件的支持。 具备特有的系统管理功能(SMIT,系统管理接口工具) 。 :基于 4.3BSD,包含许多来自 System  V 的东西。Sun  Ø  SunOS(680x0,Sparc,i386) 公司开发的 UNIX 操作系统,该系统对 UNIX 的贡献是:NFS,OpenLook GUI 标准, 现演变为 Solaris。 Ø  HP­UX(HP) :惠普公司的 UNIX。 Ø  SCO UNIX。  3.类 UNIX 系列 Ø  Linux:包括各种版本的 Linux,如 RedHat、Turbo 和 Mandrake Linux。 Ø  FreeBSD:由美国加州大学伯克利分校计算机系统研究小组设计和维护。
  • 15. 4.其他操作系统 Ø  Mac OS:苹果电脑公司推出的操作系统,主要用于 Power PC。 上述操作系统都可以安装 Java。 笔者的操作系统是微软 Windows XP SP2。本书的所有例 程都是在 Windows XP 环境下进行编写和调试的。  1.2.2  Java 的安装和配置 本书采用 Sun 公司发布的最新版本,也是近年来 Java 最重要的一个升级版本——Java  2  Platform Standard Edition 5.0,即 J2SE 5.0 作为我们的 Java 开发平台。至于 J2SE 5.0 具备哪些 新的功能和特性,请读者自行查阅相关资料。本书将尽量使用 J2SE 5.0 中的新特性来增强代 码的性能,如 Image I/O、Java 2D 等,具体将在其他章节中说明。  J2SE 5.0 的下载地址:http://java.sun.com/j2se/1.5.0/download.jsp。双击下载文件:jdk­1_  5_0­windows­i586.exe 就开始了 J2SE 5.0 开发环境的安装过程,如图 1.2 所示。 默认 图 1.2    Java 的安装过程者一:改变默认的安装路径 安装过程如下: (1) 安装程序经过自解压后, 就会出现安装协议的对话框, 【I accept the terms in the  选择 license agreement】并单击【Next】按钮; (2)在出现选择安装路径的对话框时,我们改变 J2SE  5.0 的默认安装路径。单击右边 的【Change…】按钮,在出现的路径修改对话框中,输入“c:jdk1.5.0”后退回到先前的对话 框; (3)单击【Next】按钮,继续剩余部分的安装。接着 J2SE 5.0 会提示 Java 运行环境(即  JRE 5.0)的安装路径,这里不做任何的改变,采用其默认设置。 然后,连续单击【Next】按钮直到完成安装。最后系统会提示重新启动计算机,再重新 启动计算机,需要对运行 Java 的环境变量进行设置。这是非常重要的一个步骤,如果没有设 置成功,在运行 Java 时会出现错误。 环境变量的设置,如图 1.3、图 1.4 所示。
  • 16. 图 1.3    Java 的安装过程之二:环境参数的设置 (1)进入【控制面板】,单击【系统】 ,在出现的【系统属性】对话框中,单击【高级】 选项。 (2)单击【环境变量】按钮。 (3)在环境变量对话框中,单击位于【系统变量】组中的【新建】按钮。 (4)新建一个系统变量, “变量名”为 JAVA_HOME,“变量值”为 C:JDK1.5.0,然后 单击【确定】按钮,如图 1.4 所示。这个 JAVA_HOME 的值就是 J2SE 5.0 的安装路径。 图 1.4    Java 的安装过程之三:环境参数的设置 (5) 重复第 4 步, “变量名” 在 中输入“CLASSPATH” 在 , “变量值”中输入 “.  %JAVA _HOME%lib”。注意,这里的“.”是要求 JAVA 编译器在查找 JAVA class 文件时,首 先从当前目录开始。 (6)最后是修改系统变量“PATH”的值, PATH”的新值是在原有值前面加上 “ “%JAVA_HOME%bin;”。 提示:在 Java  1.2 版以后,不再需要 CLASSPATH  来设置系统类的路径。CLASSPATH  是为了设置用户编写的类或者第三方开发的类库而设置的。 现在,为确保系统环境变量生效,重新启动计算机。重启之后,测试 J2SE 5.0 的安装与 环境变量设置是否正确。单击【开始】→【所有程序】→【附件】→【命令提示符】 ,启动命 令提示符后,在该窗口中输入如下命令: echo %java_home%  echo %classpath%  echo %path%
  • 17. java –version 在笔者本机上,得到如图 1.5 所示的结果。 图 1.5  测试 Java 运行环境系统参数的设置 如果读者得到如图 1.5 一样的结果,就说明最新版的 Java 开发环境已经安装成功。 提示:读者计算机中“Path”值可能同笔者计算机的值不一样,但其中一定要包含 “C:jdk1.5.0bin”的内容。  1.3  Java/JSP 开发工具 为了获得 Java 图表编程学习的最佳效果, 本书所有源程序都没有使用任何一种可视化的  Java  开发环境来进行开发。建议读者在学习期间不要使用可视化的开发工具,如  JBuilder、  JCreator、KAWA、Visual  Cafe、Eclipse、IntelliJ  IDEA、BEA  WebLogic  Workshop、Oracle  JDeveloper  等。本书所有的操作,都可以用  JSP  服务器(Tomcat/Resin)+WWW  浏览器 (IE/Mozilla/Firefox)+文本编辑器(EditPlus)来轻松完成。这样,我们才可以深刻地理解 系统的运行机制。等到读者对此非常熟悉的时候,再使用可视化开发工具进行开发,定会达 到事半功倍的效果。此外,在本书的附录中,我们将向读者介绍一款优秀的 Java IDE 开发工 具——Gel。利用 Gel,可以方便地创建、编辑、编译及运行 Java/JSP/Servlet 应用程序。建议 读者循序渐进地学习之后,再来学习 Gel,相信一定会喜欢上这款精巧而强大的 Java 开发环 境。 基于文本编辑器的 Java/JSP 开发工具有很多种,如记事本、UltraEdit、EditPlus 等。但最 简单及成本最低廉的非  Windows  自带的记事本(NotePad)莫属了。可以直接使用记事本进 行 Java/JSP 的程序设计, 它具有简单、方便的特点。 但其毕竟不是为程序员准备的开发工具, 因此,并不适用于程序设计。 现在,向读者推荐一款韩国的文本编辑器——EditPlus 作为我们的 Java 及 JSP 编辑器。  1.3.1  EditPlus 简介  EditPlus  是由韩国人编写的一款共享软件,官方网址是  www.editplus.com。最新版本是  EditPlus 2.12。EditPlus 是功能全面的文本、HTML、程序源代码编辑器。主要特点如下: (1)默认支持  HTML、CSS、PHP、ASP、Perl、C/C++、Java、JavaScript  和  VBScript  的语法高亮显示,通过定制语法文件,可以扩展到其他程序语言。 (2)EditPlus 提供了与 Internet 的无缝连接,可以在 EditPlus 的工作区域中打开 Intelnet  浏览窗口。
  • 18. (3)提供了多工作窗口。不用切换到桌面,便可在工作区域中打开多个文档。 (4)正确地配置 Java 的编译器“Javac”以及解释器“Java”后,使用 EditPlus 的菜单 可以直接编译执行 Java 程序。 所谓的文本编辑器,最终还是要归结在文本编辑上。EditPlus  提供了比普通编辑器更加 强大的编辑功能。首先可以无限制地 Undo,其次具有更强大的删除功能,EditPlus 不仅可以 删除一个字,而且还可以删除选择部分、删除整个行等。提供了更强大的复制功能,可以复 制整个行,如单击【Edit】菜单,选择【Duplicate line】命令,即可实现此功能。这些大大地 超越了记事本的功能。  EditPlus 查找/替换功能也是一流的。不但可以进行一般的查找和替换,而且支持以正则 表达式的方式进行查找与替换, 甚至可以在磁盘某一目录的所有文件中, 进行字符串的查找。 比如说,笔者要查找 D:webchart 目录(包括其子目录)下,所有的 jsp 文件中,哪些文件包 含了字符串: “charset=GB2312”,我们就可以单击菜单栏上的【Search】 ,选择【Find in Files】 命令。如图 1.6 所示,在出现的查找对话框中,分别填入以下内容: Ø【Find what】填入“charset=GB2312”,表示要查找的内容。 Ø【File  type】填入“*.jsp” ,表示要查找所有扩展名为  jsp 的文件,如果这一栏不输入 任何条件,则表示在所有的文件中查找,而忽略文件的格式。 Ø【Folder】填入“d:webchart” ,表示希望查找文件位于 d:webchart 这个目录下。 Ø 如果要查找  d:webchart  及其子目录下的所有  jsp  文件,就需要选中该对话框中的 “include subfolders”选项。 填好上述栏目后,单击该对话框中的【Find】按钮,就可以在  EditPlus  下方的输入输出 窗口中,得到查找的结果了。在输出窗口中,会提供一个被查找到的匹配文件的清单。在此 窗口的左侧,指出与被查找的字符串“charset=GB2312”相匹配文件的所在目录以及文件名, 然后给出字符串在该文件中出现的位置,该位置用行列坐标表示。在输出窗口的最底部,  EditPlus 会提供一个统计结果——查找到的匹配的文件总数。 图 1.6    EditPlus 的 Find in Files 功能 双击查找结果清单中出现的任一文件名,EditPlus  会在主窗口中显示出该文件的内容, 并将鼠标指针定位到被查找的字符串第一次出现的位置。 该功能在大量文件中进行查找时,提供了强大的支持。 前面谈到,设置好 Java 的编译器“Javac”和解释器“Java”后,通过 EditPlus 的菜单可
  • 20. 运行 Java 的配置 图 1.7    EditPlus 设置编译与运行 Java 程序的功能 Ø【Add Tool】 :表示新增一个用户自定义工具。 Ø【Program】 :表示该工具与程序有关。 Ø【Menu text】 :表示要求为添加的工具命名。这里填入:编译 JAVA。 Ø【Command】 :表示该工具运行时,所调用的可执行程序。Java 中的编译命令是 javac, 所以这里选择 Java 安装目录中 bin 子目录中的 javac.exe 程序。 Ø【Argument】 :表示执行  javac.exe  程序时,所需要的参数。单击旁边的带有向下三角 形的按钮来选择“$(FilePath) ”即可。 Ø 【Initial  directory】:选择初始化目录。单击旁边的带有向下三角形的按钮来选择“$  (FileDir) ”即可。 Ø【Capture output】 :选择捕获屏幕输出。 通过 EditPlus 来编译 Java 程序完成。现在继续增加一个新的工具,设置通过 EditPlus 来 运行编译成功的 Java  程序。方法同前面讲述的设置编译 Java  程序的过程基本相同。按照图  1.7 右下方所示的“运行 Java 的配置”内容,进行设定即可。 正确设置后,无论在 EditPlus 编译还是运行 Java 程序的时候,EditPlus 的输出窗口中都 会显示出相应的编译和运行结果。 关于 EditPlus 就简要介绍到这里。  1.3.2  UltraEdit 简介  UltraEdit 是共享软件,官方网址是 www.ultraedit.com,最新版本是 v11.00a。与 EditPlus  类似,UltraEdit  是一款功能强大的文本、HTML、程序源代码编辑器。作为源代码编辑器, 其默认配置可以对 C/C++、VB、HTML、Java 和 Perl 进行语法高亮显示。设计 Java 程序也 很方便,具有复制、粘贴、剪切、查找、替换、格式控制等编辑功能。  UltraEdit 同样可以在【Advanced】菜单的【Tool Configuration】菜单项配置 Java 编译器  Javac 和解释器 Java,直接编译运行 Java 程序。  UltraEdit 设置 Java 编译器“Javac”的方法如图 1.8 所示。
  • 21. 图 1.8    UltraEdit 设置编译 Java 程序的功能 Ø【Command  Line】 :表示命名行的执行方式。n%表示 Java 源程序的文件名,%e 表示  Java 源程序的扩展名。因为已经正确设置了 Java 的运行路径,所以使用 javac 就可以 了,否则就要用 C:jdk1.5.0binjavac.exe。 Ø【Working Directory】 :表示工作目录。%p 表示工作目录就是当前目录。 Ø【Menu Item Name】 :要求给添加的工具命名。填入:编译 JAVA。 Ø【Save Active File】:表示该工具运行之前,首先保存当前 Java 源程序。 Ø【Output to List Box】:表示将结果输出到列表框中。 Ø【Capture Output】 :选择捕获屏幕输出。 Ø【Insert】:Java 编译的工具菜单就做好了。 同理,设置 Java 解释器“Java”的方法如图 1.9 所示。与前面的步骤类似,只需要更改 第一和第三个步骤即可。 【Command Line】输入“java %n”【Menu Item Name】输入“运行  , Java”。 关于 UltraEdit 就简单介绍到这里。
  • 22. 图 1.9    UltraEdit 设置运行 Java 程序的功能  1.3.3  其他 Java/JSP 开发工具 下面向读者简要介绍两个开放源代码的作品 Eclipse 和 Gel,虽然本书并不使用这两种开 发工具,但笔者觉得有必要向读者介绍一下,目前国外非常流行的 Java IDE 开发工具。  1.Eclipse 简介  Eclipse 是一个开放源代码的项目, 可以在 www.eclipse.org 免费下载 Eclipse 的最新版本。 一般 Eclipse 提供几种下载版本:Release、Stable Build、Integration Build 和 Nightly Build。建 议下载 Release 或 Stable 版本。Eclipse 本身是用 Java 语言编写的,但下载的压缩包中并不包 含 Java 运行环境,需要用户自行安装 JRE,并且需要在操作系统的环境变量中,指明 JRE 中  bin 的路径。如果已经安装了 JDK,就不用安装 JRE 了。 安装 Eclipse 的步骤非常简单,只需将下载的压缩包按原路径直接解压即可。注意,如果 要更新版本,请先删除旧版本重新安装,不能直接解压到原来的路径覆盖旧版本。解压缩之 后,可以到相应的安装路径去找 Eclipse.exe 运行。如果下载的是 Release 或 Stable 版本,并 且 JRE 环境安装正确无误, 一般来说不会有什么问题, 在闪现一个很酷的月蚀图片后,  Eclipse  会显示它的默认界面。  Eclipse 的界面有点像 JBilder,实际操作进程中会发现它更像 IVJ。毕竟开发 Eclipse 的主导 是开发  IVJ  的原班人马(可参考  www.oti.com) 。值得一提的是,Eclipse 项目的参与者除了  IBM  以外,还有 Borland、Rational Software、RedHat、Merant,以及 BEA 等一大批业界的佼佼者,为  Eclipse 的未来奠定了良好的基础。  Eclipse 不仅可以开发 Java 应用程序,还可以安装 Lomboz 插件,并整合 Tomcat 以实现 对 JSP 以及 Java Servlets 的开发。 本书不在这里讨论 Eclipse 的下载、安装、使用、开发、各种插件的安装和使用,以及与  JBoss、Tomcat、WebLogic 等 JSP 或者 J2EE 服务器的整合。有兴趣的读者,请自行查阅相关 资料。 2.Gel 简介  Gel  是由  Gerald  Nunn  发布的一款  Java  IDE  开发工具。Gel  的官方主页是  http://  memescape.co.uk/gexperts/index.html。Gel 是完全免费的,读者可到该网站下载。在本书写作 时,Gel 的最新版本是 RC39。目前该 IDE 工具,在国外众多的 Java、JSP 及 J2EE 程序员中
  • 23. 引起了极大的反响,但国内很少有人使用这款优秀的 Java IDE。  Gel 的运行环境如下: Ø  Windows 95/98/ME/2000/XP  Ø  Internet Explorer 4+  Ø  JDK 1.1+  Gel 的特点如下: (1)编辑器(Editor) Ø 支持对  Java、JSP、HTML、XML、C、C++、Perl、Python,以及更多编程语言的语 法高亮显示。 Ø 无限制地取消及恢复功能。 Ø 整段代码的减少缩进量与增加缩进量。 Ø 高亮显示配对的大括号。 Ø 实时地拼写检查。 Ø 可以显示控制字符。 Ø 整合的源代码管理及控制, 支持 CVS、VSS、Clearcase、Perforce、QVCS、CS­RCS  以 及更多的格式。 Ø 正则表达式搜索。 Ø 文件查找。 Ø 将被选择代码完整地输出为 HTML 及 RTF 文件。 Ø 保持本地程序的更新历史,易于在需要的时候恢复原状。 (2)代码援助(Code Assistants) Ø 自动完成 Java 和 JSP 的编码。 Ø  Java 和 JSP 的参数提示。 Ø  Java 和 JSP 的标识符提示。 Ø 查找声明,并快速跳转到声明所属的变量、方法或类。 Ø 类浏览器。 (3)项目管理(Project Management) Ø 智能文件夹,当系统文件发生改变的时候,自动同步更新。 Ø 可以运行 Applications、Applets 以及应用服务器。 (4)J2EE  Ø 直接预览 Servlets 及 JSP。 Ø 自动完成 JSP 标签,支持 HTML 及自定义 JSP 标签。 (5)其他 Ø 支持集成 ANT。 Ø 支持集成 JUnit。 Ø 定制工具栏及快捷方式。 Ø 支持创建自定义工具。 Ø  Javadoc 浏览器。 总的来说,Gel 虽然小巧,但速度奇快,更重要的是它拥有许多大型 Java IDE 的完整功 能。本书附录,将详细介绍 Gel 的设置及如何利用 Gel 来开发 JSP 程序。  1.4  第一个 Java 程序 前面我们讲解了 J2SE 5.0 的安装及环境变量的设置,现在我们就编写一个很简单的 Java
  • 24. 应用程序 Application 来结束本章的学习。 在 EditPlus 或 UltraEdit 中输入如下代码(chap01Fig1.4WelcomeJavaChart.java): 1: // Fig. 1.4: WelcomeJavaChart.java  2: // 第一个 Java 程序 3:  4: public class WelcomeJavaChart{  5:   // Java 主程序入口 6:  public static void main(String args[]){  7: System.out.println("**************************************");  8:     System.out.println("欢迎来到<<精通 Java Web 动态图表编程>>的世界! ");  9: System.out.println("**************************************");  10:  11:   } //主程序结束 12:  13: } // end class WelcomeJavaChart 该源程序仅仅在命令窗口显示三条文本。可以用传统的方法,在  DOS  下对该文件进行 编译及运行,也可以在 EditPlus 及 UltraEdit 中进行。 将 WelcomeJavaChart.java 拷贝到 D:webchartchap01Fig1.4 子目录下,运行如下命令: D:webchartchap01Fig1.4>javac WelcomeJavaChart.java  D:webchartchap01Fig1.4>java WelcomeJavaChart 编译及运行结果如图 1.10 所示。 在 UltraEdit 中,编译和运行的方法是运行【Advanced】→【编译 JAVA】→【运行 JAVA】 工具,如果全部设置正确,就可以看到如图 1.11 所示的结果。 图 1.10    WelcomeJavaChart.java 的运行结果
  • 25. 图 1.11    UltraEdit 下 WelcomeJavaChart.java 的运行效果 在 EditPlus 中,编译和运行的方法是运行【Tools】→【编译 JAVA】→【运行 JAVA】工 具,如果全部设置正确,就可以看到如图 1.12 所示的结果。
  • 26. 图 1.12    EditPlus 下的 WelcomeJavaChart.java 的运行结果  1.5  本章小结 本章主要介绍 Java 的历史及其运行机制、技术特点,讲解了各种 Java 开发环境的搭建, 包括 JDK 的下载、安装和环境变量的设置,在 EditPlus 和 UltraEdit 中如何设置编译及运行。 此外,简要介绍了两款目前国外流行的 Java IDE 开发环境:Eclipse 和 Gel。最后用一个简单 的 Java Application 来测试搭建的 Java 开发环境是否成功。 只有在正确搭建  Java  开发环境的基础上,才能顺利地搭建  JSP  服务器。下面学习  Java  Applet 的编写和调试,让我们一起进入 Web 图表编程的精彩世界! 第 2 章  Java Applet 与绘图基础  Java 最初在因特网上流行,很大程度上归功于 Java Applet。Java 对图形处理的应用最早 就是从 Applet 开始的,对于希望掌握 Web 动态图表编程的读者来说,从 Applet 着手学习是 一个很好的途径。理解 Applet 的绘图基础,就可以顺利地过渡到如何运用 JSP 来进行图表的 绘制。  2.1    Java Applet 概述  Java 共有两种类型的程序。一种称为 Java  Application,如第 1 章 1.4 节所示的 Welcome
  • 27. JSPChart.java。本章介绍另外一种 Java 程序,这类程序称为 Java Applet。Java Applet 是一种 可以嵌入 HTML 文档(即 Web 页)中并可以被执行的 Java 程序。支持 Java 的浏览器,在浏 览一个包含有 Java Applet 的 Web 页面时,该 Applet 就被下载到该浏览器中,并被 JVM 解释 执行。 目前,支持 Java2 的浏览器有:Mozilla、Netscape7 及其以上版本、Opera 和 FireFox。微 软的 Internet  Explorer 或者早期的 Netscape 版本,需要安装 Java 的插件(Plug­in)才可以正 常浏览 Java Applet 的 Web 页面。 提示:如果读者的计算机中已经安装了 J2SE  5.0 开发环境,那么 IE 就不需要再安装插 件。该插件是作为 J2SE 5.0 的一部分(JRE 5.0)安装在浏览器上的。 我们先来看 J2SE  5.0 中提供的一些 Applet 范例,展示了 Applet 的强大功能。其中每个  Applet 还提供了源代码。通过阅读这些源代码,可以了解 Java 最新的、令人激动的新特性及 其用法。  J2SE  5.0 提供的范例位于 J2SE  5.0 安装目录中的 demo 子目录下。在 MS  Windows 中, 该范例的默认安装位置是:C:jdk1.5.0demoapplets;在 Unix/Linux/Mac  OS 中,该范例的默 认安装位置是:/usr/local/jdk1.5.0/demo/applets。 在 applets 子目录下又包含了一些子目录,每一个子目录对应着一个相应的 Java Applet, 每个 Applet 展示了不同的功能。表 2.1 列出了这些范例及其功能。 表 2.1    applets 目录中的范例 范 例 说 明  Animator  演示了四种不同类型的动画  ArcTest  演示了圆弧的绘制,可以与该 Applet 交互并改变圆弧的显示属性  BarChart  演示了一个简单的条形图  Blink  演示了以不同颜色显示并闪烁的文本  CardTest  演示了几个 GUI 的部件及布局方式  Clock  演示了一个可以显示当前日期和时间的时钟  演示了用图形抖动(dithering)技术进行图形绘制,该技术实现的是从一种颜色逐渐转 DitherTest  变成另一种颜色(渐变色)  DrawTest  演示了使用鼠标在 applet 上,用不同的颜色绘制线段和点  Fractal  演示了绘制一个不规则图形  GraphicsTest  绘制不同的图形,以演示 Java 对图形的处理能力  绘制一个通过直线连接,由许多个节点(用矩形表示)组成的图形。可以拖动其中一个 GraphLayout  节点,观察其他节点是如何重新调整它们位置的情形,以演示复杂的图形交互  演示了一个有热点的图像。当鼠标移动到热点区域,该区域将会高亮显示,并在  ImageMap  appletviewer(或者浏览器)的左下角(状态栏)显示一条消息。当鼠标定位在图像中人像 嘴上的时候,会听见 applet 说“hi”  JumpingBox  在屏幕上随机移动一个矩形,可以试一试用鼠标去捕获它  演示了几个不同化学分子结构的三维视图,可以拖动鼠标从不同的角度来观察这些化学 MoleculeViewer  分子的结构  NervousText  绘制在屏幕上跳动的文本  SimpleGraph  绘制一条复杂的曲线
  • 28. 比较三种不同的排序技术。执行该 Applet 时,会出现三个 appletviewer 窗口。单击其中 SortDemo  任意一个窗口,都会开始排序,不同的排序技术所花费的时间是不同的  SpreadSheet  演示了一个简单的,由行和列组成的电子表格  TicTacToe  演示了一个叫做 TicTacToe 的游戏,由计算机和用户互弈  WireFrame  演示了四个由许多线段组成的三维图形,分别是立方体、恐龙、直升飞机和军舰 运行上述例程的方法有两种。我们以运行表 2.1 中所讲述的 ArcTest Applet 程序为例: (1)用 Java 自带的 Applet 容器 appletview.exe 来运行上述例程。 在【命令提示符】下,输入如下命令: C:Documents and SettingsJKZhong>cd C:jdk1.5.0demoapplets ArcTest  C:jdk1.5.0demoappletsArcTest>appletviewer example1.html (2)会看到 ArcTest 的运行结果,再进行如下操作,会看到如图 2.1 所示的结果。 Ø 在第一个文本框中输入 10,表示圆弧的起始角度。 Ø 在第二个文本框中输入 145,表示圆弧的终止角度。 Ø 按钮【Fill】表示绘制并填充这个圆弧,按钮【Draw】表示仅仅绘制圆弧。单击【Fill】 按钮可以看到,绘制的结果是一个从 10 开始到 145 结束的实心圆弧。 (3)直接用浏览器打开 C:jdk1.5.0demoappletsArcTest 子目录下的 example1.html 文 档,就可以运行上述 Java Applet 程序,这里以微软的 IE 为例。 Ø 如果与笔者相同,使用微软 Windows XP SP2 下的 IE,可能会看到如图 2.2 所示的结 果。IE 可能会有这样一个提示: “为帮助保护您的安全,Internet Explorer 已经限制此 文件显示可能访问您的计算机的活动内容。单击此处查看选项…” 。 Ø 这时无法看到 Java Applet 的运行结果,因为被 IE 屏蔽了。解决的方法是,在 IE 的提 示下单击鼠标右键,在弹出的菜单中选择【允许阻止的内容】 。 Ø 然后会弹出一个【安全警告】对话框,单击【是】按钮,即可看到运行如图 2.2 所示 的 Java Applet 结果。 图 2.1    appltviewer 的运行结果 图 2.2    ArcTest Applet 的运行结果 提示:如果 appletviewer 命令不能工作,或者收到一条消息,表示没有找到 appletviewer  命令,则计算机可能没有正确地设置 PATH 的环境变量。 读者需要按照 1.2.2 节讲述的方法重 新设置 PATH 变量,修改 PATH 变量后,需要重新启动计算机。
  • 29. 2.2    Java Applet 工作流程  2.2.1  组件与容器 一个组件 (Component)代表可以在屏幕上显示出来的一个图形实例, 也就是 Component  类的任意一个子类的对象。图 2.3 是以 Component 类为基础类的继承关系结构图,图中箭头 所指向的类为超类。 从图 2.3 可以看到,JApplet、JFrame、Dialog 等就是一个组件,它们都属于 Component  类的子类。所有从 Container 派生出来的类都可以包含由 Component 类派生出来的任意一个 类的对象,所以我们称之为容器(Container) 。又因为 Container 类是 Component 类的一个子 类,所以任意一个容器对象同时又是一个 Component 对象, 因此一个容器可以包含其他容器。 下面以 Panel 类对象来说明这个关系。我们把一些图形实例如矩形、椭圆等放置在一个 Panel  类的对象——panelA 中, 再把另外一些 Component 对象如菜单、 按钮等放置在另外一个 Panel  类的对象——panelB 中,最后把 panelA 和 panelB 放置在另外一个 Panel 类的对象——panelC  中。这里的例外是,Windows 类及其子类的对象,不能包含在其他容器中,否则,系统会抛 出一个异常。 Component  (抽象类)  Container  (抽象类)  JComponent  (Swing 组件)  Panel  Window  (旧式容器)  (无边框或标题栏)  Applet  Frame  (旧式 Applet 类)  (旧式框架类)  Dialog  (旧式对话框类)  JWindow  JApplets  JFrame  JDialog  (无边框或标题栏)  Applet 的基类 应用程序 对话框的基类 窗口的基类 图 2.3  以 Component 类为基础类的继承关系结构图  JComponent  类是所有在一个窗口中作为  GUI  一部分使用的  Swing  组件的基类。因为  JComponent 也是从 Container 类继承下来的,故此所有的 Swing 组件也是容器。  JApplet 类是所有 Swing Applet 类对象的基类,它由 Component 派生的 Container 类派生 出来。因此,一个 Applet 程序就从 Container 和 Component 类继承所有的方法。此外,它也 继承了旧的 Applet 类的方法。 这里需要注意以下几点: Ø  JApplet 类、JFrame 类、JDialog 类以及 JComponent 类,包含在 javax.swing 包中。 Ø  Applet 类包含在 java.applet 包中。 Ø 除此之外的类,包含在 java.awt 包中。  java.applet  包很小,它只包含这一个类和三个相关的接口,我们很少直接使用该包中的 方法。在  JApplet  类中,对旧的  Applet  类的方法进行了扩充和改进(旧类与  javax.swing  包中的 GUI 组件不完全兼容) 。所以本书所有相关的 Applet 类都扩展于 JApplet 类。 
  • 30. 2.2.2  Applet 的编译与执行 如同 Java Application 程序一样, 在执行前必须对 Applet 类的源程序进行编译, 编译的方 法与 1.4 节讲述的方法相同。  Applet 被嵌入到 HTML 页面中, 并由 Applet 容器(appeltviewer 或者 Web 浏览器)执行。  Applet 的运行由浏览器控制, 不由 Applet 中的代码控制。 当浏览器载入包含有 Applet 的 Web  页面时,它将生成一个 Applet 类的对象,然后利用 Applet 类对象的五个方法控制 Applet 的 执行。这五个方法都是 public 类型,不返回任何结果,以及不需要任何参数的方法。 表 2.2 列出了 5 个方法及其执行的相应功能。 表 2.2    Applet 默认的 5 个方法 方 法 说 明  启动 Applet。浏览器总是调用 Applet 类的默认构造器生成对象,然后调用 init()方法进行初始 void init()  化。一般在这个方法中生成 Applet 运行所需的对象并初始化 Applet 类的所有数据成员  方法由浏览器调用,启动或者重新启动  Applet。当  Applet  第一次启动时,start()方法将紧跟 void start()  在  init()方法后被浏览器调用。如果用户离开当前的  HTML  页面后,在重新返回到当前  HTML  页面时,Start()方法也将被调用。start()方法一般用来启动 applet 需要的任何附加线程  在 init()方法执行结束,  start()方法启动后,就调用此画图方法。另外,每次需要重新绘制 Applet  void paint( Graphics g )  时,也将调用此方法。本方法的典型应用,包括使用  Applet  容器传递给  paint  方法的  Graphics  对象 g 画图  当用户离开包含有该 Applet 的 HTML 页面时,浏览器调用此方法。stop()方法被调用后,将 void stop()  立即停止所有在 start()方法中启动的操作  在终止 Applet 运行时,调用 destroy()方法,以便释放 Applet 占用的,由本地操作系统管理的 void destroy()  任何系统资源。此方法执行之前,总是先调用 stop()方法 我们编写的 Applet 程序都将继承上述 5 种默认的方法。对于每个 Applet,方法调用的顺 序总是 init、start 和 paint,这就保证了每个 Applet 开始执行时都将调用这些方法。但是,并 非每个 Applet 都需要调用 5 种方法。我们可以重载上述的 5 种方法,也可以重载其中的某种 方法,以便 Applet 实现我们所设计的方法。 浏览器通过包含有 Applet 的 HTML 页面来运行 Applet 程序。 那么,在执行 Applet 之前, 首先要创建 HTML 文档。
  • 31. 2.2.3  包含 Applet 的 HTML  通常,HTML 文档以“.html”或者“htm”的扩展名结尾。一个在 HTML 页面中包含有  Applet 的 HTML 文档,必须指明 Applet 容器应该装入和执行哪一个 Applet。 下面是一个完整的包含 Applet 的 HTML 源代码: 1: <!DOCTYPE HTML PUBLIC "­//W3C//DTD HTML 4.0 Transitional//EN">  2: <HTML>  3: <HEAD>  4:  <TITLE>包含有 Applet 的 HTML 页面</TITLE>  5:  </HEAD>  6:  7:  <BODY>  8:          <APPLET  CODE = "MyAppletName.class"  9:  WIDTH = "Applet_width_in_pixels"  10:  HEIGHT = "Applet_height_in_pixels" >  11:         </APPLET>  12:  </BODY>  13: </HTML> 我们可以看到,代码第 8 行~第 11 行是隶属于<applet>和</applet>标记之间的内容,也 是一个包含 Applet 的 HTML 页面所需的最少内容,其余部分都是标准的 HTML 标记。  Applet 标记内的“CODE”属性,表示该 Applet 的.class 文件,它假设 Applet 位于包含 该 Applet 的网页所在的相同目录下。 本例指明 Applet 容器, 载入一个名为 “MyApplet Name” 的  Applet  字节码文件。如果.class  文件和  HTML  文件不在同一目录下,则需要使用一个  CODEBASE 属性, 它拥有一个 URL 值, 指明 applet 源代码的位置,  URL 可以是绝对值 (以 http://  开头) ,也可以是相对值。属性“WIDTH”表示该 Applet 在网页上显示的宽度,用像素表示。属 性“HEIGHT”表示该 Applet 在网页上显示的高度,也用像素表示。 了解前面我们介绍的 Applet 的相关知识,就可以编写一些 Applet 程序了。  2.3  绘制文本(字符串) 现在,让我们来开发一些  Applet。首先介绍一个简单的  Applet  程序——DrawString  Applet.java,就是在 Applet 上绘制一段文本(字符串) “欢迎来到《精通 Java  Web 动态图表 编程》的世界!。  ” DrawStringApplet.java 的源程序清单如下(chap02Fig2.3Fig2.3_01): 1: // Fig. 2.3_01: DrawStringApplet.java  2: // 第一个 Java Applet 程序, 绘制文本(字符串)  3:  4: // 引入相关的包 5: import java.awt.Graphics; // 引入 Graphics 类 6: import javax.swing.JApplet; // 引入 JApplet 类 7:  8: public class DrawStringApplet extends JApplet  9: {  10:  11:   // 在 applet 上绘制文本 12:  public void paint(Graphics g)  13:   {  14:       // 调用父类的 paint 方法 15:  super.paint(g);  16:  17:       g.drawString("欢迎来到 《精通 Java  Web 动态图表编程》的世界!",  25,  25);
  • 32. 18:  19:     } // paint 方法结束 20:  21: } // DrawStringApplet 类结束 提示:本书后面的例程将不再列出完整的源代码清单,请读者从 www.broadview.com.cn 网 站下载本书配套代码,查看相关目录下完整的源代码清单。 包含这个 Applet 的 web 页面文件 DrawStringApplet.html 的源程序清单如下: 1: <!DOCTYPE HTML PUBLIC "­//W3C//DTD HTML 4.0 Transitional//EN">  2: <HTML>  3: <BODY>  4:  <APPLET  CODE  "DrawStringApplet.class"  WIDTH  "320  HEIGHT  "45"  =  =  "  =  >  5:  </APPLET>  6:  </BODY>  7:  </HTML> 提示:本书所有的 Java  Applet 都将使用与本例相类似的 HTML 文档。对于不同的 Java  Applet,读者只需要修改上述代码第四行的内容, 重新设置“CODE”、 “WIDTH” “HEIGHT” 和 的属性值即可。 图 2.4 展示了名为 DrawStringApplet 的 Applet 在四个不同的 Applet 容器中的运行结果。 分别是 Appletviewer、  Netscape Web 浏览器(现在更名为 Mozilla) Opera, 、  以及微软的 Internet  Explorer Web 浏览器。 该程序说明了 Java 的几个重要特性。程序第 17 行完成的实际工作,即在屏幕上绘制一行文 本“欢迎来到《精通 Java Web 动态图表编程》的世界!。下面我们逐行来分析本程序。 ” 程序第 1 行~第 2 行: // Fig. 2.3: DrawStringApplet.java  // 第一个 Java Applet 程序, 绘制文本(字符串) 是注释。第 1 行说明例程的编号,以及源程序的文件名。第 2 行描述程序所实现的功能。
  • 33. x 轴  appletviewer 窗口 y 轴  applet 菜单 绘制区左上角是(0,0) ,绘 制区边缘在状态栏上 x 坐标从 状态栏显示 applet  左向右递增,y 坐标从上向下 当前的运行状态 递增 文本在该处的坐 标是(25,25) 绘制区域在左上角 坐标是(25,25) 状态栏 绘制区域在左上角 坐标是(25,25) 绘制区域在左上角 坐标是(25,25)  状态栏 图 2.4    DrawStringApplet 在四个不同的 Applet 容器中的运行结果 程序第 5 行: import java.awt.Graphics; // 引入 Graphics 类 是一个 import 声明, 表明 Applet 使用 java.awt 包中的 Graphics 类。Java 包含了很多预定 义的类,并按包(类的集合)的形式进行分组。Graphics  类是一个具备图形处理能力的类, 可以让 Java Applet 能够绘制直线、文本、矩形及椭圆形等图形对象。 程序第 6 行: import javax.swing.JApplet; // 引入 JApplet 类 也是一个 import 声明,表明 applet 使用 javax.swing 包中的 JApplet 类。在 Java 2 中创建 一个 Applet 时,必须引进 JApplet 类。 程序第 8 行: public class DrawStringApplet extends Japplet 声明了一个名为 DrawStringApplet 的公有 (public) 并继承了 javax.swing 包中的 JApplet  类, 类。该类的主体从程序第 9 行的左花括号“{”开始,到程序第 21 行的右花括号“}”结束。 在继承关系中,JApplet 类称为超类(也称为基类或父类) ,DrawStringApplet 被称为子类或派 生类。因为,DrawStringApplet 继承了 JApplet 类,所以,它不仅具有 JApplet 类的所有属性 
  • 34. 和方法,而且还可以增加新的方法和属性,以及扩展被继承的方法。 程序第 12 行: public void paint(Graphics g) 声明 Java Applet 的 paint 方法。前面我们提到的 paint 方法是 Java Applet 容器在载入 Applet  时,自动调用三个方法中的一个(其他两个是 init 和 start 方法) 。如果我们不在 Applet 中重 新定义该方法,那么 Applet 容器将调用继承下来的默认超类的 paint 方法。因为,默认超类 (JApplet)的 init、start 和 paint 方法为空(指明该方法的方法体中没有任何语句) ,也就是 说,超类的 paint 方法不会在 Applet 上绘制任何东西,所以在屏幕上也就不会有任何显示。  void 表示 paint 方法执行完后,不返回任何结果。paint 方法需要一个 Graphics 类的对象  g(对象也称为“类实例”或者“实例”。paint 方法使用 Graphics 类的对象 g 在 applet 上绘 ) 制各种图像对象, 如文本及各种几何图形等。  Graphics 类的对象 g 的创建由 Applet 容器负责。 为了实现在屏幕上绘制出一段文本,程序第 13 行~19 行,重载(重新定义)了超类的  paint 方法。 程序第 15 行: super.paint(g); 调用超类 JApplet 的 paint 方法。该语句是 Java Applet 程序中 paint 方法体的第一个语句。 早期的 Java Applet 在没有该语句的情况下仍然可以正常运行, 但在一个拥有众多绘图组件和  GUI 组件的复杂 Java Applet 中, 忽略该语句可能会导致严重的错误。 所以, 在编写 Java Applet  程序的时候,一定在 paint 方法的第一行设置这条语句,这是一个很好的编程习惯。 程序第 17 行: g.drawString(“欢迎来到《精通 Java Web 动态图表编程》的世界!”, 25, 25); 通过 Graphics 类的对象 g 来调用该类的 drawString 方法,以实现在 Applet 上绘制文本的 功能。drawString 方法的具体使用如表 2.3 所示。 表 2.3    drawString 方法 方法  public abstract void drawString(String str, int x, int y)  说明 用当前的字体和颜色,在指定的坐标(x,y)处,绘制字符串 str 的内容 调用的具体方法是 Graphics  类的对象名称(这里是  g)加上一个点操作符“.” ,再加入 所调用的方法名称(这里是 drawString) 。方法名后面跟着一对括号,括号内包含有执行该方 法所需的参数。  drawString 方法需要三个参数,第一个是  String 类的字符串参数,表示要绘制的文本。 最后两个是  int  类型的整数型参数,表示要绘制文本的第一个字符左下角所在的位置,该位 置用 Java 的平面坐标系来表示。 图 2.5 说明了 Java 坐标系。坐标原点位于左上角,以像素为单位。像素是计算机屏幕上 最小的显示单位。在 Java 的坐标系中,第一个是 x 坐标,表示当前位置为水平方向,距离坐 标原点 x 个像素;第二个是 y 坐标,表示当前位置为垂直方向,距离坐标原点 y 个像素。在  Appletviewer 中,坐标原点(0,0)正好位于 Applet 菜单的下方。在 Web 浏览器中,原点(0,  0)位于 Applet 执行的矩形区域的左上角(如图 2.5 所示) 。
  • 35. 坐标原点(0,0)  25 +X  X 轴  25 欢迎来到《精 (x,y) +Y  Y 轴 图 2.5    Java 坐标系 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的 分辨率是 800´600,表示计算机屏幕上的每一行由 800 个点组成,共有 600 行,整个计算机 屏幕共有  480 000  个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显 示更多的像素。Java Applet 在屏幕上的大小,依赖于屏幕的大小与分辨率。对于大小相同的 屏幕来说,分辨率越高,Java Applet 在屏幕上的显示就越小,这是因为屏幕上的像素更多了。 程序第 17 行,将在坐标(25,25)上绘制“欢迎来到《精通 Java Web 动态图表编程》 的世界!”如图 2.4、图 2.5 所示。  Java Applet 可以在 paint 方法中多次调用 drawString 方法,在屏幕的任意位置绘制文本。 我们就可以利用这种方法来显示多行文本。  DrawMultiStringApplet.java  演示了如何绘制多行文本(chap02Fig2.3Fig2.3_02) 。通过 调用该目录下的 DrawMultiStringApplet.html 的运行结果如图 2.6 所示。 坐标(25,25) 坐标(25,40) 图 2.6  在 Java Applet 上绘制多行文本 本例同第一个 Java  Applet 程序相比,仅仅增加了第 18 行。图 2.7 所示的两行文本之所 以能够左对齐, 就是因为第 17 行和第 18 行的 drawString 方法, 都使用了相同的 x 坐标(25)。 此外,两者使用不同的 y 坐标(第 17 行是 25,第 18 行是 40)。因此在 Applet 相同的水平 位置,不同的垂直位置上显示文本,也就实现了左对齐的功能了。如果把第 17 行和第 18 行 的内容相互交换,则运行的结果也是相同的,这说明文本的位置由其坐标决定。 绘制文本时,不能通过换行符(n)来实现文本换行的功能。如  DrawMultiStringApplet2.  java(chap02Fig2.3Fig2.3_03)和 DrawStringApplet.java 相比,主要是第 17 行语句不同,如下 所示: g.drawString(“欢迎来到《精通 Java Web 动态图表编程》的世界!n 不用不知道,Java 真奇妙!”, 25, 25); 即使绘制的文本中包含有换行符(n),运行结果如图 2.7 所示,字符串并没有分行显示。
  • 36. 图 2.7  用n 绘制多行文本 提示: 在某些 Java 版本中,运行结果会在字符串中的换行符位置处显示一个黑色小方框, 表示 drawString 方法不能识别该字符。  2.4  绘制线段 如果要在 Java Applet 中绘制一段直线,就需要调用 Graphics 类的 drawLine 方法。 先来 看 drawLine 的用法,如表 2.4 所示。 表 2.4    drawLine 方法 方法  public abstract void drawLine(int x1, int y1, int x2, int y2)  说明 用当前颜色在端点 1(x1,y1)和端点 2(x2,y2)之间绘制一条直线  drawLine 方法需要四个参数,表示该线段的两个端点。第一个端点的 x 坐标和 y 坐标分 别由第 x1、y1 个参数决定;第二个端点的 x 坐标和 y 坐标分别由第 x2、y2 个参数决定。所 有的坐标值都相对于该 Applet 的左上角坐标(0,0)。drawLine 方法就是在这两个端点之间 绘制一条直线。 程序 drawLineApplet.java(chap02Fig2.4)绘制了 11 条直线、1 个三角形和 1 个矩形。源 程序的运行结果如图 2.8 所示。 坐标(160,10) 坐标(90,10) 坐标(10,10) 坐标(230,10) 坐标(90,110) 坐标(330,10) 坐标(110,110) 坐标(210,110) 坐标(230,110) 坐标(330,110) 图 2.8    drawLineApplet.java  的运行结果 程序第 5 行: import java.awt.Graphics; // 引入 Graphics 类 导入 Applet 所需的 Graphics 类(来自 java.awt 包)实际上, 。 如果总是使用完整的 Graphics  类名(java.awt.Graphics),即包含完整的包名和类名,就不需要第 5 行的 import 语句了。也 就是说,如果没有第 5 条语句,那么第 12 行就可以改写成如下形式:
  • 37. public void paint(java.awt.Graphics g) 程序第 6 行: import javax.swing.*; // 引入 javax.swing 包中所有的类 这里告诉编译器,Applet  可以使用  javax.swing 包中所有的类。星号(*)表示  javax.swing  包中所有的类都可以被编译器所使用。不过,在程序开始运行时,它并不会将该包中所有的 类都载入内存中,而只是装载程序使用的那些类。本例仅加载了 JApplet 类。 程序第 15 行: super.paint(g); 调用超类 JApplet 的 paint 方法。编写 Java  Applet 程序时,在 paint 方法的第一行设置这 条语句。 程序第 18 行~第 21 行: for (int i = 1; i <= 11 ; i++ )  {  g.drawLine(10, 10, 90, i * 10 );  } 运行了一个循环语句,调用了 11 次 drawLine 方法,在 Applet 上绘制了 11 条线段。这  11 条线段第 1 个端点的坐标都是相同的,即(10,10) ,第 2 个端点坐标的 x 坐标也是完全 相同的。只是 y 坐标不同, 每循环一次,y 坐标依次增加 10 像素。该循环的运行结果如图 2.8  中最左边的图形。 程序第 24 行~第 26 行: g.drawLine(160, 10, 110, 110);  g.drawLine(160, 10, 210, 110);  g.drawLine(110, 110, 210, 110); 直接调用 3 次 drawLine 方法,在 Applet 上绘制了由 3 条线段而组成的一个三角形。这 个三角形的三个端点坐标分别是(160,10)(110,110)和(210,110) 、 。用 drawLine 方法 在两个端点之间绘制一条直线,运行结果如图 2.8 中的三角形。 程序第 29 行~第 32 行: g.drawLine(230, 10, 230, 110);  g.drawLine(230, 10, 330, 10);  g.drawLine(330, 10, 330, 110);  g.drawLine(230, 110, 330, 110); 直接调用 4 次 drawLine 方法,在 Applet 上绘制了由 4 条线段组成的一个矩形。这个矩 形的 4 个端点坐标分别是: (230,10)(330,10)(330,110)和(230,110) 、 、 。用 drawLine  方法绘制该矩形的四条边,运行结果如图 2.8 中右边的矩形。
  • 38. 2.5  色彩管理 早期的电脑系统是没有色彩管理这个概念的, 直到 90 年代苹果电脑推出了 ColorSync 1.0  色彩管理,它局限于苹果电脑之间的色彩控制。1993  年国际色彩联盟(Interational  Color  Consortium)成立,制定了开放式色彩管理规则──ICC,使色彩在不同品牌的电脑输出/输 入设备之间能够互相沟通,产生一致的色彩效果。随后,苹果电脑系统、微软的  Windows  系统、Sun 微电脑系统等相继支持 ICC 规则。  2.5.1  色彩基础 当我们从事设计的时候,最想了解的是如何有效地使用色彩。例如,使用什么色彩会产 生什么效果,用什么色彩代表什么性格,色彩如何搭配才美观,等等。要了解这些内容,首 先要认识色彩,知道色彩具有什么物理特性,以及色彩是如何形成的。  1.什么是色彩 我们生活在一个多彩的世界里。白天,在阳光的照耀下,各种色彩争奇斗艳,并随着照 射光的改变而变化无穷。但是,每当黄昏,大地上的景物无论多么鲜艳,都将被夜幕吞没。 在漆黑的夜晚,我们不但看不到物体的颜色,甚至连物体的外形也分辨不清。同样,在暗室 里,我们什么色彩也感觉不到。这些事实告诉我们,没有光就没有色,光是人们感知色彩的 必要条件。色彩来源于光,所以,光是色彩的源泉,色彩是光的表现。要了解色彩产生的原 理,必须对光做进一步的了解。 光的物理性质由它的波长和能量来决定。波长决定了光的颜色,能量决定了光的强度。 光映像到我们的眼睛时,波长不同决定了光的色相不同。波长相同能量不同,则决定了色彩 明暗的不同。 只有波长 380nm~780nm(1nm=10-6 mm)光的辐射才能引起人们的视觉感知,这段光波 叫做可见光。我们看到的色彩,事实上是以光为媒体的一种感觉。色彩是人在接受光的刺激 后,视网膜的兴奋传送到大脑中枢而产生的印象。 英国科学家牛顿在 1666 年发现,把太阳光经过三棱镜折射,然后投射到白色屏幕上,会 显出一条像彩虹一样美丽的色光带谱,从红色开始,依次是橙、黄、绿、青、蓝、紫七色, 如图 2.9 所示。 这条依次排列的彩色光带称为光谱。这种被分解过的色 光,即使再通过三棱镜也不会分解为其他的色光,我们把光 谱中不能再分解的色光叫做单色光。由单色光混合而成的光 叫做复色光。自然界的太阳光,白炽灯和日光灯发出的光都 图 2.9  光谱 是复色光。  2.色彩的三属性 我们不仅观察物体的色彩,同时还会注意到形状、面积、体积,以致该物体的功能和所 处的环境。这些对色彩的感觉都会产生影响。为了寻找规律,人们抽出纯粹色知觉的要素, 认为构成色彩的基本要素是色相、明度、纯度,这就是色彩的三属性。 Ø 色相(Hue) 色相指色的相貌与名称。色轮是表示最基本色相关系的色表。色轮上  90 度角内的几种色彩称作同类色,也叫做近邻色或姐妹色;90 角以外的色 图 2.10  色相
  • 39. 彩称为对比色。色轮上相对位置的色叫做补色,也称为相反色,如图 2.10 所示。 Ø 明度(Value 或 Brightness) 人眼之所以能够看到物体的明暗,是因为物体所反射色光的光量(热量)存在差异。光 量越多,明度越高,反之明度越低。色料的色彩明度,取决于混色中白色和黑色含量的多少, 如图 2.11 所示。 Ø 纯度(Chroma) 所谓色彩的纯度,是指色彩鲜艳与混浊的程度,也称为彩度。色轮上各颜色都是纯色, 纯度最高。色料的混合中,越混合,色彩的纯度越低,如图 2.12 所示。 图 2.11  明度变化 图 2.12  纯度变化  3.混色理论 Ø 原色 无法用其他色彩混合得到的基本色彩称为原色。原色按照一定比例混合可以得到各种色 彩。究竟原色有多少种,又是哪几种颜色?历史上不同的学者有不同的说法,但基本上分为 三原色说和四原色说。 色彩的混色有两种类型:加法混色和减法混色。 Ø 加法混色 色光三原色(红、绿、蓝)按照一定的比例混合可以得到各种色光。三原色光等量混合 可以得到白色。色光混色和色料混色刚好相反,色光混色是越混合越明亮,所以称为加法混 色。我们熟悉的电视机和电脑的 CRT 显示器产生的色彩方式就属于加法混色,如图 2.13A 所 示。 Ø 减法混色 色料三原色(品红、黄、青蓝)按照一定的比例混合可以得到各种色彩。理论上三原色 等量混合可以得到黑色。因为色料越混合越灰暗,所以称为减法混色。水彩、油画、印刷等, 它们产生各种颜色的方法都是减法混色,如图 2.13B 所示。  A:加法混色  B:减法混色 图 2.13  色彩的混合 这两种混色方法,通过对相对应的色彩取反操作,就可以相互转换了。
  • 40. 4.色彩空间及色彩模型 “色彩空间”一词源于英语“Color Space” ,也称做“色域” 。实际上就是各种色彩的集 合,色彩的种类越多,色彩空间越大,能够表现的色彩范围(即色域)越广。对于具体的图 像设备而言,其色彩空间就是它所能表现色彩的总和。 自然界中的色彩千变万化,我们要准确地表示色彩空间就要使用到色彩模型。人们建立 了多种色彩模型,以一维、二维、三维甚至四维空间坐标来规范这些色彩。 最常用的色彩模型有:  HSB、  RGB、  CMYK 以及 CIE Lab 等色彩模型。 其中 RGB、  CMYK  是惟一两种专门面向数码设计和出版印刷的色彩模型。这里我们介绍  RGB、CMYK  色彩模 型,认识这两个色彩模型,有助于我们在设计中准确地把握色彩。 所谓 RGB 就是:红(Red) 、绿(Green) 、蓝(Blue)三种色光原色。RGB 色彩模型的 混色属于加法混色。每种原色的数值越高,色彩越明亮。R、G、B  都为  0  时是黑色,都为  255 时是白色。  RGB 是电脑设计中最直接的色彩表示方法。电脑中的 24 位真彩图像,就是采用  RGB  模型来精确记录色彩的。所以,在电脑中利用 RGB 数值可以精确取得某种颜色。  R、G、B 数值和色彩的三属性没有直接的联系,不能揭示色彩之间的关系。所以在进行 配色设计时,RGB 模型就不是那么适用了。  RGB 色彩模型又有 AdobeRGB、AppleRGB、sRGB 等几种,这些 RGB 色彩模型大多与 显示设备、输入设备(数码相机、扫描仪)相关联。 Ø“sRGB”是所谓的“标准  RGB  色彩模型” 。这种色彩空间由微软公司与惠普公司于  1997 年联合确立,被许多软件、硬件厂商所采用,逐步成为许多扫描仪、低档打印机 和软件的默认色彩空间。同样采用 sRGB 色彩空间的设备之间,可以实现色彩相互模 拟,但却是通过牺牲色彩范围来实现各种设备之间色彩的一致性的,这是所有  RGB  色彩空间中最狭窄的一个。 Ø“Apple RGB”是苹果公司早期为苹果显示器制定的色彩模式。 其色彩范围并不比 sRGB  大多少。这种显示器已经很少使用,这一标准已逐步被淘汰。 Ø“Adobe RGB(1998) ”由 Adobe  公司制定。其最早使用在 Photoshop 5.x 中,被称为  SMPTE­240M。它具备非常大的色彩范围,绝大部分色彩又是设备可呈现的,这一色 彩模型全部包含了  CMYK  的色彩范围,为印刷输出提供了便利,可以更好地还原原 稿的色彩,在出版印刷领域得到了广泛应用。 Ø“ColorMatch RGB”是由 Radius 公司定义的色彩模型,与该公司的 Pressview  显示器 的本机色彩模型相符合。 “Wide Gamut RGB”是用纯谱色原色定义的色彩范围的 RGB  色彩空间。这种空间的色域包括了几乎所有的可见色,比典型的显示器所显示的色域 还要宽。但是,由于这一色彩范围中的很多色彩不能在  RGB  显示器或印刷上准确重 现,所以这一色彩模型并没有太大的实用价值。  RGB 只是光色的表示模型,在印刷行业中,使用另外一种色彩模型 CMYK。CMYK 分 别是青色(Cyan) 、品红(Magenta) 、黄色(Yellow) 、黑色(Black)三种油墨色。每一种颜 色都用百分比来表示,而不是 RGB 那样的 256 级度。 理论上将印刷三原色,即青色(Cyan) 、品红(Magenta) 、黄色(Yellow)混合之后, 应该可以将红绿蓝光全部吸收而得到纯正的黑色,只是现实生活中找不到这种光线吸收,反 射特性都十分完美的颜料,将三种颜色混合后还是会有些许光线反射出来,呈现暗灰色或深 褐色。事实上除了黑色外,用颜料三原色也无法混合出许多暗色系的颜色,为了弥补这个缺 点,在实际印刷的时候,额外加入黑色的颜料,以解决无法产生黑色的问题。因此就有所谓  CMYK 的色彩模式,K 表示黑色(Black) 。
  • 41. 2.5.2  Java 的色彩管理  Java 以跨平台,与硬件无关的方式支持色彩管理。Java 的色彩管理功能来自于 java.awt  包中的 Color 类。Color 类允许在应用程序中指定自己需要的任意色彩,不用担心因计算机的 硬件设备所支持的绘制方式不同而引起的颜色差别。Java 支持 sRGB 色彩模型,将自动找到 最接近的颜色。  Java 对色彩的管理都被封装在 java.awt.Color 类中。  Color 类提供了对颜色控制的常量和方法。表 2.5 列出了 Color 类中部分预定义的颜色常 量及其 RGB 值。 表 2.5  部分 Color 颜色常量及其 RGB 值 颜色常量 颜 色  RGB 值  public final static Color ORANGE/orange  橙色  255, 200, 0  public final static Color PINK/pink  粉红色  255, 175, 175  public final static Color CYAN/cyan  青色  0, 255, 255  public final static Color MAGENTA/magenta  品红色  255, 0, 255  public final static Color YELLOW/yellow  黄色  255, 255, 0  public final static Color RED/red  红色  255, 0, 0  public final static Color BLACK/black  黑色  0, 0, 0  public final static Color WHITE/white  白色  255, 255, 255  public final static Color LIGHT_GRAY/lightGray  淡灰色  192, 192, 192  颜色常量的名称有两种写法,一种是小写,另一种是大写。我们建议采用大写的形式表 达 Java 的颜色常量,因为它们更符合常量的命名约定。  Color  类通过设置不同的三个原色:红、绿、蓝(RGB)的值而创建各种颜色。这三个 原色的合并值称为 RGB 值。RGB 中的每个值又可以表示为 0~255 范围内的某个整数,或者 表示为 0.0~1.0 之间的浮点数。RGB 中的 R 表示颜色中红色的数值,G 表示绿色的数值,而  B 表示蓝色的数值。数值越大,表示相应的色彩含量就越多。RBG 总共可以产生的颜色总数 为 256´256´256,即 167 77 2 16 种颜色。表 2.6 列出了 Color 的方法以及 Graphics 类中与之相 关的方法。 表 2.6  Color 的方法以及 Graphics 类中与之相关的方法  Color 的构造器及部分方法  public Color(int r, int g, int b)      // Color class  创建一种基于红色、绿色和蓝色的颜色,每种颜色的表示方法为 0~255 之间的一个整数  public Color(float r, float g, float b)    // Color class  创建一种基于红色、绿色和蓝色的颜色,每种颜色的表示方法为 0~1 之间的一个浮点数  public int getRed()  // Color class  返回一个 0~255 之间的,表示 RGB 中红色的整数值  public int getGreen()  // Color class  返回一个 0~255 之间的,表示 RGB 中绿色的整数值  public int getBlue()  // Color class  返回一个 0~255 之间的,表示 RGB 中蓝色的整数值