<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://dengyin2000.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fdengyin2000.spaces.live.com%2fcategory%2fAjax%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Java Dreams: Ajax</title><description /><link>http://dengyin2000.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catAjax</link><language>en-US</language><pubDate>Sat, 02 Aug 2008 01:08:53 GMT</pubDate><lastBuildDate>Sat, 02 Aug 2008 01:08:53 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://dengyin2000.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-5815636772130029849</live:id><live:alias>dengyin2000</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>让GWT的FlexTable支持双击（double click）</title><link>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!253.entry</link><description>&lt;div&gt;
&lt;p&gt;Each event has a set of browser events that fires it.  For example take &lt;br&gt;
&lt;p&gt;a look at the source of the HTMLTable Class in the gwt-user jar.  It &lt;br&gt;has the following constructor: &lt;br&gt;
&lt;p&gt;  public HTMLTable() { &lt;br&gt;    tableElem = DOM.createTable(); &lt;br&gt;    bodyElem = DOM.createTBody(); &lt;br&gt;    DOM.appendChild(tableElem, bodyElem); &lt;br&gt;    setElement(tableElem); &lt;br&gt;    sinkEvents(Event.ONCLICK); &lt;br&gt;  } &lt;br&gt;
&lt;p&gt;Basically, it is &amp;quot;sinking&amp;quot; only the ONCLICK event, and will ignore all &lt;br&gt;other events.   To 'sink' and event just means to react to any firings &lt;br&gt;of that event.  A full list of the various events are listed here: &lt;br&gt;
&lt;p&gt;&lt;a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.user.c"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://code.google.com/webtoolkit/documentation/com.google.gwt.user.c&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;... &lt;br&gt;
&lt;p&gt;So, for example, if you wanted the &lt;b style="color:black;background-color:rgb(255,255,102)"&gt;table&lt;/b&gt; to respond to ONDBLCLICK &lt;br&gt;events, all you need to do is extend the class of the &lt;b style="color:black;background-color:rgb(255,255,102)"&gt;table&lt;/b&gt; you want to &lt;br&gt;
&lt;p&gt;use (let's say FlexTable), so you would make the class: &lt;br&gt;
&lt;p&gt;public class HappyTable extends FlexTable { &lt;br&gt;        public HappyTable(){ &lt;br&gt;                super(); &lt;br&gt;                addTableListener(this); &lt;br&gt;                sinkEvents(Event.ONCLICK | Event.ONDBLCLICK | &lt;br&gt;Event.ONKEYDOWN); &lt;br&gt;        } &lt;br&gt;... &lt;br&gt;
&lt;p&gt;
&lt;div style="display:block"&gt;} &lt;br&gt;&lt;br&gt;&lt;/div&gt;What this code is doing, is telling the &lt;b style="color:black;background-color:rgb(255,255,102)"&gt;table&lt;/b&gt; to react to &lt;b style="color:black;background-color:rgb(255,153,153)"&gt;click&lt;/b&gt;, &lt;b style="color:black;background-color:rgb(153,255,153)"&gt;double&lt;/b&gt; &lt;br&gt;
&lt;p&gt;&lt;b style="color:black;background-color:rgb(255,153,153)"&gt;click&lt;/b&gt;, and key press events.  In the same code you would create an &lt;br&gt;onBrowser event method which would define what you want to do: &lt;br&gt;
&lt;p&gt;public void onBrowserEvent(Event event) { &lt;br&gt;                // Find out which cell was actually clicked. &lt;br&gt;                Element td = getEventTargetCell(event); &lt;br&gt;                if (td == null) { &lt;br&gt;                        return; &lt;br&gt;                } &lt;br&gt;                Element tr = DOM.getParent(td); &lt;br&gt;                Element body = DOM.getParent(tr); &lt;br&gt;                int &lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt; = DOM.getChildIndex(body, tr); &lt;br&gt;                int column = DOM.getChildIndex(tr, td); &lt;br&gt;                switch (DOM.eventGetType(event)) { &lt;br&gt;                case Event.ONCLICK: { &lt;br&gt;                        if (this.tableListeners != null) { &lt;br&gt;                                // Fire the event. &lt;br&gt;                                tableListeners.fireCellClicked(this, &lt;br&gt;&lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt;, column); &lt;br&gt;                        } &lt;br&gt;                        break; &lt;br&gt;
&lt;p&gt;                } &lt;br&gt;                case Event.ONDBLCLICK: { &lt;br&gt;                        if (this.tableListeners != null) { &lt;br&gt;                                // Fire the event. &lt;br&gt;                                tableListeners.fireCellDblClicked(this, &lt;br&gt;&lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt;, column); &lt;br&gt;                        } &lt;br&gt;                        break; &lt;br&gt;                } &lt;br&gt;                case Event.ONKEYDOWN: { &lt;br&gt;                        if (DOM.eventGetKeyCode(event) == KEY_UP) { &lt;br&gt;                                // Fire the event. &lt;br&gt;                                tableListeners.fireUpKey(this); &lt;br&gt;                        } &lt;br&gt;                        else if (DOM.eventGetKeyCode(event) == &lt;br&gt;KEY_DOWN) { &lt;br&gt;                                // Fire the event. &lt;br&gt;                                tableListeners.fireDownKey(this); &lt;br&gt;                        } &lt;br&gt;                        break; &lt;br&gt;                } &lt;br&gt;                default: { &lt;br&gt;                        // Do nothing &lt;br&gt;                } &lt;br&gt;
&lt;p&gt;                } &lt;br&gt;        } &lt;br&gt;
&lt;p&gt;Because I was doing a variety of things with the &lt;b style="color:black;background-color:rgb(255,255,102)"&gt;table&lt;/b&gt; I created my own &lt;br&gt;
&lt;p&gt;listener interface, and listener collection which included &lt;b style="color:black;background-color:rgb(153,255,153)"&gt;double&lt;/b&gt; &lt;br&gt;clicks, but this is not necessary for simpler things.  Here it is &lt;br&gt;anyway (note that this implements all of clicks, dblclicks, and up/down &lt;br&gt;
&lt;p&gt;keys): &lt;br&gt;
&lt;p&gt;public interface HappyTableListener extends TableListener{ &lt;br&gt;
&lt;p&gt;        public void onCellDblClicked(SourcesTableEvents sender, int &lt;br&gt;&lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt;, int &lt;br&gt;cell); &lt;br&gt;        public void onUpKey(SourcesTableEvents sender); &lt;br&gt;        public void onDownKey(SourcesTableEvents sender); &lt;br&gt;
&lt;p&gt;
&lt;div style="display:block"&gt;} &lt;br&gt;&lt;br&gt;&lt;/div&gt;public class MyTableListenerCollection extends Vector { &lt;br&gt;
&lt;p&gt;        public void fireCellClicked(SourcesTableEvents sender, int &lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt;, &lt;br&gt;int &lt;br&gt;cell) { &lt;br&gt;                for (Iterator it = iterator(); it.hasNext();) { &lt;br&gt;                        MyTableListener listener = (MyTableListener) &lt;br&gt;it.next(); &lt;br&gt;                        listener.onCellClicked(sender, &lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt;, cell); &lt;br&gt;                } &lt;br&gt;        } &lt;br&gt;
&lt;p&gt;        public void fireCellDblClicked(SourcesTableEvents sender, int &lt;br&gt;&lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt;, int &lt;br&gt;cell) { &lt;br&gt;                for (Iterator it = iterator(); it.hasNext();) { &lt;br&gt;                        MyTableListener listener = (MyTableListener) &lt;br&gt;it.next(); &lt;br&gt;                        listener.onCellDblClicked(sender, &lt;b style="color:black;background-color:rgb(160,255,255)"&gt;row&lt;/b&gt;, cell); &lt;br&gt;                } &lt;br&gt;        } &lt;br&gt;
&lt;p&gt;        public void fireUpKey(SourcesTableEvents sender) { &lt;br&gt;                for (Iterator it = iterator(); it.hasNext();) { &lt;br&gt;                        MyTableListener listener = (MyTableListener) &lt;br&gt;it.next(); &lt;br&gt;                        listener.onUpKey(sender); &lt;br&gt;                } &lt;br&gt;        } &lt;br&gt;        public void fireDownKey(SourcesTableEvents sender) { &lt;br&gt;                for (Iterator it = iterator(); it.hasNext();) { &lt;br&gt;                        MyTableListener listener = (MyTableListener) &lt;br&gt;it.next(); &lt;br&gt;                        listener.onDownKey(sender); &lt;br&gt;                } &lt;br&gt;        } &lt;/div&gt;
&lt;p&gt;详细请看：&lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/861b1cb22c8423c3/fcaf84884d8d3d13?lnk=gst&amp;amp;q=table+row+double+click&amp;amp;rnum=1#fcaf84884d8d3d13"&gt;http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/861b1cb22c8423c3/fcaf84884d8d3d13?lnk=gst&amp;amp;q=table+row+double+click&amp;amp;rnum=1#fcaf84884d8d3d13&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5815636772130029849&amp;page=RSS%3a+%e8%ae%a9GWT%e7%9a%84FlexTable%e6%94%af%e6%8c%81%e5%8f%8c%e5%87%bb%ef%bc%88double+click%ef%bc%89&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=dengyin2000.spaces.live.com&amp;amp;GT1=dengyin2000"&gt;</description><comments>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!253.entry#comment</comments><guid isPermaLink="true">http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!253.entry</guid><pubDate>Fri, 24 Nov 2006 05:57:52 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://dengyin2000.spaces.live.com/blog/cns!AF4AB52B167D7EE7!253/comments/feed.rss</wfw:commentRss><wfw:comment>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!253.entry#comment</wfw:comment><dcterms:modified>2006-11-24T05:57:52Z</dcterms:modified></item><item><title>小试GWT</title><link>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!246.entry</link><description>当gwt发布的时候我就初略的看了gwt的文档。当时没有在注意这个东西。当自己经过ajax， javascript洗礼后，蓦然想试试gwt这个东西。原卷了javascript的开发效率（虽然FF 有firebug， IE下面有VS）。我也不确定gwt是否会提高开发效率（我也没有用gwt做过项目），但是就评google的技术，而且可以用java去写页面代码。 我觉得有必要试试。&lt;br&gt;&lt;br&gt;发了些时间看了gwt的&lt;a href="http://code.google.com/webtoolkit/gettingstarted.html"&gt;Getting started guide&lt;/a&gt; 和 &lt;a href="http://code.google.com/webtoolkit/documentation/"&gt;Develop guide&lt;/a&gt;  这个写得还是非常简单明了的。gwt会把你写的这些client java代码编译成html和js。应该大部分都是js吧。&lt;br&gt;&lt;br&gt;在实践Reomte produce call 遇到的一个问题， 我把 MyService.java MyServiceImpl.java, MyServiceAsync.java都放在了com.dengyin.client包中，然后程序运行的时候老是会出现&amp;quot;com.google.gwt.user.server包找不到的错误&amp;quot;， 但是程序运行是正常的。但是classpath中确实有MyServiceImpl这个类，后来在&lt;a href="http://groups.google.com/group/Google-Web-Toolkit"&gt;gwt develop forum&lt;/a&gt;    找到答案。 问题原因应该是gwt在真正运行前会先独立的编译com.dengyin.client包下的所有的类。但在编译的时候是不会把com.google.gwt.user.server中的类include进来。但是MyServiceImpl继承了RemoteServiceServlet，RemoteServiceServlet是在com.google.gwt.user.server包里面的，所以会发生这个问题。其实想想也就知道gwt为什么强制用户要有client这个包的原因了， 所有在client包里面的类都不应该跟Server端的有关系，在这个包里面的所有类应该仅仅是跟界面有关系。解决办法是把MyServiceImpl移到com.dengyin.server包里面。&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5815636772130029849&amp;page=RSS%3a+%e5%b0%8f%e8%af%95GWT&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=dengyin2000.spaces.live.com&amp;amp;GT1=dengyin2000"&gt;</description><comments>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!246.entry#comment</comments><guid isPermaLink="true">http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!246.entry</guid><pubDate>Wed, 25 Oct 2006 09:42:06 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://dengyin2000.spaces.live.com/blog/cns!AF4AB52B167D7EE7!246/comments/feed.rss</wfw:commentRss><wfw:comment>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!246.entry#comment</wfw:comment><dcterms:modified>2006-10-25T09:42:06Z</dcterms:modified></item><item><title>JSON RPC call remote methods in a Java Application Server， 轻松实现ajax特性。</title><link>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!213.entry</link><description>JSON RPC JAVA 使在javascript中直接调用Java Class，而且可以hand到Java Class的返回值。然后你可以用返回的值去填充Html。&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;a&gt;JSONRPCBridge 这个是连接JSONRPC Client和我们Server端的桥梁，我们需要把我们想要调用的Server端的OBject注册到Bridge，在应用程序中我们通常注册到J&lt;/a&gt;SONRPCBridge.getGlobalBridge()中， 这是一个单例，我们程序都share这个类，还有一种做法是每次请求都create一个&lt;a&gt;JSONRPCBridge然后把这个放到session，单我觉得没有必要这样做，直接用&lt;/a&gt;&lt;a&gt;J&lt;/a&gt;SONRPCBridge.getGlobalBridge()就行了。&lt;p&gt;JSONRPCBridge.getGlobalBridge().registerObject(&amp;quot;myObject&amp;quot;, myObject);&lt;p&gt;注册之后我们就能在client使用javascript调用这个myObject了。&lt;br&gt;&lt;pre&gt;var jsonrpc = new JSONRpcClient(&amp;quot;/webapp/JSON-RPC/&amp;quot;);&lt;br&gt;&lt;/pre&gt;&lt;p&gt;&lt;a&gt;Synchronous calls&lt;/a&gt;&lt;br&gt;&lt;p&gt;jsonrpc.myObject.echo(&amp;quot;hello&amp;quot;);&lt;p&gt;&lt;a&gt;Asynchronous calls&lt;/a&gt;&lt;pre&gt;jsonrpc.test.echo(cb, &amp;quot;hello&amp;quot;);&lt;br&gt;&lt;br&gt;function cb(result, exception) {&lt;br&gt;  if(exception) { alert(exception.message); }&lt;br&gt;  // do stuff here ...&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;&lt;p&gt;我们可以在cb函数中多返回值result进行处理。&lt;p&gt;其实JSON RPC JAVA的运行原理还是比较容易理解的，把需要调用的对象注册到JSONRPCBridge中，然后JSONRpcClient使用XMLHTTPRequest发送一些规则信息到JSONRPCServlet，JSONRPCServlet根据那些规则然后去调用注册到JSONRPCBridge中对象的方法，然后在把返回值response给JSONRpcClient，然后你就可以调用cb函数去处理其中的result了。但是我们知道这里的result已经是javascript中对应的对象了 int， array。。JSON RPC JAVA是怎样处理的呢？com.metaparadigm.jsonrpc.JSONSerializer com.metaparadigm.jsonrpc.Serializer 他们负责把一些规则的string在javascript中转换成在java中使用的对象，把一些java对象转换成javascript中的对象。JSON RPC JAVA中内置了一些Serializer。请看JSONSerializer.registerDefaultSerializers()方法。&lt;p&gt;    public void registerDefaultSerializers()&lt;br&gt;    throws Exception&lt;br&gt;    {&lt;br&gt;    registerSerializer(new BeanSerializer());&lt;br&gt;    registerSerializer(new ArraySerializer());&lt;br&gt;    registerSerializer(new DictionarySerializer());&lt;br&gt;    registerSerializer(new MapSerializer());&lt;br&gt;    registerSerializer(new SetSerializer());&lt;br&gt;    registerSerializer(new ListSerializer());&lt;br&gt;    registerSerializer(new DateSerializer());&lt;br&gt;    registerSerializer(new StringSerializer());&lt;br&gt;    registerSerializer(new NumberSerializer());&lt;br&gt;    registerSerializer(new BooleanSerializer());&lt;br&gt;    registerSerializer(new PrimitiveSerializer());&lt;br&gt;    }当然你也可以自己写些自定义的Serializer，具体请看文档。&lt;br&gt;&lt;br&gt;现在项目中是把JSON RPC JAVA注册一些由Spring管理的对象。这样其实我们就需要在Spring注册ApplicationContext到ServletContext后再把里面的一些对象注册到JSONRPCBridge.getGlobalBridge()， 然后我们就可以在任何的html页面中调用那些对象。&lt;br&gt;&lt;p&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5815636772130029849&amp;page=RSS%3a+JSON+RPC+call+remote+methods+in+a+Java+Application+Server%ef%bc%8c+%e8%bd%bb%e6%9d%be%e5%ae%9e%e7%8e%b0ajax%e7%89%b9%e6%80%a7%e3%80%82&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=dengyin2000.spaces.live.com&amp;amp;GT1=dengyin2000"&gt;</description><comments>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!213.entry#comment</comments><guid isPermaLink="true">http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!213.entry</guid><pubDate>Thu, 03 Aug 2006 02:52:22 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://dengyin2000.spaces.live.com/blog/cns!AF4AB52B167D7EE7!213/comments/feed.rss</wfw:commentRss><wfw:comment>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!213.entry#comment</wfw:comment><dcterms:modified>2006-08-03T02:52:22Z</dcterms:modified></item><item><title>重拾AJAX IN ACTION.</title><link>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!186.entry</link><description>还是应该认真看看Ajax in action这本书. 自己应该认真学习学习javascript. 顺便下了Javascript犀牛书. 再结合Tacos的源码看看.  看看Tacos是怎么在tapestry实现的ajax组件.  &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5815636772130029849&amp;page=RSS%3a+%e9%87%8d%e6%8b%beAJAX+IN+ACTION.&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=dengyin2000.spaces.live.com&amp;amp;GT1=dengyin2000"&gt;</description><comments>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!186.entry#comment</comments><guid isPermaLink="true">http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!186.entry</guid><pubDate>Mon, 10 Apr 2006 01:50:36 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://dengyin2000.spaces.live.com/blog/cns!AF4AB52B167D7EE7!186/comments/feed.rss</wfw:commentRss><wfw:comment>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!186.entry#comment</wfw:comment><dcterms:modified>2006-04-10T01:50:36Z</dcterms:modified></item><item><title>Ajax in action读后感(1)</title><link>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!145.entry</link><description>&lt;div&gt;Ajax是2005年最流行的Java词汇之一。 它可能会引起Web的一场革命。 呵呵， 好像革命已经开始了。有了google为我们打头炮，我们应该有了保障。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; 看过一些Ajax的文章， 对Ajax的基本工作流程还是了解的。也做过一些Ajax的应用，用的是Tapestry和tacos4。用了Tacos4感觉不到Ajax的存在。你甚至不用碰一点Javascript的东西（确实是这样的），只能怪Tacos做得太好了。我对Javascript的认识也停留在对客户端的一些字段的验证上，我知道Javascript能做的东西远远不止这些。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;前几天在晚上无意找到Ajax in action这本电子书， 迫不及待开始看这本600多页的英文书。可惜本人英文水平太低， 只能借助金山糍粑了。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;看完了Part 1 Rethinking the web application。&lt;/div&gt;
&lt;div&gt;The key elements of Ajax： Css， Javascript， DOM， XMLHttpRequest object.&lt;/div&gt;
&lt;div&gt;这上面的四种东西对我来说基本上是盲区。 特别是Javascript，对它的语法， 语言结构， OO的特性都不了解， 所以当后面讲到对Javascript做Refact的时候， 我开始感觉有点象看天书了。我想那些Ajax的框架应该是把一些Ajax里面的通用的代码抽象出来， 做成一个通用的模块。 我想我现在应该去找本javascript语言的基础书，要不然后面肯定看不下去了。唉， 真的有点累。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-5815636772130029849&amp;page=RSS%3a+Ajax+in+action%e8%af%bb%e5%90%8e%e6%84%9f(1)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=dengyin2000.spaces.live.com&amp;amp;GT1=dengyin2000"&gt;</description><comments>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!145.entry#comment</comments><guid isPermaLink="true">http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!145.entry</guid><pubDate>Tue, 03 Jan 2006 13:46:30 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://dengyin2000.spaces.live.com/blog/cns!AF4AB52B167D7EE7!145/comments/feed.rss</wfw:commentRss><wfw:comment>http://dengyin2000.spaces.live.com/Blog/cns!AF4AB52B167D7EE7!145.entry#comment</wfw:comment><dcterms:modified>2006-01-03T13:46:30Z</dcterms:modified></item></channel></rss>