﻿<?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-无为-随笔分类-ajax</title><link>http://www.blogjava.net/mlh123caoer/category/11359.html</link><description>无为则可为，无为则至深！
</description><language>zh-cn</language><lastBuildDate>Sun, 15 Jul 2007 04:25:50 GMT</lastBuildDate><pubDate>Sun, 15 Jul 2007 04:25:50 GMT</pubDate><ttl>60</ttl><item><title>JSP在TOMCAT中的处理生命周期</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 14 Jul 2007 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/130271.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/130271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/130271.html</trackback:ping><description><![CDATA[<div>1、将WEB应用部署到TOMCAT容器，容器启动读取应用的部署文件web.xml,但不对.jsp文件做任何处理请求。</div>
<div>2、客户点击连接请求某个.jsp文件，容器开始将.jsp文件转换为一个servrlet类的.java源代码。查看指令，得到转换的可能需要的信息。创建一个HttpServlet子类，对于Tomcat5所生成的servlet会扩展org.apache.jasper.runtime.HttpJspBase类。若有一个page指令有import属性，生成的类文件的最上面会写入import语句。例如在Tomcat5中加入包语句：package org.apache.jsp；若有声明容器将这些声明写道类文件，通常放在服务方法的下面。Tomca5声明了自己的一个静态方法和一个实例方法。然后建立服务方法，方法名为_jspService()。所生成的servlet会覆盖servlet超类的service()方法。_jspService()直接由service()调用，要接收HttpServletRequest和HttpServletResponse参数。在建立这个方法的时候，容器会声明并初始化所有的隐式对象。将普通的HTML（模板文件）、scrptlet和表达式放到服务方法里，进行格式化，并写至PrintWrite响应输出。</div>
<div>3、容器尝试将这个servlet.java源文件编译为.class文件。</div>
<div>4、容器家在新生成的servlet类。</div>
<div>5、容器实例化servlet，并导致servlet的jspInit()方法运行。对象现在已成为一个完整的servlet准备就绪，接受客户的请求。</div>
<div>6、容器创建一个新线程来处理客户请求，servlet的service()方法运行。以后的处理同普通的servlet处理过程。最终servlet向客户返回一个响应。</div>
<div>需要注意的是：在JSP生命周期中，JSP的转换和编译过程只发生一次。一旦第一次编译完成，以后的调用同普通的servlet一样。大多数容器开发商提供预转化和编译的办法，是这些工作提前完成。</div><img src ="http://www.blogjava.net/mlh123caoer/aggbug/130271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-07-14 14:43 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web信息抽取技术纵览二</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91297.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Mon, 01 Jan 2007 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91297.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/91297.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/91297.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/91297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第六章																																												         																																												总结和讨论																																																																									...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91297.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/91297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-01-01 15:19 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web信息抽取技术纵览一</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91293.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Mon, 01 Jan 2007 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91293.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/91293.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/91293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/91293.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一章																																												         																																												导论																																																																												...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91293.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/91293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-01-01 15:18 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/01/01/91293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire：轻松简单地开发Web Services</title><link>http://www.blogjava.net/mlh123caoer/archive/2006/10/15/75257.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sun, 15 Oct 2006 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2006/10/15/75257.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/75257.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2006/10/15/75257.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/75257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/75257.html</trackback:ping><description><![CDATA[问一下.Net的开发者，开发Web Services有多困难?他们会被你的问题逗乐，他们会告诉你所有步骤花费的时间不会超过一分钟。再问一下Java开发者，运气好的话你会碰到上面的回答，一般情况下，你会得到一个完全不同的答案。从Web Services引入到Java中至今已经5年了，然而它仍然被认为是一门较新的技术，一个主要的原因就是使用Java实现Web Services太困难了。现在，随着新一代Web Services引擎XFire的发布，这种情况将会发生明显的变化。使用XFire，你可以把Java类方法发布为Web Services而不需要编写额外的代码。在这篇文章中，你将会看到XFire使Web Services开发变得多么容易和简单。 
<p>　　Web Services使我们能够在网络上建立分布式系统，应用程序组件可以通过任何平台、任何语言和任何方式访问。无论应用程序如何开发，使用了什么语言，以及运行在什么操作系统平台上，只要它作为Web Service，并且为协同解决问题而设计，那么你的应用程序，以任何语言开发或在任何平台上，都可以利用它的服务。这是Web Service的主要概念。</p><p>　　为了实现Web Services的平台无关性和实现访问独立性，软件行业需要遵循一些作为标准的技术。其中一些包括:</p><p>　　---XML:在Web Services环境中各层之间进行传递的默认数据格式。</p><p>　　---SOAP:封装和交换信息的默认协议。第一次被提出时，它是只取Simple Object Access Protocol(简单对象访问协议)的首字母。但是现在SOAP更多被认为是一个特定的名词，以它自己而命名，同样很多人认为这是用词不当:SOAP实际上不是用来访问对象的。另外，它也不再简单。</p><p>　　---WSDL(Web Services Description Language，Web Services描述语言):描述Web Services的语言。尽管基于XML并且可以被人理解，WSDL主要是由机器处理，由客户端程序读取和理解。</p><p>　　下面的高级层次图表，基于WWW协会发布的“Web Services Architecture”(Web Services架构)文档，显示了这些技术在实际的工作环境中是如何发挥作用:</p><p><a href="http://searchwebservices.techtarget.com.cn/TLimages/picview/?/imagelist/06/39/6fu472rkvoe2.jpg" target="_blank"><img style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" alt="点击放大此图片" src="http://searchwebservices.techtarget.com.cn/imagelist/06/39/6fu472rkvoe2s.jpg" border="0" /></a></p><p>　　这个流程图显示了Web Services中的核心技术是如何工作的。</p><p>　　这里，Provider是提供服务的应用程序组件，Requester是使用服务的客户端程序。很多其他技术也会参与到交互中，但是这个图只显示了在Web Services环境中必需的核心技术组件。</p><p>　　XFire是一个免费的开源SOAP框架，它不仅可以极大方便地实现这样一个环境，并且可以提供许多Web Services规范中高级特征，这些特征在多数的商业或者开源工具都没有提供。你要恰当的理解这些单词:great ease and simplicity(非常轻松和简单)。你将会看到使用XFire创建Web Services是多么的简单。</p><p>　　假如你的Web应用有一个Java类，并且你想把它的一个方法发布为Web Services，当使用XFire时，你不需要编写一行额外的Java代码。只需要编辑发布描述符，然后你就会得到一个Web Services。是的，它相当地简单。我们来看一个例子。<strong>一个简单的Java类</strong></p><p>　　我们的例子是一个银行业应用程序，服务器是运行在J2SE1.4.2_07下的Apache Tomcat5.5.7。假定你已经了解如何使用Java编写Web应用程序，并知道应该如何把它部署到Apache Tomcat服务器上。我们的Web应用程序非常简单;它只做一件事——将资金从一个账户转到另外一个账户上。一个普通的Java类BankingService包含了一个叫做transferFunds()的方法来为我们完成这项工作。它需要四个输入参数:</p><ul><li>　　1、 String fromAccount 
</li><li>　　2、 String toAccount 
</li><li>　　3、 double amount 
</li><li>　　4、 String currency</li></ul><p>　　代码如下:</p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">package com.mybank.xfire.example;</font></p><p><font face="Verdana">import java.text.NumberFormat;<br />import java.text.DecimalFormat;</font></p><p><font face="Verdana">/** XFire WebServices sample implementation class. <br />*/<br />public class BankingService implements IBankingService {<br />    <br />    //Default constructor.<br />    public BankingService(){    <br />    }<br />    <br />    /** Transfers fund from one account to another.<br />    */<br />    public String transferFunds(<br />        String fromAccount, String toAccount, double amount, String currency){<br />        <br />        String statusMessage = "";<br />                      <br />        //Call business objects and other components to get the job done.<br />        //Then create a status message and return.<br />        try {<br />            NumberFormat formatter = new DecimalFormat("###,###,###,###.00");       <br />            statusMessage = "COMPLETED: " + currency + " " + formatter.format(amount)+ <br />            " was successfully transferred from A/C# " + fromAccount + " to A/C# " + toAccount;<br />        } catch (Exception e){<br />            statusMessage = "BankingService.transferFunds(): EXCEPTION: " + e.toString();<br />        }<br />        return statusMessage;<br />    }<br />    <br />}</font></p></td></tr></tbody></table><p>　　在这里你看到了什么异常的东西了吗?或许没有，除了默认的构造函数，类型是public。这是必须的。否则，XFire不能够初始化这个类。因为使用接口的设计是一个好的实践，所以我们的Java类也实现了一个称为IBankingService的接口。代码十分简单:</p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">package com.mybank.xfire.example;</font></p><p><font face="Verdana">public interface IBankingService {  </font></p><p><font face="Verdana">    public String transferFunds(<br />        String fromAccount, String toAccount, double amount, String currency);<br />        <br />}</font></p></td></tr></tbody></table><p>　　在实际实现中，这样一个方法可能包括各种类型的复杂调用、查询和处理操作。但是我们的示例代码已经最小化了，以至于我们可以集中精力在主要目标上:把这个方法发布为Web Services。</p><p>　　你可以看到BankingService是一个普通的Java类，没有任何代码告诉我们它将会在Web Services中使用。好的，这里我们不需要增加任何东西。我们所有的工作都在部署描述符里完成。</p><p>　　<strong>Web应用的部署描述符</strong></p><p>　　在Java中，Web应用程序通常需要至少一个部署描述符(叫做web.xml)对其进行配置。XFire本身是一个基于servlet的应用程序。因此，我们需要增加必要的引用到描述符文件中。然后我们还必须配置将要创建的Web Services。我们使用一个称为services.xml的新文件来完成这件事。</p><p>　　<strong>web.xml</strong></p><p>　　首先，修改web.xml。我们需要增加下面的XFire servlet相关的条目:</p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">&lt;servlet&gt;<br />        &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />        &lt;display-name&gt;XFire Servlet&lt;/display-name&gt;<br />        &lt;servlet-class&gt;org.codehaus.xfire.transport.http.XfireConfigurableServlet<br />         &lt;/servlet-class&gt;<br />    &lt;/servlet&gt;</font></p><p><font face="Verdana">    &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;<br />    <br />    &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;</font></p></td></tr></tbody></table><strong><font face="Verdana">services.xml</font></strong><p>　　现在我们不得不说一下我们的Web Services的由什么组成的了。这由一个叫做services.xml的文件完成，它存放在META-INF/xfire目录下，而这整个目录放在WEB-INF/classes文件夹中，它在Web应用程序的标准类路径中。这里是services.xml中的基本配置条目:</p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><font face="Verdana">&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;<br />  <br />  &lt;service&gt;<br />    &lt;name&gt;Banking&lt;/name&gt;<br />    &lt;namespace&gt;mybank&lt;/namespace&gt;<br />    &lt;serviceClass&gt;com.mybank.xfire.example.IBankingService&lt;/serviceClass&gt;<br />    &lt;implementationClass&gt;com.mybank.xfire.example.BankingService&lt;/implementationClass&gt;<br />  &lt;/service&gt;  <br />  <br />&lt;/beans&gt;</font></td></tr></tbody></table><p> 　　让我们看看这里都包含了什么内容。Web Services的定义包含在<service>元素中，它还含有一些子元素。第一个子元素是<name>，它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。例如，在服务准备好以后，你将在浏览器上使用这个名字来查看WSDL。</name></service></p><p>　　<font face="Verdana">下一个子元素是&lt;namespace&gt;。任何合法的XML名字都是可以的。&lt;namespace&gt;用来唯一标识你的服务的各个参数。<br />&lt;serviceClass&gt;元素包含了Java类的名字，它指定了方法签名。在我们的例子中，它是接口IBankingService。如果Java类没有实现任何接口，你就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。</font></p><p><font face="Verdana">　　&lt;implementationClass&gt;保存了实现方法的Java类名。这是一个可选元素。如果上一个元素&lt;serviceClass&gt;包含了一个接口，那么相应的实现类必须在这里指定。</font></p><p><font face="Verdana">　　就是这样。我们的Web Services配置完成了</font>。</p><p>　　<strong>XFire和其它类库</strong></p><p>　　现在是最后一步了，需要得到所有必需的类库。我们怎样得到它们呢?去XFire网站，下载xfire-distribution-1.0.zip，然后解压到一个本地文件夹。复制下面的jar文件和它的库文件夹到WEB-INF/lib中:</p><ul><li>　　• activation-1.0.2.jar 
</li><li>　　• commons-codec-1.3.jar 
</li><li>　　• commons-httpclient-3.0.jar 
</li><li>　　• commons-logging-1.0.4.jar 
</li><li>　　• jaxen-1.1-beta-8.jar 
</li><li>　　• jdom-1.0.jar 
</li><li>　　• log4j-1.2.x.jar 
</li><li>　　• mail-1.3.3_01.jar 
</li><li>　　• spring-1.2.x.jar 
</li><li>　　• stax-api-1.0.jar 
</li><li>　　• wsdl4j-1.5.2.jar 
</li><li>　　• wstx-asl-2.9.jar 
</li><li>　　• xbean-2.1.0.jar 
</li><li>　　• xbean-spring-2.2.jar 
</li><li>　　• xfire-all-1.0.jar 
</li><li>　　• XmlSchema-1.0.jar</li></ul><p>　　一切妥当。我们来部署和启动应用程序。为了部署示例应用，只需要复制websvc.war到Apache Tomcat的webapps文件夹中，再等待几秒钟。它将会自动启动。这个应用的全部源代码也包含在这个war文件中。我们的程序已经准备作为一个Web Service了。<strong>我们如何知道Web Service正在工作呢?</strong></p><p>　　为了了解Web Service是否正在工作，我们需要测试。首先，我们测试来看WSDL是否可用。我们在浏览器中输入URL。哪个URL?因为我们的应用程序的war文件是websvc.war，并且在services.xml中给出的服务名是Banking，WSDL的URL应该是:http://localhost:8080/websvc/services/Banking?wsdl。</p><p>　　请注意:URL的第一部分，例如，http://localhost:8080，可能会根据你的应用服务器不同而不同。无论怎样，当你输入URL后，将会看到一个XML文档，它的根元素是<?xml:namespace prefix = wsdl /?><wsdl:definitions>。这个文档叫做服务的WSDL。如果你看到了，这就是你的应用作为Web Service已经可用的第一个证明。</wsdl:definitions></p><p>　　但是这个测试是不够的。可能会发生这种情况，可以看到WSDL，但是从客户端程序可能会访问不到服务。因此为了核实服务是否可以访问了，我们必须使用一个客户端进行服务的实际调用来进行一个真正的测试。</p><p>　　<strong>开发一个客户端</strong></p><p>　　你可以使用任何的SOAP工具创建客户端，例如，.Net或者Apache Axis，有很多种方法:使用从WSDL产生的stubs，使用动态代理，等等。在例子中，我们使用一个动态代理，以一个简单的Servlet形式，叫做WsClient.java。为了保持代码两最小，所有在屏幕显示的元素都放在了doGet()方法中。对Web Service的实际调用由callWebService()方法完成，它相当地简单。和下面的类似:</p><p></p><table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr><td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><p><font face="Verdana">/* Call the Web service<br />    *<br />    */<br />    public String callWebService(<br />        String fromAccount, String toAccount, double amount, String currency) <br />        throws MalformedURLException, Exception {<br />        <br />        //Create a metadata of the service      <br />        Service serviceModel = new ObjectServiceFactory().create(IBankingService.class);        <br />        log.debug("callSoapServiceLocal(): got service model." );<br />   <br />        //Create a proxy for the deployed service<br />        XFire xfire = XFireFactory.newInstance().getXFire();<br />        XFireProxyFactory factory = new XFireProxyFactory(xfire);      <br />    <br />        String serviceUrl = "http://localhost:8080/websvc/services/Banking";<br />        <br />        IBankingService client = null;<br />        try {<br />            client = (IBankingService) factory.create(serviceModel, serviceUrl);<br />        } catch (MalformedURLException e) {<br />            log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());<br />        }    <br />               <br />        //Invoke the service<br />        String serviceResponse = "";<br />        try { <br />            serviceResponse = client.transferFunds(fromAccount, toAccount, amount, currency);<br />       } catch (Exception e){<br />            log.error("WsClient.callWebService(): EXCEPTION: " + e.toString());                 <br />            serviceResponse = e.toString();<br />        }        <br />        log.debug("WsClient.callWebService(): status=" + serviceResponse);              </font></p><p><font face="Verdana">        //Return the response<br />        return serviceResponse;<br />    } </font></p></td></tr></tbody></table><p>　　这个代码是如何工作的呢?我来解释一下:首先，我们创建一个服务模型，它包含服务的说明——换句话说，就是服务的元数据。我们使用XFire的ObjectServiceFactory从IBankingService.class接口创建这个模型。</p><p>　　接着，为XFire获得一个代理工厂对象，它包含了常规的代码，也相当地简单和易懂。这一步中没有任何特定应用的东西。从这个proxyFactory，使用服务模型和服务端点URL(用来获得WSDL)，我们可以得到一个服务的本地代理。就是它了。这个代理就是实际的客户端。现在，我们可以调用它的transferFunds()方法来得到我们需要的Web Service。</p><p>　　一旦示例应用发布并启动，就可以尝试servlet URL:</p><p>　　http://localhost:8080/websvc/ws。</p><p>　　这个Servlet使用默认参数来调用Web Service和显示接收到的响应。页面的最后两行应该读取:</p><p>　　Response Received<br />　　COMPLETED: CDN$ 500.00 was successfully transferred from A/C# 11111-01234 to A/C# 99999-05678</p><p>　　现在你可以确定Web Service已经发布并且在运行中了。</p><p>　　为了尝试不同的输入值，你可以使用完整的URL，例如:</p><p>　　http://localhost:8080/websvc/ws?from=11-2345&amp;to=77-9876&amp;amt=250.00&amp;cur=EUR。</p><p>　　<strong>基本的Web Services开发步骤清单</strong></p><p>　　这个清单总结了将一个Java方法发布为Web Service所必须的步骤:</p><ul><li>　　1、 检查Java类的方法和默认构造函数确保为public 
</li><li>　　2、 增加XFire servlet相关条目到web.xml中 
</li><li>　　3、 创建services.xml，把它放到WEB-INF/classes/META-INF/xfire目录下 
</li><li>　　4、 增加XFire和第三方包到你的Web应用的WEB-INF/lib文件夹中</li></ul><p>　　这就是所有需要的步骤，是的，相当简单。</p><p>　　<strong>XFire的其他高级特性</strong></p><p>　　XFire的使用可能比较简单，但是在特性和功能性上，它却占据着领导者的位置。下面是它的高级特性:</p><ul><li>　　---本地数据绑定支持POJOs(plain-old Java objects)、XMLBeans、JAXB(Java Architecture for XML Binding)、Castor等等。数据绑定说明了Web Services的XML请求和映射到Java对象的XML响应。 
</li><li>　　---使用StAX(Streaming API for XML)处理XML文档。同DOM的基于树和SAX的事件驱动的处理方式相比，StAX使用了拉(pull)机制，它使处理更快速，内存效率更高。 
</li><li>　　---支持多种传输协议，如HTTP、JMS(Java Message Service)和JVM内部传输。 
</li><li>　　---嵌入式，这是XFire的核心功能之一。你可以把这个SOAP引擎嵌入到你的应用中，完全隐藏所有XFire特定引用，同样所有配置都是程序驱动。 
</li><li>　　---丰富的API，它使XFire可高度自定义，允许开发者在不同的阶段截获请求，并且对他们进行处理。 
</li><li>　　---兼容最新的标准例如SOAP1.1(没有加密远程工程调用，或者RPC)和1.2、WSDL1.1、the Web Services Interoperability Organization’s Basic Profile 1.0、Web Services Addressing和WS-Security。</li></ul><p>　　最重要的是，XFire属于新一代Web Services引擎。不仅仅是营销用语，“新一代”有一些重要的意义。Apache Axis是第一代Java语言的Web Services引擎，已经成为了所有后来工具的参考标准。在过去的几年里，Axis以及这些其它的工具已经在很多生产环境中进行了实地测试。从中得出的一个关键的问题就是Web Services并不最适合RPC类型的通信。对于性能和效率，面向文档的消息形式是最好的方式。但是Apache Axis和很多其他的Web Services引擎都被设计成了面向RPC的(尽管它们支持文档形式)。现在，整个行业正在开发新一代的SOAP引擎，设计为面向文档的。Apache已经宣布结束旧版本的Axis引擎开发，现在专注于Axis2，现在它的预发布版本是0.95。XFire在今年的2月份发布了它的第一个产品版本(1.0)。它的下一个版本(1.1)仅仅在几个星期之后就进行了发布。<strong>性能</strong></p><p>　　Web Services需要消耗很多资源，但是性能方面它们不是那么引人注目。XFire打破了这种趋势。它消耗更少的内存(部分因为 StAX的使用)，但是表现却比多数可比较的SOAP引擎出色。你可以在资源中提供的链接中看到比较的结果。</p><p>　　此外，XFire还提供了各种方法来进一步优化性能。一个方法是使用JVM内置传输(in-JVM transport)。如果你知道Web Services和客户端运行在同一个JVM上，你可以选择使用本地传输，它可以大幅提升性能。在示例中的客户端代码，看以下指定服务端点URL的这行:</p><p>　　String serviceUrl = "http://localhost:8080/websvc/services/Banking";</p><p>　　替换为</p><p>　　String serviceUrl = "xfire.local://Banking";</p><p>　　你会看到性能上的明显提高，因为它绕过了整个网络层。</p><p>　　<strong>局限性</strong></p><p>　　XFire有些重要的局限性你应该清楚:</p><ul><li>　　---开发Web Services的好的实践是从WSDL开始。大部分的SOAP引擎提供了从WSDL生成服务stub的工具。XFire也提供了这样一个工具。但是它是基于注释(annotations-based)的，因此需要J2SE5.0。对于仍坚持使用J2SE1.4.x的人来说，它不是一个令人拍手叫好的工具，因为我们有很多其他方式来编写客户端，一个就是文章中演示的方式。 
</li><li>　　---附件支持，它将会包含在未来发行的版本中。 
</li><li>　　---易于学习的用户向导。XFire团队在这个方面还有很多工作需要做。</li></ul><p>　　<strong>结论</strong></p><p>　　Java当前的趋势是简化技术的使用。因此，我们正看到一波基于POJO的开发成就。同时，面向服务架构(SOA，Services-oriented architecture)和Web Services已经变成了当前行业的热点话题。XFire正是在这种情况下产生的。它能够使POJO发布为最少的Web Services，而只需要付出最小化的努力。从而，它使希望使用这项技术的初级开发者的学习曲线变得平缓。同时，由于它兼容最新标准和提供了丰富的API，XFire为高级用户提供了更多的大好机会。</p><p><font face="Verdana">版权声明：Techtarget获Matrix授权发布,如需转载请联系Matrix<br />作者:Shahid Ahmed ;mydeman<br />原文:http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-xfire.html<br />Matrix:http://www.matrix.org.cn/resource/article/2006-09-24/XFire_6bd1061c-4bc6-11db-978f-43b3336b7e51.html</font></p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/75257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2006-10-15 12:55 <a href="http://www.blogjava.net/mlh123caoer/archive/2006/10/15/75257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX .Net Wrapper usage guide</title><link>http://www.blogjava.net/mlh123caoer/archive/2006/07/22/59519.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 22 Jul 2006 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2006/07/22/59519.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/59519.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2006/07/22/59519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/59519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/59519.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AJAX .Net Wrapper usage guide. 1																																																																																																								Background. 1															...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2006/07/22/59519.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/59519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2006-07-22 11:19 <a href="http://www.blogjava.net/mlh123caoer/archive/2006/07/22/59519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>六步使用ICallbackEventHandler实现无刷新回调 </title><link>http://www.blogjava.net/mlh123caoer/archive/2006/06/10/51810.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 10 Jun 2006 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2006/06/10/51810.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/51810.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2006/06/10/51810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/51810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/51810.html</trackback:ping><description><![CDATA[AJAX技术所提倡的无刷新回调，在原来的技术中需要写大量的JavaScript代码或使用一些AJAX框架，使得开发效率和可维护性大大降低。其实ASP.NET2.0中，已经提供了这样的接口，这就是ICallbackEventHandler。<br />    关于ICallbackEventHandler网上已经有很多文章介绍了，这篇实为画蛇添足。
<p>ICallbackEventHandler存在于System.Web.UI中，我们先做一个非常简单的例子来试用一下。</p><p>   第一步，在VS2005中建立一个新的WEB窗件。<br />   第二步，在ASPX中，放上一段HTML代码(如下)：<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">1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="form1"</span><span style="COLOR: #ff0000"> runat</span><span style="COLOR: #0000ff">="server"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">div</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">button </span><span style="COLOR: #ff0000">onclick</span><span style="COLOR: #0000ff">="CallServer()"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">CallServer</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">button</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">div</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">form</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span></div><p><br />   第三步，然后在&lt;HEAD&gt;&lt;/HEAD&gt;中放入一段JavaScript脚本：<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"> 1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">script type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/javascript</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> CallServer()<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_65_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_199_Open_Text.style.display='none'; Codehighlighter1_65_199_Closed_Image.style.display='inline'; Codehighlighter1_65_199_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_65_199_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_199_Closed_Text.style.display='none'; Codehighlighter1_65_199_Open_Image.style.display='inline'; Codehighlighter1_65_199_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" />     </span><span id="Codehighlighter1_65_199_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.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_65_199_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> product </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">测试</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000"> ClientScript.GetCallbackEventReference(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">product</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ReceiveServerData</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     <br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> ReceiveServerData(rValue)<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_252_283_Open_Image" onclick="this.style.display='none'; Codehighlighter1_252_283_Open_Text.style.display='none'; Codehighlighter1_252_283_Closed_Image.style.display='inline'; Codehighlighter1_252_283_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_252_283_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_252_283_Closed_Text.style.display='none'; Codehighlighter1_252_283_Open_Image.style.display='inline'; Codehighlighter1_252_283_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" />     </span><span id="Codehighlighter1_252_283_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.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_252_283_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />         alert(rValue);<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">script</span><span style="COLOR: #000000">&gt;</span></div><p> </p><p>   第四步，在此ASPX的后台CS代码中，继承ICallbackEventHandler接口，并实现接口中的两个方法：<br /> ICallbackEventHandler.GetCallbackResult() <br />    和<br /> ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)</p><p>   第五步，增加一个变量CallBackValue，并修改接口的两个方法为：<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"> 1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> CallBackValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.Empty;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    <br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> ICallbackEventHandler.GetCallbackResult()<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img id="Codehighlighter1_102_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_137_Open_Text.style.display='none'; Codehighlighter1_102_137_Closed_Image.style.display='inline'; Codehighlighter1_102_137_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_102_137_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_137_Closed_Text.style.display='none'; Codehighlighter1_102_137_Open_Image.style.display='inline'; Codehighlighter1_102_137_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span><span id="Codehighlighter1_102_137_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.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_102_137_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> CallBackValue </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,ok</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ICallbackEventHandler.RaiseCallbackEvent(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> eventArgument)<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_210_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_210_251_Open_Text.style.display='none'; Codehighlighter1_210_251_Closed_Image.style.display='inline'; Codehighlighter1_210_251_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_210_251_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_210_251_Closed_Text.style.display='none'; Codehighlighter1_210_251_Open_Image.style.display='inline'; Codehighlighter1_210_251_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span><span id="Codehighlighter1_210_251_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.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_210_251_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.CallBackValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> eventArgument;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div><p> </p><p>    第六步，运行，界面上会出现一个按钮，点击后，会将“测试”这个字符串传至后台，后台C#代码将字符串加上“，OK”后返回给客户端的JavaScript代码，并显示。</p><p>    以上六步，就可以实现无刷新回调了。现在，我们来分析一下几段代码。<br />    先看第三步中的JavaScript代码，其中的CallServer()方法中进行了回调，回调的语句为：<br />&lt;%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%&gt;;<br />    <br />    里面四个参数中第二个参数指定将product这个JavaScript中的字符串变量传回后台，第三个参数指定了从后台返回时接收返回信息的JavaScript方法ReceiveServerData(string Value)。</p><p>    第五步中后台的两个方法，一个ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)用来接收前台JavaScript中传来的字符串变量，并赋值给内部变量this.CallBackValue，另一个方法ICallbackEventHandler.GetCallbackResult()将变更后的内部变量this.CallBackValue返回给前台JavaScript方法ReceiveServerData(string Value)。</p><p>    调用的顺序是： (前台)CallServer() --&gt; (后台)ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) --&gt; (后台)ICallbackEventHandler.GetCallbackResult() --&gt; (前台)ReceiveServerData(string Value)。</p><p>    整个调用过程非常简单，而其中非常关键的一步是第三步的<br />&lt;%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%&gt;;<br />这个方法，以下是从网上找来的一段资料，大家可以看看。</p><p>GetCallbackEventReference使得客户端方法在客户端请求结束时得到回收。 它也让CallBackManager 确定产生哪种回叫方法。 在这个例子内使用的被重载的方法是：</p><p>   public string GetCallbackEventReference(<br />      string target, string argument,<br />      string clientCallback, string  context, <br />string clientErrorCallback) <br />Table 1. GetCallBackEventReference 方法的参数描述。<br />Parameters Description target ID of the page where the callback invocation is handled. For more see the other overloaded options available in the next immediate section.In our sample "this" is the argument value, since the callback is handled in the same page.  argument This is the parameter defintion used to send value to the server. This value is received by parameter "eventArgument" at the server end using the RaiseCallbackEvent event."arg" becomes the first parameter name in our sample. The value is passed through this argument from the client. clientCallback Method name of the callback that is invoked after successful server call."CallBackHandler" is the method name that handles the callback.   context A parameter that is associated with the "argument" from the client. It usually should be used to identify the context of the call. You will understand this better from the sample implementation.In the sample "ctx" is just another parameter definition used. The value for this is passed from the client. clientErrorCallback Name of the method that is called from the CallBackManager in case of any errors. <br />从这个方法返回的string是:</p><p>   <br />   __doCallback('__Page',arg,CallBackHandler,ctx, ErrorCallBack)<br /> <br />另一个重载方法是:</p><p>   public string GetCallbackEventReference(<br />      Control control, string argument,<br />      string clientCallback, string  context) <br />   <br />   public string GetCallbackEventReference(<br />      Control control, string argument,<br />      string clientCallback,  string  context, <br />string clientErrorCallback) <br /></p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/51810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2006-06-10 12:49 <a href="http://www.blogjava.net/mlh123caoer/archive/2006/06/10/51810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax 笔记总结1</title><link>http://www.blogjava.net/mlh123caoer/archive/2006/06/06/50809.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Tue, 06 Jun 2006 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2006/06/06/50809.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/50809.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2006/06/06/50809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/50809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/50809.html</trackback:ping><description><![CDATA[<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">       大家往往只从技术的角度来解释Ajax，而事实上Ajax并不是一个单一的技术概念。在技术范畴之外，Ajax还包含了很多web用户体验方面的元素，这也是为什么舆论普遍认为Ajax是一种web2.0技术的原因。毕竟web2.0的创新价值有很大一部分来自于对用户体验和用户作用的重视。Ajax所倡导的方式则能够大大优化用户的使用感受。由于在服务器和浏览器之间的数据传递交由JavaScript控制，开发人员得以跳出以往严格的请求应答模式从而构建更具有用户友好性的web应用。<br />       Ajax首先就不是一项纯粹的技术，而更近似于一个技术框架。同时Ajax体系当中也并没有什么新的技术元素，其核心是Javascript技术，一种以往被认为与企业应用绝缘而只适用于在客户端展示一些"小把戏"的编程语言，而XML，XHTML,DOM,XML-HTTPREQUEST,CSS等经常被用于实现Ajax的技术元素也是多年应用的成熟技术。<br />        用户与浏览器的操作交互，浏览器与服务器的数据交互是可以"异步"进行的，这也是Ajax这个名字的由来，Ajax的英文全称是Asynchronous Javascript and XML ,是指一种创建交互式网页应用的网页开发技术。 具体来说，Ajax基于以下的技术:<br />        XHTML:对应W3C的XHTML规范，目前是XHTML1.0。 <br />　　CSS:对应W3C的CSS规范，目前是CSS2.0 <br />　　DOM:这里的DOM主要是指HTML DOM，XML DOM包括在下面的XML中 <br />　　JavaScript:对应于ECMA的ECMAScript规范 <br />　　XML:对应W3C的XML DOM、XSLT、XPath等等规范 <br />　　XMLHttpRequest:对应WhatWG的Web Applications1.0规范<br />       当用户请求新的数据内容时，传统的web机制只能等待服务器将全部数据返回，然后刷新并重新显示整个页面；而Ajax只请求那些需要改变的内容，同时只改变那些需要改变的区域，而并不对这个页面进行刷新，这种能力不但使刷新成了Ajax带给用户的最主要印象，而且由于数据传递量的有效降低使得Ajax成为缓解web性能瓶颈的重要武器。<br />       无论是Ajax的模式还是所依托的具体技术在很多年前就已经出现了，之所以到今天才获得应用和认同，说明再先进的东西也只有在被需要的情况下才能得到真正的发展。Ajax技术之中，最核心的技术就是XMLHttpRequest，它最初的名称叫做XMLHTTP，是微软公司为了满足开发者的需要，1999年在IE5.0浏览器中率先推出的。后来这个技术被上述的规范命名为XMLHttpRequest。XMLHttpRequest为运行于浏览器中的JavaScript脚本提供了一种在页面之内与服务器通信的手段。页面内的JavaScript可以在不刷新页面的情况下从服务器获取数据，或者向服务器提交数据。<br />Ajax应用与传统的Web应用的区别主要在3个地方:<br />     1. 不刷新整个页面，在页面内与服务器通信。 </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">     2. 使用异步方式与服务器通信，不需要打断用户的操作，具有更加迅速的的响应能力。 </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">     3. 应用仅由少量页面组成。大部分交互在页面之内完成，不需要切换整个页面。<br />IBM在2月底已经发布了Open Ajax项目的Ajax Toolkit Framework(ATF)1.0，是一个基于Eclipse IDE的Ajax开发工具。异步交互、JavaScript脚本和XML封装数据是AJAX的三大特征。<br />首先，您拥有一些简单的定位点标记，它连接到一个JavaScriptcastVote(rank)函数。 <br />function castVote(rank) {<br />  var url = "/ajax-demo/static-article-ranking.html";<br />  var callback = processAjaxResponse;<br />  executeXhr(callback, url);<br />} </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr，提供一个回调JavaScript函数，一旦服务器响应可用，<br />该函数就被执行。由于我希望它运行在一个简单的Apache环境中，“cast vote URL”只是一个简单的HTML页面。在实际情况中，被调用的<br />URL将记录票数并动态地呈现包含投票总数的响应。 </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　下一步是发出一个XmlHttpRequest请求： <br />function executeXhr(callback, url) {<br />  // branch for native XMLHttpRequest object<br />  if (window.XMLHttpRequest) {<br />    req = new XMLHttpRequest();<br />    req.onreadystatechange = callback;<br />    req.open("GET", url, true);<br />    req.send(null);<br />  } // branch for IE/Windows ActiveX version<br />  else if (window.ActiveXObject) {<br />    req = new ActiveXObject("Microsoft.XMLHTTP");<br />    if (req) {<br />      req.onreadystatechange = callback;<br />      req.open("GET", url, true);<br />      req.send();<br />    }<br />  }<br />} </font>
				</strong>
		</p>
		<p>
				<br />
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　如您所见，执行一个XmlHttpRequest并不简单，但非常直观。和平常一样，在JavaScript领域，大部分的工作量都花在确保浏览器兼容方<br />面。在这种情况下，首先要确定XmlHttpRequest是否可用。如果不能用，很可能要使用Internet Explorer，这样就要使用所提供的ActiveX实<br />现。 </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">executeXhr()方法中最关键的部分是这两行： </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">req.onreadystatechange = callback;<br />req.open("GET", url, true); </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　第一行定义了JavaScript回调函数，您希望一旦响应就绪它就自动执行，而req.open()方法中所指定的“true”标志说明您想要异步执行该请求。 </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　一旦服务器处理完XmlHttpRequest并返回给浏览器，使用req.onreadystatechange指派所设置的回调方法将被自动调用。 </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">function processAjaxResponse() {<br />  // only if req shows "loaded"<br />  if (req.readyState == 4) {<br />    // only if "OK"<br />    if (req.status == 200) {<br />      502 502'votes').innerHTML = req.responseText;<br />    } else {<br />      alert("There was a problem retrieving the XML data:<br />" +<br />      req.statusText);<br />    }<br />  }<br />} </font>
				</strong>
		</p>
		<p>
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">现在processVoteResponse()函数开始显示出其意义了。它首先检查XmlHttpRequest的整体状态以保证它已经完成（readyStatus == 4），<br />然后根据服务器的设定询问请求状态。如果一切正常（status == 200）,就使用innerHTML属性重写DOM的“votes”节点的内容。 <br /></font>
				</strong>
		</p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/50809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2006-06-06 16:46 <a href="http://www.blogjava.net/mlh123caoer/archive/2006/06/06/50809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java使用sax对xml文档的解析 </title><link>http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47304.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sun, 21 May 2006 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47304.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/47304.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/47304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/47304.html</trackback:ping><description><![CDATA[<p>随着互联网技术的发展，XML技术变得越来越重要，从而出现了很多<br />与XML的整合应用方面的技术，SAX就是其中之一。在这里，我就简要<br />谈谈java怎样使用sax对xml文档的解析。</p>
		<p>首先，让我们来谈谈SAX对XML文档的解析机制。一般情况下，SAX 处理器<br />分析XML代码将生成以下事件：</p>
		<p>
				<br />Start document<br />Start element ()<br />Characters (white space)<br />Start element ()<br />Characters ()<br />End element ()<br />............<br />End element ()</p>
		<p>具体解析步骤如下<br />一、 创建事件处理程序，SAX 提供应用程序可扩展的类 DefaultHandler。<br />创建的解析类config必须继承类 DefaultHandler。<br />如：public class Config extends DefaultHandler{}<br />二、使用 JAXP 来创建解析器：使用 JAXP 中的类 XMLReaderFactory <br />来创建解析器。首先声明 XMLReader的一个对象 parser。然后使用<br />XMLReaderFactory的createXMLReader方法来创建 SAXParser。<br />XMLReader parser =<br />XMLReaderFactory.createXMLReader(<br />"org.apache.xerces.parsers.SAXParser"); <br />三、一旦创建了解析器，则需要将 config 设置为内容处理程序，<br />以便于其接收事件。<br />parser.setContentHandler(this);</p>
		<p>但是，当然总会有可能在试图进行解析时，数据有问题。这时应该创建<br />ErrorHandler 在这样的情况下，有一个处理程序来处理错误和内容。<br />parser.setErrorHandler(this);<br />四、准备对文件进行实际解析。应用程序文件传递给 parse()，然后应用程序<br />会继续运行。<br />parser.parse(confFile);<br />五、接下来就开始对文档进行解析了。前面说过SAX的处理机制，SAX在处理XML流<br />的过程中，首先产生startDocument()事件，实际上该事件什么也没有发生，因为<br />还没有定义任何解析的事件。使用 startDocument() 事件只是为了通知文档的开<br />始。类似其它 SAX 事件，该事件抛出 SAXException。<br />例如：<br />public void startDocument()<br />throws SAXException {<br />System.out.println(<br />"Tallying survey results...");<br />}</p>
		<p>六、跟下来，就正式开始对文件进行解析了。这时SAX会产生一个startElement()<br />事件，对于每个元素，都会回送一个传递给 startElement() 事件的名称。不过<br />解析器实际所传递是：该元素的名称空间信息；该元素的实际名称或 localName；<br />名称空间别名和 localName 的组合（否则是限定名或 qname）；以及该元素任何<br />属性。startElement() 事件还提供对元素属性的访问。将这些属性传递进称为 <br />Attributes的数据结构。根据属性在数组中位置或属性的名称，可以检索该属性值。<br />例如：<br />public void startElement(<br />String namespaceURI, <br />String localName, <br />String qName, <br />Attributes atts) <br />throws SAXException {<br />String s = (!"".equals(localName)) ? localName : qName;</p>
		<p>System.out.print("Start element: ");<br />System.out.println(localName);<br />tag = s;<br />if (localName == "Connector") {<br />System.out.println("name: "<br />+ atts.getValue("name"));<br />} else if (localName == "port") {<br />thisQuestion = atts.getValue("servername");<br />}else if (localName == "maxThreadPoolSize") {<br />thisQuestion = atts.getValue("poolname");<br />}<br />if (localName == "Database") {<br />System.out.println("name: "<br />+ atts.getValue("name"));<br />} else if (localName == "driverName") {<br />thisQuestion = atts.getValue("dataname");<br />}else if (localName == "encoding") {<br />thisQuestion = atts.getValue("codename");<br />}<br />thisElement = localName;</p>
		<p>
				<br />for (int att = 0;att &lt; atts.getLength(); att++) {<br />String attName = atts.getLocalName(att);<br />System.out.println(" "<br />+ attName + ": "<br />+ atts.getValue(attName)); <br />}</p>
		<p>
				<br />}<br />七、有了元素，接下来用 characters() 来检索实际的数据。这时可以使用下面的<br />方法获得实际的数据：<br />可以用String s = new String(ch, start, length).trim();<br />这个方法来获得数据。<br />例如：<br />public void characters(char[] ch,<br />int start,<br />int length)<br />throws SAXException {</p>
		<p>String s = new String(ch, start, length).trim();<br />if (!"".equals(s)) {<br />if ("port".equals(tag)) {<br />System.out.println(Integer.parseInt(s));<br />} else if ("maxThreadPoolSize".equals(tag)) {<br />System.out.println(Integer.parseInt(s));<br />}<br />//System.out.println(tag+" = "+s);<br />} </p>
		<p>s = new String(ch, start, length).trim();<br />if (!"".equals(s)) {<br />if ("driverName".equals(tag)) {<br />System.out.println(s);<br />} else if ("encoding".equals(tag)) {<br />System.out.println(s);<br />}<br />//System.out.println(tag+" = "+s);<br />} <br />}<br />八、接下来的要做的就是用endElement()来结束对一个xml的 element的解析。<br />例如：下面的方法<br />public void endElement(String namespaceURI, <br />String localName, <br />String qName)<br />throws SAXException {</p>
		<p>printIndent(indent);<br />System.out.println("End Element: "+localName);<br />indent = indent - 4;<br />thisQuestion = "";<br />thisElement = "";<br />九、最后就是告诉程序，xml文件解析完毕，此时，用endDocument()来结束程序。<br />例如：<br />public void endDocument() {}</p>
		<p>总的来说，sax处理xml的方法还基本上是差不多的，只是一二步的方法相对多一点,<br />那些其他的方法我这里就不多说了，由读者自己去查找资料。<br /></p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/47304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2006-05-21 17:10 <a href="http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax 学习资源</title><link>http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47302.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sun, 21 May 2006 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47302.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/47302.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/47302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/47302.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 12px">AJAX开发人员的编译模式:<a href="http://www.ajaxpatterns.org/" target="_blank"><font color="#003366">http://www.ajaxpatterns.org</font></a><br />•  XMLHttpRequest教程：“动态网页接口”:<a href="http://www.xml.com/pub/a/2005/02/09/xml-http-request.html" target="_blank"><font color="#003366">http://www.xml.com/pub/a/2005/02/09/xml-http-request.html</font></a><br />• JavaScript性能基准:<a href="http://blogs.ebusiness-apps.com/dave/?p=14" target="_blank"><font color="#003366">http://blogs.ebusiness-apps.com/dave/?p=14</font></a><br />• AJAX资源:<a href="http://www.ajaxmatters.com/" target="_blank"><font color="#003366">http://www.ajaxmatters.com</font></a><br />• JavaScript规范:<a href="http://www.ecma-international.or/" target="_blank"><font color="#003366">http://www.ecma-international.or</font></a> ... ndards/Ecma-262.htm <br />• 介绍JavaScript对象标识:<a href="http://www.crockford.com/JSON/index.html" target="_blank"><font color="#003366">http://www.crockford.com/JSON/index.html</font></a><br />•  Mozilla 的Venkman JavaScript调试器:<a href="http://www.mozilla.org/projects/venkman/" target="_blank"><font color="#003366">http://www.mozilla.org/projects/venkman/</font></a><br />•  XML DOM参考:<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/" target="_blank"><font color="#003366">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/</font></a><br />xmlsdk/html/e9da2722-7879-4e48-869c-7f16714e2824.asp <br />• Microsoft Dynamic HTML reference: <a href="http://msdn.microsoft.com/library/default.asp?url=/" target="_blank"><font color="#003366">http://msdn.microsoft.com/library/default.asp?url=/</font></a><br />workshop/author/dhtml/reference/dhtml_reference_entry.asp <br />• Gecko DOM Reference: <a href="http://www.mozilla.org/docs/dom/domref/" target="_blank"><font color="#003366">http://www.mozilla.org/docs/dom/domref/</font></a><br />• "“移植IE应用到Mozilla”<br /><a href="http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/" target="_blank"><font color="#003366">http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/</font></a><br />• Mozilla XUL reference: <br /><a href="http://www.xulplanet.com/" target="_blank"><font color="#003366">http://www.xulplanet.com/</font></a><br />• Microsoft XAML reference: <br /><a href="http://windowssdk.msdn.microsoft/" target="_blank"><font color="#003366">http://windowssdk.msdn.microsoft</font></a> ... t.asp?url=/library/<br />en-us/wcp_conceptual/html/0ff5f36e-dd84-44d1-aa3e-5bb4f147b169.asp?frame=true <br />• James Jesses Garret introduced the term AJAX in his article "AJAX: A New Approach to Web Applications," (Adaptive Path, February 2005): “AJAX：新的网页应用开发方式”<br /><a href="http://www.adaptivepath.com/publ" target="_blank"><font color="#003366">http://www.adaptivepath.com/publ</font></a> ... archives/000385.php <br />• JetBrains IntelliJ IDEA: <br /><a href="http://www.jetbrains.com/" target="_blank"><font color="#003366">http://www.jetbrains.com/</font></a><br />• Microsoft Visual Studio: <br /><a href="http://msdn.microsoft.com/vstudio/" target="_blank"><font color="#003366">http://msdn.microsoft.com/vstudio/</font></a><br />• JSEditor: <br /><a href="http://jseditor.sourceforge.net/" target="_blank"><font color="#003366">http://jseditor.sourceforge.net/</font></a><br />• JSEclipse: <br /><a href="http://www.interaktonline.com/Pr" target="_blank"><font color="#003366">http://www.interaktonline.com/Pr</font></a> ... JSEclipse/Overview/ <br />• ActiveState Komodo: <br /><a href="http://www.activestate.com/Products/Komodo/" target="_blank"><font color="#003366">http://www.activestate.com/Products/Komodo/</font></a><br />• XHTML: <br /><a href="http://www.w3.org/TR/xhtml1/" target="_blank"><font color="#003366">http://www.w3.org/TR/xhtml1/</font></a><br />• Document Object Model: <br /><a href="http://www.w3.org/DOM/" target="_blank"><font color="#003366">http://www.w3.org/DOM/</font></a><br />• Cascading Style Sheets: <br /><a href="http://www.w3.org/Style/CSS/" target="_blank"><font color="#003366">http://www.w3.org/Style/CSS/</font></a><br />• Extensible Stylesheet Language: <br /><a href="http://www.w3.org/Style/XSL/" target="_blank"><font color="#003366">http://www.w3.org/Style/XSL/</font></a><br />• XForms: <br /><a href="http://www.w3.org/MarkUp/Forms/" target="_blank"><font color="#003366">http://www.w3.org/MarkUp/Forms/</font></a><br />• Scaling Vector Graphics: <br /><a href="http://www.w3.org/Graphics/SVG/" target="_blank"><font color="#003366">http://www.w3.org/Graphics/SVG/</font></a><br />• XPath: <br /><a href="http://www.w3.org/TR/xpath" target="_blank"><font color="#003366">http://www.w3.org/TR/xpath</font></a><br />• AJAX.Net: <br /><a href="http://ajax.schwarz-interactive.de/csharpsample/default.aspx" target="_blank"><font color="#003366">http://ajax.schwarz-interactive.de/csharpsample/default.aspx</font></a><br />• Backbase: <br /><a href="http://www.backbase.com/" target="_blank"><font color="#003366">http://www.backbase.com</font></a><br />• Bitkraft: <br /><a href="http://www.tiggrbitz.com/" target="_blank"><font color="#003366">http://www.tiggrbitz.com/</font></a><br />• Django: <br /><a href="http://www.djangoproject.com/" target="_blank"><font color="#003366">http://www.djangoproject.com/</font></a><br />• Dojo: <br /><a href="http://www.dojotoolkit.org/" target="_blank"><font color="#003366">http://www.dojotoolkit.org/</font></a><br />• DWR (Direct Web Reporting): <br /><a href="http://getahead.ltd.uk/dwr/" target="_blank"><font color="#003366">http://getahead.ltd.uk/dwr/</font></a><br />• MochiKit: <br /><a href="http://mochikit.com/" target="_blank"><font color="#003366">http://mochikit.com/</font></a><br />• Prototype: <br /><a href="http://prototype.conio.net/" target="_blank"><font color="#003366">http://prototype.conio.net/</font></a><br />• Rico: <br /><a href="http://openrico.org/rico/home.page" target="_blank"><font color="#003366">http://openrico.org/rico/home.page</font></a><br />• Sajax: <br /><a href="http://www.modernmethod.com/sajax/" target="_blank"><font color="#003366">http://www.modernmethod.com/sajax/</font></a><br />• Sarissa: <br /><a href="http://sarissa.sourceforge.net/doc/" target="_blank"><font color="#003366">http://sarissa.sourceforge.net/doc/</font></a><br />• Script.aculo.us: <br /><a href="http://script.aculo.us/" target="_blank"><font color="#003366">http://script.aculo.us/</font></a><br />• Ruby on Rails: <br /><a href="http://www.rubyonrails.org/" target="_blank"><font color="#003366">http://www.rubyonrails.org/</font></a><br />• For more on AJAX and DWR, read "AJAX Made Simple with DWR," Cloves Carneiro Jr. (JavaWorld, June 2005): 关于AJAX和DWR，请阅读“AJAX使用DWR更简单”<br /><a href="http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html" target="_blank"><font color="#003366">http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html</font></a><br />• For more articles on Java development tools, browse the Development Tools section of JavaWorld’s Topical Index: 更多Java开发工具的文章，请浏览JavaWorld的开发工具部分索引页<br /><a href="http://www.javaworld.com/channel_content/jw-tools-index.shtml" target="_blank"><font color="#003366">http://www.javaworld.com/channel_content/jw-tools-index.shtml</font></a><br />• For more articles on XML, browse the Java and XML section of JavaWorld’s Topical Index: 更多XML的文章，请浏览JavaWorld的Java和XML部分索引页<br /><a href="http://www.javaworld.com/channel_content/jw-xml-index.shtml" target="_blank"><font color="#003366">http://www.javaworld.com/channel_content/jw-xml-index.shtml</font></a><br />• For more articles on UI design, browse the User Interface Design section of JavaWorld’s Topical Index: 更多UI设计的文章，请浏览JavaWorld的UI设计部分索引页<br /><a href="http://www.javaworld.com/channel_content/jw-ui-index.shtml" target="_blank"><font color="#003366">http://www.javaworld.com/channel_content/jw-ui-index.shtml</font></a></span><img src ="http://www.blogjava.net/mlh123caoer/aggbug/47302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2006-05-21 17:05 <a href="http://www.blogjava.net/mlh123caoer/archive/2006/05/21/47302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>