﻿<?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-study-随笔分类-Ajax</title><link>http://www.blogjava.net/lzj520/category/15592.html?Show=All</link><description /><language>zh-cn</language><lastBuildDate>Sun, 01 Jun 2008 14:20:46 GMT</lastBuildDate><pubDate>Sun, 01 Jun 2008 14:20:46 GMT</pubDate><ttl>60</ttl><item><title>gwt-ext Out of memory解决办法</title><link>http://www.blogjava.net/lzj520/archive/2008/06/01/205176.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Sun, 01 Jun 2008 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/06/01/205176.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/205176.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/06/01/205176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/205176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/205176.html</trackback:ping><description><![CDATA[<img height="640" alt="" src="http://www.blogjava.net/images/blogjava_net/lzj520/RunDialog.JPG" width="825" border="0" />
<img src ="http://www.blogjava.net/lzj520/aggbug/205176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-06-01 18:23 <a href="http://www.blogjava.net/lzj520/archive/2008/06/01/205176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>070723 - AJAX一些小问题</title><link>http://www.blogjava.net/lzj520/archive/2007/07/23/131853.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Mon, 23 Jul 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2007/07/23/131853.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/131853.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2007/07/23/131853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/131853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/131853.html</trackback:ping><description><![CDATA[<p>最近使用了AJAX，有些问题要注意的：<br><br>AJAX的缓存问题：<br><br></p>
<p>IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存，根本不向服务器端提交。因此无法取到刚提交的数据。</p>
<p>方法1：服务器端代码加入response.setHeader("Cache-Control", "no-cache, must-revalidate");</p>
<p>方法2：用JavaScript在Ajax提交的时候加入一个随机数作为URL中的一个参数。req.open(url + "&amp;" + Math.random).</p>
<p>Response.text乱码问题：<br><br>由于AJAX使用UTF-8传输，在服务器端加入如下代码：<br><br>PHP:header('Content-Type:text/Html;charset=GB2312');<br>ASP:Response.Charset("GB2312")<br>jsp:response.setHeader("Charset","GB2312");<br></p>
<img src ="http://www.blogjava.net/lzj520/aggbug/131853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2007-07-23 12:48 <a href="http://www.blogjava.net/lzj520/archive/2007/07/23/131853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Ajax on Rails(onlamp.com)</title><link>http://www.blogjava.net/lzj520/archive/2006/11/04/79073.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Sat, 04 Nov 2006 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2006/11/04/79073.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/79073.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2006/11/04/79073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/79073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/79073.html</trackback:ping><description><![CDATA[<p nd="2">In a few short months, Ajax has moved from an obscure and rarely used technology to the hottest thing since sliced bread. This article introduces the incredibly easy-to-use Ajax support that is part of the <a href="http://www.rubyonrails.org/">Ruby on Rails</a><a class=iAs style="COLOR: darkgreen; BORDER-BOTTOM: darkgreen 1px solid; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" href="http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html#" target=_blank itxtdid="2683937">web</a> application framework. This is not a step-by-step tutorial, and I assume that you know a little bit about how to organize and construct a Rails web application. If you need a quick refresher, check out <a href="http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html">Rolling with Ruby on Rails</a>, <a href="http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html">Part 1</a> and <a href="http://www.onlamp.com/pub/a/onlamp/2005/03/03/rails.html">Part 2</a>.</p>
<p nd="3">Just in case you've been stranded on a faraway island for most of the year, here's the history of Ajax in 60 seconds or less.</p>
<p nd="4">In the beginning, there was the World Wide Web. Compared with desktop applications, web applications were slow and clunky. People liked web applications anyway because they were conveniently available from anywhere, on any computer that had a browser. Then Microsoft created <a href="http://en.wikipedia.org/wiki/XMLHttpRequest">XMLHttpRequest</a> in Internet Explorer 5, which let browser-side JavaScript communicate with the web <a class=iAs style="COLOR: darkgreen; BORDER-BOTTOM: darkgreen 1px solid; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" href="http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html#" target=_blank itxtdid="2194428">server</a> in the background without requiring the browser to display a new web page. That made it possible to develop more fluid and responsive web applications. Mozilla soon implemented XMLHttpRequest in its browsers, as did Apple (in the Safari browser) and Opera.</p>
<p nd="5">XMLHttpRequest must have been one of the Web's best kept secrets. Since its debut in 1998, few sites have used it at all, and most developers, if they even knew about it, never used it. Google started to change that when it released a series of high-profile web applications with sleek new UIs powered by XMLHttpRequest. The most visually impressive of these is <a href="http://maps.google.com/">Google Maps</a>, which gives you the illusion of being able to drag around an infinitely sizable map in its little map window.</p>
<p nd="6">While Google's prominent use of XMLHttpRequest dramatically demonstrated that vastly improved UIs for web apps were possible, it was Jesse James Garrett's <a href="http://www.adaptivepath.com/publications/essays/archives/000385.php">February 18 essay</a> that finally gave this technique a usable name: Ajax (Asynchronous JavaScript and XML). That was the tipping point. Without knowing it, we as an industry had been waiting for this, and the new Ajax name spread like wildfire. I have never seen such rapid and near universal adoption of a new technology moniker!</p>
<h3>Traditional Web App vs. an Ajax App</h3>
<p nd="7">Let me distill the essence of an Ajax web application by examining a use case: inserting a new item into a list.</p>
<p nd="8">A typical user interface displays the current list on a web page followed by an input field in which the user can type the text of a new item. When the user clicks on a Create New Item button, the <a class=iAs style="COLOR: darkgreen; BORDER-BOTTOM: darkgreen 1px solid; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" href="http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html#" target=_blank itxtdid="2471509">app</a> actually creates and inserts the new item into the list.</p>
<p nd="9">At this point, a traditional web application sends the value of the input field to the server. The server then acts upon the data (usually by updating a database) and responds by sending back a new web page that displays an updated list that now contains the new item. This uses a lot of bandwidth, because most of the new page is exactly the same as the old one. The performance of this web app degrades as the list gets longer.</p>
<p nd="10">In contrast, an Ajax web application sends the input field to the server in the background and updates the affected portion of the current web page in place. This dramatically increases the responsiveness of the user interface and makes it feel much more like a desktop application.</p>
<p nd="11">You can see this for yourself. Below are links to two different weblogs, one that uses Ajax to post comments and another that does not. Try posting some comments to each one:</p>
<blockquote>
<p><a href="http://jroller.com/comments/curthibbs?anchor=ajax_on_rails">Traditional Web App</a> </p>
<p><a href="http://blog.curthibbs.us/articles/2005/01/01/ajax-on-rails">Ajax Web App</a> </p>
</blockquote>
<p nd="12">Ajax is all about usability--but like any technology or technique, you can use it well or use it poorly. After showing how to use Ajax, I'll give some guidelines on when to use Ajax and when not to.</p>
<h3>How to Use Ajax in Your Web Application</h3>
<p nd="13">The hard way to use Ajax in your web app is to write your own custom JavaScript that directly uses the XMLHttpRequest object's API. By doing this, you have to deal with the idiosyncrasies of each browser.</p>
<p nd="14">An easier way is to use one of several JavaScript libraries that provide higher-level Ajax services and hide the differences between browsers. Libraries such as <a href="http://www.getahead.ltd.uk/dwr/">DWR</a>, <a href="http://prototype.conio.net/">Prototype</a>, <a href="http://www.modernmethod.com/sajax/">Sajax</a>, and <a href="http://ajax.schwarz-interactive.de/csharpsample/default.aspx">Ajax.NET</a> are all good choices.</p>
<p nd="15">The easiest way of all is to use the built-in Ajax facilities of <a href="http://www.rubyonrails.org/">Ruby on Rails</a>. In fact, Rails makes Ajax so easy that for typical cases it's no harder to use Ajax than it is not to!</p>
<h3>How Rails Implements Ajax</h3>
<p nd="16">Rails has a simple, consistent model for how it implements Ajax operations.</p>
<p nd="17">Once the browser has rendered and displayed the initial web page, different user actions cause it to display a new web page (like any traditional web app) or trigger an Ajax operation:</p>
<ol>
    <li nd="18">A trigger action occurs. This could be the user clicking on a button or link, the user making changes to the data on a form or in a field, or just a periodic trigger (based on a timer).
    <li nd="19">Data associated with the trigger (a field or an entire form) is sent asynchronously to an action handler on the server via XMLHttpRequest.
    <li nd="20">The server-side action handler takes some action (that's why it is an <em nd="21">action handler</em>) based on the data, and returns an HTML fragment as its response.
    <li nd="22">The client-side JavaScript (created automatically by Rails) receives the HTML fragment and uses it to update a specified part of the current page's HTML, often the content of a <code><font color=#003366>&lt;div&gt;</font></code> tag. </li>
</ol>
<p nd="23">An Ajax request to the server can also return any arbitrary data, but I'll talk only about HTML fragments. The real beauty is how easy Rails makes it to implement all of this in your web application.</p>
<h3>Using <code><font color=#003366>link_to_remote</font></code></h3>
<p nd="24">Rails has several helper methods for implementing Ajax in your view's templates. One of the simplest yet very versatile methods is <code><font color=#003366>link_to_remote()</font></code>. Consider a simple web page that asks for the time and has a link on which the user clicks to obtain the current time. The app uses Ajax via <code><font color=#003366>link_to_remote()</font></code> to retrieve the time and display it on the web page.</p>
<p nd="25">My view template (<em nd="26">index.rhtml</em>) looks like:</p>
<pre>				<code>
<font color=#003366>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Ajax Demo&lt;/title&gt;
<strong>&lt;%= javascript_include_tag "prototype" %&gt;</strong>
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;What time is it?&lt;/h1&gt;
&lt;div id="time_div"&gt;
I don't have the time, but
</font>
<font color=#003366>
<strong>&lt;%= link_to_remote( "click here",
:update =&gt; "time_div",
:url =&gt;{ :action =&gt; :say_when }) %&gt;</strong>
and I will look it up.
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</font>
</code>
</pre>
<p nd="27">There are two helper methods of interest in the above template, marked in bold. <code><font color=#003366>javascript_include_tag()</font></code> includes the <a href="http://prototype.conio.net/">Prototype</a> JavaScript library. All of the Rails Ajax features use this JavaScript library, which the Rails distribution helpfully includes.</p>
<p nd="28">The <code><font color=#003366>link_to_remote()</font></code> call here uses its simplest form, with three parameters:</p>
<ol>
    <li nd="29">The text to display for the link--in this case, "click here".
    <li nd="30">The id of the DOM element containing content to replace with the results of executing the action--in this case, <code><font color=#003366>time_div</font></code>.
    <li nd="31">The URL of the server-side action to call--in this case, an action called <code><font color=#003366>say_when</font></code>. </li>
</ol>
<p><img height=292 alt="What Time is it before clicking" src="http://www.onlamp.com/onlamp/2005/06/09/graphics/whattime.gif" width=450> <br><em nd="32">Figure 1. Before clicking on the link</em> </p>
<p nd="33">My controller class looks like:</p>
<pre>				<code>
<font color=#003366>class DemoController &lt; ApplicationController
def index
end
def say_when
render_text "&lt;p&gt;The time is &lt;b&gt;" + DateTime.now.to_s + "&lt;/b&gt;&lt;/p&gt;"
end
end</font>
</code>
</pre>
<p><font color=#003366><img height=292 alt="What Time is it after clicking" src="http://www.onlamp.com/onlamp/2005/06/09/graphics/whattime2.gif" width=450> <br></font><em nd="34">Figure 2. After clicking on the link</em> </p>
<p nd="35">The <code><font color=#003366>index</font></code> action handler doesn't do anything except letting Rails recognize that there is an index action and causing the rendering of the <em nd="36">index.rhtml</em> template. The <code><font color=#003366>say_when</font></code> action handler constructs an HTML fragment that contains the current date and time. Figures 1 and 2 show how the index page appears both before and after clicking on the "click here" link.</p>
<p nd="37">When the user clicks on the "click here" link, the browser constructs an XMLHttpRequest, sending it to the server with a URL that will invoke the <code><font color=#003366>say_when</font></code> action handler, which returns an HTML response fragment containing the current time. The client-side JavaScript receives this response and uses it to replace the contents of the <code><font color=#003366>&lt;div&gt;</font></code> with an id of <code><font color=#003366>time_div</font></code>.</p>
<p nd="38">It's also possible to insert the response, instead of replacing the existing content:</p>
<pre>				<code>
<strong>
<font color=#003366>&lt;%= link_to_remote( "click here",
:update =&gt; "time_div",
:url =&gt; { :action =&gt; :say_when },
:position =&gt; "after" ) %&gt;</font>
</strong>
</code>
</pre>
<p nd="39">I added an optional parameter <code><strong><font color=#003366>:position =&gt; "after"</font></strong></code>, which tells Rails to insert the returned HTML fragment after the target element (<code><font color=#003366>time_div</font></code>). The position parameter can accept the values <code><font color=#003366>before</font></code>, <code><font color=#003366>after</font></code>, <code><font color=#003366>top</font></code>, and <code><font color=#003366>bottom</font></code>. <code><font color=#003366>top</font></code> and <code><font color=#003366>bottom</font></code> insert inside of the target element, while <code><font color=#003366>before</font></code> and <code><font color=#003366>after</font></code> insert outside of the target element.</p>
<p nd="40">In any case, now that I added the position parameter, my "click here" link won't disappear, so I can click on it repeatedly and watch the addition of new time reports.</p>
<p><img height=399 alt="What Time is it appending new content" src="http://www.onlamp.com/onlamp/2005/06/09/graphics/whattime3.gif" width=432> <br><em nd="41">Figure 3. The position option inserts new content</em> </p>
<p nd="42">The web page doesn't change, and neither does the URL being displayed by the browser. In a trivial example like this, there has not been much of a savings over an entire page refresh. The difference becomes more noticeable when you have a more complicated page of which you need to update only a small portion.<br><br></p>
<h3>Using <code><font color=#003366>form_remote_tag</font></code></h3>
<p nd="4">The <code><font color=#003366>form_remote_tag()</font></code> helper is similar to <code><font color=#003366>link_to_remote()</font></code> except that it also sends the contents of an HTML form. This means that the action handler can use user-entered data to formulate the response. This example displays a <a class=iAs style="COLOR: darkgreen; BORDER-BOTTOM: darkgreen 1px solid; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" href="http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html?page=2#" target=_blank itxtdid="2683937">web</a> page that shows a list and an Ajax-enabled form that lets users add items to the list.</p>
<p nd="5">My view template (<em nd="6">index.rhtml</em>) looks like:</p>
<pre>				<code>
<font color=#003366>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Ajax List Demo&lt;/title&gt;
&lt;%= javascript_include_tag "prototype" %&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h3&gt;Add to list using Ajax&lt;/h3&gt;
</font>
<font color=#003366>
<strong>&lt;%= form_remote_tag(:update =&gt; "my_list",
:url =&gt; { :action =&gt; :add_item },
:position =&gt; "top" ) %&gt;</strong>
New item text:
&lt;%= text_field_tag :newitem %&gt;
&lt;%= submit_tag "Add item with Ajax" %&gt;
<strong>&lt;%= end_form_tag %&gt;</strong>
&lt;ul id="my_list"&gt;
&lt;li&gt;Original item... please add more!&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</font>
</code>
</pre>
<p nd="7">Notice the two parts in bold. They define the beginning and end of the form. Because the form started with <code><font color=#003366>form_remote_tag()</font></code> instead of <code><font color=#003366>form_tag()</font></code>, the application will submit this form using XMLHttpRequest. The parameters to <code><font color=#003366>form_remote_tag()</font></code> should look familiar:</p>
<ul>
    <li nd="8">The update parameter specifies the id of the DOM element with content to update by the results of executing the action--in this case, <code><font color=#003366>my_list</font></code>.
    <li nd="9">The url parameter specifies the server-side action to call--in this case, an action named <code><font color=#003366>add_item</font></code>.
    <li nd="10">The position parameter says to insert the returned HTML fragment at the top of the content of the <code><font color=#003366>my_list</font></code> element--in this case, a <code><font color=#003366>&lt;ul&gt;</font></code> tag. </li>
</ul>
<p><img height=350 alt="List Demo before adding items" src="http://www.onlamp.com/onlamp/2005/06/09/graphics/listdemo.gif" width=451> <br><em nd="11">Figure 4. Before adding any items</em> </p>
<p nd="12">My controller class looks like:</p>
<pre>				<code>
<font color=#003366>class ListdemoController &lt; ApplicationController
def index
end
def add_item
render_text "&lt;li&gt;" + params[:newitem] + "&lt;/li&gt;"
end
end</font>
</code>
</pre>
<p nd="13">The <code><font color=#003366>add_item</font></code> action handler constructs an HTML list item fragment containing whatever text the user entered into the <code><font color=#003366>newitem</font></code> text field of the form.</p>
<p><img height=350 alt="List Demo after adding list items" src="http://www.onlamp.com/onlamp/2005/06/09/graphics/listdemo2.gif" width=451> <br><em nd="14">Figure 5. After adding several new list items</em> </p>
<h3>Using Observers</h3>
<p nd="15">Rails lets you monitor the value of a field and make an Ajax call to an action handler whenever the value of the field changes. The current value of the observed field is sent to the action handler in the post <a class=iAs style="COLOR: darkgreen; BORDER-BOTTOM: darkgreen 1px solid; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" href="http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html?page=2#" target=_blank itxtdid="2885012">data</a> of the call.</p>
<p nd="16">A very common use for this is to implement a live search:</p>
<pre>				<code>
<font color=#003366>&lt;label for="searchtext"&gt;Live Search:&lt;/label&gt;
&lt;%= text_field_tag :searchtext %&gt;
&lt;%= observe_field(:searchtext,
:frequency =&gt; 0.25,
:update =&gt; :search_hits,
:url =&gt; { :action =&gt; :live_search }) %&gt;
&lt;p&gt;Search Results:&lt;/p&gt;
&lt;div id="search_hits"&gt;&lt;/div&gt;</font>
</code>
</pre>
<p nd="17">This code snippet monitors the value of a text field named <code><font color=#003366>searchtext</font></code>. Every quarter of a second, Rails checks the field for changes. If the field has changed, the browser will make an Ajax call to the <code><font color=#003366>live_search</font></code> action handler, displaying the results in the <code><font color=#003366>search_hits</font></code> div.</p>
<p nd="18">You can see an actual demonstration of this live search on <a href="http://blog.curthibbs.us/">my weblog</a>. The search box is in the upper-right corner. Try typing <code><font color=#003366>enterprise</font></code> or <code><font color=#003366>rails</font></code> and see what you get.</p>
<h3>To Use or Not Use (Ajax, That Is)</h3>
<p nd="19">When you use Ajax techniques to update portions of a web page, the user gains responsiveness and fluidity. However, the user also loses the ability to bookmark and to use the browser's back button. Both of these drawbacks stem from the same fact: the URL does not change because the browser has not loaded a new page.</p>
<p nd="20">Don't use Ajax just because it's cool. Think about what makes sense in your web app's user interface.</p>
<p nd="21">For example, if a web page displays a list of accounts with operations on the displayed list like adding, deleting, and renaming accounts, these are all good candidates for Ajax. If the user clicks on a link to show all invoices that belong to an account, that's when you should display a new page and avoid Ajax.</p>
<p nd="22">This means that the user can bookmark the accounts page and invoices page, and use the back and forward buttons to switch between them. The user can't bookmark the operations within one of these lists or use the back button to try to undo an operation on the list (both of which you would probably want to prevent in a traditional web app, as well).</p>
<h3>Odds 'n' Ends</h3>
<p nd="23">I'd like to bring a couple of really cool things to your attention, but I won't be going into any detail.</p>
<p nd="24">Web pages that upload files are often frustrating to users because the user receives no feedback on the status of the upload while it progresses. Using Ajax, you can communicate with the <a class=iAs style="COLOR: darkgreen; BORDER-BOTTOM: darkgreen 1px solid; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" href="http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html?page=2#" target=_blank itxtdid="2194428">server</a> during the upload to retrieve and display the status of the upload. Sean Treadway and Thomas Fuchs have implemented a <a href="http://sean.treadway.info/demo/upload">live demonstration</a> of this using Rails and a <a href="http://sean.treadway.info/files/howto-upload-progress.mov">video</a> on how to implement it.</p>
<p nd="25">The Prototype JavaScript library that Rails uses also implements a large number of visual effects. The <a href="http://wiki.script.aculo.us/scriptaculous/show/Demos">Effects Demo Page</a> has a live demonstration of these effects along with JavaScript calls to use them</p>
<p nd="26">You can find more detailed information about these and other Ajax features of Rails in Chapter 18 of <a href="http://www.pragmaticprogrammer.com/titles/rails/">Agile Web Development with Rails</a>.</p>
<h3>Parting Thoughts</h3>
<p nd="27">The Web has come a long way since the days of isolated web sites serving up static pages. We are slowly moving into a new era where sites are dynamically interconnected, web APIs allow us to easily build on top of existing services, and the web user interface is becoming more fluid and responsive. Ajax not only plays an important role in this emerging <a href="http://en.wikipedia.org/wiki/Web_2.0">Web 2.0</a> saga, but also raises the bar on what people will consider to be an acceptable web application.</p>
<p nd="28">By all rights, adding complex Ajax features to a web application should be a lot of extra work, but Rails makes it dead simple.</p>
<!-- article_sidebar_pdf.view begins -->
<img src ="http://www.blogjava.net/lzj520/aggbug/79073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2006-11-04 16:28 <a href="http://www.blogjava.net/lzj520/archive/2006/11/04/79073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>