﻿<?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-Jelver'Sky-文章分类-AJAX/XML/ANT/SOAP/WEBService</title><link>http://www.blogjava.net/jelver/category/7671.html</link><description>“一直很多人说我是天才，但我却相信这个世界没有天才。如果没有卓越的努力和娴熟的球性，你永远不会踢出精彩的足球。我从来不会低估努力的重要性，而这正是我对自己的要求。”
----------------------------------------------------------------------------罗纳尔迪尼奥(Ronaldinho)--------
“不要叫我神童！我不是神童！我所获得的一切成就，都是我用汗水和刻苦训练换来的！” --------------------------丁俊辉（中国斯诺克公开赛冠军）---
</description><language>zh-cn</language><lastBuildDate>Wed, 12 Dec 2007 06:48:54 GMT</lastBuildDate><pubDate>Wed, 12 Dec 2007 06:48:54 GMT</pubDate><ttl>60</ttl><item><title>JDK tomcat Axis的安装使用（转）</title><link>http://www.blogjava.net/jelver/articles/167230.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Wed, 12 Dec 2007 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/167230.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/167230.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/167230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/167230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/167230.html</trackback:ping><description><![CDATA[<p><br />
一.简介<br />
什么是SOAP?SOAP是一个应用程序间的基于XML的通信工具和规范.SOAP最初由MicroSoft和Userland公司开发,已经演化了好几个版本,当前的版本SOAP1.1正飞速发展.W3C的XML协议工作组正努力把它发展为一个真正的开发的标准.SOAP1.2草案已经发布,它能澄清 1.1版规范的容易混淆的地方.</p>
<p>什么是Axis?Axis总体上是一个SOAP引擎,但又不仅仅是个引擎,它还:1)是一个简单的独立的服务器2)是一个可插入到servlet引擎(如Tomcat)中的服务3)可扩展的支持WSDL4)能根据WSDL产生JAVA文件/类5)包括一些例子程序6)包括一个可以监控TCP/IP包的工具</p>
<p>Axis起源于IBM的SOAP4J,是Apache SOAP的第三代产品,相对于以前的版本,它有如下特性:1)快速,它使用了基于事件的SAX解析机制.2)灵活,用户可以灵活定制扩展.3)稳定,接口将会变动很小.4)基于组件开发.5)支持WSDL1.1</p>
<p>二.准备<br />
应用Axis开发Web Services，你需要安装如下软件：<br />
1.jdk1.5<br />
2.安装Tomcat5.0.28,这是当前稳定版本.Tomcat运行在80端口.访问<a href="http://localhost/8080">http://localhost/8080</a>检查Tomcat是否安装成功.<br />
3.下载AXIS:<br />
官方站点:http://xml.apache.org/axis/index.html<br />
下载软件:axis-bin-1_2_1.tar.gz<br />
4.下载相关包:<br />
a.mail.jar 下载地址:http://java.sun.com/products/javamail<br />
b.activation.jar 下载地址:http://java.sun.com/products/javabeans/glasgow/jaf.html<br />
c.xerces.jar 下载地址:http://xml.apache.org/xerces-j/index.html<br />
d.xmlsec-1.2.1.jar 下载地址:http://xml.apache.org/security/</p>
<p>三.安装<br />
1.将jdk1.5.0_04安装在D:\jdk1.5.0_04下(当然安装路径可任意选)好后，环境变量配置如下：<br />
JAVA_HOME=D:\jdk1.5.0_04<br />
CLASSPATH=.;D:\jdk1.5.0_04\jre\lib\rt.jar;D:\jdk1.5.0_04\jre\lib\tools.jar<br />
Path=D:\jdk1.5.0_04\bin<br />
2.tomcat-5.0.28安装在D:\tomcat-5.0.28下(安装路径可任选)好后，环境变量配置如下：<br />
CATALINA_BASE=D:\tomcat-5.0.28<br />
CATALINA_HOME=D:\tomcat-5.0.28<br />
3.axis的安装<br />
a.将下载的Axis软件包解压缩，将其中的&#8220;webapps&#8221;目录下的&#8220;axis&#8221;目录整个拷贝到Tomcat安装目录下的&#8220;webapps&#8221;目录下。<br />
b.将mail.jar、activation.jar、xerces.jar、xmlsec-1.2.1.jar四个包,全部拷到D:\tomcat-5.0.28\webapps\axis\WEB-INF\lib下<br />
c.环境变量配置<br />
AXIS_HOME=D:\tomcat-5.0.28</p>
<p>AXIS_LIB=%AXIS_HOME%\WEB-INF\lib<br />
AXISCLASSPATH=%AXIS_LIB%\activation.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\mail.jar;AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\xerces.jar;%AXIS_LIB%\xmlsec-1.2.1.jar</p>
<p>CLASSPATH=%AXIS_HOME%\WEB-INF\lib<br />
AXISCLASSPATH=%AXIS_LIB%\activation.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\mail.jar;AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\xerces.jar;%AXIS_LIB%\xmlsec-1.2.1.jar<br />
这里有几点需要注意：中间不要有空格，包的名字可能有不同的版本，这时需要修改一下包名。</p>
<p>四.测试<br />
安装配置完毕后，应测试一下是否tomcat、Axis可以正确运行了。<br />
启动Tomcat服务器，在浏览器中访问<a href="http://localhost:8080/axis/happyaxis.jsp">http://localhost:8080/axis/happyaxis.jsp</a>，如果页面显示有错误，则需要回头检查一下相关配置是否正确，如果浏览页面能正确显示出系统组件、属性等参数配置信息，则表示安装成功。现在可以开始开发你的Web Services应用了。　</p>
<p>五、服务的发布<br />
Axis提供了两种服务发布方式，一种是即时发布（Instant Deployment），一种是定制发布（Custom Deployment）。</p>
<p>1. 使用即时发布 Java Web Service(JWS)</p>
<p>　　对即时发布的支持是Axis的特色之一，使用即时发布使用户只需有提供服务的Java类的源代码，即可将其迅速发布成Web服务。每当用户调用这类服务的时候，Axis会自动进行编译，即使服务器重启了也不必对其做任何处理，使用非常简单快捷。</p>
<p>　　使用即时发布首先需要一个实现服务功能的Java源文件，将其扩展名改为.jws（Java Web Service的缩写），然后将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下即可。<br />
&nbsp;在此给出一个HelloWorld程序，其源码如下：</p>
<p>HelloWorld.java</p>
<p>public class HelloWorld {<br />
&nbsp; public String sayHello()<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; return "HELLO WORLD!"; <br />
&nbsp; } <br />
}</p>
<p><br />
将其放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录，通过访问<a href="http://localhost:8080/axis/HelloWorld.jws?wsdl">http://localhost:8080/axis/HelloWorld.jws?wsdl</a>可以看到这个服务的WSDL描述文件，这说明HelloWorld服务被成功发布了。<br />
现在写个客户端程序访问一下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">TestClient.java<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis.client.Call;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis.client.Service;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.rpc.ParameterMode;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestClient<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_154_747_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_747_Open_Text.style.display='none'; Codehighlighter1_154_747_Closed_Image.style.display='inline'; Codehighlighter1_154_747_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_154_747_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_154_747_Closed_Text.style.display='none'; Codehighlighter1_154_747_Open_Image.style.display='inline'; Codehighlighter1_154_747_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_154_747_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_154_747_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_216_745_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_745_Open_Text.style.display='none'; Codehighlighter1_216_745_Closed_Image.style.display='inline'; Codehighlighter1_216_745_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_216_745_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_216_745_Closed_Text.style.display='none'; Codehighlighter1_216_745_Open_Image.style.display='inline'; Codehighlighter1_216_745_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_216_745_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_216_745_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;endpoint&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">8080</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/axis/HelloWorld.jws</span><span style="color: #000000">"</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">指明服务所在位置</span><span style="color: #008000"><br />
</span><span style="color: #008080">13</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;&nbsp;service&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Service();&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建一个Service实例，注意是必须的！</span><span style="color: #008000"><br />
</span><span style="color: #008080">15</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Call)&nbsp;service.createCall();</span><span style="color: #008000">//</span><span style="color: #008000">创建Call实例，也是必须的！</span><span style="color: #008000"><br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.net.URL(endpoint)&nbsp;);</span><span style="color: #008000">//</span><span style="color: #008000">为Call设置服务的位置</span><span style="color: #008000"><br />
</span><span style="color: #008080">18</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setOperationName(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">sayHello</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);</span><span style="color: #008000">//</span><span style="color: #008000">注意方法名与HelloWorld.java中一样！！</span><span style="color: #008000"><br />
</span><span style="color: #008080">20</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img id="Codehighlighter1_666_667_Open_Image" onclick="this.style.display='none'; Codehighlighter1_666_667_Open_Text.style.display='none'; Codehighlighter1_666_667_Closed_Image.style.display='inline'; Codehighlighter1_666_667_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_666_667_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_666_667_Closed_Text.style.display='none'; Codehighlighter1_666_667_Open_Image.style.display='inline'; Codehighlighter1_666_667_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;call.invoke(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;</span><span id="Codehighlighter1_666_667_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_666_667_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">&nbsp;);</span><span style="color: #008000">//</span><span style="color: #008000">返回String，没有传入参数</span><span style="color: #008000"><br />
</span><span style="color: #008080">22</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;res&nbsp;);<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p><br />
下面我们介绍第二种发布方式，这是常用的。</p>
<p>我们的第二种发布方式：<br />
1、将HelloWorld.java编译成HelloWorld.class,放到%TOMCAT_HOME%\webapps\axis\WEB-INF\classes</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下</p>
<p>2、在%TOMCAT_HOME%\webapps\axis\WEB-INF下新建deploy.wsdd文件，即SOAP服务发布描述文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; deploy.wsdd</p>
<p>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java">http://xml.apache.org/axis/wsdd/providers/java</a>"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;service name="HelloWorld" provider="java:RPC"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="HelloWorld"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="sayHello"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br />
&lt;/deployment&gt;</p>
<p>在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF，命令：<br />
java org.apache.axis.client.AdminClient deploy.wsdd 后会出现</p>
<p>Processing file deploy.wsdd<br />
&lt;Admin&gt;Done processing&lt;/Admin&gt;</p>
<p>这时你会发现目录下多了一个server-config.wsdd文件，这就是AXIS的配置文件，以后所有的服务发布描述都会在里面找到。（当然，你可以直接修改它，不用再写deploy.wsdd）然后打开浏览器<a href="http://localhost:8080/axis/services/HelloWorld?wsdl">http://localhost:8080/axis/services/HelloWorld?wsdl</a>，你就会看到你的服务已发布</p>
<p>同样用客户端程序访问一下：（注意和上边的差别！！）</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">HelloClient.java<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis.client.Call;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis.client.Service;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloClient<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_119_613_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_613_Open_Text.style.display='none'; Codehighlighter1_119_613_Closed_Image.style.display='inline'; Codehighlighter1_119_613_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_119_613_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_119_613_Closed_Text.style.display='none'; Codehighlighter1_119_613_Open_Image.style.display='inline'; Codehighlighter1_119_613_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_119_613_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_119_613_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_181_611_Open_Image" onclick="this.style.display='none'; Codehighlighter1_181_611_Open_Text.style.display='none'; Codehighlighter1_181_611_Closed_Image.style.display='inline'; Codehighlighter1_181_611_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_181_611_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_181_611_Closed_Text.style.display='none'; Codehighlighter1_181_611_Open_Image.style.display='inline'; Codehighlighter1_181_611_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_181_611_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_181_611_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;endpoint&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">8080</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/axis/services/HelloWorld</span><span style="color: #000000">"</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">注意！差别仅仅在这里！！</span><span style="color: #008000"><br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;&nbsp;service&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Service();<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Call)&nbsp;service.createCall();<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.net.URL(endpoint)&nbsp;);<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setOperationName(</span><span style="color: #000000">"</span><span style="color: #000000">sayHello</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;);<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img id="Codehighlighter1_549_550_Open_Image" onclick="this.style.display='none'; Codehighlighter1_549_550_Open_Text.style.display='none'; Codehighlighter1_549_550_Closed_Image.style.display='inline'; Codehighlighter1_549_550_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_549_550_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_549_550_Closed_Text.style.display='none'; Codehighlighter1_549_550_Open_Image.style.display='inline'; Codehighlighter1_549_550_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;call.invoke(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;</span><span id="Codehighlighter1_549_550_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_549_550_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">&nbsp;);<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;res&nbsp;);<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>五.总结</p>
<p>　　Web Services是未来网络应用的发展方向，SOAP和WSDL是Web Services的核心协议，Axis给出了一个很好的SOAP实现，它使得开发Web Services应用变得轻松而有趣。</p>
<img src ="http://www.blogjava.net/jelver/aggbug/167230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2007-12-12 14:42 <a href="http://www.blogjava.net/jelver/articles/167230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOAP中复杂类型(JavaBean)调用实例实践（转）</title><link>http://www.blogjava.net/jelver/articles/167189.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Wed, 12 Dec 2007 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/167189.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/167189.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/167189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/167189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/167189.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;1SOAP中复杂类型(JavaBean)调用实例实践&nbsp;&nbsp;2&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;5使用工具：axis-1_1&nbsp;&nbsp;6&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/jelver/articles/167189.html'>阅读全文</a><img src ="http://www.blogjava.net/jelver/aggbug/167189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2007-12-12 12:14 <a href="http://www.blogjava.net/jelver/articles/167189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用ant与jmeter实现负载测试自动化（转贴）</title><link>http://www.blogjava.net/jelver/articles/146111.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Tue, 18 Sep 2007 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/146111.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/146111.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/146111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/146111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/146111.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://blog.csdn.net/lemonfamily/archive/2007/05/17/1612826.aspx"><span><span>原贴地址：http://blog.csdn.net/lemonfamily/archive/2007/05/17/1612826.aspx</span></span></a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 性能测试一直以来都是测试领域一个令人争议的话题。测试的参考标准、评判依据及测试的方法选择都很难有一个统一的说法。但无论如何，对于需要能够承受一定压力而运行的程序来说，进行其进行功能和性能测试是一个必不可少的过程。<br />
工欲善其事，必先利其器。性能测试，很必要的准备是要利用工具简化测试的繁杂程度。减轻人工操作的负担。在下面的例子中，我们将会用到下面几个软件：<br />
Eclipse 3.2<span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;java IDE</span>，对ant的强力支持，非常方便我们利用ant的task与target功能实现测试的自动化。<br />
Ant1.7<span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>一个强大的构建脚本工具，在需要进行批处理操作或多任务时，非常有用。<a href="http://ant.apache.org/"><span><span>下载地址</span></span></a><br />
Jakarta-jmeter 2.1 &nbsp;100%用java实现的性能测试工具，原来目的是用于web的压力测试，目前已经可以用于测试静态或者动态资源的性能 包括java桌面应用程序、文件、数据库等。目前已经有更新的版本可用。<a href="http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi"><span><span>下载地址</span></span></a><br />
Badboy 2.0<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>一个非常不错的脚本录制工具，支持导出jemter的jmx格式。虽然功能不如loadrunner和winrunner强大，但如果只用于录制动作脚本，那么已经足够了。<a href="http://www.badboy.com.au/"><span><span>官方网站</span></span></a><span><br />
</span><br />
下面以个简单的web程序的负载测试的实现流程介绍如何使用ant 与jmeter实现负载测试自动化的。<br />
&nbsp;&nbsp;一、<span>&nbsp;&nbsp; </span>利用badboy录制一段脚本，该脚本包含了所需进行负载测试的url段以及请求数据。</div>
<div style="text-indent: 21.75pt"><img height="457" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/878d380d0d4c4c47868e71e2926be2bf.png" width="750" />&nbsp;<br />
<br />
然后利用 &#8221;File&#8221;-&gt;&#8221;Export to Jmeter&#8230;&#8221;导出jmx。<br />
二、<span>&nbsp;&nbsp;&nbsp; </span>运行jmeter。打开刚才的jmx。对其进行一定的编辑。<img height="549" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/c85247d9e0dd437eabc12025ed5dbffc.png" width="750" /><br />
<br />
我们计划要对登陆进行测试，则可以在该请求的节点上加上循环控制器：<img height="549" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/505e9db6d80348e3b6c5e6b975ab632c.png" width="750" /><br />
<br />
运行无误后，取消掉监视器。保存该脚本<br />
三、打开eclipse，先建一个java工程用于运行ant脚本。<br />
在jmeter的安装目录的extras文件夹下有个示例的ant运行脚本以及一个演示教程的html文档。我们直接copy这个build.xml到eclipse的新建工程目录下。利用&#8221;Windows&#8221;<span>--&gt;</span>&#8221;Show View&#8221;<span>--&gt;</span>&#8221;Other&#8221;<span>--&gt;</span>&#8221;Ant&#8221;打开ant控制面板。通过&#8221;Add Buildfiles&#8221;按钮将该build.xml添加进去。<br />
因为示例的脚本使用相对目录.，我们需要修改一下这个build.xml使得ant可以找到所指定的资源。在我的jmeter版本中，有个小的错误需要修改，原文件多打了个x：&nbsp;</div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568"><span style="font-size: 10pt; color: navy">&lt;property </span><span style="font-size: 10pt; color: navy">name=</span><span style="font-size: 10pt; color: green">"jmeter.save.saveservice.bytes" </span><span style="font-size: 10pt; color: navy">value=</span><span style="font-size: 10pt; color: green">"true"</span><span style="font-size: 10pt; color: navy">/&gt;</span></td>
        </tr>
    </tbody>
</table>
<div style="text-indent: 21.75pt"><img height="459" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/1d08f6d391484717983d342bd773e646.png" width="750" />&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行脚本成功后，会在指定的目录下生成一个html文档：&nbsp; <img height="459" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/69d392cc28c849b5a163c28ca9e7d2a5.png" width="750" /><br />
<br />
&nbsp;小提示：如果每次运行脚本不删除先前的jtl文件，则报告内容会把以前的测试结果保留下来。<br /><img src ="http://www.blogjava.net/jelver/aggbug/146111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2007-09-18 11:49 <a href="http://www.blogjava.net/jelver/articles/146111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax资料收集-Ajax文章(教程和实例)</title><link>http://www.blogjava.net/jelver/articles/87049.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Mon, 11 Dec 2006 12:42:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/87049.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/87049.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/87049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/87049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/87049.html</trackback:ping><description><![CDATA[作者tag:<a href="http://tag.csdn.net/tag/ajax/1.html" target="_blank">ajax</a> <a href="http://tag.csdn.net/tag/web开发(脚本和动态语言)/1.html" target="_blank">web开发(脚本和动态语言)</a> <a href="http://tag.csdn.net/tag/ajax资料收集-ajax文章(教程和实例)---ajax资源下载(源码和教程)---ajax规范标准/1.html" target="_blank">ajax资料收集-ajax文章(教程和实例)---ajax资源下载(源码和教程)---ajax规范标准</a> CSDN 推荐tag:<a href="http://tag.csdn.net/tag/.net/1.html" target="_blank">.net</a> <a href="http://tag.csdn.net/tag/asp.net/1.html" target="_blank">asp.net</a> <a href="http://tag.csdn.net/tag/w3c/1.html" target="_blank">w3c</a> <a href="http://tag.csdn.net/tag/web2.0/1.html" target="_blank">web2.0</a> <a href="http://tag.csdn.net/tag/教程/1.html" target="_blank">教程</a> <a href="http://tag.csdn.net/tag/资源/1.html" target="_blank">资源</a>  
<div style="CLEAR: both"></div><script><![CDATA[unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}]]&gt;</script><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/dshpsky/archive/2006/11/27/1416612.aspx"><img height="13" src="http://blog.csdn.net/images/authorship.gif" width="15" border="0" /> ajax资料收集-Ajax文章(教程和实例)---Ajax资源下载(源码和教程)---Ajax规范标准</a></div><div class="postText"><div class="tit"><br /></div><div class="date"><br /></div><table style="TABLE-LAYOUT: fixed"><tbody><tr><td><div class="cnt"><p>CSDN Blog Ajax文章搜索：<br /><a href="http://search.csdn.net/search/ajax/1/blog/">http://search.csdn.net/search/ajax/1/blog/</a><br /><br />专题：Ajax技术应用开发<br /><a href="http://www.51cto.com/html/2005/1121/11736.htm">http://www.51cto.com/html/2005/1121/11736.htm</a><br /><br /><a href="http://www.edufans.com/html/Ajax/">http://www.edufans.com/html/Ajax/</a><br /><a class="menubar" title="Ajax教程文章数：0" href="http://www.edufans.com/html/Ajax/Ajax_tech/"><font color="#810081">Ajax教程</font></a>  <br /><a class="menubar" title="Ajax技巧文章数：43" href="http://www.edufans.com/html/Ajax/Ajax_skills/"><font color="#810081">Ajax技巧</font></a><br /><a class="menubar" title="Ajax实例文章数：0" href="http://www.edufans.com/html/Ajax/Ajax_example/"><font color="#810081">Ajax实例</font></a><br /><a class="menubar" title="Ajax下载文章数：4" href="http://www.edufans.com/html/Ajax/Ajax_down/"><font color="#810081">Ajax下载</font></a><br /><br /><font color="#000000">++++++++++++++++++++++++++++++++++++++++++++++++++++++++</font><br />ajax联盟：资源下载<br /><a href="http://www.ajaxw3c.com/resource.html">http://www.ajaxw3c.com/resource.html</a></p><li><a href="http://www.ajaxw3c.com/resource_down/AjaxWeb20.rar" target="_blank">征服Ajax - Web20开发技术详解试读版【PDF电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/AjaxFastLane.pdf" target="new"><font color="#810081">AJAX 新手快车道【PDF电子版下载】</font></a></li><li><a href="http://wh.wlha.com.cn/bbs/pic/ajaxbasic.rar" target="_blank"><font color="#810081">Ajax 基础教程【html版下载】</font></a></li><li><a href="http://media.pragprog.com/titles/ajax/code/ajax-code.zip" target="_blank">Ajax 修炼之道—Web2.0入门【全部源代码下载】</a></li><li><a href="http://www.ajaxw3c.com/resource.html#">Ajax 开发精要</a></li><li><a href="http://www.ajaxw3c.com/resource_down/ajax_in_action.rar"><font color="#810081">Ajax实战(ajax_in_action)【PDF电子版下载】</font></a></li><li><a href="http://www.king-js.com/nimg/wzcg.pdf">网站重构【PDF电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/codeall101.rar">代码大全1.01中文版【PDF电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/CSS2.rar">CSS 2.0手册中文版(苏沈小雨版)【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/CSS%202.0cn.rar">CSS 2.0样式表中文手册(苏昱版)【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/JavaScript%205.rar">JScript 语言参考【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/JavaScriptcode1.0.rar">JavaScript源码大全 v1.0【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/javascript.rar">JavaScript 权威指南【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/VBScript%205.5.rar">VBScript 语言参考【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/XMLHTTP.rar"><font color="#810081">XmlHttp对象参考【chm电子版下载】</font></a></li><li><a href="http://www.ajaxw3c.com/resource_down/Flash%202004%20ActionScript.rar">Flash 2004 ActionScript 字典【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/XML.rar">XML 指南【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/XML2.rar">XML 学习手册英文第二版【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/MSWinScript.rar">Microsoft Windows脚本技术【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/WebProgram.rar">网站项目管理规范【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/DHTML.rar">网页制作完全手册【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/SQL.rar">SQL语言参考大全【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/Validator%20v1.0.rar">表单验证Validator v1.0【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/win32api.rar">新编 Win32API 大传【chm电子版下载】</a></li><li><a href="http://www.ajaxw3c.com/resource_down/webmake.rar">网站设计和制作理论知识【chm电子版下载】</a><br /><br />ajax联盟：规范标准<br /><a href="http://www.ajaxw3c.com/webstandard.html">http://www.ajaxw3c.com/webstandard.html</a><br /><br /><p class="text"><a title="CSS 编码规范" href="http://www.ajaxw3c.com/webstandard/css_standard.html" target="new"><font color="#810081">CSS 编码规范</font></a><br /><a title="ASP 编码规范" href="http://www.ajaxw3c.com/webstandard/asp_standard.html" target="new">ASP 编码规范</a><br /><a title="PHP 编码规范" href="http://www.ajaxw3c.com/webstandard/php_standard.html" target="new">PHP 编码规范</a><br /><a title="Java 编码规范" href="http://www.ajaxw3c.com/webstandard/java_standard.html" target="new">Java 编码规范</a><br /><a title="C＃编码规范" href="http://www.ajaxw3c.com/webstandard/CSharp_standard.html" target="new">C＃编码规范</a><br /><a title="JSP 编码规范" href="http://www.ajaxw3c.com/webstandard/JSP_standard.html" target="new">JSP 编码规范</a><br /><a title="网站技术规范" href="http://www.ajaxw3c.com/webstandard/web_standard.html" target="new">网站技术规范</a><br /><a title="网页制作规范及流程" href="http://www.ajaxw3c.com/webstandard/webpage_standard.html" target="new">网页制作规范及流程</a><br /><a title="专业信息网站制作规范" href="http://www.ajaxw3c.com/webstandard/webpro_standard.html" target="new">专业信息网站制作规范</a><br /><br />ajax联盟：文章教程<br /><a href="http://www.ajaxw3c.com/article.html">http://www.ajaxw3c.com/article.html</a></p><ul><li><a href="http://www.ajaxw3c.com/article/ajax20060701001.html" target="_blank">AJAX 技术简介</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060701002.html" target="_blank">AJAX 技术基础介绍</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060701003.html" target="_blank">AJAX 技术概述与现状应用</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060701004.html" target="_blank">AJAX 程序设计入门</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060701005.html" target="_blank">AJAX 应用说明及开发实例</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060704001.html" target="_blank">循序渐进学习Ajax的途径</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060704002.html" target="_blank">AJAX 开发简略</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711002.html" target="_blank">AJAX 上手篇</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711011.html" target="_blank">用AJAX编写一个简单的相册</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711001.html" target="_blank">用AJAX开发应用程序实战</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711003.html" target="_blank">AJAX 在 PHP 开发中的应用</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711004.html" target="_blank">Atlas 微软的Ajax工具包</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711005.html" target="_blank">用Ajax控制书签和回退按钮</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711006.html" target="_blank">基于Ajax应用程序架构汇总</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711007.html" target="_blank">AJAX 版的聊天室</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711008.html" target="_blank">AJAX 案例研究之详细剖析Gmail应用</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711012.html" target="_blank">Ajax 开发工具、框架</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711014.html" target="_blank">详解如何实现最基本的AJAX框架</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711010.html" target="_blank">用AJAX+J2EE实现网上会议室系统</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711009.html" target="_blank">深入理解AJAX响应信息的处理</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711014.html" target="_blank">详解如何实现最基本的AJAX框架</a></li><li><span twffan="done"><a href="http://www.ajaxw3c.com/article/ajax20060711018.html" target="_blank">实现基于Ajax的无限级菜单</a></span></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711013.html" target="_blank">AJAX 实例：根据邮编自动完成地址信息</a></li><li><a href="http://www.ajaxw3c.com/web/ajax.html" target="_blank">Ajax学习--网址链接大全</a></li></ul><p class="text">ajax联盟：WEB2.0<br /><a href="http://www.ajaxw3c.com/web20.html">http://www.ajaxw3c.com/web20.html</a></p></li><li><a href="http://www.ajaxw3c.com/web2.0/web2.0_01.html" target="new">web 2.0 概念结构</a></li><li><a href="http://www.ajaxw3c.com/web2.0/web2.0_03.html" target="new">Web 2.0 学习指南</a></li><li><a href="http://www.ajaxw3c.com/web2.0/web2.0_04.html" target="new">Web 2.0中AJAX技术应用详解</a></li><li><a href="http://www.ajaxw3c.com/web2.0/web2.0_05.html" target="new">Web 2.0 网站成功的关键</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711015.html" target="_blank">WEB2.0中AJAX应用的详细探讨</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711016.html" target="_blank">Web 2.0 编程思想:16条法则</a></li><li><a href="http://www.ajaxw3c.com/article/ajax20060711017.html" target="_blank">关于Web 2.0 网站的创业思考</a><br /><br /><br />+++++++++++++++++++++++++++++++++++++++++++++++++<br />Ajax资料<br /><a href="http://blog.csdn.net/bjoker/archive/2006/10/23/1347578.aspx">http://blog.csdn.net/bjoker/archive/2006/10/23/1347578.aspx</a><br />一.资源类网站<br /><br />1,国内网站<br />1)Ajax中国(推荐)<br />一个专业的ajax技术网站,分类清晰,有大量的电子版教程,以及AJAX源码下载!<br /><a href="http://www.okajax.com/"><u><font color="#0000ff">www.okajax.com</font></u></a><br /><br />2)ajaxcn.org<br />李琨老师的blog。李琨:《ajax实战》译者.<br /><a href="http://www.ajaxcn.org/"><u><font color="#0000ff">www.ajaxcn.org</font></u></a><br />-----------------------------------------<br />2,国外网站<br />1)、Ajax 的诞生 <br />Ajax: A New Approach to Web Applications <br /><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"><u><font color="#0000ff">www.adaptivepath.com/publications/essays/archives/000385.php</font></u></a><br /><br />2)、AJAX Matters <br /><a href="http://www.ajaxmatters.com/"><u><font color="#0000ff">www.ajaxmatters.com</font></u></a><br />关于 Ajax 技术一个信息量非常大的网站，有点像 Ajax 世界中的 TSS。 <br /><br />3)、AJAX Patterns <br />与 AJAX 设计模式相关的资源。 <br /><a href="http://www.ajaxpatterns.org/"><u><font color="#0000ff">www.ajaxpatterns.org</font></u></a><br /><a href="http://www.softwareas.com/ajax-patterns"><u><font color="#0000ff">www.softwareas.com/ajax-patterns</font></u></a><br /><br />4)、http://www.ajaxian.com <br /><br />--------------------------------------------------------------------------------<br /><br />二.热门文章<br /><br />1.什么是AJAX<br /><a href="http://www.okajax.com/info/net/20060510.html"><u><font color="#0000ff">www.okajax.com/info/net/20060510.html</font></u></a><br />2.ajax技术简介<br /><a href="http://www.okajax.com/info/basic/200604654.html"><u><font color="#0000ff">www.okajax.com/info/basic/200604654.html</font></u></a><br />3.ajax.net<br /><a href="http://www.okajax.com/info/basic/200604556.html"><font color="#0000ff"><u>www.okajax.com/info/basic/200604556.html</u></font></a><br /><a href="http://www.okajax.com/info/tech/200605589.html"><font color="#0000ff"><u>www.okajax.com/info/tech/200605589.html</u></font></a><br /><a href="http://weblogs.asp.net/mschwarz/archive/2005/04/11/399893.aspx"><u><font color="#0000ff">weblogs.asp.net/mschwarz/archive/2005/04/11/399893.aspx</font></u></a>(英文)<br /><br />--------------------------------------------------------------------------------<br /><br />三.ajax相关下载（电子书教程/源码）<br />1.Ajax基础教程电子版<br /><a href="http://www.okajax.com/info/bookdown/200604950.htm"><u><font color="#0000ff">www.okajax.com/info/bookdown/200604950.htm</font></u></a><br />2.《AJAX实战》ajax in action电子版<br /><a href="http://www.okajax.com/info/bookdown/200604366.htm"><u><font color="#0000ff">www.okajax.com/info/bookdown/200604366.htm</font></u></a><br />3.AJAX开发简略<br /><a href="http://www.okajax.com/info/bookdown/20060538.htm"><u><font color="#0000ff">www.okajax.com/info/bookdown/20060538.htm</font></u></a><br />----------------------------<br />4.AJAX版CD管理系统 (jsp)<br /><a href="http://www.okajax.com/info/codedown/200604327.htm"><u><font color="#0000ff">www.okajax.com/info/codedown/200604327.htm</font></u></a><br />5.Alexa 查询系统 (Xmlhttp + Ajax)<br /><a href="http://www.okajax.com/info/codedown/200604982.htm"><u><font color="#0000ff">www.okajax.com/info/codedown/200604982.htm</font></u></a><br />6.ASP.NET+AJAX解决网页打开等待问题<br /><a href="http://www.okajax.com/info/codedown/200604166.htm"><u><font color="#0000ff">www.okajax.com/info/codedown/200604166.htm</font></u></a><br />7.Ajax技术简介 (ajax demo)<br /><a href="http://www.okajax.com/info/codedown/200604576.htm"><u><font color="#0000ff">www.okajax.com/info/codedown/200604576.htm</font></u></a><br /><br />--------------------------------------------------------------------------------<br /><br />四.ajax相关图书<br />1.《Ajax实战》(目前Ajax领域最为全面深入的一本著作) <br /><a href="http://www.china-pub.com/computers/common/info.asp?id=28433"><u><font color="#0000ff">www.china-pub.com/computers/common/info.asp?id=28433</font></u></a><br />2.《Ajax基础教程》（亚马逊计算机榜首图书，国内第1本Ajax图书）<br /><a href="http://www.china-pub.com/computers/common/info.asp?id=28432"><u><font color="#0000ff">www.china-pub.com/computers/common/info.asp?id=28432</font></u></a><br />3.《Ajax 修炼之道-Web 2.0 入门》（Ajax从小工到专家的首选图书）<br /><a href="http://www.china-pub.com/computers/common/info.asp?id=29430"><u><font color="#0000ff">www.china-pub.com/computers/common/info.asp?id=29430</font></u></a><br />4.《征服Ajax+Lucene构建搜索引擎》<br /><a href="http://www.china-pub.com/computers/common/info.asp?id=29996"><u><font color="#0000ff">www.china-pub.com/computers/common/info.asp?id=29996</font></u></a><br />5.《征服Ajax--Web 2.0快速入门与项目实践（.net）》<br /><a href="http://www.china-pub.com/computers/common/info.asp?id=29995"><u><font color="#0000ff">www.china-pub.com/computers/common/info.asp?id=29995</font></u></a><br />6.《Ajax开发精要--概念、案例与框架》<br /><a href="http://www.china-pub.com/computers/common/info.asp?id=30006"><u><font color="#0000ff">www.china-pub.com/computers/common/info.asp?id=30006</font></u></a><br />[Page] <br /><br /><br />--------------------------------------------------------------------------------<br /><br />五.部分技术文章<br /><a href="http://www.dragonson.com/doc/ajax.html"><u><font color="#0000ff">www.dragonson.com/doc/ajax.html</font></u></a><br />Ajax内部交流文档 <br /><a href="http://info96.k12studio.com/~nio/comments.php?id=242_0_1_0_C"><u><font color="#0000ff">info96.k12studio.com/~nio/comments.php?id=242_0_1_0_C</font></u></a><br />简单地对 Ajax 进行描述介绍 <br /><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"><u><font color="#0000ff">www.adaptivepath.com/publications/essays/archives/000385.php</font></u></a><br />Ajax: A New Approach to Web Applications <br /><a href="http://jibbering.com/2002/4/httprequest.html"><u><font color="#0000ff">jibbering.com/2002/4/httprequest.html</font></u></a><br />Using the XML HTTP Request object <br /><a href="http://developer.apple.com/internet/webcontent/xmlhttpreq.html"><u><font color="#0000ff">developer.apple.com/internet/webcontent/xmlhttpreq.html</font></u></a><br />Dynamic HTML and XML: The XMLHttpRequest Object <br /><a href="http://del.icio.us/popular/ajax"><u><font color="#0000ff">del.icio.us/popular/ajax</font></u></a><br />del.icio.us / popular / ajax <br /><a href="http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples"><u><font color="#0000ff">www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples</font></u></a><br />XMLHttpRequest &amp; Ajax Working Examples <br /><a href="http://www.xml.com/lpt/a/2005/02/09/xml-http-request.html"><u><font color="#0000ff">www.xml.com/lpt/a/2005/02/09/xml-http-request.html</font></u></a><br />Very Dynamic Web Interfaces <br /><a href="http://www.standards-schmandards.com/index.php?2005/03/01/16-ajax-and-accessibility"><u><font color="#0000ff">www.standards-schmandards.com/index.php?2005/03/01/16-ajax-and-accessibility</font></u></a><br />AJAX and Accessibility <br /><a href="http://www.xml.com/lpt/a/2005/05/11/ajax-error.html"><u><font color="#0000ff">www.xml.com/lpt/a/2005/05/11/ajax-error.html</font></u></a><br />Errors and AJAX <br /><a href="http://www.softwareas.com/ajax-patterns"><u><font color="#0000ff">www.softwareas.com/ajax-patterns</font></u></a><br />AJAX Patterns: Design Patterns for AJAX Usability <br /><a href="http://www.backbase.com/download/Whitepaper%20Backbase%20AJAX%20and%20Beyond.pdf"><u><font color="#0000ff">www.backbase.com/download/Whitepaper%20Backbase%20AJAX%20and%20Beyond.pdf</font></u></a><br />Whitepaper Backbase AJAX and Beyond <br /><a href="http://www.ajaxpatterns.org/index.php?title=Main_Page"><u><font color="#0000ff">www.ajaxpatterns.org/index.php?title=Main_Page</font></u></a><br />AJAX patterns <br /><a href="http://www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html"><u><font color="#0000ff">www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html</font></u></a><br />A Simpler Ajax Path <br />++++++++++++++++++++++++++++++++++++++++++++++++++++<br />AJAX技术初探 <br /><a href="http://blog.csdn.net/weihj1999/archive/2006/11/07/1370794.aspx">http://blog.csdn.net/weihj1999/archive/2006/11/07/1370794.aspx</a><br />AJAX学习 <br /><a href="http://blog.csdn.net/starshus/archive/2006/10/15/1335028.aspx">http://blog.csdn.net/starshus/archive/2006/10/15/1335028.aspx</a><br />AJAX技术汇总 <br /><a href="http://blog.csdn.net/aiwtu/archive/2006/10/06/1323397.aspx">http://blog.csdn.net/aiwtu/archive/2006/10/06/1323397.aspx</a><br />掌握 Ajax，第 1 部分: Ajax 简介<br /><a href="http://blog.csdn.net/zhp80/archive/2006/10/12/1331538.aspx">http://blog.csdn.net/zhp80/archive/2006/10/12/1331538.aspx</a><br />Ajax原理详细说明(转自ibm开发者网站) <br /><a href="http://blog.csdn.net/etnovo/archive/2006/11/04/1366493.aspx">http://blog.csdn.net/etnovo/archive/2006/11/04/1366493.aspx</a><br />Ajax的定义与总结 <br /><a href="http://blog.csdn.net/xdy3008/archive/2006/10/30/1356778.aspx">http://blog.csdn.net/xdy3008/archive/2006/10/30/1356778.aspx</a><br />Thinking in AJAX -- 基于AJAX的WEB设计 <br /><a href="http://blog.csdn.net/ljhj210423/archive/2006/11/01/1360136.aspx">http://blog.csdn.net/ljhj210423/archive/2006/11/01/1360136.aspx</a><br />Ajax应用演示和源码下载 <br /><a href="http://blog.csdn.net/honglei225/archive/2006/11/07/1370409.aspx">http://blog.csdn.net/honglei225/archive/2006/11/07/1370409.aspx</a><br />70个流行的AJAX应用的演示和源码下载 <br /><a href="http://blog.csdn.net/xwycs/archive/2006/10/01/1315222.aspx">http://blog.csdn.net/xwycs/archive/2006/10/01/1315222.aspx</a><br />AJAX、AJAX实例及AJAX源代码（asp） <br /><a href="http://blog.csdn.net/itfly8/archive/2006/10/30/1356293.aspx">http://blog.csdn.net/itfly8/archive/2006/10/30/1356293.aspx</a><br />基于Ajax的应用程序架构汇总<br /><a href="http://blog.csdn.net/kastolo/archive/2006/11/07/1371545.aspx">http://blog.csdn.net/kastolo/archive/2006/11/07/1371545.aspx</a><br />ASP.NETWeb应用程序的简单AJAX实现 (转婕舞飞扬) <br /><a href="http://blog.csdn.net/lover_rong/archive/2006/11/09/1375031.aspx">http://blog.csdn.net/lover_rong/archive/2006/11/09/1375031.aspx</a><br />使用 Ajax 构建 RSS 阅读器<br /><a href="http://www-128.ibm.com/developerworks/cn/xml/x-ajaxrss/index.html">http://www-128.ibm.com/developerworks/cn/xml/x-ajaxrss/index.html</a><br /><br /><br /><br /></li></div></td></tr></tbody></table> </div></div><img src ="http://www.blogjava.net/jelver/aggbug/87049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2006-12-11 20:42 <a href="http://www.blogjava.net/jelver/articles/87049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse快速上手指南之使用ANT</title><link>http://www.blogjava.net/jelver/articles/81736.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Fri, 17 Nov 2006 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/81736.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/81736.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/81736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/81736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/81736.html</trackback:ping><description><![CDATA[Ant是Java平台下非常棒的批处理命令执行程序，能非常方便地自动完成编译，测试，打包，部署等等一系列任务，大大提高开发效率。如果你现在还没有开始使用Ant，那就要赶快开始学习使用，使自己的开发水平上一个新台阶。<br /><br />　　Eclipse中已经集成了Ant，我们可以直接在Eclipse中运行Ant。<br /><br />　　以前面建立的Hello工程为例，创建以下目录结构：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/208897.jpg';" hspace="3" src="http://www.yesky.com/image20010518/208897.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　新建一个build.xml，放在工程根目录下。build.xml定义了Ant要执行的批处理命令。虽然Ant也可以使用其它文件名，但是遵循标准能更使开发更规范，同时易于与别人交流。<br /><br />　　通常，src存放Java源文件，classes存放编译后的class文件，lib存放编译和运行用到的所有jar文件，web存放JSP等web文件，dist存放打包后的jar文件，doc存放API文档。<br /><br />　　然后在根目录下创建build.xml文件，输入以下内容： <br /><font face="Courier New" color="#006400"><br /></font><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#d9ecee" border="1"><tbody><tr><td><font face="Courier New" color="#006400">＜?xml version="1.0"?＞<br />＜project name="Hello world" default="doc"＞</font><br /><br /><font face="Courier New" color="#006400">＜!-- properies --＞<br />＜property name="src.dir" value="src" /＞<br />＜property name="report.dir" value="report" /＞<br />＜property name="classes.dir" value="classes" /＞<br />＜property name="lib.dir" value="lib" /＞<br />＜property name="dist.dir" value="dist" /＞<br />＜property name="doc.dir" value="doc"/＞</font><br /><br /><font face="Courier New" color="#006400">＜!-- 定义classpath --＞<br />＜path id="master-classpath"＞<br />＜fileset file="${lib.dir}/*.jar" /＞<br />＜pathelement path="${classes.dir}"/＞<br />＜/path＞</font><br /><br /><font face="Courier New" color="#006400">＜!-- 初始化任务 --＞<br />＜target name="init"＞<br />＜/target＞</font><br /><br /><font face="Courier New" color="#006400">＜!-- 编译 --＞<br />＜target name="compile" depends="init" description="compile the source files"＞<br />＜mkdir dir="${classes.dir}"/＞<br />＜javac srcdir="${src.dir}" destdir="${classes.dir}" target="1.4"＞<br />＜classpath refid="master-classpath"/＞<br />＜/javac＞<br />＜/target＞</font><br /><br /><font face="Courier New" color="#006400">＜!-- 测试 --＞<br />＜target name="test" depends="compile" description="run junit test"＞<br />＜mkdir dir="${report.dir}"/＞<br />＜junit printsummary="on"<br />haltonfailure="false"<br />failureproperty="tests.failed"<br />showoutput="true"＞<br />＜classpath refid="master-classpath" /＞<br />＜formatter type="plain"/＞<br />＜batchtest todir="${report.dir}"＞<br />＜fileset dir="${classes.dir}"＞<br />＜include name="**/*Test.*"/＞<br />＜/fileset＞<br />＜/batchtest＞<br />＜/junit＞<br />＜fail if="tests.failed"＞<br />***********************************************************<br />**** One or more tests failed! Check the output ... ****<br />***********************************************************<br />＜/fail＞<br />＜/target＞</font><br /><br /><font face="Courier New" color="#006400">＜!-- 打包成jar --＞<br />＜target name="pack" depends="test" description="make .jar file"＞<br />＜mkdir dir="${dist.dir}" /＞<br />＜jar destfile="${dist.dir}/hello.jar" basedir="${classes.dir}"＞<br />＜exclude name="**/*Test.*" /＞<br />＜exclude name="**/Test*.*" /＞<br />＜/jar＞<br />＜/target＞</font><br /><br /><font face="Courier New" color="#006400">＜!-- 输出api文档 --＞<br />＜target name="doc" depends="pack" description="create api doc"＞<br />＜mkdir dir="${doc.dir}" /＞<br />＜javadoc destdir="${doc.dir}"<br />author="true"<br />version="true"<br />use="true"<br />windowtitle="Test API"＞<br />＜packageset dir="${src.dir}" defaultexcludes="yes"＞<br />＜include name="example/**" /＞<br />＜/packageset＞<br />＜doctitle＞＜![CDATA[＜h1＞Hello, test＜/h1＞]]＞＜/doctitle＞<br />＜bottom＞＜![CDATA[＜i＞All Rights Reserved.＜/i＞]]＞＜/bottom＞<br />＜tag name="todo" scope="all" description="To do:" /＞<br />＜/javadoc＞<br />＜/target＞<br />＜/project＞</font></td></tr></tbody></table><font face="Courier New" color="#006400"></font><br />　　以上xml依次定义了init（初始化），compile（编译），test（测试），doc（生成文档），pack（打包）任务，可以作为模板。<br /><br />　　选中Hello工程，然后选择“Project”，“Properties”，“Builders”，“New…”，选择“Ant Build”：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/208898.jpg';" hspace="3" src="http://www.yesky.com/image20010518/208898.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　填入Name：Ant_Builder；Buildfile：build.xml；Base Directory：${workspace_loc:/Hello}（按“Browse Workspace”选择工程根目录），由于用到了junit.jar包，搜索Eclipse目录，找到junit.jar，把它复制到Hello/lib目录下，并添加到Ant的Classpath中：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/208899.jpg';" hspace="3" src="http://www.yesky.com/image20010518/208899.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　然后在Builder面板中钩上Ant_Build，去掉Java Builder：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src='http://www.yesky.com/image20010518/208900.jpg';" hspace="3" src="http://www.yesky.com/image20010518/208900.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　再次编译，即可在控制台看到Ant的输出：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#d9ecee" border="1"><tbody><tr><td><font face="Courier New" color="#006400">Buildfile: F:\eclipse-projects\Hello\build.xml</font><br /><br /><font face="Courier New" color="#006400">init:</font><br /><br /><font face="Courier New" color="#006400">compile:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\classes<br />[javac] Compiling 2 source files to F:\eclipse-projects\Hello\classes</font><br /><br /><font face="Courier New" color="#006400">test:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\report<br />[junit] Running example.HelloTest<br />[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.02 sec</font><br /><br /><font face="Courier New" color="#006400">pack:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\dist<br />[jar] Building jar: F:\eclipse-projects\Hello\dist\hello.jar</font><br /><br /><font face="Courier New" color="#006400">doc:<br />[mkdir] Created dir: F:\eclipse-projects\Hello\doc<br />[javadoc] Generating Javadoc<br />[javadoc] Javadoc execution<br />[javadoc] Loading source files for package example...<br />[javadoc] Constructing Javadoc information...<br />[javadoc] Standard Doclet version 1.4.2_04<br />[javadoc] Building tree for all the packages and classes...<br />[javadoc] Building index for all the packages and classes...<br />[javadoc] Building index for all classes...<br />[javadoc] Generating F:\eclipse-projects\Hello\doc\stylesheet.css...<br />[javadoc] Note: Custom tags that could override future standard tags: @todo. To avoid potential overrides, use at least one period character (.) in custom tag names.<br />[javadoc] Note: Custom tags that were not seen: @todo<br />BUILD SUCCESSFUL<br />Total time: 11 seconds</font></td></tr></tbody></table><br />　　Ant依次执行初始化，编译，测试，打包，生成API文档一系列任务，极大地提高了开发效率。将来开发J2EE项目时，还可加入部署等任务。并且，即使脱离了Eclipse环境，只要正确安装了Ant，配置好环境变量ANT_HOME=＜Ant解压目录＞，Path=…;%ANT_HOME%\bin，在命令行提示符下切换到Hello目录，简单地键入ant即可。<br /><br />相关文章：<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/index.html">http://www-128.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/index.html</a><img src ="http://www.blogjava.net/jelver/aggbug/81736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2006-11-17 12:34 <a href="http://www.blogjava.net/jelver/articles/81736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant使用指南（一） </title><link>http://www.blogjava.net/jelver/articles/81568.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Thu, 16 Nov 2006 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/81568.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/81568.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/81568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/81568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/81568.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="http://www.cnblogs.com/SGSoft/articles/81480.html">Ant使用指南（一）</a>
		</h2>原文：<a href="http://sgsoft.cnblogs.com/articles/81480.html?Pending=true#Post">http://sgsoft.cnblogs.com/articles/81480.html?Pending=true#Post</a><br />管理你的代码，doc文件,编译,配置等开发工作你是怎末做的：自己管理源目录，编译文件，copy,实施... 在window写bat,在unix写shell？ <br />     可惜我不怎末会写。所以我制作一个ejb的过程是这样的： <br />写代码-&gt;写个bat编译代码-&gt;组织文件(ejb-jar.xml,jboss.xml...)-&gt;压缩文件生成jar文档-&gt; <br />实施......(还有同样的测试过程)(为甚末不用jbuild?) 
<p><font size="2">    这中间每次修改都要经过重复的无数次手工copy,paste...过程，好累，好花时间。可我确实不想去 <br />学脚本编写，unix,linux下我还得重学，太累。</font></p><p><font size="2">    如果你和我一样希望自动执行预定义的动作却又不想太累，那末，我觉得ANT工具不错： <br />它可以以相同的用法用在不同平台(跨平台)。它是JAVA做的，免费的，开源的，据说网上已经成了事实的JAVA <br />构建标准，还听说高手都用它...... ^_^</font></p><p><font size="2">    我花了2天时间才掌握了它的基本用法，我希望你能通过我的文章和试验花半天时间就掌握它。</font></p><p><b><font color="#ff0000" size="2">内容：</font></b></p><ul><li><b><font color="#ff0000" size="2">下载，安装</font></b></li><li><b><font color="#ff0000" size="2">hello ant</font></b></li><li><b><font color="#ff0000" size="2">hello ant 进级</font></b></li><li><b><font color="#ff0000" size="2">参考及下载</font></b></li></ul><p><font size="2"><font color="#ff0000"><b>下载，安装 <br />   </b></font>又下载?又是一大堆参数变量?  :( <br />    <a href="http://jakarta.apache.org/ant/index.html">http://jakarta.apache.org/ant/index.html</a> 它是apache的java子项目"jakarta"的子项目.你可以选择 <br />当前的版本，目前我是1.5版,window版，以下就用它讲。</font></p><p><font size="2">    解压后ant_home用来方便访问。并确保你也设置了java_home 。 <br />    set ant_home=D:\java\kit\ant\jakarta-ant-1.5.1    这是我的目录     <br /><br />    就这些，简单吧。 <br /><br /><font color="#ff0000"><b>hello ant</b></font></font></p><p><font size="2">我们要开发一个java类：其内容只有一句，输出"hello ant"字符串。并使用ant完成编译和运行工作，这个例子只是为了跑通ant，不附加多余的东西。</font></p><p><font size="2">下图为文件组织，请建立相应的目录，并编写HelloAnt.java <br /><img height="198" src="http://www.huihoo.com/java/hello-ant/images/hello-ant-dir.gif" width="425" border="1" /></font></p><p><font size="2">按照人家老外的文件组织规则咱也照搬。</font></p><table style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="69" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td width="100%" bgcolor="#c0c0c0" height="13"><font size="2"> hello.ant.HelloAnt.java</font></td></tr><tr><td width="100%" height="52"><font size="2"><textarea style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体" name="S1" rows="7" cols="75">package hello.ant;

public class HelloAnt{
    public static void main(String[] args){
        System.out.println("hello ant,ant 的第一次接触，好棒！");
    } 
}</textarea></font></td></tr></tbody></table><p><font size="2">在项目根目录(hello-ant\)写1个文件：ant执行配置文件build.xml</font></p><table style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="69" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td width="100%" bgcolor="#c0c0c0" height="13"><font size="2"> build.xml</font></td></tr><tr><td width="100%" height="52"><font size="2"><textarea style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体" name="S1" rows="13" cols="75">&lt;?xml version="1.0"  encoding="GB2312" ?&gt;

&lt;!-- 一个项目,可包含很多任务组(target) --&gt;
&lt;project default="main" basedir="."&gt;

    &lt;!-- 项目中的一个任务组,可包含很多任务(task:javac,java...) --&gt;
    &lt;target name="main"&gt;

        &lt;!--编译--&gt;
        &lt;javac srcdir="src\main\hello\ant" destdir="build\classes"/&gt;

        &lt;!--运行--&gt;
        &lt;java classname="hello.ant.HelloAnt"&gt;
            &lt;classpath&gt;
                &lt;pathelement path="build\classes"/&gt;
            &lt;/classpath&gt;
        &lt;/java&gt;

    &lt;/target&gt;
&lt;/project&gt;</textarea></font></td></tr></tbody></table><p><font size="2">ok,一切大功告成，哦，不，还没有运行它。</font></p><p><font size="2">dos下进入hello-ant的目录，即build.xml所在的目录，我们要用ant工具执行它 ， </font></p><p><font size="2">执行: %ant_home%/bin/ant -file build.xml     用ant工具执行当前目录下的配置文件build.xml </font></p><p><font size="2">或  ：ant -file build.xml                    你如果设置%ant_home%/bin到path中</font></p><p><font size="2">这次ok了，这是答案：</font></p><table style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="69" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td width="100%" bgcolor="#c0c0c0" height="13"><font size="2">命令提示符窗口</font></td></tr><tr><td width="100%" bgcolor="#000000" height="52"><font color="#ffffff" size="2">D:\temp\hello-ant&gt;ant -file build.xml <br />Buildfile: build.xml <br /><br />main: <br />[javac] Compiling 1 source file to D:\temp\hello-ant\build\classes <br />[java] hello ant,ant 的第一次接触，好棒！ <br /><br />BUILD SUCCESSFUL <br />Total time: 2 seconds <br />D:\temp\hello-ant&gt;</font></td></tr></tbody></table><p><font size="2">检查一下build/classes目录，哦，看到编译过的文件就在这里: <br />build/classes/hello/ant/HelloAnt.class.</font></p><p><b><font color="#ff0000" size="2">hello ant 进级</font></b></p><p><font size="2">(此段比较废话，可以略过) <br /><font face="仿宋_GB2312">你也许会说：这末简单的工作写个批处理不就得了，又xml又ant的，把我的时间都浪费完了，我用jbuild或 <br />webShpere不就得了，怎末说你才明白呢？反正网上开源项目大多数都用ant,你总不能给人家个*.jpx吧， <br />而且这样的工具太贵，受不了(当然用D的兄弟不怕^_^ )，而且ant可以让你明确的管理和自动化所有的东西: <br />编译-实施-测试...,哎，稍微麻烦一点点，但节约你以前花在零碎的copy,paste上的时间.而且我发现管理 <br />代码的质量有所提高.</font></font></p><p><font size="2">我们要改进build.xml，让它做更多的事情：</font></p><ul><li><font size="2">定义全局变量</font></li><li><font size="2">初始化,主要是建立目录</font></li><li><font size="2">编译  (已有)</font></li><li><font size="2">打包为jar</font></li><li><font size="2">建立API documentation</font></li><li><font size="2">生成distribution产品</font></li></ul><p class="MsoNormal"><font face="仿宋_GB2312" size="2">凡事都讲究平衡，你要ant给你做更多事，当然要累一点点，不过只用累一次，以后的代码修改后的构建都是"一键式"完成,我们制作一个hello的简单例子，你可以自己做j2ee的练习。</font></p><p class="MsoNormal"><font face="宋体" size="2">我们要扩充目录结构，使它更像回事：</font></p><p class="MsoNormal"><font face="宋体" size="2">ant处理编译之前的目录：</font></p><p class="MsoNormal"><font face="宋体" size="2"><img height="170" src="http://www.huihoo.com/java/hello-ant/images/hello-ant-dir-advance-2.gif" width="425" border="1" /></font></p><p class="MsoNormal"><font face="宋体" size="2">ant处理之后的目录：</font></p><p class="MsoNormal"><font size="2"><img height="283" src="http://www.huihoo.com/java/hello-ant/images/hello-ant-dir-advance-1.gif" width="454" border="1" /></font></p><p class="MsoNormal"><font size="2">图中：\src,\docs,\lib是自己组织的文件结构，\build,\dist是ant动态生成的成品。</font></p><p class="MsoNormal"><font size="2">\src                     源文件：java源，script源，jsp源，xml配置..... <br />\src\main         java源 <br />\src\script     window,unix,liunx的执行script，我们的简单只有一个： <br />                  run.bat:  java hello.ant.HelloAnt</font></p><p class="MsoNormal"><font size="2">\docs                手写说明文档 <br />\lib                   程序所需类库的jar,比如j2ee.jar,mail,jar...</font></p><p class="MsoNormal"><font size="2">\build               用ant动态生成的构建目录 <br />\build\classes  编译的类文件 <br />\build\docs         copy "\docs"的手写说明文档，和ant生成的api文档 <br />\build\lib           放置我们自己的HelloAnt.class打包成品hello-ant.jar</font></p><p class="MsoNormal"><font size="2">\dist\bin        copy "\src\script" 得执行文件 <br />\dist\docs      copy "\build\docs" 的文档 <br />\dist\lib         除了copy "\build\lib"下的hello-ant.jar外， <br />                              还应copy "\lib"的程序所需jar，这里我们没有。</font></p><p class="MsoNormal"><font size="2">以上是我学老外的文件组织，大家可以按照自己的爱好组织</font></p><p class="MsoNormal"><font size="2">我们编写必要的文件： </font></p><table style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="29" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td width="100%" bgcolor="#c0c0c0" height="13"><font size="2">hello.ant. HelloAnt.java</font></td></tr><tr><td width="100%" height="12"><font size="2">已有</font></td></tr></tbody></table><table style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="69" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td width="100%" bgcolor="#c0c0c0" height="13"><font size="2">\src\script.bat</font></td></tr><tr><td width="100%" height="52"><font size="2"><textarea style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体" name="S1" rows="7" cols="75">@echo off
echo ========================================================
echo   请先设置 Environment
echo .
echo   JAVA_HOME: %JAVA_HOME%
echo ======================================================

%java_home%\bin\java -classpath ..\lib\hello-ant.jar  hello.ant.HelloAnt

pause </textarea></font></td></tr></tbody></table><table style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="69" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td width="100%" bgcolor="#c0c0c0" height="13"><font size="2">\docs\index.html 随便写一个手写的文档</font></td></tr><tr><td width="100%" height="52"><p align="center"><b><font color="#ff0000" size="2">hello ant 软件项目手册docs</font></b></p><hr color="#008000" size="1" /><p align="center"><b><a href="http://www.huihoo.com/java/hello-ant/api/index.html"><font color="#ff0000" size="2">访问api文档</font></a></b></p>　 </td></tr></tbody></table><table style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="69" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td width="100%" bgcolor="#c0c0c0" height="13"><font size="2">\build.xml 配置文件 </font></td></tr><tr><td width="100%" height="52"><font size="2"><textarea style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体" name="S1" rows="24" cols="83">&lt;?xml version="1.0"  encoding="GB2312" ?&gt;
&lt;!--
    =======================================================================
      hello-ant 项目 ,学习ant工具的第2个build file.

      参照ant的jakarta-ant-1.6alpha的build.xml

      Copyright (c) 2002 The Neusoft Software Foundation.  All rights
      reserved.

    =======================================================================
--&gt;

&lt;!--
    文档结构为:
    &lt;project&gt;
        &lt;property/&gt;               全局变量的定义
        &lt;property/&gt;...

        &lt;target name="1"&gt;         任务组(tasks)
            &lt;javac&gt;&lt;/javac&gt;       一项javac任务
            ...
            &lt;oneTask&gt;&lt;/ontTask&gt;   一项其它任务
        &lt;/target&gt;

        &lt;target name="2"&gt;
            &lt;javac&gt;&lt;/javac&gt;
            ...
            &lt;oneTask&gt;&lt;/ontTask&gt;
        &lt;/target&gt;
    &lt;/project&gt;

    project代表一个项目，
    default:运行到名称为"dist"的target(任务组)
    basedir:基准路径。
--&gt;
&lt;project default="dist" basedir="."&gt;

&lt;!--
    ===================================================================
      定义属性（property tasks）
      最好把用到的路径呀，名称呀都在这里定义成全局变量
      例：定义
          &lt;property name="a" value="hello"/&gt;
      以后就可以这样用它：
          &lt;property name="b" value="${a}/b"/&gt;
      现在:b=="hello/b"
    ===================================================================
--&gt;

    &lt;!--主要的系统环境属性--&gt;
    &lt;property environment="env"/&gt;&lt;!--取window,unix...的环境变量--&gt;
    &lt;property name="java.home" value="${env.JAVA_HOME}"/&gt;
    &lt;property name="ant.home"  value="${env.ANT_HOME}"/&gt;

    &lt;!--主要的app环境属性--&gt;
    &lt;property name="app.name"      value="hello-ant"/&gt;
    &lt;property name="app.jar"       value="${app.name}.jar"/&gt;
    &lt;property name="app.copyright" value=" Copyright (c) 2002 The Neusoft Software Foundation.  All rights reserved."/&gt;


    &lt;!--app中src的属性--&gt;
    &lt;property name="src.dir"    value="src" /&gt;
    &lt;property name="src.main"   value="${src.dir}/main"/&gt;
    &lt;property name="src.script" value="${src.dir}/script"/&gt;

    &lt;!--app用到的lib--&gt;
    &lt;property name="lib.dir" value="lib"/&gt;

    &lt;!--app的build目录中--&gt;
    &lt;property name="build.dir"      value="build" /&gt;
    &lt;property name="build.classes"  value="${build.dir}/classes"/&gt;
    &lt;property name="build.docs"     value="${build.dir}/docs"/&gt;
    &lt;property name="build.docs.api" value="${build.docs}/api"/&gt;
    &lt;property name="build.lib"      value="${build.dir}/lib"/&gt;

    &lt;!--app的dist (distribution) 目录中--&gt;
    &lt;property name="dist.dir"      value="dist"/&gt;
    &lt;property name="dist.bin"      value="${dist.dir}/bin"/&gt;
    &lt;property name="dist.docs"     value="${dist.dir}/docs"/&gt;
    &lt;property name="dist.lib"      value="${dist.dir}/lib"/&gt;

    &lt;!--app的docs目录中--&gt;
    &lt;property name="docs.dir"      value="docs"/&gt;

    &lt;!--
    定义一组路径以后可以通过id重用这组路径 ，例：
    &lt;javac srcdir="src/main" destdir="build/classes"&gt;
            &lt;classpath refid="classpath"/&gt;
    &lt;/javac&gt;
    --&gt;
    &lt;path id="classpath"&gt;
        &lt;!--本项目只有一个java，用不上classpath，这里只是做个例子--&gt;
        &lt;pathelement location="${build.classes}"/&gt;
        &lt;pathelement path="${java.home}/lib/tools.jar"/&gt;
    &lt;/path&gt;

&lt;!--
    ===================================================================
      init 准备目录(File Tasks)
      主要的目录结构通常是不会变的，一起生成他们
    ===================================================================
--&gt;
    &lt;target name="init"&gt;
        &lt;!--清除以前目录--&gt;
        &lt;delete dir="${build.dir}" failonerror="false" /&gt;
        &lt;delete dir="${dist.dir}"  failonerror="false"/&gt;

        &lt;!--准备目录--&gt;
        &lt;mkdir dir="${build.dir}"/&gt;
        &lt;mkdir dir="${build.classes}"/&gt;
        &lt;mkdir dir="${build.docs}"/&gt;
        &lt;mkdir dir="${build.docs.api}"/&gt;
        &lt;mkdir dir="${build.lib}"/&gt;

        &lt;mkdir dir="${dist.dir}"/&gt;
        &lt;mkdir dir="${dist.bin}"/&gt;
        &lt;mkdir dir="${dist.lib}"/&gt;

    &lt;/target&gt;

&lt;!--
    ===================================================================
      Build the code (Compile Tasks,File Tasks)
    ===================================================================
--&gt;
    &lt;target name="build" depends="init"&gt;
        &lt;!--编译--&gt;
        &lt;javac srcdir="${src.main}" destdir="${build.classes}"&gt;
            &lt;classpath refid="classpath"/&gt;
        &lt;/javac&gt;
    &lt;/target&gt;

&lt;!--
    ===================================================================
      打包文档(Archive Tasks)
      Create the project jars: xxx1.jar and xxx2.jar
    ===================================================================
--&gt;
   &lt;target name="jars" depends="build"&gt;
        &lt;jar basedir="${build.classes}" jarfile="${build.lib}/${app.jar}"/&gt;
    &lt;/target&gt;

&lt;!--
     ===================================================================
       Creates the API documentation
     ===================================================================
--&gt;
    &lt;target name="javadocs"
            depends="jars"
            description="--&gt; creates the API documentation"&gt;
        &lt;!--copy docs 手册... --&gt;
        &lt;copy todir="${build.docs}"&gt;
            &lt;fileset dir="${docs.dir}"/&gt;
        &lt;/copy&gt;

        &lt;javadoc packagenames="hello.ant.*"
                 sourcepath="${src.main}"
                 defaultexcludes="yes"
                 destdir="${build.docs.api}"
                 author="true"
                 version="true"
                 use="true"
                 windowtitle="Docs API"&gt;
             &lt;doctitle&gt;&lt;![CDATA[&lt;h1&gt;hello ant Docs API&lt;/h1&gt;]]&gt;&lt;/doctitle&gt;
             &lt;bottom&gt;&lt;![CDATA[&lt;i&gt;${app.copyright}&lt;/i&gt;]]&gt;&lt;/bottom&gt;
             &lt;tag name="todo" scope="all" description="To do:" /&gt;
         &lt;/javadoc&gt;
    &lt;/target&gt;

&lt;!--
     ===================================================================
       Create the distribution that can run (Archive Tasks)
       主要是从各目录中把该copy的copy上
     ===================================================================
--&gt;
   &lt;target name="dist" depends="javadocs"&gt;
        &lt;!--copy bin 执行文件 --&gt;
        &lt;copy todir="${dist.bin}"&gt;
            &lt;fileset dir="${src.script}/"/&gt;
        &lt;/copy&gt;
        &lt;copy todir="${dist.docs}"&gt;
            &lt;fileset dir="${build.docs}/"/&gt;
        &lt;/copy&gt;
        &lt;!-- copy lib 文件 --&gt;
        &lt;copy todir="${dist.lib}"&gt;
            &lt;fileset dir="${build.lib}/"/&gt;
        &lt;/copy&gt;

    &lt;/target&gt;
&lt;!--
     ===================================================================
      Cleans everything(File Tasks)
      例如可以删除build中的文件，留给你发挥吧
     ===================================================================
--&gt;

&lt;/project&gt;</textarea></font></td></tr></tbody></table><p class="MsoNormal"><font size="2"><br />build.xml多了些，但其实很简单：(注释比较详细可以参照，这里再简单说一下)</font></p><p class="MsoNormal"><font size="2">一个build.xml包含一个工程的自动化处理的完整xml说明，并且基本由3种东东组成：</font></p><p class="MsoNormal"><font size="2">&lt;project &gt; <br /><br />    1.全局变量的定义 <br />    &lt;property/&gt;</font></p><p class="MsoNormal"><font size="2">    2.任务组 <br />    &lt;target&gt; <br />        3.许多单项任务... 像copy,delete,javac,jar... <br />        &lt;task1/&gt; <br />        &lt;task2/&gt; <br />        &lt;task3/&gt; <br />    &lt;/target&gt;</font></p><p class="MsoNormal"><font size="2">&lt;/project&gt;</font></p><img src ="http://www.blogjava.net/jelver/aggbug/81568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2006-11-16 17:19 <a href="http://www.blogjava.net/jelver/articles/81568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用xmlhttp和Java session监听改善站内消息系统</title><link>http://www.blogjava.net/jelver/articles/43316.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Wed, 26 Apr 2006 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/43316.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/43316.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/43316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/43316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/43316.html</trackback:ping><description><![CDATA[  这个题目含有许多需要解释的概念，最容易说明的是“站内消息”，这是很多论坛都有的功能，可以通过web向其他的在线用户发送消息，很多用户都使用过。站内消息的第一个好处是大家都不需要安装客户端，你不用知道对方的MSN或者QQ，就能与他联系，称赞他的观点或者是给他一顿臭骂。第二个好处是客户管理方便，利用session来维护在线名单，各种脚本都已经把session操作封装得很易用了，不用像其他无状态的即时通信工具（比如使用UDP通信的工具）一样，要费一些脑细胞来解决在线名单的问题。缺点嘛，就是实时性不好，一般是在用户跳转或者刷新页面才能探测消息、更新在线名单。<br /><br />　　 Session监听嘛，没什么好解释的，java提供了很灵活的事件机制来监听session，可以监听session的创建和销毁，监控session所携带数据的创建、变化和销毁，可以监听session的锐化和钝化（了解对象序列化的兄弟应该知道这个），其他的平台是个什么情况我不太清楚，估计也差不多吧。如果能够对所有客户的session进行监控，就不用再去操作麻烦而危险的Application了。
<p>　　 　　 Xmlhttp是MS推的一项技术，功能很复杂，可以做很多事情，比如客户端可以在简单的HTML中打开HTTP连接，主动向server请求数据并获得返回数据，是DOM技术一个非常重要的应用，利用它来写无刷新的动态页面简直是so easy，做过web开发的兄弟应该明白它的意义有多么重大。<br /><br />一、 session监听<br /><br />　　 servlet中对session的监听有很多接口，功能很灵活，最常用的是监听Session和Attribute。这里要澄清一下概念，servlet中的session监听和Attribute监听含义有差别，session监听指的不是我们一般所理解的放置一个session或者销毁一个session，这是Attribute监听的功能，因为servlet中放置session的语法是session.setAttribute(“session名”,要放入的对象)。而session监听，监听的是HTTP连接，只要有用户与server连接，就算连接的是一个空白的jsp页面，也会触发session事件，所以此处的session实际上指的是connection，用来统计当前在线用户数最合适了。不知道我说清楚了没有。下面分别讲解这两种监听方式。<br /><br />1、 session监听<br /><br />　　 首先编写一个session监听类，实作HttpSessionListener接口，它的作用是计算当前有多少个在线用户：<br /><br /></p><div class="codeStyle"><ol><li><i><font color="#339900">/**</font></i></li><li><i><font color="#339900">*@Author bromon</font></i></li><li><i><font color="#339900">*2004-6-12</font></i></li><li><i><font color="#339900">*/</font></i></li><li><b><font color="#0000ff">package</font></b> org.bromon.test; 
</li><li></li><li><b><font color="#0000ff">import</font></b> javax.servlet.*; 
</li><li><b><font color="#0000ff">import</font></b> javax.servlet.http.*; 
</li><li></li><li><b><font color="#0000ff">public</font></b> <b><font color="#0000ff">class</font></b> SessionCount <b><font color="#0000ff">implements</font></b> <a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionListener.java.html" target="_blank"><font class="classLink"><u>HttpSessionListener</u></font></a></li><li>{ 
</li><li>    <b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">int</font></b> count=0; 
</li><li></li><li>    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> sessionCreated(<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionEvent.java.html" target="_blank"><font class="classLink"><u>HttpSessionEvent</u></font></a> se) 
</li><li>    { 
</li><li>        count++; 
</li><li>        <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.out.println(“session创建：”+<b><font color="#0000ff">new</font></b> java.util.<b><a href="http://www.javaresearch.org/source/jdk142/java/util/Date.java.html" target="_blank"><font class="classLink"><u>Date</u></font></a></b>()); 
</li><li>    } 
</li><li></li><li>    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> sessionDestroyed(<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionEvent.java.html" target="_blank"><font class="classLink"><u>HttpSessionEvent</u></font></a> se) 
</li><li>    { 
</li><li>       count--; 
</li><li>       <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></b>.out.println(“session销毁:”+<b><font color="#0000ff">new</font></b> java.util.<b><a href="http://www.javaresearch.org/source/jdk142/java/util/Date.java.html" target="_blank"><font class="classLink"><u>Date</u></font></a></b>()); 
</li><li>    } 
</li><li></li><li>    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">static</font></b> <b><font color="#0000ff">int</font></b> getCount() 
</li><li>    { 
</li><li>       <b><font color="#0000ff">return</font></b>(count); 
</li><li>     } 
</li><li>} </li></ol></div><br /><br /><br />　　 怎么样，是不是一目了然？count被定义为static，是因为要保证整个系统只有这一个count。如果你实在不放心，可以把它写成一个单例类。<br /><br />　　 然后在web.xml中声明这个监听器：<br />&lt;listener&gt;<br />&lt;listener-class&gt;<br />org.bromon.test.SessionCount<br />&lt;/listener-class&gt;<br />&lt;/listener&gt;<br /><br />　　 编写一个测试页面test.jsp，内容是获得count：<br />&lt;%<br />int count=org.bromon.test.SessionCount.getCount();<br />out.println(count);<br />%&gt;<br /><br />　　 需要注意的是，这里根本不涉及任何session的操作。重启动App server，试着连接test.jsp，可以看到监听器已经开始工作。<br /><br />2、 Attribute监听<br />　　 作为一个站内消息系统，肯定要获得所有登陆者的ID，才有可能互发消息。这就涉及Attribute监听。假设我们写了个用户登陆的模块，用户通过身份验证之后会产生一个session，保存它的相关信息，比如：<br /><div class="codeStyle"><ol><li><i><font color="#339900">//check.jsp</font></i></li><li>&lt;% 
</li><li>    <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> name=request.getParameter(“name”); 
</li><li>    <font color="#ff0000">Name</font>=<b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b>(name.getBytes(“ISO8859-1”)); 
</li><li>    session.setAttribute(“user”,name); 
</li><li>%&gt; </li></ol></div><br /><br />　　 做过jsp的兄弟应该对这段代码再熟悉不过了，下面写个监听器来监听用户登陆，把所有用户的ID保存到一个List当中，这个监听器实作HttpSessionAttributeListener接口：<br /><br /><div class="codeStyle"><ol><li><i><font color="#339900">/**</font></i></li><li><i><font color="#339900">*@Author bromon</font></i></li><li><i><font color="#339900">*2004-6-12</font></i></li><li><i><font color="#339900">*/</font></i></li><li><b><font color="#0000ff">package</font></b> org.bromon.test; 
</li><li></li><li><b><font color="#0000ff">import</font></b> javax.servlet.*; 
</li><li><b><font color="#0000ff">import</font></b> javax.servlet.http.*; 
</li><li><b><font color="#0000ff">import</font></b> java.util.*; 
</li><li></li><li><b><font color="#0000ff">public</font></b> <b><font color="#0000ff">class</font></b> OnlineList <b><font color="#0000ff">implements</font></b> <a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionAttributeListener.java.html" target="_blank"><font class="classLink"><u>HttpSessionAttributeListener</u></font></a></li><li>{ 
</li><li>    <b><font color="#0000ff">private</font></b> <b><font color="#0000ff">static</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/util/List.java.html" target="_blank"><font class="classLink"><u>List</u></font></a></b> list=<b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/util/ArrayList.java.html" target="_blank"><font class="classLink"><u>ArrayList</u></font></a></b>(); 
</li><li></li><li>    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> attributeAdded(<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionBindingEvent.java.html" target="_blank"><font class="classLink"><u>HttpSessionBindingEvent</u></font></a> se) 
</li><li>    { 
</li><li>        <b><font color="#0000ff">if</font></b>(“user”.equals(se.getName())) 
</li><li>        { 
</li><li>            list.add(se.getValue()); 
</li><li>         } 
</li><li>    } 
</li><li></li><li>    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> attributeRemoved(<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionBindingEvent.java.html" target="_blank"><font class="classLink"><u>HttpSessionBindingEvent</u></font></a> se) 
</li><li>    { 
</li><li>         <b><font color="#0000ff">if</font></b>(“user”.equals(se.getName())) 
</li><li>         { 
</li><li>            list.remove(se.getValue()); 
</li><li>         } 
</li><li>    } 
</li><li></li><li>    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> attributeReplaced(<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpSessionBindingEvent.java.html" target="_blank"><font class="classLink"><u>HttpSessionBindingEvent</u></font></a> se){} 
</li><li></li><li>    <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">static</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/util/List.java.html" target="_blank"><font class="classLink"><u>List</u></font></a></b> getList() 
</li><li>    { 
</li><li>         <b><font color="#0000ff">return</font></b>(list); 
</li><li>     } 
</li><li>} </li></ol></div><br /><br />写个简单的jsp来得到用户列表：<br />&lt;%<br />    java.util.List list=org.bromon.test.OnlineList.getList();<br />    out.println(“共有”+list.size()+”名用户已登陆：”);<br />    for(int I=0;I&lt;lise.size();i++)<br />    {<br />        out.println(list.get(i));<br />    }<br />%&gt;<br /><br />也许你说，这有什么神奇呢，监听session而已，不着急，看看xmlhttp。<br /><br />二、 XMLHTTP<br /><br />　　 XMLHTTP的用处很多，这里只说我们需要的，就是无刷新的与server通信，看这段代码：<br /><br /><div class="codeStyle"><ol><li>&lt;script language=<font color="#ff33ff">"javascript"</font>&gt;  
</li><li>xml = <b><font color="#0000ff">new</font></b> ActiveXObject(<font color="#ff33ff">"Microsoft.XMLHTTP"</font>);  
</li><li>var post=<font color="#ff33ff">" "</font>;<i><font color="#339900">//构造要携带的数据 </font></i></li><li>xml.open(<font color="#ff33ff">"POST"</font>,<font color="#ff33ff">"http://localhost:7001/TestWL/index.jsp"</font>,<b><font color="#0000ff">false</font></b>);<i><font color="#339900">//使用POST方法打开一个到服务器的连接 </font></i></li><li>xml.setrequestheader(<font color="#ff33ff">"content-length"</font>,post.<b><font color="#0000ff">length</font></b>);  
</li><li>xml.setrequestheader(<font color="#ff33ff">"content-type"</font>,<font color="#ff33ff">"application/x-www-form-urlencoded"</font>);  
</li><li>xml.send(post);<i><font color="#339900">//发送数据 </font></i></li><li>var res = xml.responseText;<i><font color="#339900">//接收服务器返回的数据 </font></i></li><li>document.write(res);  
</li><li>&lt;/script&gt; </li></ol></div><br /><br /><br />　　 豁然开朗，这段代码就是打开一个HTTP连接，以标准的HTTP格式传递数据，如果你喜欢，可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容Mozilla和Netscape。下面来写一个轮询，每隔一段时间刷新一次用户列表，当然，是不需要刷新页面的：<br /><br /><div class="codeStyle"><ol><li>&lt;html&gt; 
</li><li>&lt;head&gt;&lt;title&gt;探测器&lt;/title&gt; 
</li><li>&lt;script language=<font color="#ff33ff">"javascript"</font>&gt; 
</li><li>function detect() 
</li><li>{ 
</li><li>xml = <b><font color="#0000ff">new</font></b> ActiveXObject(<font color="#ff33ff">"Microsoft.XMLHTTP"</font>);  
</li><li>var post=<font color="#ff33ff">" "</font>;<i><font color="#339900">//构造要携带的数据 </font></i></li><li>xml.open(<font color="#ff33ff">"POST"</font>,<font color="#ff33ff">"http://localhost:7001/TestWL/index.jsp"</font>,<b><font color="#0000ff">false</font></b>);<i><font color="#339900">//使用POST方法打开一个到服务器的连接，以异步方式通信 </font></i></li><li>xml.setrequestheader(<font color="#ff33ff">"content-length"</font>,post.<b><font color="#0000ff">length</font></b>);  
</li><li>xml.setrequestheader(<font color="#ff33ff">"content-type"</font>,<font color="#ff33ff">"application/x-www-form-urlencoded"</font>);  
</li><li>xml.send(post);<i><font color="#339900">//发送数据 </font></i></li><li>var res = xml.responseText;<i><font color="#339900">//接收服务器返回的数据 </font></i></li><li>list.innerText=res; 
</li><li>setTimeout(“detect()”,5000);<i><font color="#339900">//每隔5秒钟轮询一次</font></i></li><li>}  
</li><li>&lt;/script&gt; 
</li><li>&lt;body onload=”detect()”&gt; 
</li><li>&lt;a id=”list”&gt;&lt;/a&gt; 
</li><li>&lt;/body&gt; 
</li><li>&lt;/html&gt; </li></ol></div><br /><br />　　 这样的通信方式数据量很小，不用重新传递整个页面，5秒钟轮一次，普通PC也能承受较大的在线数。构造一个探测器来监听在线列表和消息，效果是很好的，即使你的客户坐在电脑前袖手旁观，键鼠都不碰一下，也能保证数据即时传递，页面也不会发生跳转和刷新。<br /><br />　　 Session监听加上XMLHTTP通信，开发一个较为完善的站内消息系统实在易如反掌。 <br /><img src ="http://www.blogjava.net/jelver/aggbug/43316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2006-04-26 15:35 <a href="http://www.blogjava.net/jelver/articles/43316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于web.xml配置的详细说明</title><link>http://www.blogjava.net/jelver/articles/40920.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Thu, 13 Apr 2006 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/40920.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/40920.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/40920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/40920.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/40920.html</trackback:ping><description><![CDATA[
		<font face="Arial">1 定义头和根元素<br /><br />部署描述符文件就像所有XML文件一样，必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。<br />DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本（如2.2或2.3）并指定管理此文件其余部分内容的语法的DTD(Document Type Definition，文档类型定义)。<br />所有部署描述符文件的顶层（根）元素为web-app。请注意，XML元素不像HTML，他们是大小写敏感的。因此，web-App和WEB-APP都是不合法的，web-app必须用小写。<br /><br />2 部署描述符文件内的元素次序<br /><br />XML 元素不仅是大小写敏感的，而且它们还对出现在其他元素中的次序敏感。例如，XML头必须是文件中的第一项，DOCTYPE声明必须是第二项，而web- app元素必须是第三项。在web-app元素内，元素的次序也很重要。服务器不一定强制要求这种次序，但它们允许（实际上有些服务器就是这样做的）完全拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。<br />下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如，此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意，所有这些元素都是可选的。因此，可以省略掉某一元素，但不能把它放于不正确的位置。<br />l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。<br />l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。<br />l description description元素给出与此有关的说明性文本。<br />l context-param context-param元素声明应用范围内的初始化参数。<br />l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。<br />l filter-mapping 一旦命名了一个过滤器，就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。<br />l listener servlet API的版本2.3增加了对事件监听程序的支持，事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。<br />l servlet 在向servlet或JSP页面制定初始化参数或定制URL时，必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。<br />l servlet-mapping 服务器一般为servlet提供一个缺省的URL：</font>
		<a href="http://host/webAppPrefix/servlet/ServletName">
				<font face="Arial">http://host/webAppPrefix/servlet/ServletName</font>
		</a>
		<font face="Arial">。但是，常常会更改这个URL，以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时，使用servlet-mapping元素。<br />l session-config 如果某个会话在一定时间内未被访问，服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值，或者可利用session-config元素制定缺省超时值。<br />l mime-mapping 如果Web应用具有想到特殊的文件，希望能保证给他们分配特定的MIME类型，则mime-mapping元素提供这种保证。<br />l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时，使用哪个文件。<br />l error-page error-page元素使得在返回特定HTTP状态代码时，或者特定类型的异常被抛出时，能够制定将要显示的页面。<br />l taglib taglib元素对标记库描述符文件（Tag Libraryu Descriptor file）指定别名。此功能使你能够更改TLD文件的位置，而不用编辑使用这些文件的JSP页面。<br />l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。<br />l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。<br />l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用<br />l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。<br />l security-role security-role元素给出安全角色的一个列表，这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。<br />l env-entry env-entry元素声明Web应用的环境项。<br />l ejb-ref ejb-ref元素声明一个EJB的主目录的引用。<br />l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。<br /><br />3 分配名称和定制的UL<br /><br />在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称，使用servlet-mapping元素将定制的URL与刚分配的名称相关联。<br />3.1 分配名称<br />为了提供初始化参数，对servlet或JSP页面定义一个定制URL或分配一个安全角色，必须首先给servlet或JSP页面一个名称。可通过 servlet元素分配一个名称。最常见的格式包括servlet-name和servlet-class子元素（在web-app元素内），如下所示：<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt; <br />这表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名称具有两个主要的含义。首先，初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其次,可在 URL而不是类名中使用此名称。因此，利用刚才给出的定义，URL </font>
		<a href="http://host/webAppPrefix/servlet/Test">
				<font face="Arial">http://host/webAppPrefix/servlet/Test</font>
		</a>
		<font face="Arial"> 可用于 </font>
		<a href="http://host/webAppPrefix/servlet/moreservlets.TestServlet">
				<font face="Arial">http://host/webAppPrefix/servlet/moreservlets.TestServlet</font>
		</a>
		<font face="Arial"> 的场所。<br />请记住：XML元素不仅是大小写敏感的，而且定义它们的次序也很重要。例如，web-app元素内所有servlet元素必须位于所有servlet- mapping元素（下一小节介绍）之前，而且还要位于5.6节和5.11节讨论的与过滤器或文档相关的元素（如果有的话）之前。类似地，servlet 的servlet-name子元素也必须出现在servlet-class之前。5.2节"部署描述符文件内的元素次序"将详细介绍这种必需的次序。<br />例如，程序清单5-1给出了一个名为TestServlet的简单servlet，它驻留在moreservlets程序包中。因为此servlet是扎根在一个名为deployDemo的目录中的Web应用的组成部分，所以TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清单5-2给出将放置在deployDemo/WEB-INF/内的web.xml文件的一部分。此web.xml文件使用servlet-name和servlet-class元素将名称Test与TestServlet.class相关联。图 5-1和图5-2分别显示利用缺省URL和注册名调用TestServlet时的结果。<br /><br />程序清单5-1 TestServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to illustrate servlet naming<br />* and custom URLs.<br />* &lt;P&gt;<br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* </font>
		<a href="http://www.moreservlets.com/">
				<font face="Arial">http://www.moreservlets.com/</font>
		</a>
		<font face="Arial">.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class TestServlet extends HttpServlet {<br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String uri = request.getRequestURI();<br />out.println(ServletUtilities.headWithTitle("Test Servlet") +<br />"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +<br />"&lt;H2&gt;URI: " + uri + "&lt;/H2&gt;\n" +<br />"&lt;/BODY&gt;&lt;/HTML&gt;");<br />}<br />}<br /><br /><br />程序清单5-2 web.xml（说明servlet名称的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- … --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- … --&gt;<br />&lt;/web-app&gt;<br /><br />3.2 定义定制的URL<br />大多数服务器具有一个缺省的serlvet URL：<br />http://host/webAppPrefix/servlet/packageName.ServletName。虽然在开发中使用这个URL很方便，但是我们常常会希望另一个URL用于部署。例如，可能会需要一个出现在Web应用顶层的URL（如，http: //host/webAppPrefix/Anyname），并且在此URL中没有servlet项。位于顶层的URL简化了相对URL的使用。此外，对许多开发人员来说，顶层URL看上去比更长更麻烦的缺省URL更简短。<br />事实上，有时需要使用定制的URL。比如，你可能想关闭缺省URL映射，以便更好地强制实施安全限制或防止用户意外地访问无初始化参数的servlet。如果你禁止了缺省的URL，那么你怎样访问servlet呢？这时只有使用定制的URL了。<br />为了分配一个定制的URL，可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一个任意名称，可利用此名称引用相应的servlet；url-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必须以斜杠（/）起始。<br />下面给出一个简单的web.xml摘录，它允许使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test或<br />http: //host/webAppPrefix/servlet/moreservlets.TestServlet。请注意，仍然需要XML头、 DOCTYPE声明以及web-app封闭元素。此外，可回忆一下，XML元素出现地次序不是随意的。特别是，需要把所有servlet元素放在所有 servlet-mapping元素之前。<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/UrlTest&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />URL模式还可以包含通配符。例如，下面的小程序指示服务器发送所有以Web应用的URL前缀开始，以..asp结束的请求到名为BashMS的servlet。<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;msUtils.ASPTranslator&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/*.asp&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />3.3 命名JSP页面<br />因为JSP页面要转换成sevlet，自然希望就像命名servlet一样命名JSP页面。毕竟，JSP页面可能会从初始化参数、安全设置或定制的URL中受益，正如普通的serlvet那样。虽然JSP页面的后台实际上是servlet这句话是正确的，但存在一个关键的猜疑：即，你不知道JSP页面的实际类名（因为系统自己挑选这个名字）。因此，为了命名JSP页面，可将jsp-file元素替换为servlet-calss元素，如下所示：<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;<br />&lt;/servlet&gt;<br />命名JSP页面的原因与命名servlet的原因完全相同：即为了提供一个与定制设置（如，初始化参数和安全设置）一起使用的名称，并且，以便能更改激活 JSP页面的URL（比方说，以便多个URL通过相同页面得以处理，或者从URL中去掉.jsp扩展名）。但是，在设置初始化参数时，应该注意，JSP页面是利用jspInit方法，而不是init方法读取初始化参数的。<br />例如，程序清单5-3给出一个名为TestPage.jsp的简单JSP页面，它的工作只是打印出用来激活它的URL的本地部分。TestPage.jsp放置在deployDemo应用的顶层。程序清单5-4给出了用来分配一个注册名PageName，然后将此注册名与http://host/webAppPrefix/UrlTest2/anything 形式的URL相关联的web.xml文件（即，deployDemo/WEB-INF/web.xml）的一部分。<br /><br />程序清单5-3 TestPage.jsp<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;<br />JSP Test Page<br />&lt;/TITLE&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY BGCOLOR="#FDF5E6"&gt;<br />&lt;H2&gt;URI: &lt;%= request.getRequestURI() %&gt;&lt;/H2&gt;<br />&lt;/BODY&gt;<br />&lt;/HTML&gt;<br /><br /><br />程序清单5-4 web.xml（说明JSP页命名的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;<br />&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt; PageName &lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/UrlTest2/*&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />4 禁止激活器servlet<br /><br />对servlet或JSP页面建立定制URL的一个原因是，这样做可以注册从 init（servlet）或jspInit（JSP页面）方法中读取得初始化参数。但是，初始化参数只在是利用定制URL模式或注册名访问 servlet或JSP页面时可以使用，用缺省URL http://host/webAppPrefix/servlet/ServletName 访问时不能使用。因此，你可能会希望关闭缺省URL，这样就不会有人意外地调用初始化servlet了。这个过程有时称为禁止激活器servlet，因为多数服务器具有一个用缺省的servlet URL注册的标准servlet，并激活缺省的URL应用的实际servlet。<br />有两种禁止此缺省URL的主要方法：<br />l 在每个Web应用中重新映射/servlet/模式。<br />l 全局关闭激活器servlet。<br />重要的是应该注意到，虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激活servlet所做的工作更多，但重新映射可以用一种完全可移植的方式来完成。相反，全局禁止激活器servlet完全是针对具体机器的，事实上有的服务器（如ServletExec）没有这样的选择。下面的讨论对每个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的详细内容。<br />4.1 重新映射/servlet/URL模式<br />在一个特定的Web应用中禁止以http://host/webAppPrefix/servlet/ 开始的URL的处理非常简单。所需做的事情就是建立一个错误消息servlet，并使用前一节讨论的url-pattern元素将所有匹配请求转向该 servlet。只要简单地使用：<br />&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />作为servlet-mapping元素中的模式即可。<br />例如，程序清单5-5给出了将SorryServlet servlet（程序清单5-6）与所有以http://host/webAppPrefix/servlet/ 开头的URL相关联的部署描述符文件的一部分。<br /><br />程序清单5-5 web.xml（说明JSP页命名的摘录）<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br /><br />&lt;web-app&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Sorry&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;moreservlets.SorryServlet&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;!-- ... --&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt; Sorry &lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;!-- ... --&gt;<br />&lt;/web-app&gt;<br /><br /><br />程序清单5-6 SorryServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to give error messages to<br />* users who try to access default servlet URLs<br />* (i.