??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av无码国产精品夜色午夜,亚洲国产精品成人综合久久久,亚洲精品无码成人片久久不卡 http://m.tkk7.com/bennybao/<div style="position: relative; left: 200"><font color="#E0E0E)">-&nbsp;BennyBao</font></div>zh-cnMon, 12 May 2025 16:30:49 GMTMon, 12 May 2025 16:30:49 GMT60[引文] 我们需要重新思考Model2的h(hun)?/title><link>http://m.tkk7.com/bennybao/archive/2006/09/08/68613.html</link><dc:creator>BennyBao</dc:creator><author>BennyBao</author><pubDate>Fri, 08 Sep 2006 14:16:00 GMT</pubDate><guid>http://m.tkk7.com/bennybao/archive/2006/09/08/68613.html</guid><wfw:comment>http://m.tkk7.com/bennybao/comments/68613.html</wfw:comment><comments>http://m.tkk7.com/bennybao/archive/2006/09/08/68613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/bennybao/comments/commentRss/68613.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/bennybao/services/trackbacks/68613.html</trackback:ping><description><![CDATA[ <font face="Verdana" size="2"> <em>收藏一DLEE老大的文章,里面的话句句说到了我的心坎里?br /></em> <br />Z么我说Struts/WebWork?x)受到Ajax的威胁呢Q有的h可能觉得大家相安无事不是很好Q你是不是有经病故意挑起h民内部矛盾?问题是他们之间确实存在着一些深层的内在矛盾和冲H,q些矛盾才是目前Struts?WebWork都只能在非常有限的程度上支持Ajax的原因。所以,问题是架构性的Qƈ不是型的修补或者更好的~程技巧可以彻底解决的?</font> <p class="paragraph"> <font face="Verdana" size="2">传统的服务器端MVC架构设计Q也是Model2Q,存在着一个基本的假设是Web应用的工作流是由一pd的页面切换构成的。这U架构中的一个ViewQ从语义上来讲只能代表一个完整的HTML面。整个Web应用的表现层Q被划分成ؓ(f)非常多的面的组合?</font> </p> <p class="paragraph"> <font face="Verdana" size="2">而Ajax开发者眼里,W(xu)eb应用的工作流q不是这h成的。Ajax开发者看待Web应用的角度与传统开发者相比差别非常大。在一个Ajax应用中,只有相对很少的页面。每个页面,包括面引用CSS样式、JS脚本Q都是一个更型的Ajax应用。甚至一些功能简单的Ajax应用Q本w仅仅由一个单一的页面构成。例如一个简单的RSS阅读器,q有IBMW记本上那个获得天气预报的桌面?br />按照Ajax in ActionQAjax应用可以分成3U类型:(x) </font> </p> <ol> <li> <font face="Verdana" size="2">以内容ؓ(f)中心的应用,服务器返回的是一DHTML内容?</font> </li> <li> <font face="Verdana" size="2">以脚本ؓ(f)中心的应用,服务器返回的是一DJS脚本?</font> </li> <li> <font face="Verdana" size="2">以数据ؓ(f)中心的应用,服务器返回的是一D|据,可以是XML格式、JSON格式或者其他文本格式?</font> </li> </ol> <font face="Verdana" size="2">服务器返回给Ajax应用?U类型的|络量Q不UCؓ(f)数据是与上面W?UAjax应用相区别)(j)QQ何一U都不能被简单地视作传统MVC架构中的ViewQ因Z们各自所代表的语义与传统MVC架构中的View的语义是完全不同的。所以可以看出,除了初次交付l浏览器一个完整的Ajax应用之外Q传l的MVC架构对于Ajax应用的支持是非常有限的。其实ؓ(f)了给客户端提供上?cȝl流量,一个Servlet已经_了。DWR、JSON-RPC、Buffalo在服务器端也是由Servlet实现的,不要求服务器端一定要安装某种MVC框架?br />上面3cd用,前面的两c,客户端JS代码比较单,表现逻辑仅有一部分位于客户端,大部分仍然位于服务器端,因此传统的服务器端MVC架构仍然是非常有价值的。但是大家注意第3cAjax应用Q实际上它已l将l大部分甚至可以全部的表现逻辑都{Ud客户端来执行Q这个时候服务器端传l的Web表现层实际上被架IZQ皮之不存,毛将焉附Q)(j)。而对于Ajax应用来说Q虽然近期可能还是以W?cAjax应用ZQ例如,所谓的AHAH技术)(j)Q但是最有生命力和发展前景的q是W?cAjax应用?</font> <p class="paragraph"> <font face="Verdana" size="2">自从1999qM$推出IE5.0支持XMLHTTPQ可以不h面以异步方式从服务器获取数据之后,W(xu)eb开发的领域埋下了一颗定时炸弹(6q以后,一个新词Ajax的出现引爆了q颗炸弹Q。Model2最初的设计应该发生在这件大事(现在应该承认QM$做了一件天大的好事Q发生之前,其设计师不可能想到异步请求的价倹{按照Model2的设计思想直接产生了Struts。但是后来的WebWork在最初设计阶D仍然与q个技术失之交臂,q是相当可惜的一件事情。WebWork其实最初设计的时候就可以走的更远Q但是他们只惌StrutsQ做一个更好的Model2 MVC开发框架。现在他们再惌上这班列车已l有Ҏ(gu)了。如果基的服务器端MVC架构的h(hun)值是可疑的,那么其他围绕q个架构所开发的基础架构的h(hun)g同样是可疑的?</font> </p> <p class="paragraph"> <font face="Verdana" size="2">所以在现在q个时刻Q重新正本清源地思考Model2最初的设计Q它带来的Web开发的巨大q步Q以?qing)它所存在的不I是一个非常现实的问题?/font> </p> <img src ="http://m.tkk7.com/bennybao/aggbug/68613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/bennybao/" target="_blank">BennyBao</a> 2006-09-08 22:16 <a href="http://m.tkk7.com/bennybao/archive/2006/09/08/68613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为Ajax的XMLHttpRequest提供对象?模仿Apache中ObjectPool的实?http://m.tkk7.com/bennybao/archive/2006/09/08/68566.htmlBennyBaoBennyBaoFri, 08 Sep 2006 09:47:00 GMThttp://m.tkk7.com/bennybao/archive/2006/09/08/68566.htmlhttp://m.tkk7.com/bennybao/comments/68566.htmlhttp://m.tkk7.com/bennybao/archive/2006/09/08/68566.html#Feedback3http://m.tkk7.com/bennybao/comments/commentRss/68566.htmlhttp://m.tkk7.com/bennybao/services/trackbacks/68566.html阅读全文

BennyBao 2006-09-08 17:47 发表评论
]]>
JavaScript中try...catch和异常处?/title><link>http://m.tkk7.com/bennybao/archive/2006/09/05/67862.html</link><dc:creator>BennyBao</dc:creator><author>BennyBao</author><pubDate>Tue, 05 Sep 2006 09:56:00 GMT</pubDate><guid>http://m.tkk7.com/bennybao/archive/2006/09/05/67862.html</guid><wfw:comment>http://m.tkk7.com/bennybao/comments/67862.html</wfw:comment><comments>http://m.tkk7.com/bennybao/archive/2006/09/05/67862.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/bennybao/comments/commentRss/67862.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/bennybao/services/trackbacks/67862.html</trackback:ping><description><![CDATA[ <font face="Verdana" size="2">在JavaScript可以使用try...catch来进行异常处理。例如:(x) </font> <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"> <font face="Verdana"> <font size="2"> <img id="Codehighlighter1_4_21_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_21_Open_Text.style.display='none'; Codehighlighter1_4_21_Closed_Image.style.display='inline'; Codehighlighter1_4_21_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_4_21_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_21_Closed_Text.style.display='none'; Codehighlighter1_4_21_Open_Image.style.display='inline'; Codehighlighter1_4_21_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">try</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_4_21_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <font face="Verdana"> <font size="2"> <span id="Codehighlighter1_4_21_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    foo.bar();<br /><img id="Codehighlighter1_33_73_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_73_Open_Text.style.display='none'; Codehighlighter1_33_73_Closed_Image.style.display='inline'; Codehighlighter1_33_73_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_33_73_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_73_Closed_Text.style.display='none'; Codehighlighter1_33_73_Open_Image.style.display='inline'; Codehighlighter1_33_73_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000"> (e) </span> <span id="Codehighlighter1_33_73_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_33_73_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    alert(e.name </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"> </span> <span style="COLOR: #000000">+</span> </font> </font> <span style="COLOR: #000000"> <font face="Verdana" size="2"> e.message);<br /><img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</font> </span> </span> </div> <br /> <font face="Verdana" size="2">目前我们可能得到的系l异怸要包含以?U?</font> <font face="Verdana" size="2"> <br /> </font> <ul> <li> <font face="Verdana"> <font size="2"> <strong>EvalError</strong>: raised when an error occurs executing code in eval() </font> </font> </li> <li> <font face="Verdana"> <font size="2"> <strong>RangeError</strong>: raised when a numeric variable or parameter is outside of its valid range </font> </font> </li> <li> <font face="Verdana"> <font size="2"> <strong>ReferenceError</strong>: raised when de-referencing an invalid reference </font> </font> </li> <li> <font face="Verdana"> <font size="2"> <strong>SyntaxError</strong>: raised when a syntax error occurs while parsing code in eval() </font> </font> </li> <li> <font face="Verdana"> <font size="2"> <strong>TypeError</strong>: raised when a variable or parameter is not a valid type </font> </font> </li> <li> <font face="Verdana"> <font size="2"> <strong>URIError</strong>: raised when encodeURI() or decodeURI() are passed invalid parameters </font> </font> </li> </ul> <p> <font face="Verdana" size="2">上面的六U异常对象都l承?strong>Error</strong>对象。他们都支持以下两种构造方? </font> </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"> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff">new</span> </font> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> Error();<br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> Error(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">异常信息</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> </font> </font> </div> <p> <font face="Verdana" size="2">手工抛出异常的方法如下:(x)</font> </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"> <font face="Verdana"> <font size="2"> <img id="Codehighlighter1_4_38_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_38_Open_Text.style.display='none'; Codehighlighter1_4_38_Closed_Image.style.display='inline'; Codehighlighter1_4_38_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_4_38_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_38_Closed_Text.style.display='none'; Codehighlighter1_4_38_Open_Image.style.display='inline'; Codehighlighter1_4_38_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">try</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_4_38_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_4_38_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">throw</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> Error(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Whoops!</span> <span style="COLOR: #000000">"</span> </font> </font> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">);<br /><img id="Codehighlighter1_50_90_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_90_Open_Text.style.display='none'; Codehighlighter1_50_90_Closed_Image.style.display='inline'; Codehighlighter1_50_90_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_50_90_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_90_Closed_Text.style.display='none'; Codehighlighter1_50_90_Open_Image.style.display='inline'; Codehighlighter1_50_90_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span> </font> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000"> (e) </span> <span id="Codehighlighter1_50_90_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_50_90_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    alert(e.name </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"> </span> <span style="COLOR: #000000">+</span> </font> </font> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> e.message);<br /><img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </font> </font> </span> </div> <p> <font face="Verdana" size="2">如要判断异常信息的类型,可在catch中进行判断:(x)</font> </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"> <font face="Verdana"> <font size="2"> <img id="Codehighlighter1_4_21_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_21_Open_Text.style.display='none'; Codehighlighter1_4_21_Closed_Image.style.display='inline'; Codehighlighter1_4_21_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_4_21_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_21_Closed_Text.style.display='none'; Codehighlighter1_4_21_Open_Image.style.display='inline'; Codehighlighter1_4_21_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">try</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_4_21_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <font face="Verdana"> <font size="2"> <span id="Codehighlighter1_4_21_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    foo.bar();<br /><img id="Codehighlighter1_33_216_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_216_Open_Text.style.display='none'; Codehighlighter1_33_216_Closed_Image.style.display='inline'; Codehighlighter1_33_216_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_33_216_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_216_Closed_Text.style.display='none'; Codehighlighter1_33_216_Open_Image.style.display='inline'; Codehighlighter1_33_216_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000"> (e) </span> <span id="Codehighlighter1_33_216_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_33_216_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img id="Codehighlighter1_67_115_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_115_Open_Text.style.display='none'; Codehighlighter1_67_115_Closed_Image.style.display='inline'; Codehighlighter1_67_115_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_67_115_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_115_Closed_Text.style.display='none'; Codehighlighter1_67_115_Open_Image.style.display='inline'; Codehighlighter1_67_115_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (e </span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000"> EvalError) </span> <span id="Codehighlighter1_67_115_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_67_115_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        alert(e.name </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"> </span> <span style="COLOR: #000000">+</span> </font> </font> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> e.message);<br /><img id="Codehighlighter1_151_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_151_199_Open_Text.style.display='none'; Codehighlighter1_151_199_Closed_Image.style.display='inline'; Codehighlighter1_151_199_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_151_199_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_151_199_Closed_Text.style.display='none'; Codehighlighter1_151_199_Open_Image.style.display='inline'; Codehighlighter1_151_199_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span> </font> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (e </span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000"> RangeError) </span> <span id="Codehighlighter1_151_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_151_199_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        alert(e.name </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"> </span> <span style="COLOR: #000000">+</span> </font> </font> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> e.message);<br /><img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </font> </font> </span> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </font> </span> <font face="Verdana" size="2"> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> <img src="http://m.tkk7.com/images/dot.gif" /> etc</span> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">}</span> </font> </font> </span> </div> <p> <font face="Verdana" size="2">Errorh下面一些主要属性:(x) </font> </p> <ul> <li> <font face="Verdana" size="2">description: 错误描述 (仅IE可用). </font> </li> <li> <font face="Verdana" size="2">fileName: 出错的文件名 (仅Mozilla可用). </font> </li> <li> <font face="Verdana" size="2">lineNumber: 出错的行?(仅Mozilla可用). </font> </li> <li> <font face="Verdana" size="2">message: 错误信息 (在IE下同description) </font> </li> <li> <font face="Verdana" size="2">name: 错误cd. </font> </li> <li> <font face="Verdana" size="2">number: 错误代码 (仅IE可用). </font> </li> <li> <font face="Verdana" size="2">stack: 像Java中的Stack Trace一L(fng)错误堆栈信息 (仅Mozilla可用). </font> </li> </ul> <font face="Verdana" size="2">因此Z更好的了解错误信息我们可以将catch部分改ؓ(f)如下形式Q?<br /><br /></font> <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"> <font face="Verdana"> <font size="2"> <img id="Codehighlighter1_4_18_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_18_Open_Text.style.display='none'; Codehighlighter1_4_18_Closed_Image.style.display='inline'; Codehighlighter1_4_18_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_4_18_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_18_Closed_Text.style.display='none'; Codehighlighter1_4_18_Open_Image.style.display='inline'; Codehighlighter1_4_18_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">try</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_4_18_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <font face="Verdana"> <font size="2"> <span id="Codehighlighter1_4_18_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    foo.bar();<br /><img id="Codehighlighter1_30_382_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_382_Open_Text.style.display='none'; Codehighlighter1_30_382_Closed_Image.style.display='inline'; Codehighlighter1_30_382_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_30_382_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_382_Closed_Text.style.display='none'; Codehighlighter1_30_382_Open_Image.style.display='inline'; Codehighlighter1_30_382_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000"> (e) </span> <span id="Codehighlighter1_30_382_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_30_382_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img id="Codehighlighter1_64_240_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_240_Open_Text.style.display='none'; Codehighlighter1_64_240_Closed_Image.style.display='inline'; Codehighlighter1_64_240_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_64_240_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_64_240_Closed_Text.style.display='none'; Codehighlighter1_64_240_Open_Image.style.display='inline'; Codehighlighter1_64_240_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (browserType </span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000"> BROWSER_IE) </span> <span id="Codehighlighter1_64_240_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_64_240_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{                            <br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        alert(<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">name: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> e.name </span> <span style="COLOR: #000000">+</span> </font> </font> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">\nmessage: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> e.message </span> <span style="COLOR: #000000">+</span> </font> </font> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">\nlineNumber: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> e.lineNumber </span> <span style="COLOR: #000000">+</span> </font> </font> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">\nfileName: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> e.fileName </span> <span style="COLOR: #000000">+</span> </font> </font> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">\nstack: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> </font> </font> <span style="COLOR: #000000"> <font face="Verdana" size="2"> e.stack);        <br /><img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</font> </span> </span> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img id="Codehighlighter1_248_380_Open_Image" onclick="this.style.display='none'; Codehighlighter1_248_380_Open_Text.style.display='none'; Codehighlighter1_248_380_Closed_Image.style.display='inline'; Codehighlighter1_248_380_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_248_380_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_248_380_Closed_Text.style.display='none'; Codehighlighter1_248_380_Open_Image.style.display='inline'; Codehighlighter1_248_380_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_248_380_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_248_380_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{                    <br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        alert(<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">name: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> e.name </span> <span style="COLOR: #000000">+</span> </font> </font> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">    <br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">\nerrorNumber: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> (e.number </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">0xFFFF</span> <span style="COLOR: #000000">) </span> <span style="COLOR: #000000">+</span> </font> </font> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">\nmessage: </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> e.message</span> <span style="COLOR: #000000">"</span> </font> </font> <span style="COLOR: #000000"> <font face="Verdana" size="2">);        <br /><img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</font> </span> </span> <span style="COLOR: #000000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</font> </span> </span> </div> <br /> <font face="Verdana" size="2">JavaScript中的throw命o(h)事实上可以抛ZQ何对象,q且我们可以在catch接受到此对象。例如:(x)<br /><br /></font> <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"> <font face="Verdana"> <font size="2"> <img id="Codehighlighter1_4_37_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_37_Open_Text.style.display='none'; Codehighlighter1_4_37_Closed_Image.style.display='inline'; Codehighlighter1_4_37_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_4_37_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_37_Closed_Text.style.display='none'; Codehighlighter1_4_37_Open_Image.style.display='inline'; Codehighlighter1_4_37_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">try</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_4_37_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_4_37_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">throw</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> Date();    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 抛出当前旉对象</span> </font> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img id="Codehighlighter1_49_95_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_95_Open_Text.style.display='none'; Codehighlighter1_49_95_Closed_Image.style.display='inline'; Codehighlighter1_49_95_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_49_95_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_95_Closed_Text.style.display='none'; Codehighlighter1_49_95_Open_Image.style.display='inline'; Codehighlighter1_49_95_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </font> </span> <span style="COLOR: #000000"> <font face="Verdana" size="2">}</font> </span> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000"> (e) </span> <span id="Codehighlighter1_49_95_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://m.tkk7.com/images/dot.gif" /> </span> </font> </font> <span id="Codehighlighter1_49_95_Open_Text"> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    alert(e.toLocaleString());    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 使用本地格式昄当前旉</span> </font> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </font> </span> <span style="COLOR: #000000"> <font face="Verdana" size="2">}</font> </span> </span> </div> <img src ="http://m.tkk7.com/bennybao/aggbug/67862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/bennybao/" target="_blank">BennyBao</a> 2006-09-05 17:56 <a href="http://m.tkk7.com/bennybao/archive/2006/09/05/67862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创] Web表现层的Client端设计模式探?/title><link>http://m.tkk7.com/bennybao/archive/2006/09/03/67337.html</link><dc:creator>BennyBao</dc:creator><author>BennyBao</author><pubDate>Sat, 02 Sep 2006 16:26:00 GMT</pubDate><guid>http://m.tkk7.com/bennybao/archive/2006/09/03/67337.html</guid><wfw:comment>http://m.tkk7.com/bennybao/comments/67337.html</wfw:comment><comments>http://m.tkk7.com/bennybao/archive/2006/09/03/67337.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://m.tkk7.com/bennybao/comments/commentRss/67337.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/bennybao/services/trackbacks/67337.html</trackback:ping><description><![CDATA[ <p> <font face="Verdana"> <font size="2"> <em>本文着重讨论的是具有RIA特征的Web应用。例如目前比较流行的的AjaxcWeb应用。传l的ZUHTML的Web应用不在本文讨论之列?/em> <br /> <br />随着Ajax的升温,开发h员逐渐对Web应用中的各种UI控g和开发框架开始有了越来越厚的兴。目前所知的q方面的控g集或开发框架可以说是ƈ不鲜见。笔者将q些产品大致分ؓ(f)两个大类Q离散控仉型和数据模型驱动型。这两个词大家应该很陌生Q因Z们都是鄙造的?br /><br /><strong>L控g集型</strong> Q?此类产品以提供一pd相对独立的界面控件ؓ(f)主要目的。控件的cd比较全面Q例如搭建Web应用常见的各UGrid、Tree、Menu、ToolBar、Window{。不q此cM品一般不?x)过多的考虑界面中的数据和操作逻辑的封装,臛_只会(x)提供相对单的静态数据绑?。我认ؓ(f)此类产品的主要出发点是改善Web应用的界面表现能力,同时借助自带的SDK提供一U更加规范的开发模式?br />目前我所知的大部分品似乎都属于q一cd。例? backbase、qooxdoo、NetAdventage、bindows{?br />Backbase实例中心: </font> </font> <a target="_blank"> <font face="Verdana" size="2">http://www.backbase.com/demos/explorer </font> </a> <br /> <br /> <font size="2"> <font face="Verdana"> <strong>数据模型驱动?/strong> Q?此类产品除了要提供一l比较好用的UI控g集之外,更会(x)提供对界面中数据模型的管理功能。其UI控g以数据敏感控件ؓ(f)丅R数据敏感控件可以通过于数据模型的l定来实现对表现层中数据的展C和控制。这U数据绑定可成ؓ(f)动态数据绑?。可以说q一cM品的主要出发炚w改善Web应用的界面表现能力外Q也非常注重提供一U快速开发的模式?br />好的数据模型驱动型的开发框架应该首先包含离散控仉中的各种功能Q它事实上是一U相对于单纯的UI控g集而言更高层次的抽象?br /><img height="173" alt="o_binding.png" src="http://m.tkk7.com/images/blogjava_net/bennybao/14638/o_binding.png" width="320" border="0" /><br />q种模式其实在以前CS下非常常见,例如VB、Delphi{RAD开发工h交数据库应用开发模式都属于q种cd。不q到了BS下h们似乎都忘记q种开发模式。可能是因ؓ(f)不够见多识广Q目前笔者所知的此类产品只有dorado?br />dorado的示例中心:(x)</font> <font face="Verdana"> <a target="_blank">http://sample.bstek.com</a> </font> </font> </p> <p> <font face="Verdana" size="2">对于上面提到的两U数据绑定方式的解释如下Q?br /><br /><strong>静态数据绑?/strong> ?是指在控件可以根据指z他的数据?往往是XML数据源或单的数组)自动的提取ƈ展示其中的数据。这U提取过E是d完成的,当提取过E结束后控g无法l箋感知数据源中数据的变化。这事实上是从控件到数据源的拉模?Pull Mode)?br /><br /><strong>动态数据绑?/strong> ?是指控件以观察者的角色注册到数据源(往往是经q封装的U有对象)中。数据源成ؓ(f)被观察者。当数据源中的数据或状态发生改变时?x)主动通知所有观察者(即绑定的控gQ,然后再由控g自动提取数据完成展现的更新。这样一旦绑定徏立以后控件就可以实时的体现数据源中的最新变化。如果用户利用这些控件对数据或状态做了改变,那么q种改变自然也会(x)通过数据源再实时的通知l所有其它相关的控g。这事实上是从数据源到控件的推模?Push Mode)?br /> <br />回到关于L控g集型和数据模型驱动型的讨论。这两种开发框枉有这自己的适用面。笔者认为离散控仉型的开发框架更加适合与一些像论坛q样更加注重展现的应用。而对于那些具有明显数据库应用Ҏ(gu)的的Web应用(例如MIScd?Q则数据模型驱动型的开发框架更能发挥它的优ѝ?br />得出以上l论的原因是我认为数据模型驱动型的开发框架能够开发h员将更多的精力投入到界面所需要实现的更能当中Q至在制作面的前期阶D不必太多的x界面的表现Ş式。同时如果能够将更多的界面操作逻辑装到数据模型对象中Q就可以保证在后期当最l用h出界面的修改要求Ӟ开发h员可以用更小的代h完成对界面的重构?br /><br />让我们来具体分析两个场景:<br /><br /><strong>场景1</strong>Q一个用惯了CS应用的用戯求开发一个界面来l护公司目前拥有的所有书c。ؓ(f)了方便的完成Ҏ(gu)有书c的CRUD操作Q用户希望以一个Grid控g来完成所有这些操作,同时用户希望能够在界面批量的完成一pdC、U、D操作之后一ơ性的Ҏ(gu)据进行保存。每本书c都有一个由pȝ自动分配的编码作Z键,因此用户不需要看Cc的~码?br />分析Q如果我们现在只有一个离散的Grid控g。要完成上述功能我们q需要做以下一些工?<br /><br /></font> </p> <li> <font face="Verdana" size="2">׃~码不在Grid中显C,因此扑ֈ一个办法能够管理每本书c的~码?</font> </li> <li> <font face="Verdana" size="2">׃客户端需要缓存用L(fng)一pdC、U、D操作然后作批量的提交处理Q因此必d一些工作以便记录下哪些书被修改了、哪些是新增的、哪些被删除了?</font> </li> <li> <font face="Verdana" size="2">在提交时所有的数据修改信息抽取出来l装成可用于提交的格式?br /><br />可见如果使用一个离散的Grid控g来制作这个界面,我们q必要做不工作。如果我们能够选择一个数据模型驱动型的开发框Ӟ上面提到的很多功能框架中往往已经具备。开发h员要做的往往只是声明好一个数据模型然后把它跟Grid兌h。如果?zhn)以前使用qVB或Delphiq一cd发功能,应该不难惛_q个q程?br /><br /><strong>场景2</strong>Q想像一个用户信息的录入界面Q如下图。用者需要输入用L(fng)w䆾证,׃什么证的号码中包含了很多信息,pȝ完全有可能从其中解析出出生日期和性别q样的信息。因此ؓ(f)了方便录入,我们可以让表单中的出生日期和性别q两个栏位支持自动填入缺省值的功能Q只要用户录入了w䆾证号码,可以马上自动填充上qC个栏位?/font> <p> <font face="Verdana" size="2"> <img height="182" alt="o_user_form1.png" src="http://m.tkk7.com/images/blogjava_net/bennybao/14638/o_user_form1.png" width="284" border="0" /> <br /> <br />在基于离散控件的~程方式中,我们需要知道n份证、出生日期、性别q三个编辑框的idQƈ针对他们q行~程。其代码形式可能如下:<br /><br /></font> </p> <p> <font face="Verdana" size="2"> </font> </p> <p> <font face="Verdana" size="2"> </font> </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"> <font face="Verdana"> <font size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">var id </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> inputId.getValue(); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 获得w䆾证号?/span> </font> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> <img src="http://m.tkk7.com/images/dot.gif" /> <img src="http://m.tkk7.com/images/dot.gif" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 对n份证q行解析</span> </font> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">inputBrithday.setValue(brithday); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 为出生日期设|缺省?/span> </font> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">radioGroupSex.setValue(sex); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 为性别讄~省?/span> </font> </font> </div> <p> <font face="Verdana" size="2"> </font> </p> <p> <font face="Verdana" size="2">在基于数据模型驱动型框架的编E方式中Q我们ƈ不需要关注界面上摆放了什么控Ӟ只需要知道关注如何操作数据模型对象。其代码形式可能如下:</font> </p> <p> <font face="Verdana" size="2"> </font> </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"> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">var id </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> dmUser.getValue(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">id</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 从数据模?dmUser)中提取n份证L(fng)</span> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000"> <img src="http://m.tkk7.com/images/dot.gif" /> <img src="http://m.tkk7.com/images/dot.gif" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 对n份证q行解析</span> </font> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">dmUser.setValue(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">birthday</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, brithday); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 为出生日期设|缺省?/span> </font> </font> <span style="COLOR: #008000"> <br /> <font face="Verdana" size="2"> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </font> </span> <font face="Verdana"> <font size="2"> <span style="COLOR: #000000">dmUser.setValue(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">sex</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, sex); </span> <span style="COLOR: #008000">//</span> </font> </font> <font face="Verdana"> <font size="2"> <span style="COLOR: #008000"> 为性别讄~省?br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span> </font> </font> </div> <p> <font face="Verdana" size="2">可见在这U开发模式中我们的代码几乎完全针Ҏ(gu)据模型展开Q当我们为dmUser中的brithday和sex赋值后Q相应的数据敏感控g?x)立刻自动显C出q些的数据。这L(fng)~程模式可以让代码有高度的一致性,当我们制作复杂的用户界面Ӟ可以不需要记住诸多的控gid?br />q一步假设。如果用h一天觉得这L(fng)界面q不方便对多W数据进行方便的l护Q而要求对界面q行如下调整。在删除原先的表单,利用一个Grid控g来对用户信息q行l护?br /><img height="329" alt="o_user_form2.png" src="http://m.tkk7.com/images/blogjava_net/bennybao/14638/o_user_form2.png" width="284" border="0" /><br />如果我们的编E方式是ZL控g的,那么我们不可避免的要对先前编写那D代码做一些调整了。我需要将那段代码UL到表格当中?br />但是如果我们的编E方式是Z数据模型驱动型框架的Q那么我们要做的只是界面上的表单删掉,然后在放|一个与现有数据模型l定的Grid控g。至于那D代码,它完全不需要做M变动?br /><br />lg可见Q在MIScWeb应用的表现层开发方面。数据模型驱动型的开发框架可以ؓ(f)开发h员带来更多的实惠。不知道随着旉的推U这一cȝ开发框架会(x)不会(x)丰富hQ?br /></font> </p> <p> <font face="Verdana" size="2"> </font> </p> </li> <img src ="http://m.tkk7.com/bennybao/aggbug/67337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/bennybao/" target="_blank">BennyBao</a> 2006-09-03 00:26 <a href="http://m.tkk7.com/bennybao/archive/2006/09/03/67337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创] 关于AJAX表现层的设计模式的思?[1]http://m.tkk7.com/bennybao/archive/2006/08/30/66542.htmlBennyBaoBennyBaoTue, 29 Aug 2006 17:55:00 GMThttp://m.tkk7.com/bennybao/archive/2006/08/30/66542.htmlhttp://m.tkk7.com/bennybao/comments/66542.htmlhttp://m.tkk7.com/bennybao/archive/2006/08/30/66542.html#Feedback3http://m.tkk7.com/bennybao/comments/commentRss/66542.htmlhttp://m.tkk7.com/bennybao/services/trackbacks/66542.html 本文着重讨论的是具有AJAX特征的WEB应用表现层的设计模式Q特别是如何设计表现层中展现数据的管理模式。同时本文假讑ֺ用的用户界面是操作性和交互性相对较强的MIScd用,因此其中的部分观点可能ƈ不适合以内容发布ؓ(f)ȝ互联|应用?/em>

被过度倚重的AJAX

自打2005q初W一回听说AJAX以来Q这个名词以飞快的速度传播Q走U的速度勘比李宇春。AJAX即不是新技术也不是很复杂的技术,它不q是ZWEB的RIA应用的一个操作特性(或技术特性)(j)而已。这一切的发生也许因ؓ(f)是AJAX出现的时机,那正是用户ؓ(f)了WEB应用那o(h)Z堪的操作性即抓狂,E序员ؓ(f)了难以实现的面操作逻辑而即崩溃之际。于是AJAX成了BS应用的救命稻草。颓废的Z看到了希望的曙光?

不过以鄙人拙见,大家如此热衷于讨论AJAXg有点本末倒置了。AJAX本nq不能帮我们上面提到的问题。我们需要应该一套完整的UIlg库,象VBQDELPHI、PB中的我们曄用过的那U组件库Q一套易于用有能够与各U开发模式的Ҏ(gu)的组件库。当然最好是带有AJAXҎ(gu)的lg库。但是现在我们好像还没有得到一套o(h)大家都满意的lg库,于是我们仍然只能讨论AJAX聊以充饥?

a归正传,要设计这L(fng)一套UIlg库还有很多障需要逾越?

1.       DHTMLQJavaScript的组件开发可不像在CS中那L(fng)单?
2.       如何有效的管理展现数据?
3.       让性能不在成ؓ(f)瓉?
4.       跨浏览器的兼Ҏ(gu)?
5.       好用的设计工兗?
???

览器端的MVC Q?部分表现层逻辑推向前端

在上面提到的几个障碍当中我感觉最被大家提及(qing)的就是第二条。拜读过dlee推荐?lt;Ajax in Action>Q其中提C在浏览器端应用MVC。不q书中只提到了数据与展现的分,却ƈ没有提到如何有效的管理这些用于展现的数据。V自不必想Q一定是指运行于览器中的各U可视化的控ӞM应该是指用于展现的数据;而C应当是指介于M和V之间的松耦合的关联关pR我想“浏览器端应用MVC”在其合理性上应该能够得到大家的共识,如同我们讨论Server端的MVC架构模式时一P从M的设计开始是我个人的?fn)惯思维Q应当也是浏览器端MVC中的重中之重。首先设计出一个健壮的表现层中的数据管理模式将为后面的工作打下一个良好基?br /> 

参考文?/span> : [原创] Web表现层的Client端设计模式探?/a>

q里提到的表现层应当是指包含Server端的展现相关的逻辑以及(qing)览器中的逻辑。在传统的开发方式中表现层逻辑往往只涉?qing)到Server端,而到了Client端已完全变成了HTML+CSS或XML+XSLT毫无设计模式可言。笔者认为随着技术的发展和AJAX的推动,我们有必要将一部分表现层逻辑推向览器已q一步增强界面的交互能力?

或许目前大家设计的WEB面q很需要考虑对展现数据的理。但是一旦有一天我们拥有了一套好用的UIlg库,那时我们设计的用户交互界面的复杂度也׃(x)H破目前我们?fn)惯认?f)的上限。想像一个稍微有点复杂的场景Q如果我们拥有了一个像Excel一L(fng)可以对Q意单元进行实时编辑的GridlgQ用户可以对其中的数据做L的增删改操作Q那么我们就必须要考虑一下如何将用户所填入的数据以合理有效的方式提交回Server端了?br /> 
CS中的展现数据模型对象

不过真的要来设计一U在表现层中的数据模型,q真是有点千头万~、无从下手。所以在具体考虑如何理q些数据之前Q我们先来看一看在传统的CS应用中数据是如何q行理的,有没有什么可以借鉴的东西?不约而同的,在这些开发模式中都能扑ֈ一U专用的数据模型对象Q在VB中它叫ADO.RecordSet、在Delphi中它叫TDataSet、在PB中它叫DataWindow。它们都有一些共同的特点Q?

1.       表驱动的l构, h当前记录的概c(din)?br />表驱动的设计模式是由关系型数据库自然衍生q来的设计方式,q种设计非常有利于用户对数据的浏览和~辑Q也W合我们对同l构扚w数据q行览和编辑的一般理解和?fn)惯?
o_grid.PNG

2.       控g可直接与数据模型q行l定?/span>

数据敏感控g与数据模型进行绑定,q自动的展示、修Ҏ(gu)控制其中的数据,q是CS中最常用的一U开发模式。其核心原理是设计模式中的观察者模式。数据模型是被观察者,控g是观察者。当数据模型中的数据发生变化Ӟ?x)主动的通知l定的控件做相应的刷新动作以实时的体现最新的数据。对于支持数据修Ҏ(gu)控制操作Q例如:(x)d记录的操作)(j)的控Ӟ如果用户利用其对l定的数据模型中的数据或状态做了改变,那么q种改变自然也会(x)实现通知l所有其它相关的控g中?br />o_binding.png 

但是在现在的
Java ?/span> BS
应用开发过E中我们往往比较?yu)的用到。即使有l大部分也只是只d的绑定?br />
3.       q型的数据理方式?qing)列描述对象?br />在上qCS应用中,数据对象大都以类似Map的方式对数据q行理Q而不是像我们在Java中更l常讨论的VO、PO的数据描q方式。对q型的数据对象而言Q真正的数据cd(相当于VO中属性的cd)是保存在一l列描述对象当中的?
在Java中我们习(fn)惯的d和设|属性的Ҏ(gu)往往?
employee.getName(); 
 employee.isMarried(); 
 … … …?br /> employee.setName(“Henry?; 

而在CS的开发的代码中读取和讄属性的Ҏ(gu)往往是(以ADO.RecordSetZQ:(x)
 dsEmployee(“name?; 
 dsEmployee(“married?; 
 … … …?br /> dsEmployee(“name?  
=   “Henry? 

4.       都具有一定的数据校验功能?qing)支持一些与展现相关的属性?br />数据对象中的列描q对象在描述属性名和数据类型的同时Q往往q包含了其它一些跟昄和编辑有关的Ҏ(gu),例如QreadOnly、format、validator{。以readOnly属性ؓ(f)例,当我们将数据模型中某个列的readOnly属性设|ؓ(f)true后,所有与该列相关的数据敏感控仉变成只ȝ状态。这L(fng)好处在于开发h员在~写面逻辑时不必过多的考虑面上堆砌了那些元素Q而之需要关注他要处理怎样的数据操作逻辑Q页面上大部分的操作逻辑或显C逻辑都将围绕数据模型对象而展开?br />
5.       支持事g。它们都拥有cMbeforeChange、afterChange、beforeDelete、afterDeleteq样的事Ӟ以便于开发h员能够利用这些事件提供一些简单的数据校验或操作逻辑?br />
BS中的展现数据模型的初步设?/b>

CS下的q些数据模型对象在早些年都有着成功的实c(din)试惻I能不能把q种在CS下的表现层设计模式移植到BS的开发当中呢Q不q鉴于BS架构更高的复杂的q个dq不单,按照我的设想l过UL的系l架构大致可能如下:(x)
o_arch1.png

图中数据模型对象被拆分成了两个部分,即Server端的实例和Client端的实例。当我们要将数据从Server端传递到Client端时Q系l首先应在Server端构Z个基于Java的数据模型,该数据模型对象的数据取自BO提供的VO。当?dng)如果Server端原本用了JSPQBean的开发模式,数据模型对象也可能直接取自JDBC的ResultSet。而后数据模型对象利用一套实现已装好的规则Q将数据以XML{方式输出到Client端。此时Client端的可视化控件就可以Ҏ(gu)据进行浏览和操作Q如果用户通过可视化控件对数据做了修改Q这些脏数据也将暂时被缓存在Client端数据模型对象中Q知道用hl点M提交按钮Q此pȝ再利用AJAX机制数据同步回Server端ƈ执行q一步的后台处理?br /> 
看v来我们好像已l有了一个很好的开局Q不q笔者认为在BS架构中完全照搬CS中的那套设计思\可能q不是最佳的Ҏ(gu)。主要原因在CS中的q些数据模型都是按照表结构驱动的方式设计的,其基本思\cM关系型数据库中的表。而我们在J2EE的设计模式中更常使用的却是模型驱动的设计方式。表l构驱动自认有它的有点,易于理解Q方便用。不q他也有一些致命的~陷Q特别是它不能很好的描述数据对象之间的关p,每当我们试图使用表驱动的模型来描q递归Q树(wi)Q主从关联这h据关p,L?x)感觉束手束脚。无疑,ZOO的对象模型的l构是一U更好的数据描述方式Q它往往能够更加准确的、真实的表达数据之间的关pR?br />
(未完待箋...) 
 


BennyBao 2006-08-30 01:55 发表评论
]]>
վ֩ģ壺 ޾ƷƷþ99| vaƷѹۿ| ߲| Av뾫Ʒ| ҹƷƵ| ɫͼɫС˵| ĻѸ| ޳aƬ߹ۿĶ| Ѿþˬˬav| ߾ƷһС˵| aaaëƬƵѹۿ| þþƷAɫ| freeƵ| avַ| aëƬȫѲ| ˾þں2019| 8xվ߹ۿ| ɫַ| 츾ҹƵ| 츾AV| ޳һ| ɫƬѿ| ۺɫһС˵| պһ| a뾫Ʒɫҹ| Ļ| òƵѿ| ޹ۺϵһƷС˵| 뾫ƷӰ| ƵѲ| ޸߲| ҹƵѹۿƵ| 99Ʒһ| ŷƵ| ˾Ʒ| ߹ۿѹۿ| պAVһ| ѹۿͰŮƵ| Ļϵ| һ| avһ|