??xml version="1.0" encoding="utf-8" standalone="yes"?>
前言
一. Java 文档?javadoc
? 文档注释的格?/font>
1. 文档注释的格式化
2. 文档注释的三部分
? 使用 javadoc 标记
http://outinn.diy.myrice.com/book/javadoc/#t31
http://outinn.diy.myrice.com/book/javadoc/#t32
http://outinn.diy.myrice.com/book/javadoc/#t33
? javadoc 命o(h)
Java 的语法与 C++ ?qing)?f)怼Q那么,你知?Java 的注释有几种吗?是两U?
// 注释一?br /> /* ...... */ 注释若干?/p>
不完全对Q除了以上两U之外,q有W三U,文档注释Q?/p>
/** ...... */ 注释若干行,q写?javadoc 文档
通常q种注释的多行写法如下:(x)
/**
* .........
* .........
*/
暂停Q暂停!q第三种注释有什么用Qjavadoc 又是什么东西?
好,那就让我告诉你—?
Java E序员都应该知道使用 JDK 开发,最好的帮助信息来?SUN 发布?Java 文档。它分包、分c详l的提供了各Ҏ(gu)、属性的帮助信息Q具有详l的cL(wi)信息、烦引信息等Qƈ提供了许多相关类之间的关p,如ѝ实现接口、引用等?/p>
Java 文档全是׃?html 文gl织h的,?SUM 的站点上可以下蝲它们的压~包。但是你肯定想不刎ͼq些文档我们可以自己生成。——就此打住,再吊一ơ胃口?/p>
安装?JDK 之后Q安装目录下有一?src.jar 文g或?src.zip 文gQ它们都是以 ZIP 格式压羃的,可以使用 WinZip 解压。解压之后,我们可以看到分目录攄全是 .java 文g。是了,q些是 Java q行cȝ源码了,非常完整Q连注释都写得一清二楚……不q,怎么看这些注释都有点似曾相识的感觉?
q就不奇怪了Q我们的q底也快要揭开了。如果你仔细Ҏ(gu)一?.java 源文件中的文档注?(/** ... */) ?Java 文档的内容,你会(x)发现它们是一L(fng)。Java 文档只是q在格式和排版上下了些功夫。再仔细一点,你会(x)发现 .java 源文件中的注释还带有 HTML 标识Q如 <B>?lt;BR>?lt;Code> {,?Java 文档中,该出现这些标识的地方Q已l按标识的的定义q行了排版?/p>
l于真像大白了,原来 Java 文档是来自这些注释。难怪这些注释叫做文档注释呢Q不q,是什么工hq些注释变成文档的呢Q?/p>
是该请出 javadoc 的时候了。在 JDK ?bin 目录下你可以扑ֈ javadocQ如果是 Windows 下的 JDKQ它的文件名?javadoc.exe。?javdoc ~译 .java 源文件时Q它?x)读?.java 源文件中的文档注释,q按照一定的规则?Java 源程序一赯行编译,生成文档?/p>
介绍 javadoc 的编译命令之前,q是先了解一下文档注释的格式吧。不qؓ(f)了能够编译下面提到的若干例子Q这里先介绍一?javadoc 命o(h)Q?/p>
javadoc -d 文档存放目录 -author -version 源文件名.java
q条命o(h)~译一个名?“源文g?java”的 java 源文Ӟq将生成的文档存攑֜“文档存攄录”指定的目录下,生成的文档中 index.html 是文档的首c(din)?author ?-version 两个选项可以省略?/p>
文档注释可以用于对类、属性、方法等q行说明。写文档注释旉了需要?/** .... */ 限定之外Q还需要注意注释内部的一些细节问题?/p>
生成的文档是 HTML 格式Q而这?HTML 格式的标识符q不?javadoc 加的Q而是我们在写注释的时候写上去的。比如,需要换行时Q不是敲入一个回车符Q而是写入 <br>Q如果要分段Q就应该在段前写?<p>?/p>
因此Q格式化文档Q就是在文档注释中添加相应的 HTML 标识?/p>
文档注释的正文ƈ不是直接复制到输出文?(文档?HTML 文g)Q而是d每一行后Q删掉前导的 * 号及(qing) * 号以前的I格Q再输入到文档的。如
/** * This is first line. <br> ***** This is second line. <br> This is third line. */ |
~译输出后的 HTML 源码则是
This is first line. <br> This is second line. <br> This is third line. |
前导?* 号允许连l用多个,其效果和使用一?* 号一P但多?* 号前不能有其它字W分隔,否则分隔W及(qing)后面?* 号都作为文档的内容? 号在q里是作为左边界使用Q如上例的第一行和W二行;如果没有前导?* P则边界从W一个有效字W开始,而不包括前面的空|如上例第三行?/p>
q有一炚w要说明,文档注释只说明紧接其后的cR属性或者方法。如下例Q?/p>
/** comment for class */ public class Test { /** comment for a attribute */ int number; /** comment for a method */ public void myMethod() { ...... } ...... } |
上例中的三处注释是分别对类、属性和Ҏ(gu)的文档注释。它们生成的文档分别是说明紧接其后的cR属性、方法的。“紧接”二字尤光要,如果忽略了这一点,很可能造成生成的文档错误。如
import java.lang.*; /** commnet for class */ public class Test { ...... } // 此例为正的例子 |
q个文档注释生成正的文档。但只需要改变其中两行的位置Q变成下例,׃(x)出错Q?/p>
/** commnet for class */ import java.lang.*; public class Test { ...... } // 此例为错误的例子 |
q个例子只把上例?import 语句和文档注释部分交换了位置Q结果却大不相同——生成的文档中根本就找不Cq注释的内容了。原因何在?
?font color="#008000">/** commnet for class */”是?class Test 的说明,把它攑֜“public class Test { ...... }”之前时Q其后紧接着 class TestQ符合规则,所以生成的文档正确。但是把它和“import java.lang.*;”调换了位置后,其后紧接的就是不 class Test 了,而是一?import 语句。由于文档注释只能说明类、属性和Ҏ(gu)Qimport 语句不在此列Q所以这个文档注释就被当作错误说明省略掉了?/p>
Ҏ(gu)在文档中昄的效果,文档注释分ؓ(f)三部分。先举例如下Q以便说明?/p>
/** * show Ҏ(gu)的简q? * <p>show Ҏ(gu)的详l说明第一?lt;br> * show Ҏ(gu)的详l说明第二行 * @param b true 表示昄Qfalse 表示隐藏 * @return 没有q回? */ public void show(boolean b) { frame.show(b); } |
W一部分是简q。文档中Q对于属性和Ҏ(gu)都是先有一个列表,然后才在后面一个一个的详细的说明。列表中属性名或者方法名后面那段说明是q。如下图中被U框框选的部分Q?/p>
q部分写在一D|档注释的最前面Q第一个点?(.) 之前 (包括点号)。换句话_(d)是用第一个点号分隔文档注释,之前是简qͼ之后是第二部分和W三部分。如上例中的 ? show Ҏ(gu)的简q?”?/p>
有时Q即使正地以一个点号作为分隔,javadoc 仍然?x)出错,把点号后面的部分也做ZW一部分。ؓ(f)了解册个问题,我们可以使用一?<p> 标志第二分部分开Z一D,如上例的? <p>show Ҏ(gu)的详l说明第一?....”。除此之外,我们也可以?<br> 来分隔?/p>
W二部分是详l说明部分。该部分对属性或者方法进行详l的说明Q在格式上没有什么特D的要求Q可以包含若q个点号。它在文档中的位|如下图所C:(x)
q部分文档在上例中相应的代码是:(x)
* show Ҏ(gu)的简q?
* <p>show Ҏ(gu)的详l说明第一?lt;br>
* show Ҏ(gu)的详l说明第二行
发现什么了Q对了,qC在其中。这一点要C了,不要画蛇添——在详细说明部分中再写一ơ简q哦Q?/p>
W三部分是特D说明部分。这部分包括版本说明、参数说明、返回D明等。它在文档中的位|:(x)
W三部分在上例中相应的代码是
* @param b true 表示昄Qfalse 表示隐藏
* @return 没有q回?/font>
除了 @param ?@return 之外Q还有其它的一些特D标讎ͼ分别用于对类、属性和Ҏ(gu)的说明……不要推我,我马上就说?/p>
javadoc 标记是插入文档注释中的特D标讎ͼ它们用于标识代码中的Ҏ(gu)引用。javadoc 标记由“@”及(qing)其后所跟的标记cd和专用注释引用组成。记住了Q三个部分——@、标记类型、专用注释引用。不q我宁愿把它分成两部分:(x)@ 和标记类型、专用注释引用。虽?@ ?标记cd之间有时可以用空格符分隔Q但是我宁愿始终它们紧挨着写,以减出错机?x)?/p>
javadoc 标记有如下一些:(x)
|
下面详细说明各标记?/p>
@see 的句法有三种Q?
@see cd
@see #Ҏ(gu)名或属性名
@see cd#Ҏ(gu)名或属性名
cdQ可以根据需要只写出cd (?String) 或者写出类全名 (?java.lang.String)。那么什么时候只需要写出类名,什么时候需要写出类全名呢?
如果 java 源文件中?import 语句包含了的c,可以只写出类名,如果没有包含Q则需要写出类全名。java.lang 也已l默认被包含了。这?javac ~译 java 源文件时的规定一P所以可以简单的?javac ~译来判断,源程序中 javac 能找到的c,javadoc 也一定能扑ֈQjavac 找不到的c,javadoc 也找不到Q这需要用类全名了?/p>
Ҏ(gu)名或者属性名Q如果是属性名Q则只需要写出属性名卛_Q如果是Ҏ(gu)名,则需要写出方法名以及(qing)参数cdQ没有参数的Ҏ(gu)Q需要写ZҎ(gu)受如
成员cd | 成员名称?qing)参?/b> | @see 句法 |
属?/td> | number | @see number |
属?/td> | count | @see count |
Ҏ(gu) | count() | @see count() |
Ҏ(gu) | show(boolean b) | @see show(boolean) |
Ҏ(gu) | main(String[] args) | @see main(String[]) |
有时也可以偷懒:(x)假如上例中,没有 count q一属性,那么参考方?count() 可以简写成 @see count。不q,Z安全赯Q还是写?@see count() 比较好?/p>
@see 的第二个句法和第三个句法都是转向Ҏ(gu)或者属性的参考,它们有什么区别呢Q?/p>
W二个句法中没有指出cdQ则默认为当前类。所以它定义的参考,都{向本cM的属性或者方法。而第三个句法中指ZcdQ则q可以{向其它类的属性或者方法?/p>
关于 @see 标记Q我们D个例说明。由?@see 在对c说明、对属性说明、对Ҏ(gu)说明时用法都一P所以这里只以对c说明ؓ(f)例?/p>
/** * @see String * @see java.lang.StringBuffer * @see #str * @see #str() * @see #main(String[]) * @see Object#toString() */ public class TestJavaDoc { } |
生成的文档的相关部分如下图:(x)
String ?StringBuffer 都是?java.lang 包中Q由于这个包是默认导入了的,所以这两个cd以直接写cdQ也可以写类全名。str、str() 为同名属性和Ҏ(gu)Q所以方法名需要用 () 区分。main 是带参数的方法,所以在 () 中指明了参数cd。toString() 虽然在本cM也有 (?Object l承?Q但我们是想参?Object cȝ toString() Ҏ(gu)Q所以用了 Object#toString()?/p>
奇怪的是,Z么其中只?str、str() ?main(String[]) 变成了链接呢Q那是因为编译时没有?java.lang 包或?Stirng、StringBuffer、Object 三个cȝ源文件一起加入编译,所以,生成的文档没有关于那三个cȝ信息Q也׃可以建立链接了。后面讲?javadoc ~译命o(h)的时候还?x)详l说明?/p>
上例中如果去把类中的 str 属性去掉,那么生成的文档又?x)有什么变化呢Q你?x)发玎ͼ原来?str, str()Q而现在变成了 str(), str()Q因?str 属性已l没有了Q所?str 也表C方?str()?/p>
2. 使用 @author、@version 说明c?/p>
q两个标记分别用于指明类的作者和版本。缺省情况下 javadoc 其忽略Q但命o(h)行开?-author ?-version 可以修改q个功能Q其包含的信息被输出。这两个标记的句法如下:(x)
@author 作者名
@version 版本?/font>
其中Q@author 可以多次使用Q以指明多个作者,生成的文档中每个作者之间用逗号 (,) 隔开。@version 也可以用多ơ,只有W一ơ有效,生成的文档中只会(x)昄W一ơ?@version 指明的版本号。如下例
/** * @author Fancy * @author Bird * @version Version 1.00 * @version Version 2.00 */ public class TestJavaDoc { } |
生成文档的相关部分如图:(x)
从生成文档的囄中可以看出,两个 @author 语句都被~译Q在文档中生成了作者列表。而两?@version 语句中只有第一句被~译了,只生成了一个版本号?/p>
从图上看Q作者列表是以逗号分隔的,如果我想分行昄怎么办?另外Q如果我xCZ个以上的版本号又该怎么办?
——我们可以将上述两条 @author 语句合ؓ(f)一句,把两?@version 语句也合Z句:(x)
@author Fancy<br>Bird
@version Version 1.00<br>Version 2.00
l果如图Q?/p>
我们q样做即辑ֈ了目的,又没有破坏规则。@author 之后的作者名?@version 之后的版本号都可以是用户自己定义的Q?HTML 格式Q所以我们可以?<br> 标记其分行昄。同Ӟ在一?@version 中指明两个用 <br> 分隔的版本号Q也没有破坏只显C第一?@version 内容的规则?/p>
3. 使用 @param、@return ?@exception 说明Ҏ(gu)
q三个标记都是只用于Ҏ(gu)的。@param 描述Ҏ(gu)的参敎ͼ@return 描述Ҏ(gu)的返回|@exception 描述Ҏ(gu)可能抛出的异常。它们的句法如下Q?/p>
@param 参数?参数说明
@return q回D?br /> @exception 异常cd 说明
每一?@param 只能描述Ҏ(gu)的一个参敎ͼ所以,如果Ҏ(gu)需要多个参敎ͼ需要多ơ?@param 来描q?/p>
一个方法中只能用一?@returnQ如果文档说明中列了多个 @returnQ则 javadoc ~译时会(x)发出警告Q且只有W一?@return 在生成的文档中有效?/p>
Ҏ(gu)可能抛出的异常应当用 @exception 描述。由于一个方法可能抛出多个异常,所以可以有多个 @exception。每?@exception 后面应有q的异常cdQ说明中应指出抛出异常的原因。需要注意的是,异常cd应该Ҏ(gu)源文件的 import 语句定是写出类名还是类全名? CZ如下Q?/p>
public class TestJavaDoc { /** * @param n a switch * @param b excrescent parameter * @return true or false * @return excrescent return * @exception java.lang.Exception throw when switch is 1 * @exception NullPointerException throw when parameter n is null */ public boolean fun(Integer n) throws Exception { switch (n.intValue()) { case 0: break; case 1: throw new Exception("Test Only"); default: return false; } return true; } } |
使用 javadoc ~译生成的文档相关部分如下图Q?/p>
可以看到Q上例中 @param b excrescent parameter 一句是多余的,因ؓ(f)参数只是一?nQƈ没有一?b但?javadoc ~译时ƈ没有(g)查。因此,写文档注释时一定要正确匚w参数表与Ҏ(gu)中正式参数表的项目。如果方法参数表中的参数?aQ文档中却给出对参数 x 的解释,或者再多出一个参?iQ就?x)让人摸不着头脑了。@exceptin 也是一栗?/p>
上例E序中ƈ没有抛出一?NullPointerExceptionQ但是文档注释中Z么要写上q么一句呢Q难道又是ؓ(f)了演C?q不是ؓ(f)了演C描q多余的异常也能通过~译Q而是Z说明写异常说明时应考运行时 (RunTime) 异常的可能性。上例程序中Q如果参?n 是给的一个空?(null)Q那么程序会(x)在运行的时候抛Z?NullPointerExceptionQ因此,在文档注释中d了对 NullPointerException 的说明?/p>
上例中的 @return 语句有两个,但是Ҏ(gu)规则Q同一个方法中Q只有第一?@return 有效Q其余的?x)?javadoc 忽略。所以生成的文档中没有出现第二个 @return 的描q?/p>
讲到q里Q该怎么写文档注释你应该已经清楚了,下面开始讲?javadoc 的常用命令?/p>
q行 javadoc -help 可以看到 javadoc 的用法,q里列D常用参数如下Q?/p>
用法Q?br /> javadoc [options] [packagenames] [sourcefiles]
选项Q?/p>
-public | 仅显C?public cd成员 | |
-protected | 昄 protected/public cd成员 (~省) | |
-package | 昄 package/protected/public cd成员 | |
-private | 昄所有类和成?/td> | |
-d <directory> | 输出文g的目标目?/td> | |
-version | 包含 @version D?/td> | |
-author | 包含 @author D?/td> | |
-splitindex | 烦引分为每个字母对应一个文?/td> | |
-windowtitle <text> | 文档的浏览器H口标题 |
javadoc ~译文档时可以给定包列表Q也可以l出源程序文件列表。例如在 CLASSPATH 下有两个包若q类如下Q?/p>
fancy.Editor
fancy.Test
fancy.editor.ECommand
fancy.editor.EDocument
fancy.editor.EView
q里有两个包 (fancy ?fancy.editor) ?5 个类。那么编译时 (Windows 环境) 可以使用如下 javadoc 命o(h)Q?/p>
javadoc fancy\Test.java fancy\Editor.java fancy\editor\ECommand.java fancy\editor\EDocument.java fancy\editor\EView.java
q是l出 java 源文件作为编译参数的Ҏ(gu)Q注意命令中指出的是文g路径Q应该根据实际情冉|变。也可以是给出包名作为编译参敎ͼ如:(x)
javadoc fancy fancy.editor
用浏览器打开生成文档?index.html 文g卛_发现两种方式~译l果的不同,如下图:(x)
用第二条命o(h)生成的文档被框架分成了三部分Q包列表、类列表和类说明。在包列表中选择了某个包之后Q类列表中就?x)列包中的所有类Q在cd表中选择了某个类之后Q类说明部分׃(x)昄cȝ详细文档。而用W一条命令生成的文档只有两部分,cd表和c说明,没有包列表。这是两种方式生成文档的最大区别了?/p>
下面再来l说选项?/p>
-public?protected?package?private 四个选项Q只需要Q选其一卛_。它们指定的昄cL员的E度。它们显C的成员多少是一个包含的关系Q如下表Q?/p>
-private (昄所有类和成? | |||||
|
-d 选项允许你定义输出目录。如果不?-d 定义输出目录Q生成的文档文g?x)放在当前目录下?d 选项的用法是
-d 目录?/font>
目录名ؓ(f)必填,也就是说Q如果你使用?-d 参数Q就一定要为它指定一个目录。这个目录必dl存在了Q如果还不存在,请在q行 javadoc 之前创徏该目录?/p>
-version ?-author 用于控制生成文档时是否生?@version ?@author 指定的内宏V不加这两个参数的情况下Q生成的文档中不包含版本和作者信息?/p>
-splitindex 选项烦引分为每个字母对应一个文件。默认情况下Q烦引文件只有一个,且该文g中包含所有烦引内宏V当然生成文档内容不多的时候,q样做非常合适,但是Q如果文档内定w常多的时候,q个索引文g包含非常多的内容,昑־q于庞大。?-splitindex ?x)把索引文g按各索引的W一个字母进行分c,每个字母对应一个文件。这P减M一个烦引文件的负担?/p>
-windowtitle 选项为文档指定一个标题,该标题会(x)昄在窗口的标题栏上。如果不指定该标题,而默认的文档标题为“生成的文档Q无标题Q”。该选项的用法是Q?/p>
-windowtitle 标题
标题是一串没有包含空格的文本Q因为空格符是用于分隔各参数的,所以不能包含空根{同 -d cMQ如果指定了 -windowtitle 选项Q则必须指定标题文本?/p>
到此为止QJava 文档?javadoc ׃l完了。javadoc 真的能让我们?Java 注释上做文章——生成开发文档?/p>
随着ajax的升温,javascript来得Ch们的重视。重要的是,ajax在一定程度上带来了web软g架构上的变化Qh们把来多的功能分
配到客户端实玎ͼjavascript子项目规模越来越大。如何更高效的用javascriptQ如何更U学的组ljavascriptQ如何更利?br />保证目q展Q我惛_我的l验谈一Ҏ(gu)见?/p>
一?开发h员需要认真学?fn)javascript语言本n
׃javascript是?a >世界上最被误解的语言?
大部分h对javascript语法q没有全面了解过Q只是凭借看h很像c或者java的关键字按照自己的理解写javascript代码。其?br />javascript是一U很独特的语aQ和c++/java有非常大的区别,要想用javascript做大一些的目Q开发h员必老老实实的学习(fn)
javascript的语法。真正掌握了语法后,我们才不?x)把delete看成释放内存对象Q才不会(x)为到底参C递是g递还是引用传递而烦恹{真正理?br />了javascript的基于原型的OO方式Q才可能写出h良好架构的javascriptE序?br />
《javascript权威指南》是一本最合适的书,郑重推荐。另?a >ECMA262
文档可以作ؓ(f)参考。网上流行的jscript手册chm版本使用h比较方便Q不q这是微软的jscript实现Q和标准的javascript略有区别Q用时应该注意上面的注脚信息。关于javascript的原型和OO,|上已经有很多文章介l了Q在此不再多说?/p>
二?良好的代码来源于良好的设?/font>
三?使用设计模式Q复用其他领域的设计l验
四?调试代码的技?/font>
只有设计优良Q代码才?x)写的漂亮。现在的javascript子项目已l不是以前web目中的“边角料”和散兵游勇了,在较大的ajax目内,
javascript非常复杂,ajax的异步模型也和以前顺序执行的E序设计有所区别。所以徏议做javascript前首先做好设计。推荐用用?br />驱动的方式,把用例分析清楚,以便全局考虑所有可能的面交互q程Q绘出页面内一些对象之间的交互图,分析一些数据对象的状态,作出_?br />javascript设计?/p>
如果javascript非常复杂Q可以考虑使用一些模式。我惛_部分做javascript的开发者都不是“javascriptU班”出w吧:)
掌握了javascript的语a本质Q就可以复用我们在其他领域的l验了。用javascript框架或者ajax框架Q用单例模式做一个全局的数
据缓冲池Q或者用观察者模式把界面对象和数据对象分,使用命o(h)模式实现用户的操作队列等{?/p>
javascript的代码不太好调试Q这是由于:(x)
debug工具调试本地代码q可以,直接调试|站js代码表现Ơ佳。opera除了javascript控制台外我没有找到其他调试工兗?/li>
在此我推荐几个调试技巧:(x)
可以在网内建立一个textarea来接受你惌行的js语句Q然后加一个按钮用js的eval函数执行你输入的代码?br />
q种方式非常适合在线调试Q网出错后写代码输出页面内的对象倹{徏议写一些dump工具函数配合使用Q效果更佟?br />
我非常喜Ƣ这U方式,可以随时使用开x开面内隐藏的textareaq行调试Q感觉很像给一台服务器接上了终端,然后使用shell可以做Q何事?) 函数可以在这里重新定义,可以L操作界面中的M元素Q调用Q何对象的M函数Q输ZQ何你需要的q行时刻倹{?br />
使用try{}catch(e){}l构不光可以屏蔽出错信息Q让界面更友好。我们的E序可以使用异常、抛出异常来构徏一U更好的出错处理机制?br />
有这样一个故事,我在使用string.localeCompare函数旉手写了这L(fng)代码Q?br />
var iRe = str1.localeCompare(str2);
switch(iRe){
0: return ....
1: return ....
-1:return ....
defalut:throw "error:localeCompare return other value"
}
写完忘了,没想到我的同事在linux下用firefoxӞ异常被抛ZQ然后我们得知:(x)linux firefox下localeCompareq回的不只是0/1/-1,而是q回一个具体?
q个异常抛出有效的检出了代码的不完?br />
firefox下的异常dump后能得到较ؓ(f)详细的调用栈信息Q这一炚w常好。IE的异怿息没有这么详l?br />
异常和断a也可以结合成Z个非常有效的调试工具?br />
断言(assert)是在其他语言中的一U很有效的调试工P常常以这UŞ式出玎ͼ(x)
assert(<条g>);
在程序处于debug状态,当条件ؓ(f)假时Q系l中止运行ƈ报告q个断言。由于断a是我们自己定义的Q所以我们可以很Ҏ(gu)的判断出出错的地方,q而找到bug所在?br />
javascript语言没有提供宏,也没有提供assertQ我们可以这h?br />
if(_is_debug) assert = function(expression , strLable){
if( !expression ) throw Error(strLable);
}
else assert = function(){};//_is_debug是一个全局变量
q样可以实现在发?不可能的事情"的时候,让程序在调试模式下抛出异常,在发布版本中不作理会(x)?br />
可以q样输出当前栈的调用信息,弥补刚才提到的IE中异常对象没有栈信息的缺?
function callStackInfo(){
var s="",line="";
var cer=arguments.callee.caller;
while(cer){
var sf=cer.toString();
s+=line+sf.substring(sf.indexOf('function'),sf.indexOf('{'))+"\n";
line=".."+line;
cer=cer.caller;
}
return s;
}
本文只就javascript在web开发,特别是在ajax斚w的开发做了一些讨论,主要在于窥如何更好的用“纯javascript”。web开
发还有很多其他方面,比如xml和Dom{实际上和javascript息息相关Q但是本文没有涉?qing),q请见谅。欢q各位朋友就我的讨论多提意见?br />
]]>
如果输入框ؓ(f)I的?JavaScript ?x)?this.value 解析?false, 所以后面的doSomething()不?x)执行?br />JavaScript 表单中的空白字D计ؓ(f)I字W串或?amp;& 。this 关键字是指向包含事g处理属性(如:(x)blurQ?br />的表单输入框的很好而常用的Ҏ(gu)。而this.value 则返回这个文本输入框的内宏V?br />
AJAX开发简?br />
作?br />|名
联络
柯自?br />eamoi?? educhina
eamoi@163.comQ技术) zcke0728@hotmail.comQ版权)
发布记录Q?br />
版本
日期
作?br />说明
1.0
2005-10-28
柯自?br />创徏Q第一?/p>
链接Q?br />
cd
|址
Blog
http://www.tkk7.com/eamoi/
MSN-Space
http://spaces.msn.com/members/eamoi/
OpenDoc版权说明Q?br />
本文档版权归原作者所有?br />
在免贏V且无Q何附加条件的前提下,可在|络媒体中自׃播?br />
如需部分或者全文引用,请事先征求作者意见?br />
如果本文Ҏ(gu)有些许帮助,表达谢意的最好方式,是将(zhn)发现的问题和文档改q意见及(qing)时反馈给作者。当Ӟ倘若有时间和能力Q能为技术群体无偿A(ch)献自q所学ؓ(f)最好的回馈?br />
AJAX开发简?.. 1
一、AJAX定义... 3
二、现状与需要解决的问题... 3
三、ؓ(f)什么用AJAX. 4
四、谁在用AJAX. 6
五、用AJAX改进你的设计... 6
例子1Q数据校?.. 7
例子2Q按需取数据—联菜?.. 7
例子3Q读取外部数?.. 7
六、AJAX的缺?.. 7
七、AJAX开?.. 8
7.1、AJAX应用到的技?.. 8
A、XMLHttpRequest对象... 8
B、Javascript. 9
C、DOM. 9
D、XML. 9
7.2、AJAX开发框?.. 9
A、初始化对象q发出XMLHttpRequesth... 9
B、指定响应处理函?.. 10
C、发出HTTPh... 10
D、处理服务器q回的信?.. 11
E、一个初步的开发框?.. 11
7.3、简单的CZ... 13
A、数据校?.. 13
B、联菜?.. 14
参考文章:(x)... 16
在用浏览器览|页的时候,当页面刷新很慢的时候,你的览器在q什么?你的屏幕内容是什么?是的Q你的浏览器在等待刷斎ͼ而你的屏q内Ҏ(gu)一片空白,而你在屏q前苦苦的等待浏览器的响应。开发h员ؓ(f)了克服这U尴的局面,不得不在每一个可能需要长旉{待响应的页面上增加一个DIVQ告诉用户“系l正在处理?zhn)的请求,L(fng)候……”?br />
现在Q有一U越来越行热的“老”技术,可以d改变q种H迫的局面。那是AJAX。如今,随着Gmail、Google-maps的应用和各种览器的支持QAJAX正逐渐吸引全世界的眼球?br />
一、AJAX定义
AJAXQAsynchronous JavaScript and XMLQ其实是多种技术的l合Q包括Javascript、XHTML和CSS、DOM、XML和XSTL、XMLHttpRequest。其中:(x)
使用XHTML和CSS标准化呈玎ͼ使用DOM实现动态显C和交互Q用XML和XSTLq行数据交换与处理,使用XMLHttpRequest对象q行异步数据dQ用Javascriptl定和处理所有数据?br />
在AJAX提出之前Q业界对于上q技术都只是单独的用,没有l合使用Q也是由于之前的技术需求所军_的。随着应用的广泛,AJAX也成为香饽饽了?br />
二、现状与需要解决的问题
传统的Web应用采用同步交互q程Q这U情况下Q用户首先向HTTP服务器触发一个行为或h的呼求。反q来Q服务器执行某些dQ再向发求的用户q回一个HTML面。这是一U不q诏的用户体验,服务器在处理h的时候,用户多数旉处于{待的状态,屏幕内容也是一片空白。如下图Q?/p>
自从采用文本作为Web传输和呈C后,我们都是采用q么一套传输方式。当负蝲比较?yu)的时候,qƈ不会(x)体现出有什么不妥。可是当负蝲比较大,响应旉要很长,1分钟?分钟……数分钟的时候,q种{待׃可忍受了。严重的Q超q响应时_(d)服务器干脆告诉你面不可用。另外,某些时候,我只是想改变面一部分的数据Q那Z么我必须重新加蝲整个面呢?Q当软g设计来讲Ih性化的时候,q么p糕的用户体验简直与q种原则背道而驰。ؓ(f)什么老是要让用户{待服务器取数据呢?臛_Q我们应该减用L(fng)待的旉。现在,除了E序设计、编码优化和服务器调优之外,q可以采用AJAX?br />
三、ؓ(f)什么用AJAX
与传l的Web应用不同QAJAX采用异步交互q程。AJAX在用户与服务器之间引入一个中间媒介,从而消除了|络交互q程中的处理—等待—处理—等待缺炏V用L(fng)览器在执行d时即装蝲了AJAX引擎。AJAX引擎用JavaScript语言~写Q通常藏在一个隐藏的框架中。它负责~译用户界面?qing)与服务器之间的交互。AJAX引擎允许用户与应用Y件之间的交互q程异步q行Q独立于用户与网l服务器间的交流。现在,可以用Javascript调用AJAX引擎来代替生一个HTTP的用户动作,内存中的数据~辑、页面导航、数据校验这些不需要重新蝲入整个页面的需求可以交lAJAX来执行?/p>
使用AJAXQ可以ؓ(f)ISP、开发h员、终端用户带来可见的便捷Q?br />
l 减轻服务器的负担。AJAX的原则是“按需取数据”,可以最大程度的减少冗余hQ和响应Ҏ(gu)务器造成的负担?br />
2 无刷新更新页面,减少用户心理和实际的{待旉。特别的Q当要读取大量的数据的时候,不用像Reload那样出现白屏的情况,AJAX使用XMLHTTP对象发送请求ƈ得到服务器响应,在不重新载入整个面的情况下用Javascript操作DOM最l更新页面。所以在d数据的过E中Q用h面对的不是白屏,是原来的面内容Q也可以加一个Loading的提C框让用L(fng)道处于读取数据过E)Q只有当数据接收完毕之后才更新相应部分的内容。这U更新是瞬间的,用户几乎感觉不到?br />
3 带来更好的用户体验?br />
4 可以把以前一些服务器负担的工作{嫁到客户端,利用客户端闲|的能力来处理,减轻服务器和带宽的负担,节约I间和宽带租用成本?br />
5 可以调用外部数据?br />
6 Z标准化的q被q泛支持的技术,不需要下载插件或者小E序?br />
7 q一步促q页面呈现和数据的分R?br />
四、谁在用AJAX
在应用AJAX开发上面,Google当仁不让是表率。Orkut、Gmail、Google Groups、Google Maps、Google Suggest都应用了q项技术。Amazon的A9.com搜烦引擎也采用了cM的技术?br />
微Y也在U极开发更为完善的AJAX应用Q它卛_推出代号为Atlas的AJAX工具。Atlas的功能超了AJAX本nQ包括整合Visual Studio的调试功能。另外,新的ASP.NET控g客户端控件与服务器端代码的捆l更为简ѝAtlas客户脚本框架QAtlas Clent Script FrameworkQ也使与|页?qing)相关项目的交互更?f)便利。但Visual Studio 2005中ƈ不包含此功能?br />
微Y最q宣布Atlas客户脚本框架包含如下内容(详细资料误问Atlas计划|站Q:(x)
* 一个可扩展的核心框Ӟ它添加了JavaScript功能Q如生命同时期管理、承管理、多点传送处理器和界面管理?br />
* 一个常见功能的基本cdQ有丰富的字W串处理、计时器和运行Q务?br />
* 为HTML附加动态行为的用户界面框架?br />
* 一l用来简化服务器q通和|络讉K的网l堆栈?br />
* 一l丰富的用户界面开发控Ӟ如:(x)自动完成的文本框、动d拖放?br />
* 处理览器脚本行为差异的览器兼容层面?br />
典型的,微YAJAX技术应用在MSN Space上面。很多h一直都对MS Space服务感到很奇怪,当提交回复评Z后,览器会(x)暂时停顿一下,然后在无h的情况下把我提交的评论显C出来。这个就是应用了AJAX的效果。试惻I如果d一个评论就要重新刷新整个页面,那可真费事?br />
目前QAJAX应用最普遍的领域是GIS-Map斚w。GIS的区域搜索强调快速响应,AJAX的特Ҏ(gu)好符合这U需求?br />
五、用AJAX改进你的设计
AJAX虽然可以实现无刷新更新页面内容,但是也不是什么地斚w可以用,主要应用在交互较多、频J读数据、数据分c良好的Web应用中。现在,让我们D两个例子Q看看如何用AJAX改进你的设计?br />
例子1Q数据校?br />
在输入form表单内容的时候,我们通常需要确保数据的唯一性。因此,常常在页面上提供“唯一性校验”按钮,让用L(fng)击,打开一个校验小H口Q或者等form提交到服务器端,由服务器判断后在q回相应的校验信息。前者,window.open操作本来是比较耗费资源的,通常由window. showModalDialog代替Q即使这样也要弹Z个对话框Q后者,需要把整个面提交到服务器q由服务器判断校验,q个q程不仅旉长而且加重了服务器负担。而用AJAXQ这个校验请求可以由XMLHttpRequest对象发出Q整个过E不需要弹出新H口Q也不需要将整个面提交到服务器Q快速又不加重服务器负担?br />
例子2Q按需取数据—联菜?br />
以前Qؓ(f)了避免每ơ对菜单的操作引L(fng)重蝲面Q不采用每次调用后台的方式,而是一ơ性将U联菜单的所有数据全部读取出来ƈ写入数组Q然后根据用L(fng)操作用JavaScript来控制它的子集项目的呈现Q这栯然解决了操作响应速度、不重蝲面以及(qing)避免向服务器频繁发送请求的问题Q但是如果用户不对菜单进行操作或只对菜单中的一部分q行操作的话Q那d的数据中的一部分׃(x)成ؓ(f)冗余数据而浪费用L(fng)资源Q特别是在菜单结构复杂、数据量大的情况下(比如菜单有很多、每一U菜又有上百个项目)Q这U弊端就更ؓ(f)H出?br />
现在应用AJAXQ在初始化页面时我们只读出它的第一U的所有数据ƈ昄Q在用户操作一U菜单其中一Ҏ(gu)Q会(x)通过Ajax向后台请求当前一U项目所属的二子菜单的所有数据,如果再l请求已l呈现的二菜单中的一Ҏ(gu)Q再向后面请求所操作二菜单对应的所有三U菜单的所有数据,以此cL……这P用什么就取什么、用多少取多少Q就不会(x)有数据的冗余和浪费,减少了数据下载总量Q而且更新面时不用重载全部内容,只更新需要更新的那部分即可,相对于后台处理ƈ重蝲的方式羃短了用户{待旉Q也把对资源的浪贚w到最低?br />
例子3Q读取外部数?br />
AJAX可以调用外部数据Q因此,可以对一些开发的数据比如XML文档、RSS文档q行二次加工Q实现数据整合或者开发应用程序?br />
六、AJAX的缺?br />
AJAX不是完美的技术。用AJAXQ它的一些缺陷不得不权衡一下:(x)
l???????? AJAX大量使用了Javascript和AJAX引擎Q而这个取决于览器的支持。IE5.0?qing)以上、Mozilla1.0、NetScape7?qing)以上版本才支持QMozilla虽然也支持AJAXQ但是提供XMLHttpRequest的方式不一栗所以,使用AJAX的程序必L试针对各个浏览器的兼Ҏ(gu)?br />
l???????? AJAX更新面内容的时候ƈ没有h整个面Q因此,|页的后退功能是失效的Q有的用戯l常搞不清楚现在的数据是旧的q是已经更新q的。这个就需要在明显位置提醒用户“数据已更新”?br />
l???????? Ҏ(gu)媒体的支持没有FLASH、Java Applet好?br />
l???????? 一些手持设备(如手机、PDA{)现在q不能很好的支持Ajax?br />
七、AJAX开?br />
到这里,已经可以清楚的知道AJAX是什么,AJAX能做什么,AJAX什么地方不好。如果你觉得AJAX真的能给你的开发工作带来改q的话,那么l箋看看怎么使用AJAX吧?br />
7.1、AJAX应用到的技?br />
AJAX涉及(qing)到的7Ҏ(gu)术中Q个为Javascript、XMLHttpRequest、DOM、XML比较有用?br />
A、XMLHttpRequest对象
XMLHttpRequest是XMLHTTPlg的对象,通过q个对象QAJAX可以像桌面应用程序一样只同服务器q行数据层面的交换,而不用每ơ都h界面Q也不用每次数据处理的工作都交l服务器来做Q这h减轻了服务器负担又加快了响应速度、羃短了用户{待的时间?br />
IE5.0开始,开发h员可以在Web面内部使用XMLHTTP ActiveXlg扩展自n的功能,不用从当前的Web面D可以直接传输数据到服务器或者从服务器接收数据?Mozilla1.0以及(qing)NetScape7则是创徏l承XML的代理类XMLHttpRequestQ对于大多数情况QXMLHttpRequest对象和XMLHTTPlg很相|Ҏ(gu)和属性类|只是部分属性不同?br />
XMLHttpRequest对象初始化:(x)
XMLHttpRequest对象的方法:(x)
Ҏ(gu)
描述
abort()
停止当前h
getAllResponseHeaders()
作ؓ(f)字符串返回完整的headers
getResponseHeader("headerLabel")
作ؓ(f)字符串返回单个的header标签
open("method","URL"[,asyncFlag[,"userName"[, "password"]]])
讄未决的请求的目标 URLQ方法,和其他参?/p>
send(content)
发送请?/p>
setRequestHeader("label", "value")
讄headerq和h一起发?/p>
XMLHttpRequest对象的属性:(x)
属?/p>
描述
onreadystatechange
状态改变的事g触发?/p>
readyState
对象状?integer):
0 = 未初始化
1 = d?br />
2 = 已读?br />
3 = 交互?br />
4 = 完成
responseText
服务器进E返回数据的文本版本
responseXML
服务器进E返回数据的兼容DOM的XML文档对象
status
服务器返回的状态码, 如:(x)404 = "文g未找? ?00 ="成功"
statusText
服务器返回的状态文本信?/p>
B、Javascript
Javascript一直被定位为客L(fng)的脚本语aQ应用最多的地方是表单数据的校验。现在,可以通过Javascript操作XMLHttpRequestQ来跟数据库打交道?br />
C、DOM
DOMQDocument Object ModelQ是提供lHTML和XML使用的一lAPIQ提供了文g的表q结构,q可以利用它改变其中的内容和可见物。脚本语a通过DOM才可以跟面q行交互。Web开发h员可操作?qing)徏立文件的属性、方法以?qing)事仉以对象来展现。比如,document׃表页面对象本w?br />
D、XML
通过XMLQExtensible Markup LanguageQ,可以规范的定义结构化数据Q是|上传输的数据和文档W合l一的标准。用XML表述的数据和文档Q可以很Ҏ(gu)的让所有程序共享?br />
7.2、AJAX开发框?br />
q里Q我们通过一步步的解析,来Ş成一个发送和接收XMLHttpRequesth的程序框架。AJAX实质上也是遵循Request/Server模式Q所以这个框架基本的程也是Q对象初始化à发送请求à服务器接收à服务器返回à客L(fng)接收à修改客户端页面内宏V只不过q个q程是异步的?br />
A、初始化对象q发出XMLHttpRequesth
Z让Javascript可以向服务器发送HTTPhQ必M用XMLHttpRequest对象。用之前,要先XMLHttpRequest对象实例化。之前说q,各个览器对q个实例化过E实C同。IE以ActiveX控g的Ş式提供,而Mozilla{浏览器则直接以XMLHttpRequestcȝ形式提供。ؓ(f)了让~写的程序能够跨览器运行,要这样写Q?/p>
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
??? http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
??? http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
有些版本的Mozilla览器处理服务器q回的未包含XML mime-type头部信息的内Ҏ(gu)?x)出错。因此,要确保返回的内容包含text/xml信息?/p>
http_request = new XMLHttpRequest();
http_request.overrideMimeType('text/xml');
B、指定响应处理函?br />
接下来要指定当服务器q回信息时客L(fng)的处理方式。只要将相应的处理函数名U赋lXMLHttpRequest对象的onreadystatechange属性就可以了。比如:(x)
http_request.onreadystatechange = processRequest;
需要指出的Ӟq个函数名称不加括号Q不指定参数。也可以用Javascriptx定义函数的方式定义响应函数。比如:(x)
http_request.onreadystatechange = function() {
};
C、发出HTTPh
指定响应处理函数之后Q就可以向服务器发出HTTPh了。这一步调用XMLHttpRequest对象的open和sendҎ(gu)?/p>
http_request.open('GET', 'http://www.example.org/some.file', true);
http_request.send(null);
open的第一个参数是HTTPh的方法,为Get、Post或者Head?br />
W二个参数是目标URL。基于安全考虑Q这个URL只能是同|域的,否则?x)提C“没有权限”的错误。这个URL可以是Q何的URLQ包括需要服务器解释执行的页面,不仅仅是静态页面?br />
W三个参数只是指定在{待服务器返回信息的旉内是否l执行下面的代码。如果ؓ(f)TrueQ则不会(x)l箋执行Q直到服务器q回信息。默认ؓ(f)True?br />
按照序Qopen调用完毕之后要调用sendҎ(gu)。send的参数如果是以Post方式发出的话Q可以是M想传l服务器的内宏V不q,跟form一P如果要传文gl服务器Q必d调用setRequestHeaderҎ(gu)Q修改MIMEcd。如下:(x)
http_request.setRequestHeader(“Content-Type?”application/x-www-form-urlencoded?;
D、处理服务器q回的信?br />
在第二步我们已经指定了响应处理函敎ͼq一步,来看看这个响应处理函数都应该做什么?br />
首先Q它要检查XMLHttpRequest对象的readyState|判断h目前的状态。参照前文的属性表可以知道QreadyStategؓ(f)4的时候,代表服务器已l传回所有的信息Q可以开始处理信息ƈ更新面内容了。如下:(x)
if (http_request.readyState == 4) {
??? // 信息已经q回Q可以开始处?br />
} else {
??? // 信息q没有返回,{待
}
服务器返回信息后Q还需要判断返回的HTTP状态码Q确定返回的面没有错误。所有的状态码都可以在W3C的官方网站上查到。其中,200代表面正常?/p>
if (http_request.status == 200) {
??? // 面正常Q可以开始处理信?br />
} else {
??? // 面有问?br />
}
XMLHttpRequestҎ(gu)功返回的信息有两U处理方式:(x)
responseTextQ将传回的信息当字符串用;
responseXMLQ将传回的信息当XML文档使用Q可以用DOM处理?br />
E、一个初步的开发框?br />
ȝ上面的步骤,我们整理Z个初步的可用的开发框Ӟ供以后调用;q里Q将服务器返回的信息用window.alert以字W串的Ş式显C出来:(x)
<script language="javascript">
?????? var http_request = false;
?????? function send_request(url) {//初始化、指定处理函数、发送请求的函数
????????????? http_request = false;
????????????? //开始初始化XMLHttpRequest对象
????????????? if(window.XMLHttpRequest) { //Mozilla 览?br />
???????????????????? http_request = new XMLHttpRequest();
???????????????????? if (http_request.overrideMimeType) {//讄MiMEcd
??????????????????????????? http_request.overrideMimeType("text/xml");
???????????????????? }
????????????? }
????????????? else if (window.ActiveXObject) { // IE览?br />
???????????????????? try {
??????????????????????????? http_request = new ActiveXObject("Msxml2.XMLHTTP");
???????????????????? } catch (e) {
??????????????????????????? try {
?????????????????????????????????? http_request = new ActiveXObject("Microsoft.XMLHTTP");
??????????????????????????? } catch (e) {}
???????????????????? }
????????????? }
????????????? if (!http_request) { // 异常Q创建对象实例失?br />
???????????????????? window.alert("不能创徏XMLHttpRequest对象实例.");
???????????????????? return false;
????????????? }
????????????? http_request.onreadystatechange = processRequest;
????????????? // 定发送请求的方式和URL以及(qing)是否同步执行下段代码
????????????? http_request.open("GET", url, true);
????????????? http_request.send(null);
?????? }
?????? // 处理q回信息的函?br />
??? function processRequest() {
??????? if (http_request.readyState == 4) { // 判断对象状?br />
??????????? if (http_request.status == 200) { // 信息已经成功q回Q开始处理信?br />
??????????????? alert(http_request.responseText);
??????????? } else { //面不正?br />
??????????????? alert("(zhn)所h的页面有异常?);
??????????? }
??????? }
??? }
</script>
7.3、简单的CZ
接下来,我们利用上面的开发框架来做两个简单的应用?br />
A、数据校?br />
在用h册的表单中,l常到要检验待注册的用户名是否唯一。传l的做法是采用window.open的弹出窗口,或者window. showModalDialog的对话框。不q,q两个都需要打开H口。采用AJAX后,采用异步方式直接参数提交到服务器,用window.alert服务器q回的校验信息显C出来。代码如下:(x)
在之间增加一Dform表单代码Q?/p>
在开发框架的基础上再增加一个调用函敎ͼ(x)
function userCheck() {
?????? var f = document.form1;
?????? var username = f.username.value;
?????? if(username=="") {
????????????? window.alert("用户名不能ؓ(f)I?);
????????????? f.username.focus();
????????????? return false;
?????? }
?????? else {
????????????? send_request('sample1_2.jsp?username='+username);
?????? }
}
看看sample1_2.jsp做了什么:(x)
<%@ page contentType="text/html; charset=gb2312" errorPage="" %>
<%
String username = request.getParameter("username");
if("educhina".equals(username)) out.print("用户名已l被注册Q请更换一个用户名?);
else out.print("用户名尚未被使用Q?zhn)可以l箋?);
%>
q行一下,嗯,没有弹出H口Q没有页面刷斎ͼ跟预想的效果一栗如果需要的话,可以在sample1_2.jsp中实现更复杂的功能。最后,只要反馈信息打印出来就可以了?br />
B、联菜?br />
我们在第五部分提到利用AJAX改进U联菜单的设计。接下来Q我们就演示一下如何“按需取数据”?br />
首先Q在<body></body>中间增加如下HTML代码Q?br />
<table width="200" border="0" cellspacing="0" cellpadding="0">
??? <tr>
??????? <td height="20">
???????????????????? <a href="javascript:void(0)" onClick="showRoles('pos_1')">l理?lt;/a>
????????????? </td>
??? </tr>
??? <tr style="display:none">
??????? <td height="20" id="pos_1"> </td>
??? </tr>
??? <tr>
??????? <td height="20">
???????????????????? <a href="javascript:void(0)" onClick="showRoles('pos_2')">开发部</a>
????????????? </td>
??? </tr>
??? <tr style="display:none ">
??????? <td id="pos_2" height="20"> </td>
??? </tr>
</table>
在框架的基础上增加一个响应函数showRoles(obj)Q?br />
//昄部门下的岗位
function showRoles(obj) {
?????? document.getElementById(obj).parentNode.style.display = "";
?????? document.getElementById(obj).innerHTML = "正在d数据..."
?????? currentPos = obj;
?????? send_request("sample2_2.jsp?playPos="+obj);
}
修改框架的processRequest函数Q?br />
// 处理q回信息的函?br />
function processRequest() {
? if (http_request.readyState == 4) { // 判断对象状?br />
??? if (http_request.status == 200) { // 信息已经成功q回Q开始处理信?br />
?????? document.getElementById(currentPos).innerHTML = http_request.responseText;
??? } else { //面不正?br />
????? alert("(zhn)所h的页面有异常?);
??? }
? }
}
最后就是smaple2_2.jsp了:(x)
<%@ page contentType="text/html; charset=gb2312" errorPage="" %>
<%
String playPos = request.getParameter("playPos");
if("pos_1".equals(playPos))
out.print(" ȝ?lt;br> 副ȝ?);
else if("pos_2".equals(playPos))
out.println(" dE师<br> 软g工程?);
%>
q行一下看看效果:(x)
参考文章:(x)
作者:(x)
fanscial
标题Q?/p>
《AJAX介?/p>
|址Q?/p>
http://www.tkk7.com/fanscial/archive/2005/08/31/11628.html
作者:(x)
Amour GUO
标题Q?/p>
《AJAX内部交流文档?/p>
|址Q?/p>
http://www.dragonson.com/doc/ajax.html
作者:(x)
MoztwWiki
标题Q?/p>
《AJAX上手?/p>
|址Q?/p>
http://wiki.moztw.org/index.php/AJAX_%E4%B8%8A%E6%89%8B%E7%AF%87
3 坚持通过Uxml方式传递数据,不要通过普通文本方式传递html或者javascript代码。降低cgi和页面的耦合性,q样相同的一个xml数据才能很容易的使用在各U不同的面上。google在这斚wq不是一个好的榜栗?br />
4 通过一致性的接口调用Q不要在代码里面随处创徏控g发vhttpq接。否则代码将乱成一片?br />
5 要预见到跨域讉K问题的存在,不管是否跨域始终通过代理面讉K。这样静态页面才能在需要的时候自qUd到其他服务器上?br />
6 量用一致的代码库解析xml生成昄面Q不要在每个面上各自写解析xml和生成html的代码。否则页面将来非帔R以维护。Uuzone采用的开源项目sarissa或者Google发v的开业项目Ajaxslt都是可以考虑的选择?/p>