﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-思</title><link>http://www.blogjava.net/xxxzheng/</link><description>路慢慢其休远兮,吾将上下而求素</description><language>zh-cn</language><lastBuildDate>Wed, 15 Apr 2026 12:00:18 GMT</lastBuildDate><pubDate>Wed, 15 Apr 2026 12:00:18 GMT</pubDate><ttl>60</ttl><item><title>xml作用</title><link>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22270.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Fri, 02 Dec 2005 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22270.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/22270.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22270.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/22270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/22270.html</trackback:ping><description><![CDATA[在很多研讨会和培训班上我遇到过许多人，他们还不明白为什么要使用XML也不知道如何&nbsp;<BR>在他们的应用中使用XML。一些来自诸如Gartner公司的报告建议说，商业公司不能再做&nbsp;<BR>局外人了，不能对XML置之不理。如果你还不清楚XML到底有什么好处的话，你并不是唯&nbsp;<BR>一的人。&nbsp;<BR>我决定把与人们和媒体关于XML话题的交谈整理成文，列出XML在应用中的五个最令人喜&nbsp;<BR>爱的用法。尽管这些并不能包含XML的所有潜在应用，至少是些最重要的领域。&nbsp;<BR>1、数据交换&nbsp;<BR>用XML在应用程序和公司之间作数据交换已不是什么秘密了，毫无疑问应被列为第一位。&nbsp;<BR>那么为什么XML在这个领域里的地位这么重要呢？原因就是XML使用元素和属性来描述数&nbsp;<BR>据。在数据传送过程中，XML始终保留了诸如父/子关系这样的数据结构。几个应用程序&nbsp;<BR>可以共享和解析同一个XML文件，不必使用传统的字符串解析或拆解过程。&nbsp;<BR>相反，普通文件不对每个数据段做描述(除了在头文件中)，也不保留数据关系结构。使&nbsp;<BR>用XML做数据交换可以使应用程序更具有弹性，因为可以用位置(与普通文件一样)或用元&nbsp;<BR>素名(从数据库)来存取XML数据。&nbsp;<BR>2、Web服务&nbsp;<BR>Web服务是最令人激动的革命之一，它让使用不同系统和不同编程语言的人们能够相互交&nbsp;<BR>流和分享数据。其基础在于Web服务器用XML在系统之间交换数据。交换数据通常用XML标&nbsp;<BR>记，能使协议取得规范一致，比如在简单对象处理协议(Simple&nbsp;Object&nbsp;Access&nbsp;Protoc&nbsp;<BR>ol,&nbsp;SOAP)平台上。&nbsp;<BR>SOAP可以在用不同编程语言构造的对象之间传递消息。这意味着一个C#对象能够与一个&nbsp;<BR>Java对象进行通讯。这种通讯甚至可以发生在运行于不同操作系统上的对象之间。DCOM&nbsp;<BR>,&nbsp;CORBA或Java&nbsp;RMI只能在紧密耦合的对象之间传递消息，SOAP则可在松耦合对象之间传&nbsp;<BR>递消息。&nbsp;<BR>3、内容管理&nbsp;<BR>XML只用元素和属性来描述数据，而不提供数据的显示方法。这样，XML就提供了一个优&nbsp;<BR>秀的方法来标记独立于平台和语言的内容。&nbsp;<BR>使用象XSLT这样的语言能够轻易地将XML文件转换成各种格式文件，比如HTML,&nbsp;WML,&nbsp;PD&nbsp;<BR>F,&nbsp;flat&nbsp;file,&nbsp;EDI,&nbsp;等等。XML具有的能够运行于不同系统平台之间和转换成不同格式&nbsp;<BR>目标文件的能力使得它成为内容管理应用系统中的优秀选择。&nbsp;&nbsp;<BR>4、Web集成&nbsp;<BR>现在有越来越多的设备也支持XML了。使得Web开发商可以在个人电子助理和浏览器之间&nbsp;<BR>用XML来传递数据。&nbsp;<BR>为什么将XML文本直接送进这样的设备去呢？这样作的目的是让用户更多地自己掌握数据&nbsp;<BR>显示方式，更能体验到实践的快乐。常规的客户/服务(C/S)方式为了获得数据排序或更&nbsp;<BR>换显示格式，必须向服务器发出申请；而XML则可以直接处理数据，不必经过向服务器申&nbsp;<BR>请查询-返回结果这样的双向“旅程”，同时在设备也不需要配制数据库。&nbsp;<BR>甚至还可以对设备上的XML文件进行修改并将结果返回给服务器。想像一下，一台具有互&nbsp;<BR>联网功能并支持XML的电冰箱将会给市场带来多么大的冲击吧。你从此不必早起去取牛奶&nbsp;<BR>了！&nbsp;<BR>5、配制&nbsp;<BR>许多应用都将配制数据存储在各种文件里，比如.INI文件。虽然这样的文件格式已经使&nbsp;<BR>用多年并一直很好用，但是XML还是以更为优秀的方式为应用程序标记配制数据。使用.&nbsp;<BR>NET里的类，如XmlDocument和XmlTextReader，将配制数据标记为XML格式，能使其更具&nbsp;<BR>可读性，并能方便地集成到应用系统中去。使用XML配制文件的应用程序能够方便地处理&nbsp;<BR>所需数据，不用象其他应用那样要经过重新编译才能修改和维护应用系统。&nbsp;<BR>如前所述，这里提到的五种使用XML的途径不包括全部场合。<img src ="http://www.blogjava.net/xxxzheng/aggbug/22270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-12-02 17:32 <a href="http://www.blogjava.net/xxxzheng/archive/2005/12/02/22270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习xml</title><link>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22269.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Fri, 02 Dec 2005 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22269.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/22269.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/22269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/22269.html</trackback:ping><description><![CDATA[<P>XML越来越热，关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏，很多朋友问我：XML到底有什么用，我们是否需要学习它？我想就我个人学习过程的心得和经验，写一篇比较全面的介绍文章。首先有两点是需要肯定的：&nbsp;</P>
<P>第一：XML肯定是未来的发展趋势，不论是网页设计师还是网络程序员，都应该及时学习和了解，等待只会让你失去机会；&nbsp;</P>
<P>第二：新知识肯定会有很多新概念，尝试理解和接受，您才可能提高。不要害怕和逃避，毕竟我们还年轻。&nbsp;</P>
<P>提纲</P>
<P>本文共分五大部分。分别是XML快速入门，XML的概念，XML的术语，XML的实现，XML的实例分析。最后附录介绍了XML的相关资源。作者站在普通网页设计人员的角度，用平实生动的语言，向您讲述XML的方方面面，帮助你拨开XML的神秘面纱，快速步入XML的新领域。&nbsp;</P>
<P>第一章:XML快速入门</P>
<P>一.&nbsp;什么是XML？&nbsp;</P>
<P>二.&nbsp;XML是新概念吗？&nbsp;</P>
<P>三.&nbsp;使用XML有什么好处？&nbsp;</P>
<P>四.&nbsp;XML很难学吗？&nbsp;</P>
<P>五.&nbsp;XML和HTML的区别&nbsp;</P>
<P>六.&nbsp;XML的严格格式&nbsp;</P>
<P>七.&nbsp;关于XML的更多&nbsp;</P>
<P>一.&nbsp;什么是XML？</P>
<P>&nbsp;</P>
<P>这往往是第一个问题，也往往在第一个问题上你就会搞不明白，因为大多的教材上这样回答：</P>
<P>XML是Extensible&nbsp;Markup&nbsp;Language的简写，一种扩展性标识语言。&nbsp;这是标准的定义。那么什么是标志语言，为什么叫扩展性？已经让人有些糊涂。我想我们这样来理解会好一些：</P>
<P>对HTML你已经非常熟悉了吧，它就是一种标记语言，记得它的全称吗："Hypertext&nbsp;Markup&nbsp;Language"&nbsp;超文本标记语言。明白了？同时，HTML里面有很多标签，类似,等，都是在HTML&nbsp;<BR>4.0里规范和定义，而XML里允许你自己创建这样的标签，所以叫做可扩展性。</P>
<P>这里有几个容易混淆的概念要提醒大家：</P>
<P>1.XML并不是标记语言。它只是用来创造标记语言(比如HTML)的元语言。天，又糊涂了！不要紧，你只要知道这一点：XML和HTML是不一样的，它的用处途比HTML广泛得多，我们将在后面仔细介绍。</P>
<P>2.XML并不是HTML的替代产品。XML不是HTML的升级，它只是HTML的补充，为HTML扩展更多功能。我们仍将在较长的一段时间里继续使用HTML。(但值得注意的是HTML的升级版本XHTML的确正在向适应XML靠拢。)</P>
<P>3.不能用XML来直接写网页。即便是包含了XML数据，依然要转换成HTML格式才能在浏览器上显示。</P>
<P>下面就是一段XML示例文档(例1)，用来表示本文的信息:</P>
<P>&lt;myfile&gt;</P>
<P></P>
<P>&lt;title&gt;XML&nbsp;Quick&nbsp;Start&lt;/title&gt;</P>
<P></P>
<P>&lt;author&gt;ajie&lt;/author&gt;</P>
<P></P>
<P>&lt;email&gt;ajie@aolhoo.com&lt;/email&gt;</P>
<P></P>
<P>&lt;date&gt;20010115&lt;/date&gt;</P>
<P></P>
<P>&lt;/myfile&gt;&nbsp;</P>
<P>&nbsp;</P>
<P>注意：</P>
<P>&nbsp;</P>
<P>1.这段代码仅仅是代码，让你初步感性认识一下XML，并不能实现什么具体应用；</P>
<P>2.其中类似&lt;&nbsp;title&gt;,&lt;&nbsp;author&gt;的语句就是自己创建的标记(tags)，它们和HTML标记不一样，例如这里的&lt;&nbsp;title&gt;是文章标题的意思，HTML里的&lt;&nbsp;title&gt;是页面标题。</P>
<P>二.&nbsp;XML是新概念吗？&nbsp;</P>
<P>不是。XML来源于SGML，一种比HTML更早的标志语言标准。&nbsp;</P>
<P>关于SGML，我们来简单了解一下，你只需要有个大致概念就可以。&nbsp;</P>
<P>SGML全称是"Standard&nbsp;Generalized&nbsp;Markup&nbsp;Language"(通用标识语言标准)。看名称就知道：它是标志语言的标准，也就是说所有标志语言都是依照SGML制定的，当然包括HTML。SGML的覆盖面很广，凡是有一定格式的文件都属于SGML，比如报告，乐谱等等，HTML是SGML在网络上最常见的文件格式。因此，人们戏称SGML是HTML的"妈妈"。&nbsp;</P>
<P><BR>而XML就是SGML的简化版，只不过省略了其中复杂和不常用的部分。(哦，明白了！是HTML第二个"mother"，难怪比HTML功能强大呢。)，和SGML一样，XML也可以应用在金融，科研等各个领域，我们这里讲的，只是XML在web方面的运用而已。&nbsp;</P>
<P><BR>到这里，你应该有点明白了：XML是用来创建定义类似HTML的标记语言，然后再用这个标记语言来显示信息。&nbsp;三.&nbsp;使用XML有什么好处？&nbsp;</P>
<P>有了HTML，为什么还需要用XML？&nbsp;</P>
<P>因为现在网络应用越来越广泛，仅仅靠HTML单一文件类型来处理千变万化的文档和数据已经力不丛心，而且HTML本身语法十分不严密，严重影响网络信息传送和共享。(想想浏览器兼容的问题伤透多少设计师的脑细胞啊。)人们早已经开始探讨用什么方法来满足网络上各种应用的需要。使用SGML是可以的，但SGML太庞大，编程复杂，于是最终选择了"减肥"的SGML---XML作为下一代web运用的数据传输和交互的工具。&nbsp;</P>
<P><BR>使用XML有什么好处？来看w3c组织(XML标准制定者)的说明：&nbsp;</P>
<P>XML使得在网络上使用SGML语言更加"简单和直接":&nbsp;简化了定义文件类型的过程，简化了编程和处理SGML文件的过程，简化了在Web上的传送和共享。&nbsp;</P>
<P><BR>1.XML可以广泛的运用于web的任何地方;&nbsp;</P>
<P>2.XML可以满足网络应用的需求；&nbsp;</P>
<P>3.使用XML将使编程更加简单；&nbsp;</P>
<P>4.XML便于学习和创建；&nbsp;</P>
<P>5.XML代码将清晰和便于阅读理解；&nbsp;</P>
<P>还是抽象了些。让我们在后面的实例教程中慢满体会XML的强大优势吧！&nbsp;</P>
<P>四.&nbsp;XML很难学吗？</P>
<P>如果你有兴趣学习XML，不禁会问：XML难吗？学习XML需要什么样的基础？</P>
<P>XML非常简单，学习容易。如果你熟悉HTML，你会发现它的文档和HTML非常相似，看同样的示例文档(例1)：</P>
<P>?xml&nbsp;version="1.0"?&gt;</P>
<P></P>
<P>&lt;myfile&gt;</P>
<P></P>
<P>&lt;title&gt;XML&nbsp;Quick&nbsp;Start&lt;/title&gt;</P>
<P></P>
<P>&lt;author&gt;ajie&lt;/author&gt;</P>
<P></P>
<P>&lt;email&gt;ajie@aolhoo.com&lt;/email&gt;</P>
<P></P>
<P>&lt;date&gt;20010115&lt;/date&gt;</P>
<P></P>
<P>&lt;/myfile&gt;</P>
<P>第一行是一个XML声明，表示文档遵循的是XML的1.0&nbsp;版的规范。</P>
<P>第二行定义了文档里面的第一个元素(element)，也称为根元素:&nbsp;&lt;&nbsp;myfile&gt;。这个就类似HTML里的&lt;&nbsp;HTML&gt;开头标记。注意，这个名称是自己随便定义的。</P>
<P>再下面定义了四个子元素：title,author,email,和date。分别说明文章的标题，作者，邮箱和日期。当然，你可以用中文来定义这些标签，看上去更便于理解：&nbsp;<BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;</P>
<P>&lt;文章&gt;</P>
<P>&lt;标题&gt;XML轻松学习手册&lt;/标题&gt;</P>
<P>&lt;作者&gt;ajie&lt;/作者&gt;</P>
<P>&lt;信箱&gt;ajie@aolhoo.com&lt;/信箱&gt;</P>
<P>&lt;日期&gt;20010115&lt;/日期&gt;</P>
<P>&lt;/文章&gt;</P>
<P>&nbsp;</P>
<P>这就是XML的文档，任何掌握HTML的网友都可以直接写出这样简单的XML文档。</P>
<P>另外，学习XML还必须掌握一种页面脚本语言，常见的就是<I>javascript</I>和VB&nbsp;script。因为XML数据是使用script实现HTML中调用和交互的。我们看一个最简单的例子(例2)：</P>
<P>1.将下面代码存为myfile.htm</P>
<P><BR>&lt;html&gt;</P>
<P>&lt;head&gt;</P>
<P>&lt;script&nbsp;language="<I>javascript</I>"&nbsp;for="window"&nbsp;event="onload"&gt;</P>
<P>var&nbsp;xmlDoc&nbsp;=&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLDOM");</P>
<P>xmlDoc.async="false";</P>
<P>xmlDoc.load("myfile.xml");</P>
<P>nodes&nbsp;=&nbsp;xmlDoc.documentElement.childNodes;</P>
<P>title.innerText&nbsp;=&nbsp;nodesitem(0).text;</P>
<P>author.innerText&nbsp;=&nbsp;nodes.item(1).text;</P>
<P>email.innerText&nbsp;=&nbsp;nodes.item(2).text;</P>
<P>date.innerText&nbsp;=&nbsp;nodes.item(3).text;</P>
<P>&lt;/script&gt;</P>
<P>&lt;title&gt;在HTML中调用XML数据&lt;/title&gt;</P>
<P>&lt;/head&gt;</P>
<P>&lt;body&nbsp;bgcolor="#FFFFFF"&gt;</P>
<P>&lt;b&gt;标题:&nbsp;&lt;/b&gt;</P>
<P>&lt;span&nbsp;id="title"&gt;&nbsp;&lt;/span&gt;</P>
<P>&lt;b&gt;作者:&nbsp;&lt;/b&gt;&gt;</P>
<P>&lt;span&nbsp;id="author"&gt;&lt;/span&gt;</P>
<P>&lt;b&gt;信箱:&nbsp;&lt;/b&gt;</P>
<P>&lt;span&nbsp;id="email"&gt;&lt;/span&gt;</P>
<P>&lt;b&gt;日期：&lt;/b&gt;</P>
<P>&lt;span&nbsp;id="date"&gt;&lt;/span&gt;</P>
<P>&lt;/body&gt;</P>
<P></P>
<P>&lt;/html&gt;</P>
<P><BR>2.将下面代码存为myfile.xml</P>
<P><BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;</P>
<P>&lt;myfile&gt;</P>
<P>&lt;title&gt;XML轻松学习手册&lt;/title&gt;</P>
<P>&lt;author&gt;ajie&lt;/author&gt;</P>
<P>&lt;email&gt;ajie@aolhoo.com&lt;/email&gt;</P>
<P>&lt;date&gt;20010115&lt;/date&gt;</P>
<P>&lt;/myfile&gt;</P>
<P><BR>3.将它们放在同一个目录下，用IE5以上版本浏览器打开，可以看到效果。&nbsp;学习并掌握一种script，你将真正了解到XML无比的强大的功能。</P>
<P>五.&nbsp;XML和HTML的区别&nbsp;</P>
<P>&nbsp;</P>
<P>XML和HTML都来自于SGML，它们都含有标记，有着相似的语法，HTML和XML的最大区别在于：HTML是一个定型的标记语言，它用固有的标记来描述，显示网页内容。比如&lt;&nbsp;H1&gt;表示首行标题，有固定的尺寸。相对的，XML则没有固定的标记，XML不能描述网页具体的外观，内容，它只是描述内容的数据形式和结构。&nbsp;</P>
<P>&nbsp;</P>
<P><BR>这是一个质的区别：网页将数据和显示混在一起，而XML则将数据和显示分开来。&nbsp;</P>
<P>&nbsp;</P>
<P>我们看上面的例子，在myfile.htm中，我们只关心页面的显示方式，我们可以设计不同的界面，用不同的方式来排版页面，但数据是储存在myfile.xml中，不需要任何改变。&nbsp;</P>
<P>&nbsp;</P>
<P><BR>(如果你是程序员，你会惊讶的发现，这与模块化面向对象编程的思想极其相似！其实网页何尝不是一种程序呢？)&nbsp;</P>
<P>&nbsp;</P>
<P>正是这种区别使得XML在网络应用和信息共享上方便，高效，可扩展。所以我们相信，XML做为一种先进的数据处理方法，将使网络跨越到一个新的境界。</P>
<P>&nbsp;</P>
<P>六.&nbsp;XML的严格格式</P>
<P>&nbsp;</P>
<P>吸取HTML松散格式带来的经验教训，XML一开始就坚持实行"良好的格式"。</P>
<P>我们先看HTML的一些语句，这些语句在HTML中随处可见:</P>
<P>1.</P>
<P>sample</P>
<P><BR>2.&lt;&nbsp;b&gt;&lt;&nbsp;i&gt;sample&lt;&nbsp;/b&gt;&lt;&nbsp;/i&gt;</P>
<P><BR>3.&lt;&nbsp;td&gt;sample&lt;&nbsp;/TD&gt;</P>
<P><BR>4.&lt;&nbsp;font&nbsp;color=red&gt;samplar&lt;&nbsp;/font&gt;</P>
<P><BR>在XML文档中，上述几种语句的语法都是错误的。因为:</P>
<P>1.所有的标记都必须要有一个相应的结束标记；</P>
<P>2.所有的XML标记都必须合理嵌套；</P>
<P>3.所有XML标记都区分大小写；</P>
<P>4.所有标记的属性必须用""括起来；</P>
<P>所以上列语句在XML中正确的写法是</P>
<P>1.<BR>sample</P>
<P>2.&lt;&nbsp;b&gt;&lt;&nbsp;i&gt;sample&lt;&nbsp;/i&gt;&lt;&nbsp;/b&gt;<BR>3.&lt;&nbsp;td&gt;sample&lt;&nbsp;/td&gt;<BR>4.&lt;&nbsp;font&nbsp;color="red"&gt;samplar&lt;&nbsp;/font&gt;</P>
<P>　　另外，XML标记必须遵循下面的命名规则:</P>
<P>1.名字中可以包含字母、数字以及其它字母；&nbsp;</P>
<P>2.名字不能以数字或"_"&nbsp;(下划线)&nbsp;开头；</P>
<P>3.名字不能以字母&nbsp;xml&nbsp;(或&nbsp;XML&nbsp;或&nbsp;Xml&nbsp;..)&nbsp;开头；</P>
<P>4.名字中不能包含空格。</P>
<P>在XML文档中任何的差错，都会得到同一个结果：网页不能被显示。各浏览器开发商已经达成协议，对XML实行严格而挑剔的解析，任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下，比如将&lt;&nbsp;email&gt;改为&lt;&nbsp;Email&gt;，然后用IE5直接打开myfile.xml，会得到一个出错信息页面：</P>
<P><BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;</P>
<P>&lt;myfile&gt;</P>
<P>&lt;title&gt;XML轻松学习手册&lt;/title&gt;</P>
<P>&lt;author&gt;ajie&lt;/author&gt;</P>
<P>&lt;Email&gt;ajie@aolhoo.com&lt;/email&gt;</P>
<P>&lt;date&gt;20010115&lt;/date&gt;</P>
<P>&lt;/myfile&gt;&nbsp;</P>
<P>七.&nbsp;关于XML的更多&nbsp;</P>
<P>好了，到现在你已经知道：&nbsp;</P>
<P>1.什么是XML；&nbsp;<BR>2.XML,HTML,SGML之间的关系和区别；&nbsp;<BR>3.XML的简单应用。&nbsp;</P>
<P>恭喜你！你已经不再对XML一无所知，并且已经走在了网络技术的前沿。整个学习过程好象并不很难哦:)&nbsp;</P>
<P>如果你对XML有更多的兴趣，希望进一步了解XML的详细资料和其它的实际运用技术，欢迎继续浏览我们的下一章：XML的概念。<BR>&nbsp;<BR><FONT size=4>XML轻松学习手册（2）XML概念</FONT></P>
<P>第二章&nbsp;XML概念</P>
<P>导言&nbsp;</P>
<P>经过第一章的快速入门学习，你已经知道了XML是一种能够让你自己创造标识的语言，它可以将数据与格式从网页中分开，它可以储存数据和共享数据的特性使得XML无所不能。如果你希望深入学习XML，系统掌握XML的来龙去脉，那么我们首先还是要回到XML概念的问题上来。XML(Extensible&nbsp;Markup&nbsp;Language)，一种扩展性标识语言。"扩展性""标识""语言"。每一个词都明确的点明了XML的重要特点和功能。我们来仔细分析：&nbsp;</P>
<P>一.&nbsp;扩展性&nbsp;<BR>二.&nbsp;标识&nbsp;<BR>三.&nbsp;语言&nbsp;<BR>四.&nbsp;结构化&nbsp;<BR>五.&nbsp;Meta数据&nbsp;<BR>六.&nbsp;显示&nbsp;<BR>七.&nbsp;DOM&nbsp;</P>
<P>一.扩展性---使用XML，你可以为你的文档建立自己的标记(tags)。&nbsp;</P>
<P>XML的第一个词是"扩展性"，这正是XML强大的功能和弹性的原因。&nbsp;<BR>在HTML里，有许多固定的标记，我们必须记住然后使用它们，你不能使用HTML规范里没有的标记。而在XML中，你能建立任何你需要的标记。你可以充分发挥你的想象力，给你的文档起一些好记的标记名称。比如，你的文档里包含一些游戏的攻略，你可以建立一个名为&lt;game&gt;的标记，然后在&lt;game&gt;下再根据游戏类别建立&lt;RPG&gt;,&lt;SLG&gt;等标记。只要清晰，易于理解你可以建立任何数量的标记。&nbsp;</P>
<P>一开始你也许会不适应，因为我们在学习HTML时，有固定的标记可以直接学习和使用；(很多人包括我自己都是边分析别人的代码和标识，边建立自己的网页)，而XML却没有任何标记可以学，也很少有文档的标记是一模一样的。我们怎么办？呵呵，没有就自己创建呀。一旦你真正开始写XML文档，你会发现随心所欲的创造新标记也是一份很有趣的事。你可以建立有自己特色的标记，甚至建立你自己的HTML语言。&nbsp;</P>
<P>扩展性使你有更多的选择和强大的能力，但同时也产生一个问题就是你必须学会规划。你自己要理解自己的文档，知道它由哪几部分组成，相互之间的关系和如何识别它们。&nbsp;</P>
<P>关于建立标识还需要说明一点，标识是描述数据的类型或特性，比如&lt;width&gt;，年龄&lt;age&gt;，姓名&lt;name&gt;等，而不是数据的内容，比如：&lt;10pxl&gt;,&lt;18&gt;,&lt;张三&gt;，这些都是无用的标记。如果你学过数据库，你可以这样理解，标识就是一种字段名。&nbsp;</P>
<P>二.标识---使用XML你可以识别文档中的元素。&nbsp;</P>
<P>XML的第二个词是"标识"，这表明了XML的目的是标识文档中的元素。&nbsp;</P>
<P>不论你是HTML,还是XML，标识的本质在于便于理解，如果没有标识，你的文档在计算机看来只是一个很长的字符串，每个字看起来都一样，没有重点之分。&nbsp;</P>
<P>通过标识，你的文档才便于阅读和理解，你可以划分段落，列明标题。XML中，你更可以利用其扩展性&nbsp;来为文档建立更合适的标识。&nbsp;</P>
<P>不过，有一点要提醒大家注意：标识仅仅是用来识别信息，它本身并不传达信息。例如这样的HTML代码：&nbsp;</P>
<P>&lt;b&gt;frist&nbsp;step&lt;b&gt;&nbsp;<BR>这里&lt;b&gt;表示粗体，只用来说明是用粗体来显示"frist&nbsp;step"字符，&lt;b&gt;本身并不包含任何实际的信息，在页面上你看不到&lt;b&gt;，真正传达信息的是"frist&nbsp;step&nbsp;"。&nbsp;</P>
<P>三.语言---使用XML你要遵循特定的语法来标识你的文档。&nbsp;</P>
<P>XML第三个词是"语言"。这表明了作为一种语言XML必须遵循一定的规则。虽然XML的扩展性允许你创建新标识，但它仍然必须遵循特定的结构，语法和明确的定义。&nbsp;</P>
<P>在计算机领域，语言常常表示一?quot;程序语言"，用来编程实现一些功能和应用，但不是所有的"语言"都是用来编程的，XML就只是一种用来定义标识和描述信息的语言。&nbsp;</P>
<P>下面我们来深入了解一下XML应用的其本原理，可能会很枯燥，但是对于整体的理解很重要，你可以先快速过一遍，心里有一个模糊的概念，具体精髓则需要在实践中慢慢领会。</P>
<P>四.结构化---XML促使文档结构化，所有的信息按某种关系排列。&nbsp;</P>
<P>"结构化"听起来太抽象了，我们这样理解，结构化就是为你的文档建立一个框架，就象写文章先写一个提纲。结构化使你的文档看起来不会杂乱无章，每一部分都紧密联系，形成一个整体。&nbsp;</P>
<P>结构化有两个原则：&nbsp;<BR>1.每一部分(每一个元素)都和其他元素有关联。关联的级数就形成了结构。&nbsp;<BR>2.标识本身的含义与它描述的信息相分离。&nbsp;</P>
<P>我们来看一个简单的例子帮助理解：&nbsp;<BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;<BR>&lt;myfile&gt;<BR>&lt;title&gt;XML轻松学习手册&lt;/title&gt;<BR>&lt;chapter&gt;XML快速入门<BR>&lt;para&gt;什么是XML&lt;/para&gt;<BR>&lt;para&gt;使用XML的好处&lt;/para&gt;<BR>&lt;/chapter&gt;<BR>&lt;chapter&gt;XML的概念<BR>&lt;para&gt;扩展性&lt;/para&gt;<BR>&lt;para&gt;标识&lt;/para&gt;<BR>&lt;/chapter&gt;<BR>&lt;/myfile&gt;<BR>这是本文的XML描述文档，可以看到标识分三级关联,非常清晰：&nbsp;<BR>&lt;myfile&gt;<BR>&lt;chapter&gt;<BR>&lt;para&gt;<BR>...<BR>&lt;/para&gt;<BR>&lt;/chapter&gt;<BR>&lt;/myfile&gt;<BR>上面这样的文档结构，我们又称之为"文档树"，主干是父元素，如&lt;myfile&gt;，分支和页是子元素，如&lt;chapter&gt;和&lt;para&gt;。&nbsp;</P>
<P>五.Meta数据(Metadata)---专业的XML使用者会使用meta数据来工作。&nbsp;</P>
<P>在HTML中我们知道可以使用meta标识来定义网页的关键字，简介等，这些标识不会显示在网页中，但可以被搜索引擎搜索到，并影响搜索结果的排列顺序。&nbsp;</P>
<P>XML对这一原理进行了深化和扩展，用XML，你可以描述你的信息在哪里，你可以通过meta来验证信息，执行搜索，强制显示，或者处理其他的数据。&nbsp;</P>
<P>下面是一些XML&nbsp;metadata在实际应用中的用途：&nbsp;</P>
<P>1.可以验证数字签名，使在线商务的提交动作(submission)有效。&nbsp;<BR>2.可以被方便的建立索引和进行更有效搜索。&nbsp;<BR>3.可以在不同语言之间传输数据。&nbsp;</P>
<P>W3C组织正在研究一种名为RDF(Resource&nbsp;Description&nbsp;Framework)的metadata处理方法，可以自动交换信息，W3C宣称，使用RDF配合数字签名，将使网络中存在"真实可信"的电子商务。&nbsp;</P>
<P>六.显示&nbsp;</P>
<P>单独用XMl不能显示页面，我们使用格式化技术，比如CSS或者XSL，才能显示XML标记创建的文档。&nbsp;</P>
<P>我们在前面第一章讲到XML是将数据和格式分离的。XML文档本身不知道如何来显示，必须有辅助文件来帮助实现。(XML取消了所有标识，包括font,color,p等风格样式定义标识，因此XML全部是采用类似DHTML中CSS的方法来定义文档风格样式。)，XML中用来设定显示风格样式的文件类型有：&nbsp;</P>
<P>1.XSL&nbsp;</P>
<P>XSL全称是Extensible&nbsp;Stylesheet&nbsp;Language(可扩展样式语言),&nbsp;是将来设计XML文档显示样式的主要文件类型。它本身也是基于XML语言的。使用XSL，你可以灵活的设置文档显示样式，文档将自动适应任何浏览器和PDA(掌上电脑)。&nbsp;</P>
<P>XSL也可以将XML转化为HTML，那样，老的浏览器也可以浏览XML文档了。&nbsp;</P>
<P>2.CSS&nbsp;</P>
<P>CSS大家很熟悉了，全称是Cascading&nbsp;Style&nbsp;Sheets(层叠样式表)，是目前用来在浏览器上显示XML文档的主要方法。&nbsp;</P>
<P>3.Behaviors&nbsp;</P>
<P>Behaviors现在还没有成为标准。它是微软的IE浏览器特有的功能，用它可以对XML标识设定一些有趣动作。&nbsp;</P>
<P>七.DOM&nbsp;</P>
<P>DOM全称是document&nbsp;object&nbsp;model(文档对象模型)，DOM是用来干什么的呢？假设把你的文档看成一个单独的对象，DOM就是如何用HTML或者XML对这个对象进行操作和控制的标准。&nbsp;</P>
<P>面向对象的思想方法已经非常流行了，在编程语言(例如java，js)中，都运用面向对象的编程思想。在XML中，就是要将网页也作为一个对象来操作和控制，我们可以建立自己的对象和模板。与对象进行交流，如何命令对象，就要用到API。API全称Application&nbsp;Programming&nbsp;Interface，它是访问和操作对象的规则。而DOM就是一种详细描述HTML/XML文档对象规则的API。它规定了HTML/XML文档对象的命名协定，程序模型，沟通规则等。在XML文档中，我们可以将每一个标识元素看作一个对象---它有自己的名称和属性。&nbsp;</P>
<P>XML创建了标识，而DOM的作用就是告诉script如何在浏览器窗口中操作和显示这些标识&nbsp;</P>
<P>上面我们已经简要的讲述了一些XML的基本原理，我们来看看它们之间的关联以及它们是如何工作的，先看这里一张图：</P>
<P><BR><IMG src="http://bbs.xml.org.cn/images/files/gif.gif" border=0>此主题相关图片如下：<BR><A class=contentlink href="http://bbs.xml.org.cn/UploadFile/20043211415426569.gif" target=_blank><IMG alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/UploadFile/20043211415426569.gif" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0></A></P>
<P>1.XML描述数据类型。例如:"King&nbsp;lear"是一个标题元素；&nbsp;<BR>2.CSS储存并控制元素的显示样式。例如：标题将被以18pt字体显示&nbsp;<BR>3.script脚本控制元素如何动作。例如：当一个title元素"out&nbsp;of&nbsp;stock"，将被用红色显示。&nbsp;<BR>4.DOM则为脚本和对象的交流提供一个公共平台，并将结果显示在浏览器窗口。&nbsp;</P>
<P>如果任何一个部分发生错误，都不会得到正确结果。&nbsp;</P>
<P>好了，看到这里，我们已经对XML是如何工作的有一个整体的大致的概念。通过这一章的学习，我们可能感觉到XML似乎更偏向数据处理，更方便程序员学习。实际情况也是这样的，XML设计的目的就是用来方便的共享和交互数据的。下一章，我们将系统的了解关于XML的各种术语。欢迎您继续浏览。</P>
<P><FONT size=4>XML轻松学习手册（3）XML的术语</FONT></P>
<P>第三章&nbsp;XML的术语</P>
<P>提纲：&nbsp;</P>
<P><BR>导言&nbsp;</P>
<P>一.XML文档的有关术语&nbsp;</P>
<P>二.DTD的有关术语&nbsp;</P>
<P>导言&nbsp;</P>
<P><BR>初学XML最令人头疼的就是有一大堆新的术语概念要理解。由于XML本身也是一个崭新的技术，正在不断发展和变化，各组织和各大网络公司(微软,IBM,SUN等)都在不断推出自己的见解和标准，因此新概念漫天飞就不足为奇了。而国内又缺乏权威的机构或组织来对这些术语正式定名，你所看见的有关XML的中文教材大部分是靠作者本身的理解翻译过来的，有些是正确的，有些是错误的，更加妨碍了我们对这些概念的理解和学习。&nbsp;</P>
<P>你下面将要看到的关于XML术语的解释，也是作者本身的理解和翻译。阿捷是以W3C组织发布的XML1.0标准规范和相关的正式说明文档为根据来讲述。可以确保这些理解是基本正确的，至少不是错误的。你如果想进一步阅读和了解，我在本文的最后部分列明了相关资源的出处和链接，你可以直接访问。好，我们转入正题：</P>
<P>一.XML文档的有关术语</P>
<P>什么是XML文档？知道HTML原代码文件吧，XML文档就是用XML标识写的XML原代码文件。XML文档也是ASCII的纯文本文件，你可以用Notepad创建和修改。XML文档的后缀名为.XML，例如myfile.xml。用IE5.0以上浏览器也可以直接打开.xml文件，但你看到的就是"XML原代码"，而不会显示页面内容。你可以将下面代码存为myfile.xml试试：</P>
<P><BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;</P>
<P>&lt;myfile&gt;</P>
<P>&lt;title&gt;XML轻松学习手册&lt;/title&gt;</P>
<P>&lt;author&gt;ajie&lt;/author&gt;</P>
<P>&lt;email&gt;ajie@aolhoo.com&lt;/email&gt;</P>
<P>&lt;date&gt;20010115&lt;/date&gt;</P>
<P>&lt;/myfile&gt;</P>
<P><BR>XML文档包含三个部分：</P>
<P>1.&nbsp;一个XML文档声明；</P>
<P>2.&nbsp;一个关于文档类型的定义；</P>
<P>3.&nbsp;用XML标识创建的内容。</P>
<P><BR>举例说明:</P>
<P>&lt;?xml&nbsp;version="1.0"?&gt;</P>
<P>&lt;!DOCTYPE&nbsp;filelist&nbsp;SYSTEM&nbsp;"filelist.dtd"&gt;</P>
<P>&lt;filelist&gt;&nbsp;</P>
<P>&lt;myfile&gt;</P>
<P>&lt;title&gt;QUICK&nbsp;START&nbsp;OF&nbsp;XML&lt;/title&gt;</P>
<P>&lt;author&gt;ajie&lt;/author&gt;</P>
<P>&lt;/myfile&gt;</P>
<P>......</P>
<P>&lt;/filelist&gt;&nbsp;</P>
<P>其中第一行&lt;?xml&nbsp;version="1.0"?&gt;就是一个XML文档的声明，第二行说明这个文档是用filelist.dtd来定义文档类型的，第三行以下就是内容主体部分。&nbsp;<BR>我们来了解XML文档中有关的术语：</P>
<P><BR>1.Element(元素)：</P>
<P>元素在HTML我们已经有所了解，它是组成HTML文档的最小单位，在XML中也一样。一个元素由一个标识来定义，包括开始和结束标识以及其中的内容，就象这样：&lt;author&gt;ajie&lt;/author&gt;&nbsp;</P>
<P><BR>唯一不同的就是：在HTML中，标识是固定的，而在XML中，标识需要你自己创建。</P>
<P><BR>2.Tag(标识)&nbsp;</P>
<P>标识是用来定义元素的。在XML中，标识必须成对出现，将数据包围在中间。标识的名称和元素的名称是一样的。例如这样一个元素：</P>
<P>&lt;author&gt;ajie&lt;/author&gt;&nbsp;</P>
<P>其中&lt;author&gt;就是标识。</P>
<P><BR>3.Attribute(属性):&nbsp;</P>
<P>什么是属性？看这段HTML代码:&lt;font&nbsp;color="red"&gt;word&lt;/font&gt;。其中color就是font的属性之一。</P>
<P>属性是对标识进一步的描述和说明，一个标识可以有多个属性，例如font的属性还有size。XML中的属性与HTML中的属性是一样的，每个属性都有它自己的名字和数值，属性是标识的一部分。举例：</P>
<P>&lt;author&nbsp;sex="female"&gt;ajie&lt;/author&gt;</P>
<P>XML中属性也是自己定义的，我们建议你尽量不使用属性，而将属性改成子元素，例如上面的代码可以改成这样：</P>
<P>&lt;author&gt;ajie</P>
<P>&lt;sex&gt;female&lt;/sex&gt;</P>
<P>&lt;/author&gt;</P>
<P>原因是属性不易扩充和被程序操作。</P>
<P><BR>4.Declaration(声明)&nbsp;</P>
<P>在所有XML文档的第一行都有一个XML声明。这个声明表示这个文档是一个XML文档，它遵循的是哪个XML版本的规范。一个XML的声明语句就象这样：</P>
<P>&lt;?xml&nbsp;version="1.0"?&gt;&nbsp;</P>
<P><BR>5.DTD(文件类型定义)&nbsp;</P>
<P>DTD是用来定义XML文档中元素，属性以及元素之间关系的。</P>
<P>通过DTD文件可以检测XML文档的结构是否正确。但建立XML文档并不一定需要DTD文件。关于DTD文件的详细说明我们将在下面单独列项。</P>
<P><BR>6.Well-formed&nbsp;XML(良好格式的XML)</P>
<P>一个遵守XML语法规则，并遵守XML规范的文档称之为"良好格式"。如果你所有的标识都严格遵守XML规范，那么你的XML文档就不一定需要DTD文件来定义它。</P>
<P>良好格式的文档必须以一个XML声明开始，例如：</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;standalone="yes"&nbsp;encoding="UTF-8"?&gt;</P>
<P>其中你必须说明文档遵守的XML版本，目前是1.0；其次说明文档是"独立的"，它不需要DTD文件来验证其中的标识是否有效；第三，要说明文档所使用的语言编码。默认的是UTF-8，如果使用中文，你需要设置为GB2312。</P>
<P>良好格式的XML文档必须有一个根元素，就是紧接着声明后面建立的第一个元素，其它元素都是这个根元素的子元素，属于根元素一组。</P>
<P>良好格式的XML文档的内容书写时必须遵守XML语法。(有关XML语法我们将在下一章仔细讲解)</P>
<P><BR>7.Valid&nbsp;XML(有效的XML)</P>
<P>一个遵守XML语法规则，并遵守相应DTD文件规范的XML文档称为有效的XML文档。注意我们比较"Well-formed&nbsp;XML"和"Valid&nbsp;<BR>XML"，它们最大的差别在于一个完全遵守XML规范，一个则有自己的"文件类型定义(DTD)"。</P>
<P>将XML文档和它的DTD文件进行比较分析，看是否符合DTD规则的过程叫validation(确认)。这样的过程通常我们是通过一个名为parser的软件来处理的。</P>
<P>有效的XML文档也必须以一个XML声明开始，例如：</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;standalone="no"&nbsp;encode="UTF-8"?&gt;</P>
<P>和上面例子不同的，在standalone(独立)属性中，这里设置的是"no"，因为它必须和相应的DTD一起使用，DTD文件的定义方法如下：</P>
<P>&lt;!DOCTYPE&nbsp;type-of-doc&nbsp;SYSTEM/PUBLIC&nbsp;"dtd-name"&gt;&nbsp;</P>
<P>其中：</P>
<P>"!DOCTYPE"是指你要定义一个DOCTYPE;</P>
<P>"type-of-doc"是文档类型的名称，由你自己定义，通常于DTD文件名相同；</P>
<P>"SYSTEM/PUBLIC"这两个参数只用其一。SYSTEM是指文档使用的私有DTD文件的网址，而PUBLIC则指文档调用一个公用的DTD文件的网址。</P>
<P>"dtd-name"&nbsp;就是DTD文件的网址和名称。所有DTD文件的后缀名为".dtd"。</P>
<P>我们还是用上面的例子，应该写成这样：</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;standalone="no"&nbsp;encode="UTF-8"?&gt;</P>
<P>&lt;!DOCTYPE&nbsp;filelist&nbsp;SYSTEM&nbsp;"filelist.dtd"&gt;&nbsp;</P>
<P>二.DTD的有关术语</P>
<P>什么是DTD,我们上面已经简略提到。DTD是一种保证XML文档格式正确的有效方法，可以比较XML文档和DTD文件来看文档是否符合规范，元素和标签使用是否正确。一个DTD文档包含：元素的定义规则，元素间关系的定义规则，元素可使用的属性，可使用的实体或符号规则。</P>
<P>DTD文件也是一个ASCII的文本文件，后缀名为.dtd。例如:myfile.dtd。</P>
<P>为什么要用DTD文件呢？我的理解是它满足了网络共享和数据交互，使用DTD最大的好处在于DTD文件的共享。(就是上文DTD说明语句中的PUBLIC属性)。比如，两个相同行业不同地区的人使用同一个DTD文件来作为文档创建规范，那么他们的数据就很容易交换和共享。网上有其他人想补充数据，也只需要根据公用的DTD规范来建立文档，就立刻可以加入。</P>
<P>目前，已经有数量众多的写好的DTD文件可以利用。针对不同的行业和应用，这些DTD文件已经建立了通用的元素和标签规则。你不需要自己重新创建，只要在他们的基础上加入你需要的新标识。</P>
<P>当然，如果愿意，你可以创建自己的DTD，它可能和你的文档配合的更加完美。建立自己的DTD也是很简单的一件事，一般只需要定义4-5个元素就可以了。</P>
<P>调用DTD文件的方法有两种：</P>
<P>1.直接包含在XML文档内的DTD</P>
<P>你只要在DOCTYPE声明中插入一些特别的说明就可以了，象这样：&nbsp;</P>
<P>我们有一个XML文档：</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;</P>
<P>&lt;myfile&gt;</P>
<P>&lt;title&gt;XML轻松学习手册&lt;/title&gt;</P>
<P>&lt;author&gt;ajie&lt;/author&gt;</P>
<P>&lt;/myfile&gt;</P>
<P>我们在第一行后面插入下面代码就可以：</P>
<P>&lt;!DOCTYPE&nbsp;myfile&nbsp;[</P>
<P>&lt;!ELEMENT&nbsp;title&nbsp;(#PCDATA)&gt;</P>
<P>&lt;!ELEMENT&nbsp;author&nbsp;(#PCDATA)&gt;</P>
<P>&lt;!ENTITY&nbsp;copyright&nbsp;"Copyright&nbsp;2001,&nbsp;Ajie."&gt;</P>
<P>]&gt;<BR>&nbsp;</P>
<P>2.调用独立的DTD文件</P>
<P>将DTD文档存为.dtd的文件，然后在DOCTYPE声明行中调用，例如，将下面的代码存为myfile.dtd</P>
<P>&lt;!ELEMENT&nbsp;myfile&nbsp;(title,&nbsp;author)&gt;</P>
<P>&lt;!ELEMENT&nbsp;title&nbsp;(#PCDATA)&gt;</P>
<P>&lt;!ELEMENT&nbsp;author&nbsp;(#PCDATA)&gt;<BR>&nbsp;</P>
<P>然后在XML文档中调用，在第一行后插入：</P>
<P>&lt;!DOCTYPE&nbsp;myfile&nbsp;SYSTEM&nbsp;"myfile.dtd"&gt;<BR>&nbsp;</P>
<P>我们可以看到DTD文档和HTML中js的调用是差不多的，关于DTD文档具体如何写，我们将在下一章和XML文档的语法一起介绍。&nbsp;</P>
<P><BR>下面我们来了解DTD有关的术语：</P>
<P>1.Schema(规划)&nbsp;</P>
<P>schema是数据规则的描述。schema做两件事：</P>
<P>a.它定义元素数据类型和元素之间的关系；</P>
<P>b.它定义元素所能包含的内容类型。</P>
<P>DTD就是关于XML文档的一个schema。</P>
<P>2.Document&nbsp;Tree(文档树)&nbsp;</P>
<P>"文档树"在前面第二章我们已经提到过，它是文档元素分级结构的形象表示。一个文档结构树包含根元素，根元素是最顶级的元素，(就是紧接着XML声明语句后的第一个元素)。看例子：</P>
<P>&lt;?xml&nbsp;version="1.0"?&gt;</P>
<P>&lt;filelist&gt;&nbsp;</P>
<P>&lt;myfile&gt;</P>
<P>&lt;title&gt;...&lt;/title&gt;</P>
<P>&lt;author&gt;...&lt;/author&gt;</P>
<P>&lt;/myfile&gt;</P>
<P>&lt;/filelist&gt;</P>
<P>上面的例子分三级结构排列成"树"状，其中的&lt;filelist&gt;就是根元素。在XML和DTD文件中，第一个定义的都是根元素。<BR>&nbsp;</P>
<P>3.Parent&nbsp;Element(父元素)/Child&nbsp;Element(子元素)</P>
<P>父元素是指包含有其它元素的元素，被包含的元素称为它的子元素。看上面的"结构树"，其中&lt;myfile&gt;是父元素，&lt;title&gt;,&lt;author&gt;是它的子元素，而&lt;myfile&gt;又是&lt;filelist&gt;的子元素。象&lt;title&gt;这样没有包含任何子元素的最后一级元素我们也称之为"页元素"。<BR>4.Parser(解析软件)&nbsp;</P>
<P>Parser是一种检查XML文档是否遵循DTD规范的工具软件。</P>
<P>XML的parser发展为两类：一种是"非确认类paeser"，只检测文档是否遵守XML语法规则，是否用元素标识建立了文档树。另一种是"确认类paeser"，它不但检测文档语法，结构树，而且比较解析你使用的元素标识是否遵守了相应DTD文件的规范。</P>
<P>Parser能独立使用，也可以成为编辑软件或浏览器的一部分。在后面的相关资源列表里，我列出了当前比较流行的一些parsers。</P>
<P><BR>　　好了，通过第三章的学习，我们已经了解了一些XML和DTD的基本术语，但是我们还不知道怎样来写这些文件，需要遵循什么样的语法，在下一章，将重点介绍有关撰写XML和DTD文档的语法。请继续浏览，谢谢！</P>
<P><FONT size=4>XML轻松学习手册（4）XML语法</FONT></P>
<P>第四章&nbsp;XML语法&nbsp;</P>
<P>提纲：&nbsp;</P>
<P>一.XML语法规则&nbsp;<BR>二.元素的语法&nbsp;<BR>三.注释的语法&nbsp;<BR>四.CDATA的语法&nbsp;<BR>五.Namespaces的语法&nbsp;<BR>六.entity的语法&nbsp;<BR>七.DTD的语法&nbsp;</P>
<P>通过前面三章的学习，我们已经对什么是XML，它的实现原理以及相关的术语有所了解。接下来我们就开始学习XML的语法规范，动手写自己的XML文档。</P>
<P>一.XML语法规则</P>
<P>XML的文档和HTML的原代码类似，也是用标识来标识内容。创建XML文档必须遵守下列重要规则：<BR>规则1：必须有XML声明语句<BR>这一点我们在上一章学习时已经提到过。声明是XML文档的第一句，其格式如下：<BR>&lt;?xml&nbsp;version="1.0"&nbsp;standalone="yes/no"&nbsp;encoding="UTF-8"?&gt;&nbsp;<BR>声明的作用是告诉浏览器或者其它处理程序：这个文档是XML文档。声明语句中的version表示文档遵守的XML规范的版本；standalone表示文档是否附带DTD文件，如果有，参数为no；encoding表示文档所用的语言编码，默认是UTF-8。</P>
<P>规则2：是否有DTD文件<BR>如果文档是一个"有效的XML文档"(见上一章)，那么文档一定要有相应DTD文件，并且严格遵守DTD文件制定的规范。DTD文件的声明语句紧跟在XML声明语句后面，格式如下：<BR>&lt;!DOCTYPE&nbsp;type-of-doc&nbsp;SYSTEM/PUBLIC&nbsp;"dtd-name"&gt;&nbsp;<BR>其中：<BR>"!DOCTYPE"是指你要定义一个DOCTYPE;<BR>"type-of-doc"是文档类型的名称，由你自己定义，通常于DTD文件名相同；<BR>"SYSTEM/PUBLIC"这两个参数只用其一。SYSTEM是指文档使用的私有DTD文件的网址，而PUBLIC则指文档调用一个公用的DTD文件的网址。<BR>"dtd-name"&nbsp;就是DTD文件的网址和名称。所有DTD文件的后缀名为".dtd"。<BR>我们还是用上面的例子，应该写成这样：<BR>&lt;?xml&nbsp;version="1.0"&nbsp;standalone="no"&nbsp;encode="UTF-8"?&gt;<BR>&lt;!DOCTYPE&nbsp;filelist&nbsp;SYSTEM&nbsp;"filelist.dtd"&gt;</P>
<P>规则3：注意你的大小写<BR>在XML文档中，大小写是有区别的。&lt;P&gt;和&lt;p&gt;是不同的标识。注意在写元素时，前后标识大小写要保持一样。例如:&lt;Author&gt;ajie&lt;/Author&gt;，写成&lt;Author&gt;ajie&lt;/author&gt;是错误的。<BR>你最好养成一种习惯，或者全部大写，或者全部小写，或者大写第一个字母。这样可以减少因为大小写不匹配产生的文档错误。</P>
<P>规则4：给属性值加引号<BR>在HTML代码里面，属性值可以加引号，也可以不加。例如:&lt;font&nbsp;color=red&gt;word&lt;/font&gt;和&lt;font&nbsp;color="red"&gt;word&lt;/font&gt;都可以被浏览器正确解释。<BR>但是在XML中则规定，所有属性值必须加引号(可以是单引号，也可以是双引号)，否则将被视为错误。</P>
<P>规则5：所有的标识必须有相应的结束标识<BR>在HTML中，标识可能不是成对出现的，比?lt;br&gt;。而在XML中规定，所有标识必须成对出现，有一个开始标识，就必须有一个结束标识。否则将被视为错误。</P>
<P>规则6：所有的空标识也必须被关闭<BR>空标识就是标识对之间没有内容的标识。比如<BR>,&lt;img&gt;等标识。在XML中，规定所有的标识必须有结束标识，针对这样的空标识，XML中处理的方法是在原标识最后加/，就可以了。例如：</P>
<P>应写为&lt;br&nbsp;/&gt;；<BR>&lt;META&nbsp;name="keywords"&nbsp;content="XML,&nbsp;SGML,&nbsp;HTML"&gt;应写为&lt;META&nbsp;name="keywords"&nbsp;content="XML,&nbsp;SGML,&nbsp;HTML"&nbsp;/&gt;；<BR>&lt;IMG&nbsp;src=&nbsp;"cool.gif"&gt;应写为&lt;IMG&nbsp;src=&nbsp;"cool.gif"&nbsp;/&gt;&nbsp;</P>
<P><BR>第四章&nbsp;XML语法</P>
<P>二.元素的语法&nbsp;</P>
<P>元素由一对标识以及其中的内容组成。就象这样：ajie。元素的名称和标识的名称是一样的。标识可以用属性来进一步描述。&nbsp;</P>
<P>在XML中，没有任何保留字，所以你可以随心所欲的用任何词语来作为元素名称。但是也必须遵守下列规范：&nbsp;</P>
<P>1.名称中可以包含字母、数字以及其它字母；&nbsp;</P>
<P>2.名称不能以数字或"_"&nbsp;(下划线)开头；&nbsp;</P>
<P>3.名称不能以字母&nbsp;xml(或&nbsp;XML&nbsp;或&nbsp;Xml&nbsp;..)开头&nbsp;</P>
<P>4.名称中不能包含空格&nbsp;</P>
<P>5.名称中间不能包含":"(冒号)&nbsp;</P>
<P>为了使元素更容易阅读理解和操作，我们还有一些建议：&nbsp;</P>
<P>1.名称中不要使用"."。因为在很多程序语言中,"."是作为对象的属性，例如：font.color。同样的原因"-"也最好不要用，必须使用的，以"_"代替；&nbsp;</P>
<P>2.名称尽量简短。&nbsp;</P>
<P>3.名称的大小写尽量采用同一标准。&nbsp;</P>
<P>4.名称可以使用非英文字符，比如用中文。但是有些软件可能不支持。(IE5目前是支持中文元素的。)&nbsp;</P>
<P>另外，补充一点关于属性的说明。在HTML中，属性可以用来定义元素的显示格式，比如：&lt;font&nbsp;color="red"&gt;word&lt;/font&gt;将把word显示为红色。而在XML中，属性只是对标识的描述，与元素内容的显示无关。例如同样一句：&lt;font&nbsp;color="red"&gt;word&lt;/font&gt;，并不会将word显示为红色。(那么，有网友会问：如何在XML中将文字显示为红色呢？这就需要使用CSS或者XSL，我们在下面详细讲述。)&nbsp;</P>
<P>三.注释的语法&nbsp;</P>
<P>注释是为了便于阅读和理解，在XML文档添加的附加信息，将不会被程序解释或则浏览器显示。&nbsp;</P>
<P>注释的语法如下：&nbsp;</P>
<P>&lt;!--&nbsp;这里是注释信息&nbsp;--&gt;&nbsp;</P>
<P>可以看到，它和HTML中的注释语法是一样的，非常容易。养成良好的注释习惯将使你的文档更加便于维护，共享，看起来也更专业。&nbsp;</P>
<P>四.CDATA的语法&nbsp;</P>
<P>CDATA全称character&nbsp;data，翻译为字符数据。我们在写XML文档时，有时需要显示字母，数字和其它的符号本身，比如"&lt;"，而在XML中，这些字符已经有特殊的含义，我们怎么办呢？这就需要用到CDATA语法。语法格式如下：&nbsp;</P>
<P>&lt;![CDATA[这里放置需要显示的字符]]&gt;&nbsp;</P>
<P>例如：&nbsp;</P>
<P>&lt;![CDATA[&lt;AUTHOR&nbsp;sex="female"&gt;ajie&lt;/AUTHOR&gt;]]&gt;&nbsp;</P>
<P>在页面上显示的内容将是"&lt;AUTHOR&nbsp;sex="female"&gt;ajie&lt;/AUTHOR&gt;"&nbsp;</P>
<P><BR>第四章&nbsp;XML语法</P>
<P>五.Namespaces的语法&nbsp;</P>
<P>Namespaces翻译为名字空间。名字空间有什么作用呢？当我们在一个XML文档中使用他人的或者多个DTD文件，就会出现这样的矛盾：因为XML中标识都是自己创建的，在不同的DTD文件中，标识名可能相同但表示的含义不同，这就可能引起数据混乱。<BR>比如在一个文档&lt;table&gt;wood&nbsp;table&lt;/table&gt;中&lt;table&gt;表示桌子，<BR>而在另一个文档&lt;table&gt;namelist&lt;/table&gt;中&lt;table&gt;表示表格。如果我需要同时处理这两个文档，就会发生名字冲突。<BR>了解决这个问题，我们引进了namespaces这个概念。namespaces通过给标识名称加一个网址(URL)定位的方法来区别这些名称相同的标识。&nbsp;<BR>Namespaces同样需要在XML文档的开头部分声明，声明的语法如下：<BR>&lt;document&nbsp;xmlns:yourname='URL'&gt;<BR>其中yourname是由你定义的namespaces的名称，URL就是名字空间的网址。<BR>假设上面的"桌子&lt;table&gt;"文档来自<A class=contentlink href="http://www.zhuozi.com/" target=_blank><FONT color=#4455aa>http://www.zhuozi.com</FONT></A>，我们就可以声明为<BR>&lt;document&nbsp;xmlns:zhuozi='<A class=contentlink href="http://www.zhuozi.com&amp;/" target=_blank><FONT color=#4455aa>http://www.zhuozi.com&amp;</FONT></A>#39;&gt;&nbsp;<BR>然后在后面的标识中使用定义好的名字空间：<BR>&lt;zhuozi:table&gt;wood&nbsp;table&lt;/table&gt;<BR>这样就将这两个&lt;table&gt;区分开来。注意的是：设置URL并不是说这个标识真的要到那个网址去读取，仅仅作为一种区别的标志而已。</P>
<P>六.entity的语法</P>
<P>entity翻译为"实体"。它的作用类似word中的"宏"，也可以理解为DW中的摸板，你可以预先定义一个entity，然后在一个文档中多次调用，或者在多个文档中调用同一个entity。<BR>entity可以包含字符，文字等等，使用entity的好处在于：1.它可以减少差错，文档中多个相同的部分只需要输入一遍就可以了。2.它提高维护效率。比如你有40个文档都包含copyright的entity，如果需要修改这个copyright,不需要所有的文件都修改，只要改最初定义的entity语句就可以了。<BR>XML定义了两种类型的entity。一种是我们这里说的普通entity，在XML文档中使用；另一种是参数entity，在DTD文件中使用。<BR>entity的定义语法为:<BR>&lt;!DOCTYPE&nbsp;filename&nbsp;[<BR>&lt;!ENTITY&nbsp;entity-name&nbsp;"entity-content"<BR>]<BR>&gt;<BR>例如我要定义一段版权信息:<BR>&lt;!DOCTYPE&nbsp;copyright&nbsp;[<BR>&lt;!ENTITY&nbsp;copyright&nbsp;"Copyright&nbsp;2001,&nbsp;Ajie.&nbsp;All&nbsp;rights&nbsp;reserved"<BR>]<BR>&gt;<BR>如果我的版权信息内容和他人共享一个XML文件，也可以使用外部调用的方法，语法象这样：<BR>&lt;!DOCTYPE&nbsp;copyright&nbsp;[<BR>&lt;!ENTITY&nbsp;copyright&nbsp;SYSTEM&nbsp;"<A class=contentlink href='http://www.sample.com/copyright.xml">' target=_blank><FONT color=#4455aa>http://www.sample.com/copyright.xml"&gt;</FONT></A>&nbsp;<BR>]<BR>&gt;<BR>定义好的entity在文档中的引用语法为：&amp;entity-name;<BR>例如，上面定义的版权信息，调用时写作?copyright;<BR>完整的例子如下，你可以copy下来存为copyright.xml观看实例：<BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;<BR>&lt;!DOCTYPE&nbsp;copyright&nbsp;[<BR>&lt;!ENTITY&nbsp;copyright&nbsp;"Copyright&nbsp;2001,&nbsp;Ajie.&nbsp;All&nbsp;rights&nbsp;reserved"&gt;<BR>]&gt;<BR>&lt;myfile&gt;<BR>&lt;title&gt;XML&lt;/title&gt;<BR>&lt;author&gt;ajie&lt;/author&gt;<BR>&lt;email&gt;ajie@aolhoo.com&lt;/email&gt;<BR>&lt;date&gt;20010115&lt;/date&gt;<BR>©right;<BR>&lt;/myfile&gt;&nbsp;</P>
<P><BR>第四章&nbsp;XML语法</P>
<P>七.DTD的语法&nbsp;</P>
<P>DTD是"有效XML文档"的必须文件，我们通过DTD文件来定义文档中元素和标识的规则及相互关系。如何建立一个DTD文件呢？让我们一起来学习：&nbsp;</P>
<P>1.设置元素&nbsp;</P>
<P>元素是XML文档的基本组成部分。你要在DTD中定义一个元素，然后在XML文档中使用。元素的定义语法为：&lt;!ELEMENT&nbsp;DESCRIPTION&nbsp;(#PCDATA,&nbsp;DEFINITION)*&gt;&nbsp;</P>
<P>说明：&nbsp;</P>
<P>"&lt;!ELEMENT"&nbsp;是元素的声明，说明你要定义的是一个元素；&nbsp;</P>
<P>声明后面的"DESCRIPTION",是元素的名称；&nbsp;</P>
<P>"(#PCDATA,&nbsp;DEFINITION)*&gt;"则是该元素的使用规则。规则定义了元素可以包含的内容以及相互的关系。下面的表格概要列出了元素的规则：&nbsp;</P>
<P>2.元素规则表:&nbsp;</P>
<P><BR><IMG src="http://bbs.xml.org.cn/images/files/gif.gif" border=0>此主题相关图片如下：<BR><A class=contentlink href="http://bbs.xml.org.cn/UploadFile/20043211552231245.gif" target=_blank><IMG alt="" src="http://bbs.xml.org.cn/UploadFile/20043211552231245.gif" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 dypop="按此在新窗口浏览图片"></A></P>
<P>另外，我们还可以为元素定义属性，因为我们不推荐使用属性，在这里就不详细展开了。</P>
<P>　最后，我们来总结一些前四章学习的内容，写一个包含DTD，XML，以及Script的简单实例，便于读者理解：<BR>1.将下面文件存为myfile.dtd<BR>&lt;!ELEMENT&nbsp;myfile&nbsp;(title,&nbsp;author)&gt;<BR>&lt;!ELEMENT&nbsp;title&nbsp;(#PCDATA)&gt;<BR>&lt;!ELEMENT&nbsp;author&nbsp;(#PCDATA)&gt;</P>
<P>2.然后建立XML文档myfile.xml:<BR>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;<BR>&lt;!DOCTYPE&nbsp;myfile&nbsp;SYSTEM&nbsp;"myfile.dtd"&gt;<BR>&lt;myfile&gt;<BR>&lt;title&gt;XML轻松学习手册&lt;/title&gt;<BR>&lt;author&gt;ajie&lt;/author&gt;<BR>&lt;/myfile&gt;</P>
<P>3.建立HTML文档myfile.html<BR>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;script&nbsp;language="<I>javascript</I>"&nbsp;for="window"&nbsp;event="onload"&gt;<BR>var&nbsp;xmlDoc&nbsp;=&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLDOM");<BR>xmlDoc.async="false";<BR>xmlDoc.load("myfile.xml");<BR>nodes&nbsp;=&nbsp;xmlDoc.documentElement.childNodes;<BR>title.innerText&nbsp;=&nbsp;nodes.item(0).text;<BR>author.innerText&nbsp;=&nbsp;nodes.item(1).text;<BR>&lt;/script&gt;<BR>&lt;title&gt;在HTML中调用XML数据&lt;/title&gt;<BR>&lt;/head&gt;<BR>&lt;body&nbsp;bgcolor="#FFFFFF"&gt;<BR>&lt;b&gt;标题:&nbsp;&lt;/b&gt;<BR>&lt;span&nbsp;id="title"&gt;&lt;/span&gt;&lt;br&gt;<BR>&lt;b&gt;作者:&nbsp;&lt;/b&gt;<BR>&lt;span&nbsp;id="author"&gt;&lt;/span&gt;&lt;br&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;</P>
<P>4.用IE5.0以上浏览器打开myfile.html就可以看到效果了。</P>
<P><FONT size=4>XML轻松学习手册（5）XML实例解析</FONT></P>
<P>第五章：XML实例解析&nbsp;</P>
<P>提纲：&nbsp;</P>
<P>一：实例效果&nbsp;</P>
<P>二：实例解析&nbsp;<BR>　　1.定义新标识。<BR>　　2.建立XML文档。<BR>　　3.建立相应的HTML文件。&nbsp;</P>
<P>XML在不同领域有着广泛的应用，比如在科技领域的MathML，无线通信应用的WML，在网络图象方面的SVG等等，我们这里侧重讨论XML在web上的应用。XML在web上应用主要是利用其强大的数据操作能力。一般用XML配合<I>javascript</I>和asp等服务器端程序，可以实现网络上几乎所有的应用需求。&nbsp;</P>
<P>考虑讲解方便，我们在下面介绍一个简单的实例，不包含服务器端程序。目的在于让您对XML的数据操作能力有一个感性的认识。&nbsp;</P>
<P>好，我们首先[&nbsp;点击这里&nbsp;]来看实例的效果。(请用IE5.0以上版本浏览器打开)&nbsp;</P>
<P>这是一个简单的CD唱片数据检索功能。你通过点击"上一张","下一张"可以看到单张CD的有关信息。这样的效果我们原来用两种方法可以实现：&nbsp;</P>
<P>1.利用DHTML，将数据隐藏在不同的层中，通过鼠标事件依次显示；&nbsp;</P>
<P>2.利用后台程序(如ASP,CGI,PHP,JSP等)，调用服务器端的数据。&nbsp;</P>
<P>但是在这个实例中，我们打开页面原代码可以看到，其中没有用DHTML的DIV，也没有表单的action，它完全是用XML来实现的。下面我们来分析它的制作过程：</P>
<P>第一步：定义新标识。<BR>根据实际的CD数据，首先新建一个名为&lt;CD&gt;的标识；其次建立它相关的数据标识，分别是:CD名称&lt;Title&gt;,演唱者&lt;Artist&gt;,出版年代&lt;Year&gt;,国家&lt;Country&gt;,发行公司&lt;Company&gt;和价格&lt;Price&gt;；最后还要建立一个名为目录&lt;CATALOG&gt;的标识。为什么要再建立一个&lt;CATALOG&gt;标识呢？因为在XML文档中规定，必须且只能有一个根元素(标识)，我们有多个CD数据，这些数据是并列的关系，所以需要为这些并列的元素建立一个根元素。<BR>以上元素的定义和关系都完全符合XML标准，不需要特别的DTD文件来定义，所以可以省略DTD定义。如果我们想使用DTD来定义，以上过程可以表示为：</P>
<P>&lt;!ELEMENT&nbsp;CATALOG&nbsp;(CD)*&gt;<BR>&lt;!ELEMENT&nbsp;CD&nbsp;(Title,Artist,Year,Country,Company,Price)&gt;<BR>&lt;!ELEMENT&nbsp;Title&nbsp;(#PCDATA)&gt;<BR>&lt;!ELEMENT&nbsp;Artist&nbsp;(#PCDATA)&gt;<BR>&lt;!ELEMENT&nbsp;Year&nbsp;(#PCDATA)&gt;<BR>&lt;!ELEMENT&nbsp;Country&nbsp;(#PCDATA)&gt;<BR>&lt;!ELEMENT&nbsp;Company&nbsp;(#PCDATA)&gt;<BR>&lt;!ELEMENT&nbsp;Price&nbsp;(#PCDATA)&gt;</P>
<P>这段代码表示：元素CATALOG包含多个CD子元素，而子元素CD又依次包含Title,&nbsp;Artist,&nbsp;Year,&nbsp;Country,&nbsp;Company,&nbsp;Price&nbsp;六个子元素，它们的内容都定义为文本(字符,数字,文本)。(注:具体的语法说明可以看上一章关于DTD的介绍)&nbsp;</P>
<P>第二步：建立XML文档。</P>
<P>&lt;?xml&nbsp;version="1.0"?&gt;<BR>&lt;CATALOG&gt;<BR>&lt;CD&gt;<BR>&lt;TITLE&gt;Empire&nbsp;Burlesque&lt;/TITLE&gt;<BR>&lt;ARTIST&gt;Bob&nbsp;Dylan&lt;/ARTIST&gt;<BR>&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<BR>&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<BR>&lt;PRICE&gt;10.90&lt;/PRICE&gt;<BR>&lt;YEAR&gt;1985&lt;/YEAR&gt;<BR>&lt;/CD&gt;<BR>&lt;CD&gt;<BR>&lt;TITLE&gt;Hide&nbsp;your&nbsp;heart&lt;/TITLE&gt;<BR>&lt;ARTIST&gt;Bonnie&nbsp;Tylor&lt;/ARTIST&gt;<BR>&lt;COUNTRY&gt;UK&lt;/COUNTRY&gt;<BR>&lt;COMPANY&gt;CBS&nbsp;Records&lt;/COMPANY&gt;<BR>&lt;PRICE&gt;9.90&lt;/PRICE&gt;<BR>&lt;YEAR&gt;1988&lt;/YEAR&gt;<BR>&lt;/CD&gt;<BR>&lt;CD&gt;<BR>&lt;TITLE&gt;Greatest&nbsp;Hits&lt;/TITLE&gt;<BR>&lt;ARTIST&gt;Dolly&nbsp;Parton&lt;/ARTIST&gt;<BR>&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<BR>&lt;COMPANY&gt;RCA&lt;/COMPANY&gt;<BR>&lt;PRICE&gt;9.90&lt;/PRICE&gt;<BR>&lt;YEAR&gt;1982&lt;/YEAR&gt;<BR>&lt;/CD&gt;<BR>&lt;CD&gt;<BR>&lt;TITLE&gt;Still&nbsp;got&nbsp;the&nbsp;blues&lt;/TITLE&gt;<BR>&lt;ARTIST&gt;Gary&nbsp;More&lt;/ARTIST&gt;<BR>&lt;COUNTRY&gt;UK&lt;/COUNTRY&gt;<BR>&lt;COMPANY&gt;Virgin&nbsp;redords&lt;/COMPANY&gt;<BR>&lt;PRICE&gt;10.20&lt;/PRICE&gt;<BR>&lt;YEAR&gt;1990&lt;/YEAR&gt;<BR>&lt;/CD&gt;<BR>&lt;CD&gt;<BR>&lt;TITLE&gt;Eros&lt;/TITLE&gt;<BR>&lt;ARTIST&gt;Eros&nbsp;Ramazzotti&lt;/ARTIST&gt;<BR>&lt;COUNTRY&gt;EU&lt;/COUNTRY&gt;<BR>&lt;COMPANY&gt;BMG&lt;/COMPANY&gt;<BR>&lt;PRICE&gt;9.90&lt;/PRICE&gt;<BR>&lt;YEAR&gt;1997&lt;/YEAR&gt;<BR>&lt;/CD&gt;<BR>&lt;/CATALOG&gt;&nbsp;</P>
<P>上面代码首先用&lt;?xml&nbsp;version="1.0"?&gt;声明语句表明这是一个XML文档，它的格式遵守XML&nbsp;1.0标准规范。然后是文档内容，结构树非常清晰：<BR>&lt;CATALOG&gt;<BR>&lt;CD&gt;<BR>......&nbsp;<BR>&lt;/CD&gt;<BR>&lt;CD&gt;<BR>......&nbsp;<BR>&lt;/CD&gt;</P>
<P>&lt;/CATALOG&gt;<BR>一共定义了5组数据。我们将上面的代码存为cd.xml文件，以备调用。&nbsp;</P>
<P><BR>第三步：建立相应的HTML文件。<BR>1.导入XML数据。<BR>我们知道，目前流行的浏览器中，暂时只有微软的IE5.0以上版本浏览器支持XML。IE是通过在HTML中的object物件来支持插入XML，并通过js的XMLDocument.load()方法来导入数据。我们看代码：&nbsp;&lt;object&nbsp;WIDTH="0"&nbsp;HEIGHT="0"<BR>CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"&nbsp;ID="xmldso"&gt;<BR>&lt;/object&gt;</P>
<P>定义一个object，ID名为xmldso。然后在head区用js引入xml数据：</P>
<P>&lt;script&nbsp;for="window"&nbsp;event="onload"&gt;<BR>xmldso.XMLDocument.load("cd.xml");<BR>&lt;/script&gt;</P>
<P>2.捆绑数据。<BR>然后将用&lt;SPAN&gt;标识来将XML数据绑定在表格中。其中ID,DATASRC,DTATFLD都是&lt;SPAN&gt;的属性。代码如下：</P>
<P>&lt;table&gt;<BR>&lt;tr&gt;&lt;td&gt;Title:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="title"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="TITLE"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Artist:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="artist"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="ARTIST"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Year:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="year"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="YEAR"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Country:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="country"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="COUNTRY"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Company:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="company"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="COMPANY"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Price:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="price"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="PRICE"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;/table&gt;</P>
<P>3.动作操作。<BR>最后，为数据提供浏览按钮：<BR>&lt;INPUT&nbsp;TYPE=button&nbsp;<I>value</I>="上一张CD"&nbsp;<I>onCLICK</I>="moveprevious()"&gt;<BR>&lt;INPUT&nbsp;TYPE=button&nbsp;<I>value</I>="下一张CD"&nbsp;<I>onCLICK</I>="movenext()"&gt;</P>
<P>并利用js来完成两个鼠标点击功能：movenext()和moveprevious()。在head区加入如下代码：</P>
<P>&lt;script&nbsp;language="<I>javascript</I>"&gt;<BR>function&nbsp;movenext()<BR>{<BR>if&nbsp;(xmldso.recordset.absoluteposition&nbsp;&lt;&nbsp;xmldso.recordset.recordcount)<BR>{<BR>xmldso.recordset.movenext();<BR>}<BR>}<BR>function&nbsp;moveprevious()<BR>{<BR>if&nbsp;(xmldso.recordset.absoluteposition&nbsp;&gt;&nbsp;1)<BR>{<BR>xmldso.recordset.moveprevious();<BR>}<BR>}<BR>&lt;/script&gt;</P>
<P>好，我们先看HTML文件的全部原代码：</P>
<P>&lt;html&gt;<BR>&lt;head&gt;</P>
<P>&lt;script&nbsp;for="window"&nbsp;event="onload"&gt;<BR>xmldso.XMLDocument.load("cd.xml");<BR>&lt;/script&gt;</P>
<P>&lt;script&nbsp;language="<I>javascript</I>"&gt;<BR>function&nbsp;movenext()<BR>{<BR>if&nbsp;(xmldso.recordset.absoluteposition&nbsp;&lt;&nbsp;xmldso.recordset.recordcount)<BR>{<BR>xmldso.recordset.movenext();<BR>}<BR>}<BR>function&nbsp;moveprevious()<BR>{<BR>if&nbsp;(xmldso.recordset.absoluteposition&nbsp;&gt;&nbsp;1)<BR>{<BR>xmldso.recordset.moveprevious();<BR>}<BR>}<BR>&lt;/script&gt;</P>
<P>&lt;TITLE&gt;CD&nbsp;Navigate&lt;/TITLE&gt;<BR>&lt;/head&gt;</P>
<P>&lt;body&gt;<BR>&lt;p&gt;<BR>&lt;object&nbsp;WIDTH="0"&nbsp;HEIGHT="0"<BR>CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"&nbsp;ID="xmldso"&gt;<BR>&lt;/object&gt;</P>
<P>&lt;table&gt;<BR>&lt;tr&gt;&lt;td&gt;Title:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="title"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="TITLE"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Artist:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="artist"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="ARTIST"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Year:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="year"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="YEAR"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Country:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="country"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="COUNTRY"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Company:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="company"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="COMPANY"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;tr&gt;&lt;td&gt;Price:&lt;/td&gt;&lt;td&gt;&lt;SPAN&nbsp;ID="price"&nbsp;DATASRC=#xmldso&nbsp;DATAFLD="PRICE"&gt;&lt;/SPAN&gt;&lt;/td&gt;&lt;/tr&gt;<BR>&lt;/table&gt;</P>
<P>&lt;p&gt;<BR>&lt;INPUT&nbsp;TYPE=button&nbsp;<I>value</I>="上一张CD"&nbsp;<I>onCLICK</I>="moveprevious()"&gt;<BR>&lt;INPUT&nbsp;TYPE=button&nbsp;<I>value</I>="下一张CD"&nbsp;<I>onCLICK</I>="movenext()"&gt;<BR>&lt;/p&gt;</P>
<P>&lt;/body&gt;<BR>&lt;/html&gt;</P>
<P>将以上代码存为cd.htm文件，于第二步的cd.xml文件放在一起。打开cd.htm文件，你就看见和上面实例一样的效果了。</P>
<P>好，到今天为止，我们已经学习了关于XML的不少知识，我们来总结一下前面五个章节，分别是XML快速入门，XML的概念原理，XML的术语，XML的语法和本章的实例解析。到这里，教程部分就结束了。在写作过程中，阿捷尽最大努力将有关XML概念讲得通俗易懂，尽量把自己的理解告诉给大家，但因为本人学习XML时间也不长，对整个XML的技术把握还不够系统和深入，所以难免有疏漏的地方，请大家指正和谅解，谢谢！<BR>&lt;完&gt;</P><img src ="http://www.blogjava.net/xxxzheng/aggbug/22269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-12-02 17:25 <a href="http://www.blogjava.net/xxxzheng/archive/2005/12/02/22269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是XML</title><link>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22264.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Fri, 02 Dec 2005 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22264.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/22264.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/12/02/22264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/22264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/22264.html</trackback:ping><description><![CDATA[什么是XML<BR><BR>　 XML是一个精简的SGML，它将SGML的丰富功能与HTML的易用性结合到Web的用中。XML保留了SGML的可扩展功能，这使XML从根本上有别于HTML。XML要比HTML强大得多，它不再是固定的标记，而是允许定义数量不限的标记来描述文档中的资料，允许嵌套的信息结构。HTML只是Web显示数据的通用方法，而XML提供了一个直接处理 Web 数据的通用方法。HTML着重描述Web页面的显示格式，而XML着重描述的是Web页面的内容。让我们先来看一看用XML描述<BR>　&lt;weatherreport&gt;<BR><BR>　　&lt;date&gt;March 25, 1998&lt;/date&gt;<BR><BR>　　&lt;time&gt;08:00&lt;/time&gt;<BR><BR>　　&lt;area&gt;<BR><BR>　　　&lt;city&gt;Seattle&lt;/city&gt;<BR><BR>　　　&lt;state&gt;WA&lt;/state&gt;<BR><BR>　　　&lt;region&gt;West Coast&lt;/region&gt;<BR><BR>　　　&lt;country&gt;USA&lt;/country&gt;<BR><BR>　　&lt;/area&gt;<BR><BR>　　&lt;measurements&gt;<BR><BR>　　　&lt;skies&gt;partly cloudy&lt;/skies&gt;<BR><BR>　　　&lt;temperature&gt;46&lt;/temperature&gt;<BR><BR>　　　&lt;wind&gt;<BR><BR>　　　&lt;direction&gt;SW&lt;/direction&gt;<BR><BR>　　　&lt;windspeed&gt;6&lt;/windspeed&gt;<BR><BR>　　&lt;/wind&gt;<BR><BR>　　&lt;hindex&gt;51&lt;/hindex&gt;<BR><BR>　　&lt;humidity&gt;87&lt;/humidity&gt;<BR><BR>　　&lt;visibility&gt;10&lt;/visibility&gt;<BR><BR>　　&lt;uvindex&gt;1&lt;/uvindex&gt;<BR><BR>　&lt;/measurements&gt;<BR><BR>&lt;/weatherreport&gt;<BR><BR><BR><BR>　　为了使编写的Web页面成为有效的XML文档，文中每一添加的标记必须记入一个<BR><BR>独立的DTD文件中。当客户浏览天气预报文档时，相关的DTD文件是随着文档一起下<BR><BR>载到客户端，客户浏览器就懂得怎样来处理它们，例如你可以从几个天气报告中计<BR><BR>算出平均温度等，最后将结果显示出来。<BR><BR>　　DTD文件使XML页面能包含更多的内容，表现更复杂的形式。从实例中也可以看<BR><BR>出XML页面信息是结构化的，有些与数据库结构类似，因而更具访问性，其检索结<BR><BR>果更有针对性、更准确。<BR><BR>　　另外你也可以将URL地址定义在DTD文件中，当Web主页地址发生变化时，你只<BR><BR>需改动DTD文件中的定义即可，而不必一一在HTML文档中改变URL地址，从而使Web<BR><BR>的维护更方便，用户也不会遇到URL地址找不到的信息，这样一来，Web的应用更稳<BR><BR>定。<BR><BR>　　并不是所有的DTD文件都要下载到客户端，已经制订成为标准的协议，例如在<BR><BR>后面第六点中提到的化学标记语言CML、数学标记语言MML等是不需要DTD文件的。<BR><BR><BR><BR>　　除了DTD外，XML中还包括可扩展格式语言XSL(Extensible Style Language) <BR><BR>和可扩展链接语言XLL(Extensible Linking Language)。<BR><BR>　　XSL用于将XML数据翻译为HTML或其他格式的语言。XSL提供了一种叠式页面<BR><BR>CSS的功能，使开发者构造出具有表达层结构的Web页面来，以有别于XML的数据结<BR><BR>构。XSL也能和HTML一起构造叠式页面。XSL可以解释数量不限的标记，它使Web的<BR><BR>版面更丰富多彩，例如动态的文本、跑马式的文字。此外，XSL还处理多国文字、<BR><BR>双字节的汉字显示、网格的各种各样的处理等。<BR><BR>　　XLL是XML的链接语言，它与HTML的链接相似，但功能更强大。XLL支持可扩展<BR><BR>的链接和多方向的链接。它打破了HTML只支持超级文本概念下最简单的链接限制，<BR><BR>能支持独立于地址的域名、双向链路、环路、多个源的集合链接等。XLL链接可不<BR><BR>受文档制约，完全按用户要求来指定和管理。<BR><BR>　　为了使XML易学易用，XML精简了一大片SGML难得用一次的功能。正如几十万汉<BR><BR>字中常用的只不过八千，SGML常用的部分只占20％，XML抛弃了SGML中不常用的部<BR><BR>分，使它一下就精简了80％。这样一来，XML的语法说明书只有30页，而SGML却有<BR><BR>500页。<BR><BR>　　XML设计中也考虑了它的易用性，易用性来自两个方面：一方面用户编写Web页<BR><BR>面方便，另一方面设计人员实现XML浏览器也不太困难。<BR><BR>　　总之，XML使用一个简单而有灵活的标准格式，为基于Web的应用提供了一个描<BR><BR>述数据和交换数据的有效手段。HTML描述了显示全球数据的通用方法，而XML提供<BR><BR>了直接处理全球数据的通用方法。<BR><BR><BR><BR>目前的主要XML技术<BR><BR>XML 与 命名空间<BR><BR>文档类型定义DTD<BR><BR>XPath<BR><BR>XPointer、XInclude、XML Base<BR><BR>XSL Transformations<BR><BR>SAX<BR><BR>DOM<BR><BR>XML Schema<BR><BR>SOAP<img src ="http://www.blogjava.net/xxxzheng/aggbug/22264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-12-02 16:56 <a href="http://www.blogjava.net/xxxzheng/archive/2005/12/02/22264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些简单得JAVA小程序</title><link>http://www.blogjava.net/xxxzheng/archive/2005/12/01/22138.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Thu, 01 Dec 2005 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/12/01/22138.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/22138.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/12/01/22138.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/22138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/22138.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一个简单的Java应用程序public class Hello{ &nbsp;&nbsp;&nbsp;&nbsp;public static void main (String args[ ])&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("这是一个简单的应用程序");&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/xxxzheng/archive/2005/12/01/22138.html'>阅读全文</a><img src ="http://www.blogjava.net/xxxzheng/aggbug/22138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-12-01 17:49 <a href="http://www.blogjava.net/xxxzheng/archive/2005/12/01/22138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>连接数据库大全</title><link>http://www.blogjava.net/xxxzheng/archive/2005/12/01/22135.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Thu, 01 Dec 2005 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/12/01/22135.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/22135.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/12/01/22135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/22135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/22135.html</trackback:ping><description><![CDATA[Java数据库连接（JDBC）由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API，使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同，所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。<BR><BR>　　一、连接各种数据库方式速查表<BR><BR>　　下面罗列了各种数据库使用JDBC连接的方式，可以作为一个手册使用。<BR><BR>　　1、Oracle8/8i/9i数据库（thin模式）<BR><BR>Class.forName(“oracle.jdbc.driver.OracleDriver“).newInstance();<BR>String url=“jdbc:oracle:thin:@localhost:1521:orcl“; //orcl为数据库的SID<BR>String user=“test“;<BR>String password=“test“;<BR>Connection conn= DriverManager.getConnection(url,user,password);<BR><BR>　　2、DB2数据库<BR>Class.forName(“com.ibm.db2.jdbc.app.DB2Driver “).newInstance();<BR>String url=“jdbc:db2://localhost:5000/sample“; //sample为你的数据库名<BR>String user=“admin“;<BR>String password=““;<BR>Connection conn= DriverManager.getConnection(url,user,password);<BR><BR>　　3、Sql Server7.0/2000数据库<BR>Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver“).newInstance();<BR>String url=“jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb“;<BR>//mydb为数据库<BR>String user=“sa“;<BR>String password=““;<BR>Connection conn= DriverManager.getConnection(url,user,password);<BR><BR>　　4、Sybase数据库<BR>Class.forName(“com.sybase.jdbc.SybDriver“).newInstance();<BR>String url =“ jdbc:sybase:Tds:localhost:5007/myDB“;//myDB为你的数据库名<BR>Properties sysProps = System.getProperties();<BR>SysProps.put(“user“,“userid“);<BR>SysProps.put(“password“,“user_password“);<BR>Connection conn= DriverManager.getConnection(url, SysProps);<BR>　5、Informix数据库<BR>Class.forName(“com.informix.jdbc.IfxDriver“).newInstance();<BR>String url = “jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;<BR>user=testuser;password=testpassword“; //myDB为数据库名<BR>Connection conn= DriverManager.getConnection(url);<BR><BR>　　6、MySQL数据库<BR>Class.forName(“org.gjt.mm.mysql.Driver“).newInstance();<BR>String url =“jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1“<BR>//myDB为数据库名<BR>Connection conn= DriverManager.getConnection(url);<BR><BR>　　7、PostgreSQL数据库<BR>Class.forName(“org.postgresql.Driver“).newInstance();<BR>String url =“jdbc:postgresql://localhost/myDB“ //myDB为数据库名<BR>String user=“myuser“;<BR>String password=“mypassword“;<BR>Connection conn= DriverManager.getConnection(url,user,password);<BR><BR>　　8、access数据库直连用ODBC的<BR>Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“) ;<BR>String url=“jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=“+application.getRealPath(“/Data/ReportDemo.mdb“);<BR>Connection conn = DriverManager.getConnection(url,““,“”);<BR>Statement stmtNew=conn.createStatement() ;<BR><BR>　　二、JDBC连接MySql方式<BR><BR>　　下面是使用JDBC连接MySql的一个小的教程<BR><BR>　　1、查找驱动程序<BR><BR>　　MySQL目前提供的java驱动程序为Connection/J，可以从MySQL官方网站下载，并找到mysql-connector-java-3.0.15-ga-bin.jar文件，此驱动程序为纯java驱动程序，不需做其他配置。<BR>2、动态指定classpath<BR><BR>　　如果需要执行时动态指定classpath，就在执行时采用－cp方式。否则将上面的.jar文件加入到classpath环境变量中。<BR><BR>　　3、加载驱动程序<BR>try{<BR>　Class.forName(com.mysql.jdbc.Driver);<BR>　System.out.println(Success loading Mysql Driver!);<BR>}catch(Exception e)<BR>{<BR><BR>　System.out.println(Error loading Mysql Driver!);<BR>　e.printStackTrace();<BR>}<BR><BR>　　4、设置连接的url<BR><BR>jdbc：mysql：//localhost/databasename[?pa=va][＆pa=va]<BR><BR>　　三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧<BR><BR>　　1、在客户端软件开发中使用Thin驱动程序<BR><BR>　　在开发Java软件方面，Oracle的数据库提供了四种类型的驱动程序，二种用于应用软件、applets、servlets等客户端软件，另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中，我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口（JNI），通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序，它直接与数据库进行通讯。为了获得最高的性能，Oracle建议在客户端软件的开发中使用OCI驱动程序，这似乎是正确的。但我建议使用Thin驱动程序，因为通过多次测试发现，在通常情况下，Thin驱动程序的性能都超过了OCI驱动程序。<BR><BR>　　2、关闭自动提交功能，提高系统性能<BR><BR>　　在第一次建立与数据库的连接时，在缺省情况下，连接是在自动提交模式下的。为了获得更好的性能，可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能，如下所示：<BR>　　conn.setAutoCommit(false);<BR><BR>　　值得注意的是，一旦关闭了自动提交功能，我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。<BR>3、在动态SQL或有时间限制的命令中使用Statement对象<BR><BR>　　在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象时，每次执行一个SQL命令时，都会对它进行解析和编译。这可能会使你认为，使用PreparedStatement对象比使用Statement对象的速度更快。然而，我进行的测试表明，在客户端软件中，情况并非如此。因此，在有时间限制的SQL操作中，除非成批地处理SQL命令，我们应当考虑使用Statement对象。<BR><BR>　　此外，使用Statement对象也使得编写动态SQL命令更加简单，因为我们可以将字符串连接在一起，建立一个有效的SQL命令。因此，我认为，Statement对象可以使动态SQL命令的创建和执行变得更加简单。<BR><BR>　　4、利用helper函数对动态SQL命令进行格式化<BR><BR>　　在创建使用Statement对象执行的动态SQL命令时，我们需要处理一些格式化方面的问题。例如，如果我们想创建一个将名字O‘Reilly插入表中的SQL命令，则必须使用二个相连的“‘‘”号替换O‘Reilly中的“‘”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法，然后在连接字符串心服用公式表达一个SQL命令时，使用创建的helper方法。与此类似的是，我们可以让helper方法接受一个Date型的值，然后让它输出基于Oracle的to_date()函数的字符串表达式。<BR><BR>　　5、利用PreparedStatement对象提高数据库的总体效率<BR><BR>　　在使用PreparedStatement对象执行SQL命令时，命令被数据库进行解析和编译，然后被放到命令缓冲区。然后，每当执行同一个PreparedStatement对象时，它就会被再解析一次，但不会被再次编译。在缓冲区中可以发现预编译的命令，并且可以重新使用。在有大量用户的企业级应用软件中，经常会重复执行相同的SQL命令，使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务，我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。<BR><BR>　　6、在成批处理重复的插入或更新操作中使用PreparedStatement对象<BR><BR>　　如果成批地处理插入和更新操作，就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理，只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理，或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制，可以以如下所示的方式调用setExecuteBatch()：<BR>PreparedStatement pstmt3D null;<BR>try {<BR>　((OraclePreparedStatement)pstmt).setExecuteBatch(30);<BR>　...<BR>　pstmt.executeUpdate();<BR>}<BR><BR>　　调用setExecuteBatch()时指定的值是一个上限，当达到该值时，就会自动地引发SQL命令执行，标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。<BR>7、使用Oracle locator方法插入、更新大对象（LOB）<BR><BR>　　Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理，尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值，也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB，但需要使用locator才能获取LOB的值。由于存在这二个问题，因此，我建议使用locator的方法来插入、更新或获取LOB的值。<BR><BR>　　8、使用SQL92语法调用存储过程<BR><BR>　　在调用存储过程时，我们可以使用SQL92或Oracle PL/SQL，由于使用Oracle PL/SQL并没有什么实际的好处，而且会给以后维护你的应用程序的开发人员带来麻烦，因此，我建议在调用存储过程时使用SQL92。<BR><BR>　　9、使用Object SQL将对象模式转移到数据库中<BR><BR>　　既然可以将Oracle的数据库作为一种面向对象的数据库来使用，就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象，将它们的属性映射到关系表中，然后在这些bean中添加方法。尽管这样作在Java中没有什么问题，但由于操作都是在数据库之外进行的，因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术，可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作，然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式，不但Java应用程序可以使用应用软件的对象模式，其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。<BR><BR>　　10、利用SQL完成数据库内的操作<BR><BR>　　我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求，而不是使用Java等过程化的编程语言。<BR><BR>　　如果编程人员要在一个表中查找许多行，结果中的每个行都会查找其他表中的数据，最后，编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务，何必要让数据在网上流来流去的？我建议用户认真学习如何最大限度地发挥SQL的功能<BR><img src ="http://www.blogjava.net/xxxzheng/aggbug/22135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-12-01 17:46 <a href="http://www.blogjava.net/xxxzheng/archive/2005/12/01/22135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2ee 配置</title><link>http://www.blogjava.net/xxxzheng/archive/2005/11/30/22008.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Wed, 30 Nov 2005 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/11/30/22008.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/22008.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/11/30/22008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/22008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/22008.html</trackback:ping><description><![CDATA[　1、介绍<BR>本文介绍J2EE环境的配置，所有涉及的文件都在J2EE安装目录下的oncfig目录，这些文件都是文本文件，你可以有任意的文本编辑器来编辑它们。<BR>通常情况下，你没有改变这些文件的必要。但是如果你使用的数据库驱动不是cloudscape的时候，你需要遵循本章的内容进行配置。<BR>2、JDBC驱动<BR>默认的J2EE安装后支持cloudscape数据库（一个sun公司提供的演示数据库），如果你的ejb使用的jdbc不是连接cloudscape数据库，那么你需要按照下面的知道进行配置。（如果你不能确定本版本的J2EE支持你使用的jdbc驱动，请到 11111 看相关信息。）<BR>3、驱动的位置<BR>你必须把驱动文件（.jar文件）copy到 $J2EE_HOME/lib/system目录下。并且保证该文件包含在J2EE_CLASSPATH 的环境变量中。<BR>4、J2EE_CLASSPATH 环境变量<BR>J2EE server通过JDBC驱动连接数据库。通通过J2EE_CLASSPATH 的环境变量定位驱动文件（.jar文件）的位置。你可以在启动J2EE前在命令行设置这个变量。但是我们推荐你在脚本中设置J2EE_CLASSPATH 变量。编辑用户配置文件在安装的过程中是必须的一步。在unix中，用户配置文件是 /bin/userconfig.sh，windows nt中是bin/userconfig.bat<BR>注意：你应该同时在CLASSPATH环境变量中去掉驱动文件（.jar文件）。<BR>5、JDBC 1.0 驱动<BR>为了配置jdbc1.0驱动，编辑config/default.properties 文件的jdbc.drivers 和 jdbc.datasources两个属性值。再次要注意的是驱动文件必须包含在J2EE_CLASSPATH环境变量中。<BR>jdbc.drivers 属性<BR>jdbc.drivers 属性的值是有一系列的冒号分割的jdbc驱动的类名。格式如下：<BR>jdbc.drivers=:: . . .<BR>例如：　　jdbc.drivers=oracle.jdbc.driver.OracleDriver:testutil.MyDriver<BR>jdbc.datasources 属性值<BR>jdbc.datasources 属性值由两部分组成，一个是datasource的jndi的名字，一个是数据库的url。典型的情况是：jndi名字是数据库的逻辑名字，rul指定数据库的实际位置。jndi名字和url都是在ejb编码的过程中指定的。rul的格式，请参照jdbc驱动提供商的文档。<BR>jdbc.datasources 的语法如下： <BR>jdbc.datasources=|||. . .<BR>符号有两个作用。第一，它隔开几个jndi_datasource；第二，它隔开每一个jndi_datasource中的jndi_datasource&gt; 和 元素. <BR>jndi_datasource元素的语法如下：<BR>jdbc/<BR>由jdbc关键字开头，jndi_name是在jndi目录中指定的datasouce名字。<BR>例如：　jdbc.datasources=jdbc/Oracle|jdbc:oracle:thin@rtc:1521:acct|jdbc/MyDB|jdbc:test<BR>6、支持JTA的JDBC2.0驱动<BR>配置JTA的JDBC2.0的驱动，你需要设置以下属性的值：<BR>jdbc20.datasources<BR>xadatasource..jndiname　xadatasource..classname<BR>xadatasource..dbuser<BR>xadatasource..dbpassword<BR>xadatasource..prop.<BR>同时你也必须在J2EE_CLASSPATH 环境变量中包括jdbc驱动文件。<BR>jdbc20.datasources 属性<BR>jdbc20.datasources 属性的值和jndi名字连接，用于定位datasouce的位置（它就是lookup方法的参数）。<BR>jdbc20.datasources 的语法如下：<BR>jdbc20.datasources=||||的作用有两个，第一，隔开jndi_datasource 和并组成一对，第二，隔开每一对的jndi_datasource&gt; 、元素。<BR>和 jndi_XA_datasource有相同的语法：<BR>jdbc/<BR>jdbc关键字开头。jndi_name是datasource名字，这个名字指向jndi目录。<BR>例如：　　jdbc20.datasources=jdbc/Merant|jdbc/XAMerant|jdbc/Finch|jdbc/XAFinch<BR>xadatasource属性<BR>xadatasource..jndiname 属性指定XA DataSource的jndi名字。语法如下：<BR>xadatasource..jndiname=jdbc/<BR>n代表每一组xadatasource。第一个jdbc2.0驱动n为0，下一个是1，2等等。jndi_XA_datasource元素和jdbc20.datasources 指定的值对应。The xadatasource..dbuser 和 xadatasource..dbpassword 属性指定数据库用户和密码。通常该用户具有管理员的权限（更多的信息请看 2222 The distributed.transaction.recovery ）。<BR>xadatasource..prop. 指定和特定的属性值关联的值。实际的值可能是jdbc驱动。<BR>例如：　　xadatasource.0.jndiname=jdbc/XAMerant<BR>xadatasource.0.classname=com.merant.sequelink.jdbcx.datasource.SequeLinkDataSource<BR>xadatasource.0.prop.url=jdbc:sequelink://mypc:5000/[Oracle]<BR>7、事务<BR>你可以编辑config/default.properties 文件控制事务发生和超时设置。distributed.transaction.recovery 属性这个属性控制分布事物是否发生。这些事物可以发生的话，下面的条件必须满足：<BR>跨库操作时的事物范围。<BR>J2EE程序通过jdbc2.0 JTA驱动访问数据库<BR>当故障发生的时候，事物的各个的组成部分可以按照符合两段提交协议的方式提交或回滚。<BR>事物发生的时候，server重新启动后事物可以提交或回滚。<BR>distributed.transaction.recovery的值为true或者false。J2EE安装后默认为false。<BR>distributed.transaction.recovery=false<BR>transaction.time属性<BR>在应用container-managed 事物的ejb中，你可以控制事物超时的间隔通过设置transaction.timeout的值。例如：<BR>transaction.timeout=5<BR>在设置以后，如果事物在5秒内没有完成，J2EE事物管理器将回滚它。当J2EE第一次安装的时候，timeout的值时0代表没有超时。<BR>只有使用container-managed 管理事物的ejb受到timeout的影响。至于在bean-managed和JTA　transactions 中你可以引用 UserTransaction 的 setTransactionTimeout方法。同时你也可以在其他组建中引用setTransactionTimeout方法：比如servlets和jsp。<BR>8、端口<BR>J2EE需要tcp/ip端口。修改config目录下的相应文件可以修改端口号。下表是端口号和相应的文件。<BR>EJB 9191 ejb.properties http.port=9191 <BR>　　HTTP 8000 web.properties port=8000 <BR>　　HTTPS 7000 web.properties https.port=7000 <BR>　　Naming and Directory 1050 orb.properties port=1050 <BR>　　9191 端口用于提供client下载需要的stub类<BR>　　8000 提供http服务<BR>　　7000 提供https服务<BR>　　1050 基于orb的jndi名字服务使用的端口<BR>9、日志文件<BR>J2EE server有几个日志文件。默认这些文件在logs目录下。编辑config/default.properties 文件中的 log.directory 属性可以更改默认目录。<BR>log.directory=logs <BR>同时你也可以编辑default.properties 文件更改日志文件的名字。例如：你可以修改log.output 属性的值来修改the output.log 文件的名字。<BR>一般来说，日志文件决定于启动J2EE的模式。（single还是multiple VM (virtual machine) 模式） Single VM 日志文件默认的情况是Single VM 模式。在这种情况下，日志文件位于<BR>$J2EE_HOME///ejb<BR>logs是在default.properties 文件中log.directory 属性指定的。host元素是计算机名称。生成下列文件。<BR>　　system.out<BR>　　system.err<BR>　　event.log<BR>　　output.log<BR>　　error.log<BR>　　system.out 和system.err文件包括ejb中 System.out 和 System.err的输出。如果你运行J2EE -verbose数，输出被写到stdout（标准输出） 和stderr（标准错误。输出）。system.out 和 system.err日志文件不建。只有config/auth.properties 文件中audit属性值为true时audit.lo才创建。<BR>Multiple VM 日志<BR>如果你用J2EE -mutiVM启动server，ejb和http服务在自己的虚拟机以单独的服务启动。每一个depploy的应用程序也在自己的虚拟机中运行。日志文件和上述的一样，但是存放的目录不同。目录如下：<BR>EJB $J2EE_HOME//ejb/ejbd <BR>HTTP $J2EE_HOME//ejb/httpd <BR>deployed application $J2EE_HOME//ejb/ <BR>web server日志<BR>编辑web.properties文件中的内容，可以改变由web server创建的日志文件的名字。<BR>10、安全<BR>未授权用户<BR>对于J2EE来说，当有未授权的用户试图调用ejb container的时候，J2EE必须存在一般意义上的未授权用户存在。在J2EE中这个用户名字是guest，密码是guest123。你可以在auth.properties 文件中修改用户名和密码。 <BR>default.principal.name=guest<BR>default.principal.password=guest123<BR>Keystore密码<BR>如果用户使用公钥访问https，认证信息放在/.keystore 文件中。同时user-home是System.getProperty("user.home")的返回值。keystore是一个典型的密码文件。默认的密码是changeit。可以在web.properties 文件中修改keystore.password 属性的值来改变密码。<BR>ANYONE 角色<BR>在application deployment工具的security面板中，默认的情况下方法分配给ANYONE 角色。这样的结果 是所有的用户和组都可以调用它。如果你没有影射到一个特定的角色，每一个用户和用户都可以调用它。可以在auth.properties 文件中设置anyone.role.name 的值来改变默认anyone角色。<BR>钝化发生的条件：内存限制<BR>当ejb container开始钝化一个ejb的时候，它把ejb保存在附属存储中并且试图重新分配内存。默认的情况下，如果内存使用超过128m的时候钝化开始发生。可以编辑config/default.properties 文件中passivation.threshold.memory 属性的值来修改默认值。<BR>passivation.threshold.memory=128000000<BR>值必须是一个正的整数。当你减少这个值的时候钝化现象回经常发生。<BR>jndi name server host<BR>如果jndi name server和J2EE server不在同一个机器上，你必须改变config/orb.properties 文件中host属性的值。<BR>host=localhost<BR>HTTP 文档根<BR>默认的情况下，http和https服务的文档是public_html。你可以编辑web.properties 文件中documentroot属性的值来改变它。<BR>documentroot=public_html/ <img src ="http://www.blogjava.net/xxxzheng/aggbug/22008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-11-30 17:13 <a href="http://www.blogjava.net/xxxzheng/archive/2005/11/30/22008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非常不错的SCJP真题回忆</title><link>http://www.blogjava.net/xxxzheng/archive/2005/11/30/22007.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Wed, 30 Nov 2005 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/11/30/22007.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/22007.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/11/30/22007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/22007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/22007.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PART 11.public static void main(String args[]) { Boolean a[]=new Boolean[4]; int I= 1; System.out.println(a[I]); } What will be printed? Compilation Error in Line 2 Compilation Error in line 4 Excepti...&nbsp;&nbsp;<a href='http://www.blogjava.net/xxxzheng/archive/2005/11/30/22007.html'>阅读全文</a><img src ="http://www.blogjava.net/xxxzheng/aggbug/22007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-11-30 17:08 <a href="http://www.blogjava.net/xxxzheng/archive/2005/11/30/22007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>问题集锦：Servlets/JSP开发技术问答</title><link>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21998.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Wed, 30 Nov 2005 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21998.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/21998.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/21998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/21998.html</trackback:ping><description><![CDATA[　<B>为什么GenericServlet在init(ServletConfig config)基础上增加了一个init()方法？</B><BR>　　<BR>　　init()方法被GenericServlet.init(ServletConfig config)方法调用。<BR>　　<BR>　　init()方法方便了开发人员定制Servlet的初始化，而无须去维护ServletConfig对象的存储工作。<BR>　　<BR>　　重写GenericServlet.init(ServletConfig config)必须要显示的调用super.init(config)方法。<BR>　　<BR>　　<B>ServletContext.getContect(java.lang.String uripath)的作用是什么？</B><BR>　　<BR>　　返回同一Server中指定的path对应的ServletContext对象,通过该对象可以实现与Server中的其他Context打交道。<BR>　　<BR>　　uripath必须是以"/"开始（该路径的含义是相对于整个Servlet文档的根路径，而不是当前ServletContext的根路径）。<BR>　　<BR>　　<B>Servlet生命周期是什么？</B><BR>　　<BR>　　一般的Servlet(GenericServlet,即与协议无关的Servlet)的生命周期：init() --&gt; GenericServlet.service(ServletRequest req, ServletResponse res) --&gt; destroy.<BR>　　<BR>　　HttpServlet的生命周期: init() --&gt; GenericServlet.service(ServletRequest req, ServletResponse res)---&gt; service(HttpServletRequest req, HttpServletResponse resp) --&gt; doXXXX()--&gt;destroy.<BR>　　<BR>　　<B>有没有必要重写GenericServlet.service()方法？</B><BR>　　<BR>　　对于HttpServlet来说没有必要。只需要重写它的doXXXX()方法就可以了。HttpServlet中service()方法会自动的根据用户请求类型把请求转发给相应的doXXXX()方法（例如doGet()方法）。<BR>　　<BR>　　ServletRequest.getReader()和ServletRequest.getInputStream()如何使用？<BR>　　<BR>　　注意两个方法不能同时使用。<BR>　　<BR>　　ServletRequest.getRealPath(String path)方法已经不推荐使用。<BR>　　<BR>　　请使用ServletContext.getRealPath(String path)方法。<BR>　　<BR>　　<B>ServletResponse缺省的字符集(charset)是什么?</B><BR>　　<BR>　　ServletResponse缺省的字符集(charset)是ISO-8859-1,可以通过setContentType(java.lang.String)方法改变新的字符集。<BR>　　<BR>　　例如：setContentType("text/html; charset=Shift_JIS").<BR>　　<BR>　　关于字符集信息，可以浏览<A href="http://info.internet.isi.edu/in-notes/rfc/files/rfc2045.txt" target=_blank><FONT color=blue><SPAN class=zhi14>RFC 2045</SPAN></FONT></A><BR>　　<BR>　　<B>HttpServletRequest.getRequestURI()和HttpServletRequest.getRequestURL()区别是什么?<BR>　　</B><BR>　　request.getRequestURI() 返回值类似：/xuejava/requestdemo.jsp<BR>　　<BR>　　request.getRequestURL() 返回值类似：http://localhost:8080/xuejava/requestdemo.jsp<BR>　　<BR>　　HttpServletRequest.encodeURL()和HttpServletRequest.encodeRedirectURL(()区别是什么?为什么要有两个不同的方法呢？<BR>　　<BR>　　当用URL-rewriting方式来管理Session的时候，需要用到以上的两个方法。<BR>　　<BR>　　两个方法的不同点是：两个方法确定是否需要包含session ID的逻辑不同。<BR>　　<BR>　　在调用HttpServletResponse.sendRedirect前，应该先调用encodeRedirectURL()方法，否则可能会丢失Sesssion信息。 ...<BR>　　<BR>　　<B>如何使你的Servlet或者JSP实现Single Thread Model?</B><BR>　　<BR>　　对于Servlet实现javax.single.SingleThreadModel接口。<BR>　　<BR>　　对于JSP,在Page Directive中写如下的语句&lt;%@ page isThreadSafe="false" %&gt;<BR>　　<BR>　　JSP Tag 和 JSP XML-based Tag<BR>　　<BR>　　...<BR>　　<BR>　　<B>如何把某一个JSP Page定义成为Error Page?为什么要这样做？</B><BR>　　<BR>　　实现方法： &lt;%@ page isErrorPage="true" %&gt;<BR>　　<BR>　　为什么？ 因为需要获取Exception 对象（缺省情况下，在JSP Page中是不能直接使用“隐含对象” exception的）。<BR>　　<BR>　　<B>JSP Page的执行顺序是如何的？</B><BR>　　<BR>　　JSP Page的执行顺序如下：<BR>　　<BR>　　JSP Page Translation. JSP Page --&gt; Servlet source code.<BR>　　JSP Page Compilation. Servlet source code --&gt; Servlet class.<BR>　　Load Class(First time or the server restarted)<BR>　　<BR>　　Create instance(可能会很多次，如果JSP Page中声明了&lt;%@ page isThreadSafe="false" %&gt;)<BR>　　<BR>　　Call jspInit method（一般的JSP Page都没有重写这个方法，重写需要在声明语句段中）。<BR>　　<BR>　　Call _jspService method（类似与一般HttpServlet的doGet和doPost方法，但是可以同时用来处理Post和Getq请求）。<BR>　　<BR>　　Call jspDestroy method（Server在卸载Servet的时候，例如当Servlet很久没有使用的情况）。<BR>　　<BR>　　<B>JSP Page中有哪些隐含对象(Implicity Object)?各自的类型和作用是什么？</B><BR>　　<BR>　　request --<BR>　　reponse --<BR>　　session --<BR>　　application --<BR>　　out --<BR>　　page --<BR>　　pagecontext --<BR>　　exception -- 只有在当前JSP Page为Error Page的时候才有效。<BR>　　config --<BR>　　<BR>　　<B>&lt;jsp:include page="/foo/foo.jsp" %&gt; 和 &lt;@ include file="/foo/foo.jsp" %&gt;的区别是什么？<BR>　　</B><BR>　　&lt;jsp:include ... -- request time.<BR>　　&lt;@ include ... -- Page translation time.<BR>　　<BR>　　<B>Servlets/JSP Container(Engine)有几种运行方式？</B><BR>　　<BR>　　Standalone<BR>　　Tomcat standalone mode<BR>　　In-process<BR>　　Tomcat running inside Apache Web Server.<BR>　　Out-of-process<BR>　　Apache + mod_jk + Tomcat<BR>　　<BR>　　Servlet,Servlet开发人员，Servlet API, Servlet Container的关系是什么？<BR>　　<BR>　　Servlet,Servlet开发人员 ---&gt;Servlet API --&gt; Servlet Container<BR>　　The parts of an HTTP message<BR>　　<BR>　　Message part Description<BR>　　The initial line： Specifies the purpose of the request or response message<BR>　　例子：GET /reports/sales/index.html HTTP/1.0<BR>　　The header section:Specifies the meta-information, such as size, type, and encoding,<BR>　　about the content of the message<BR>　　A blank line:<BR>　　An optional message body: The main content of the request or response message<BR>　　<BR>　　下面是一个Response的例子：<BR>　　<BR>　　HTTP/1.0 200 OK<BR>　　Date: Tue, 01 Dec 2001 23:59:59 GMT<BR>　　Content-Type: text/html<BR>　　Content-Length: 52<BR>　　<BR>　　&lt;html&gt;<BR>　　&lt;body&gt;<BR>　　&lt;h1&gt;Hello, John!&lt;/h1&gt;<BR>　　&lt;/body&gt;<BR>　　&lt;/html&gt;<BR>　　<BR>　　<B>HTTP规范中定义了哪些方法？各自有什么用途？</B><BR>　　<BR>　　GET<BR>　　HEAD<BR>　　POST<BR>　　从 Http 1.1规范开始，增加了以下的方法:<BR>　　<BR>　　PUT<BR>　　OPTIONS<BR>　　TRACE<BR>　　DELETE<BR>　　CONNECT<BR>　　<BR>　　ServetRequest中为什么要定义:getContentType(),getContentLength()方法。<BR>　　<BR>　　根据HTTP协议规范，Request 和 Response一样也有这些必不可少的内容！<BR>　　<BR>　　所以需要首先了解 HTTP Message的概念和其内容的格式，这些东西对于Request和Reponse是一样的。<BR>　　<BR>　　对于GET方式发送的请求，其内容类型为：null<BR>　　<BR>　　对于POST方式发送的请求，其内容类型为：application/x-www-form-urlencoded<BR>　　<BR>　　POST方式发送请求的内容类似于：username=xuejava.<BR>　　<BR>　　RequestDispatcher.forward()和HttpServletResponse.sendRedirect()的区别是什么？<BR>　　<BR>　　RequestDispatcher.forward()是在服务器端运行；HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成。<BR>　　<BR>　　所以RequestDispatcher.forward()对于浏览器来说是“透明的”；而HttpServletResponse.sendRedirect()则不是。<BR>　　<BR>　　另外，还要注意RequestDispatcher.forward()在调用的时候Response不能已经Commit了（Response.isCommitted()）。<BR>　　<BR>　　ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)的区别是什么？为什么？<BR>　　<BR>　　ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径；而ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。<BR>　　<BR>　　因为ServletRequest具有相对路径的概念；而ServletContext对象无次概念。<BR>　　<BR>　　<B>如何把请求转移到另外一个Web App中的某个地址？</B><BR>　　<BR>　　ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)只能把请求转移到同一个Web App中的地址。<BR>　　<BR>　　如果需要把请求转移到另外一个Web App中的某个地址，可以按下面的做法：<BR>　　<BR>　　1. 获得另外一个Web App的ServletConext对象(currentServletContext.getContext(uripath)).<BR>　　<BR>　　2. 调用ServletContext.getRequestDispatcher(String url)方法。<BR>　　<BR>　　未完待续<img src ="http://www.blogjava.net/xxxzheng/aggbug/21998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-11-30 16:56 <a href="http://www.blogjava.net/xxxzheng/archive/2005/11/30/21998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>问题集锦：Servlets/JSP开发技术问答</title><link>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21997.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Wed, 30 Nov 2005 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21997.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/21997.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/21997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/21997.html</trackback:ping><description><![CDATA[　<B>为什么GenericServlet在init(ServletConfig config)基础上增加了一个init()方法？</B><BR>　　<BR>　　init()方法被GenericServlet.init(ServletConfig config)方法调用。<BR>　　<BR>　　init()方法方便了开发人员定制Servlet的初始化，而无须去维护ServletConfig对象的存储工作。<BR>　　<BR>　　重写GenericServlet.init(ServletConfig config)必须要显示的调用super.init(config)方法。<BR>　　<BR>　　<B>ServletContext.getContect(java.lang.String uripath)的作用是什么？</B><BR>　　<BR>　　返回同一Server中指定的path对应的ServletContext对象,通过该对象可以实现与Server中的其他Context打交道。<BR>　　<BR>　　uripath必须是以"/"开始（该路径的含义是相对于整个Servlet文档的根路径，而不是当前ServletContext的根路径）。<BR>　　<BR>　　<B>Servlet生命周期是什么？</B><BR>　　<BR>　　一般的Servlet(GenericServlet,即与协议无关的Servlet)的生命周期：init() --&gt; GenericServlet.service(ServletRequest req, ServletResponse res) --&gt; destroy.<BR>　　<BR>　　HttpServlet的生命周期: init() --&gt; GenericServlet.service(ServletRequest req, ServletResponse res)---&gt; service(HttpServletRequest req, HttpServletResponse resp) --&gt; doXXXX()--&gt;destroy.<BR>　　<BR>　　<B>有没有必要重写GenericServlet.service()方法？</B><BR>　　<BR>　　对于HttpServlet来说没有必要。只需要重写它的doXXXX()方法就可以了。HttpServlet中service()方法会自动的根据用户请求类型把请求转发给相应的doXXXX()方法（例如doGet()方法）。<BR>　　<BR>　　ServletRequest.getReader()和ServletRequest.getInputStream()如何使用？<BR>　　<BR>　　注意两个方法不能同时使用。<BR>　　<BR>　　ServletRequest.getRealPath(String path)方法已经不推荐使用。<BR>　　<BR>　　请使用ServletContext.getRealPath(String path)方法。<BR>　　<BR>　　<B>ServletResponse缺省的字符集(charset)是什么?</B><BR>　　<BR>　　ServletResponse缺省的字符集(charset)是ISO-8859-1,可以通过setContentType(java.lang.String)方法改变新的字符集。<BR>　　<BR>　　例如：setContentType("text/html; charset=Shift_JIS").<BR>　　<BR>　　关于字符集信息，可以浏览<A href="http://info.internet.isi.edu/in-notes/rfc/files/rfc2045.txt" target=_blank><FONT color=blue><SPAN class=zhi14>RFC 2045</SPAN></FONT></A><BR>　　<BR>　　<B>HttpServletRequest.getRequestURI()和HttpServletRequest.getRequestURL()区别是什么?<BR>　　</B><BR>　　request.getRequestURI() 返回值类似：/xuejava/requestdemo.jsp<BR>　　<BR>　　request.getRequestURL() 返回值类似：http://localhost:8080/xuejava/requestdemo.jsp<BR>　　<BR>　　HttpServletRequest.encodeURL()和HttpServletRequest.encodeRedirectURL(()区别是什么?为什么要有两个不同的方法呢？<BR>　　<BR>　　当用URL-rewriting方式来管理Session的时候，需要用到以上的两个方法。<BR>　　<BR>　　两个方法的不同点是：两个方法确定是否需要包含session ID的逻辑不同。<BR>　　<BR>　　在调用HttpServletResponse.sendRedirect前，应该先调用encodeRedirectURL()方法，否则可能会丢失Sesssion信息。 ...<BR>　　<BR>　　<B>如何使你的Servlet或者JSP实现Single Thread Model?</B><BR>　　<BR>　　对于Servlet实现javax.single.SingleThreadModel接口。<BR>　　<BR>　　对于JSP,在Page Directive中写如下的语句&lt;%@ page isThreadSafe="false" %&gt;<BR>　　<BR>　　JSP Tag 和 JSP XML-based Tag<BR>　　<BR>　　...<BR>　　<BR>　　<B>如何把某一个JSP Page定义成为Error Page?为什么要这样做？</B><BR>　　<BR>　　实现方法： &lt;%@ page isErrorPage="true" %&gt;<BR>　　<BR>　　为什么？ 因为需要获取Exception 对象（缺省情况下，在JSP Page中是不能直接使用“隐含对象” exception的）。<BR>　　<BR>　　<B>JSP Page的执行顺序是如何的？</B><BR>　　<BR>　　JSP Page的执行顺序如下：<BR>　　<BR>　　JSP Page Translation. JSP Page --&gt; Servlet source code.<BR>　　JSP Page Compilation. Servlet source code --&gt; Servlet class.<BR>　　Load Class(First time or the server restarted)<BR>　　<BR>　　Create instance(可能会很多次，如果JSP Page中声明了&lt;%@ page isThreadSafe="false" %&gt;)<BR>　　<BR>　　Call jspInit method（一般的JSP Page都没有重写这个方法，重写需要在声明语句段中）。<BR>　　<BR>　　Call _jspService method（类似与一般HttpServlet的doGet和doPost方法，但是可以同时用来处理Post和Getq请求）。<BR>　　<BR>　　Call jspDestroy method（Server在卸载Servet的时候，例如当Servlet很久没有使用的情况）。<BR>　　<BR>　　<B>JSP Page中有哪些隐含对象(Implicity Object)?各自的类型和作用是什么？</B><BR>　　<BR>　　request --<BR>　　reponse --<BR>　　session --<BR>　　application --<BR>　　out --<BR>　　page --<BR>　　pagecontext --<BR>　　exception -- 只有在当前JSP Page为Error Page的时候才有效。<BR>　　config --<BR>　　<BR>　　<B>&lt;jsp:include page="/foo/foo.jsp" %&gt; 和 &lt;@ include file="/foo/foo.jsp" %&gt;的区别是什么？<BR>　　</B><BR>　　&lt;jsp:include ... -- request time.<BR>　　&lt;@ include ... -- Page translation time.<BR>　　<BR>　　<B>Servlets/JSP Container(Engine)有几种运行方式？</B><BR>　　<BR>　　Standalone<BR>　　Tomcat standalone mode<BR>　　In-process<BR>　　Tomcat running inside Apache Web Server.<BR>　　Out-of-process<BR>　　Apache + mod_jk + Tomcat<BR>　　<BR>　　Servlet,Servlet开发人员，Servlet API, Servlet Container的关系是什么？<BR>　　<BR>　　Servlet,Servlet开发人员 ---&gt;Servlet API --&gt; Servlet Container<BR>　　The parts of an HTTP message<BR>　　<BR>　　Message part Description<BR>　　The initial line： Specifies the purpose of the request or response message<BR>　　例子：GET /reports/sales/index.html HTTP/1.0<BR>　　The header section:Specifies the meta-information, such as size, type, and encoding,<BR>　　about the content of the message<BR>　　A blank line:<BR>　　An optional message body: The main content of the request or response message<BR>　　<BR>　　下面是一个Response的例子：<BR>　　<BR>　　HTTP/1.0 200 OK<BR>　　Date: Tue, 01 Dec 2001 23:59:59 GMT<BR>　　Content-Type: text/html<BR>　　Content-Length: 52<BR>　　<BR>　　&lt;html&gt;<BR>　　&lt;body&gt;<BR>　　&lt;h1&gt;Hello, John!&lt;/h1&gt;<BR>　　&lt;/body&gt;<BR>　　&lt;/html&gt;<BR>　　<BR>　　<B>HTTP规范中定义了哪些方法？各自有什么用途？</B><BR>　　<BR>　　GET<BR>　　HEAD<BR>　　POST<BR>　　从 Http 1.1规范开始，增加了以下的方法:<BR>　　<BR>　　PUT<BR>　　OPTIONS<BR>　　TRACE<BR>　　DELETE<BR>　　CONNECT<BR>　　<BR>　　ServetRequest中为什么要定义:getContentType(),getContentLength()方法。<BR>　　<BR>　　根据HTTP协议规范，Request 和 Response一样也有这些必不可少的内容！<BR>　　<BR>　　所以需要首先了解 HTTP Message的概念和其内容的格式，这些东西对于Request和Reponse是一样的。<BR>　　<BR>　　对于GET方式发送的请求，其内容类型为：null<BR>　　<BR>　　对于POST方式发送的请求，其内容类型为：application/x-www-form-urlencoded<BR>　　<BR>　　POST方式发送请求的内容类似于：username=xuejava.<BR>　　<BR>　　RequestDispatcher.forward()和HttpServletResponse.sendRedirect()的区别是什么？<BR>　　<BR>　　RequestDispatcher.forward()是在服务器端运行；HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成。<BR>　　<BR>　　所以RequestDispatcher.forward()对于浏览器来说是“透明的”；而HttpServletResponse.sendRedirect()则不是。<BR>　　<BR>　　另外，还要注意RequestDispatcher.forward()在调用的时候Response不能已经Commit了（Response.isCommitted()）。<BR>　　<BR>　　ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)的区别是什么？为什么？<BR>　　<BR>　　ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径；而ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。<BR>　　<BR>　　因为ServletRequest具有相对路径的概念；而ServletContext对象无次概念。<BR>　　<BR>　　<B>如何把请求转移到另外一个Web App中的某个地址？</B><BR>　　<BR>　　ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)只能把请求转移到同一个Web App中的地址。<BR>　　<BR>　　如果需要把请求转移到另外一个Web App中的某个地址，可以按下面的做法：<BR>　　<BR>　　1. 获得另外一个Web App的ServletConext对象(currentServletContext.getContext(uripath)).<BR>　　<BR>　　2. 调用ServletContext.getRequestDispatcher(String url)方法。<BR>　　<BR>　　未完待续<img src ="http://www.blogjava.net/xxxzheng/aggbug/21997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-11-30 16:56 <a href="http://www.blogjava.net/xxxzheng/archive/2005/11/30/21997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础知识——java入门与加深2</title><link>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21995.html</link><dc:creator>Steve</dc:creator><author>Steve</author><pubDate>Wed, 30 Nov 2005 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21995.html</guid><wfw:comment>http://www.blogjava.net/xxxzheng/comments/21995.html</wfw:comment><comments>http://www.blogjava.net/xxxzheng/archive/2005/11/30/21995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xxxzheng/comments/commentRss/21995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xxxzheng/services/trackbacks/21995.html</trackback:ping><description><![CDATA[31 throw和throws有什么不同？<BR>　　<BR>　　答：throws用于声明一个方法会抛出哪些异常。而throw是在方法体中实际执行抛出异常的动作。<BR>　　<BR>　　如果你在方法中throw一个异常，却没有在方法声明中声明之，编译器会报错。<BR>　　<BR>　　注意Error和RuntimeException的子类是例外，无需特别声明。<BR>　　<BR>　　32 什么是异常？<BR>　　<BR>　　答：异常最早在Ada语言中引入，用于在程序中动态处理错误并恢复。<BR>　　<BR>　　你可以在方法中拦截底层异常并处理之，也可以抛给更高层的模块去处理。<BR>　　<BR>　　你也可以抛出自己的异常指示发生了某些不正常情况。常见的拦截处理代码如下：<BR>　　try<BR>　　{<BR>　　...... //以下是可能发生异常的代码<BR>　　...... //异常被抛出，执行流程中断并转向拦截代码。<BR>　　......<BR>　　}<BR>　　<BR>　　catch(Exception1 e) //如果Exception1是Exception2的子类并要做特别处理，应排在前面<BR>　　{<BR>　　//发生Exception1时被该段拦截<BR>　　}<BR>　　catch(Exception2 e)<BR>　　{<BR>　　//发生Exception2时被该段拦截<BR>　　}<BR>　　finally //这是可选的<BR>　　{<BR>　　//无论异常是否发生，均执行此段代码<BR>　　}<BR>　　<BR>　　33 final和finally有什么不同？<BR>　　<BR>　　答：final请见26。finally用于异常机制，参见32。<BR>　　<BR>　　<B>五、 面向对象篇</B><BR>　　<BR>　　34 extends和implements有什么不同？<BR>　　<BR>　　答：extends用于（单）继承一个类（class），而implements用于实现一个接口（interface）。<BR>　　<BR>　　interface的引入是为了部分地提供多继承的功能。<BR>　　<BR>　　在interface中只需声明方法头，而将方法体留给实现的class来做。<BR>　　<BR>　　这些实现的class的实例完全可以当作interface的实例来对待。<BR>　　<BR>　　有趣的是在interface之间也可以声明为extends（单继承）的关系。<BR>　　<BR>　　35 java怎么实现多继承？<BR>　　<BR>　　答：java不支持显式的多继承。<BR>　　<BR>　　因为在显式多继承的语言例如c++中，会出现子类被迫声明祖先虚基类构造函数的问题，而这是违反面向对象的封装性原则的。<BR>　　<BR>　　java提供了interface和implements关键字来部分地实现多继承。参见34。<BR>　　<BR>　　36 abstract是什么？<BR>　　<BR>　　答：被声明为abstract的方法无需给出方法体，留给子类来实现。<BR>　　<BR>　　而如果一个类中有abstract方法，那么这个类也必须声明为abstract。<BR>　　<BR>　　被声明为abstract的类无法实例化，尽管它可以定义构造方法供子类使用。<BR>　　<BR>　　37 public,protected,private有什么不同？<BR>　　<BR>　　答：这些关键字用于声明类和成员的可见性。public成员可以被任何类访问，protected成员限于自己和子类访问，private成员限于自己访问。<BR>　　<BR>　　Java还提供了第四种的默认可见性，当没有任何public,protected,private修饰时.<BR>　　<BR>　　类可以用public或默认来修饰。<BR>　　<BR>　　38 Override和Overload有什么不同？<BR>　　<BR>　　答：Override是指父类和子类之间方法的继承关系，这些方法有着相同的名称和参数类型。<BR>　　<BR>　　Overload是指同一个类中不同方法（可以在子类也可以在父类中定义）间的关系，这些方法有着相同的名称和不同的参数类型。<BR>　　<BR>　　39 我继承了一个方法，但现在我想调用在父类中定义的方法。<BR>　　<BR>　　答：用super.xxx()可以在子类中调用父类方法。<BR>　　<BR>　　40 我想在子类的构造方法中调用父类的构造方法，该怎么办？<BR>　　<BR>　　答：在子类构造方法的第一行调用super(...)即可。<BR>　　<BR>　　41 我在同一个类中定义了好几个构造方法并且想在一个构造方法中调用另一个。<BR>　　<BR>　　答：在构造方法第一行调用this(...)。<BR>　　<BR>　　42 我没有定义构造方法会怎么样？<BR>　　<BR>　　答：自动获得一个无参数的构造方法。<BR>　　<BR>　　43 我调用无参数的构造方法失败了。<BR>　　<BR>　　答：如果你至少定义了一个构造方法，就不再有自动提供的无参数的构造方法了。<BR>　　<BR>　　你需要显式定义一个无参数的构造方法。<BR>　　<BR>　　44 我该怎么定义类似于C++中的析构方法（destructor）？<BR>　　<BR>　　答：提供一个void finalize()方法。在Garbarge Collector回收该对象时会调用该方法。<BR>　　<BR>　　注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要提供该方法。<BR>　　<BR>　　45 我想将一个父类对象转换成一个子类对象该怎么做？<BR>　　<BR>　　答：强制类型转换。如<BR>　　public void meth(A a)<BR>　　{<BR>　　B b = (B)a;<BR>　　}<BR>　　如果a实际上并不是B的实例，会抛出ClassCastException。所以请确保a确实是B的实例。<BR>　　<BR>　　46 其实我不确定a是不是B的实例，能不能分情况处理？<BR>　　<BR>　　答：可以使用instanceof操作符。例如<BR>　　<BR>　　if( a instanceof B )<BR>　　{<BR>　　B b = (B)a;<BR>　　}<BR>　　else<BR>　　{<BR>　　...<BR>　　<BR>　　<BR>　　}<BR>　　<BR>　　47 我在方法里修改了一个对象的值，但是退出方法后我发现这个对象的值没变！<BR>　　<BR>　　答：很可能你把传入参数重赋了一个新对象，例如下列代码就会造成这种错误：<BR>　　<BR>　　public void fun1(A a) //a是局部参数，指向了一个外在对象。<BR>　　{<BR>　　a = new A(); //a指向了一个新对象，和外在对象脱钩了。如果你要让a作为传出变量，不要写这一句。<BR>　　<BR>　　a.setAttr(attr);//修改了新对象的值，外在对象没有被修改。<BR>　　}<BR>　　<BR>　　基本类型也会出现这种情况。例如：<BR>　　<BR>　　public void fun2(int a)<BR>　　{<BR>　　a = 10;//只作用于本方法，外面的变量不会变化。<BR>　　}<BR>　　<BR>　　<B>六、java.util篇</B><BR>　　<BR>　　48 java能动态分配数组吗？<BR>　　<BR>　　答：可以。例如int n = 3; Language[] myLanguages = new Language[n];<BR>　　<BR>　　49 我怎么知道数组的长度？<BR>　　<BR>　　答：用length属性。如上例中的 myLanguages.length 就为 3。<BR>　　<BR>　　50 我还想让数组的长度能自动改变，能够增加/删除元素。<BR>　　<BR>　　答：用顺序表--java.util.List接口。<BR>　　<BR>　　你可以选择用ArrayList或是LinkedList，前者是数组实现，后者是链表实现。<BR>　　<BR>　　例如： List list = new ArrayList(); 或是 List list = new LinkedList(); 。<BR>　　<BR>　　51 什么是链表？为什么要有两种实现？<BR>　　<BR>　　答：请补习数据结构。<BR>　　<BR>　　52 我想用队列/栈。<BR>　　<BR>　　答：用java.util.LinkedList。<BR>　　<BR>　　53 我希望不要有重复的元素。<BR>　　<BR>　　答：用集合--java.util.Set接口。例如：Set set = new HashSet()。<BR>　　<BR>　　54 我想遍历集合/Map。<BR>　　<BR>　　答：用java.util.Iterator。参见API。<BR>　　<BR>　　55 我还要能够排序。<BR>　　<BR>　　答：用java.util.TreeSet。例如：Set set = new TreeSet()。放进去的元素会自动排序。<BR>　　<BR>　　你需要为元素实现Comparable接口，还可能需要提供equals()方法，compareTo()方法，hash Code()方法。<BR>　　<BR>　　56 但是我想给数组排序。<BR>　　<BR>　　答：java.util.Arrays类包含了sort等实用方法。<BR>　　<BR>　　57 我想按不同方法排序。<BR>　　<BR>　　答：为每种方法定义一个实现了接口Comparator的类并和Arrays综合运用。<BR>　　<BR>　　58 Map有什么用？<BR>　　<BR>　　答：存储key-value的关键字-值对，你可以通过关键字来快速存取相应的值。<BR>　　<BR>　　59 set方法没问题，但是get方法返回的是Object。<BR>　　<BR>　　答：强制类型转换成你需要的类型。参见45。<BR>　　<BR>　　60 我要获得一个随机数。<BR>　　<BR>　　答：使用java.util.Random类。<BR>　　<BR>　　61 我比较两个String总是false，但是它们明明都是"abc" ！<BR>　　<BR>　　答：比较String一定要使用equals或equalsIgnoreCase方法，不要使用 == ！<BR>　　<BR>　　==比较的是两个引用（变量）是否指向了同一个对象，而不是比较其内容。<img src ="http://www.blogjava.net/xxxzheng/aggbug/21995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xxxzheng/" target="_blank">Steve</a> 2005-11-30 16:53 <a href="http://www.blogjava.net/xxxzheng/archive/2005/11/30/21995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>