﻿<?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-where the amazing happens</title><link>http://www.blogjava.net/zqc/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 14:30:39 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 14:30:39 GMT</pubDate><ttl>60</ttl><item><title>测试，测试，测试，给我tmd写测试！</title><link>http://www.blogjava.net/zqc/archive/2007/07/17/130925.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Tue, 17 Jul 2007 13:10:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2007/07/17/130925.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/130925.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2007/07/17/130925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/130925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/130925.html</trackback:ping><description><![CDATA[
<p>尽管很早开始就不止一次得对自己说，单元测试！单元测试！单元测试！ 但是依然失望得发现现在所遇到所有的烦恼几乎都与测试有关。曾经要一个人三天内搞定一个论坛--功能还相当复杂：除了基本的crud发帖回帖搜索什么的还要有用户分组、访问权限、子论坛，等，现在想当时是什么让我在撑过来的？是那一个个简单难看弱智的testcase！在我看来一个不懂得tdd不理解测试先行不清楚怎么写testcase的程序员就几乎就不能算是个合格得程序员。这不是技术问题，是政治问题。尤其是在你发现你的已经离职的同事写的一个极为复杂的自定义控件在使用的时候出现一大堆bug而你还要花一堆时间去纠正时的绝望。整个项目组没人写testcase?没问题，我自己写就行了----整个软件框架模块可测试性太低？没问题，花点时间把重要的类解耦出来--时间来不及？更没问题，磨刀不误砍柴功。</p>
<br/><p>明天打算给那些组件所有public的方法写上测试用例--虽然花时间给别人的代码写测试是极为无聊的行为，但是现在我也认了，不能再这样提心吊胆得写代码和手工测试了，宁可花上一个上午甚至更多的时间来写用例搭建环境。Rod Johnson说得对极了,牛仔式真是编程害死：满天飞的工厂模式、单例、静态变量，什么注释都没有的监听接口----最重要的是，没有测试用例--乃还算程序员吗？知道老子花了多少时间来拜读修改重构step in,step over您的"大作"？holy shit.</p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Del.icio.us</span> : <a href="http://del.icio.us/tag/java+zqc+test+%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95" class="ztag" rel="tag">java zqc test 单元测试</a></span> 
</p><img src ="http://www.blogjava.net/zqc/aggbug/130925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2007-07-17 21:10 <a href="http://www.blogjava.net/zqc/archive/2007/07/17/130925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>总结杂记</title><link>http://www.blogjava.net/zqc/archive/2007/06/19/125205.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Tue, 19 Jun 2007 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2007/06/19/125205.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/125205.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2007/06/19/125205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/125205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/125205.html</trackback:ping><description><![CDATA[
<h5>上周开始上班时，原来以为会去做web开发，毕竟这方面比较熟练，不料被丢去搞桌面应用。基本上是一个springrcp开发的一个prototype，前几天先看看代码和tutorials熟悉下系统，然后写了几个功能demo。springrcp在java的桌面应用中不算主流，所以资料找起来也比较困难，项目组其他两人都忙得屁股朝天，只能自己慢慢琢磨。总结下来srpc的几大问题，启动速度、自定义数据绑定和输入校验。在设计理念上，srcp无疑适合胖客户端的大型企业应用(Thick Enterprise App)--根据backbean自动生成ui、自动绑定数据和校验等，通过一堆（注意，一堆。）spring contex和resource文件组装起来。srcp无疑是个非常实在的开发框架，太实在到以至于人们一提rcp马上就是eclipsercp，当然，eclipse rcp比起来，它可以算是已经<span style="TEXT-DECORATION: underline">不再</span>更新了（从3年前开始）。</h5>
<h5 align="justify">　　springframework.org论坛里有条评论，翻译过来大概就是说，srcp程序说到底"<em>就是用几个jar和配置文件把你的swing应用组织起来的有着复杂的设计结构的xx</em>"（好吧我不理解乱翻译），说起swing，为了兼顾各个方面的因素(主要是concurrency)，swing的开发者们不得不让swing的使用者们在一个迂回曲折的环境中编写他们的应用。这就好像在一座庞大的金字塔内部观察它的建筑结构一样，你会发出阵阵惊叹；也会绉起眉头迷惑不解--开始的时候后者是远远多过前者的。回过来看看现在如火如荼的web开发，想想，web开发是不是在走10几20年前的老路，什么才是程序的真谛呢？</h5>
<h5>接下来准备学习一点数据挖掘方面的知识，具体点是语义分析。因为公司在数据采集这方面还相当原始的spider+手工收割，和st谈到这个时也提到个可选的方案，天知道那个看上去不良少年一样的家伙脑袋里到底装了多少东西。好了，这周打算拖拖拉拉地把自动更新updater写完，顺便看看有没机会弄成一个通用的updater。第一期的业务逻辑不复杂，所以也暂时没我什么事，正好可以一只脚站在门外细心瞅瞅，其他等评估结果出来了再说。刚才收信时候看到有封14号的offer letter，密密麻麻的英文搞得foxmail都把它丢到垃圾箱里去了。<br/><br/></h5>
<img src ="http://www.blogjava.net/zqc/aggbug/125205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2007-06-19 22:34 <a href="http://www.blogjava.net/zqc/archive/2007/06/19/125205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全排列和其他</title><link>http://www.blogjava.net/zqc/archive/2007/06/05/122137.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Tue, 05 Jun 2007 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2007/06/05/122137.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/122137.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2007/06/05/122137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/122137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/122137.html</trackback:ping><description><![CDATA[
<p>昨天上午去面试的一道题，当场没想出来，回来花了点时间补完了下发回去.</p>
<p>原题要求用java，用python只是为了方便。用回溯法快，但是还是坚持用遍历森林来写，这也是面试时没想完的思路，呵呵，我就是自找麻烦的硬石头性格。</p>
<p>最先想到用无向连通图进行深度优先搜索，但是没有考虑到结束条件。对于N个待排列的数字，每个节点都有N-1个出口和入口，而用树状结构每个节点只有一个父节点，存在递归返回的条件。但是这个方法的实用性只限制在当排列数很少（N &lt; 8）时。当N&gt;8时算法消耗的时间明显增加(一共8*7*6*5*4*3*2*1=40320种组合)，当N&gt;1000时(当然，这种情况是不敢想像的)就会达到python的递归极限。所以真正如果要干点什么的话(当然，高中生都知道全排列拿52张扑克牌出来排一下结果集就是个天文数字)，这显然不是个好算法。</p>
<br/><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"><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><span style="COLOR: #008000">#</span><span style="COLOR: #008000">coding=utf-8</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #000000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span> <span style="COLOR: #008000">数字全排列</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/>#</span> <span style="COLOR: #008000">Chris Zheng 2007-06-05</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #000000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">import</span> <span style="COLOR: #000000">sys, os<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">待排列的数字</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #000000">NUMS</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">]<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">结果集合</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #000000">results</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">[]<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/>EXCLUDES</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">(<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">lambda</span> <span style="COLOR: #000000">a,b,nums:abs(nums.index(a)</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">nums.index(b))</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span> <span style="COLOR: #008000">#</span><span style="COLOR: #008000">a,b是否相邻</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">lambda</span> <span style="COLOR: #000000">a,b,idx_a,idx_b,nums:nums.index(a)</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">idx_a</span> <span style="COLOR: #0000ff">and</span> <span style="COLOR: #000000">nums.index(b) \<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">idx_b</span> <span style="COLOR: #008000">#</span><span style="COLOR: #008000">a,b是否同时符合特定位置</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #000000">)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span> <span style="COLOR: #008000">3和4不能相邻 当2在第1时6不能在第7</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #000000">EXT_PARAMS</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">(<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> (</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,NUMS),(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,NUMS)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/>)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">检查排除条件</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">def</span> <span style="COLOR: #800080">__check_conditions</span><span style="COLOR: #000000">(nums):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> matchs</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">False<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">f</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">EXCLUDES:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">params</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">EXT_PARAMS:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> params[</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">nums<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> matchs</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">f(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">params)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">matchs:</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">matchs<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">except</span> <span style="COLOR: #000000">Exception:</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">matchs<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">树节点</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">node(object):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">def</span> <span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self, n):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> self.value</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">n<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> self.parent</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">None<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> self.children</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">[]<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">def</span> <span style="COLOR: #800080">__eq__</span><span style="COLOR: #000000">(self,other):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">self.value</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">other.value<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">def</span> <span style="COLOR: #800080">__str__</span><span style="COLOR: #000000">(self):</span><span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">str(self.value)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">主方法</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">def</span> <span style="COLOR: #000000">get_all(nums):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> trees</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">[]<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">n</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">nums:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> trees.append(create_tree(node(n)))<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">t</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">trees:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> walk_tree(t)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">global</span> <span style="COLOR: #000000">results<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #008000">#</span><span style="COLOR: #008000">过滤条件</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">(r</span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">r</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">results</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #0000ff">not</span> <span style="COLOR: #800080">__check_conditions</span><span style="COLOR: #000000">(r))<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">生成结果树</span> <span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">def</span> <span style="COLOR: #000000">create_tree(root):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> parent_elements</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #800080">__parents</span><span style="COLOR: #000000">(root)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">len(parent_elements)</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">len(NUMS)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">:</span><span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">root<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> nums</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">(nums</span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">nums</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">NUMS</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">node(nums)</span> <span style="COLOR: #0000ff">not</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">parent_elements)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">k</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">nums:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> c</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">node(k)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> c.parent</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">root<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> root.children.append(create_tree(c))<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">root<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">def</span> <span style="COLOR: #800080">__parents</span><span style="COLOR: #000000">(node):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> parent_elements</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">[node]<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">node.parent:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> parent_elements.append(node.parent)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> node</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">node.parent<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">parent_elements<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">遍历结果树</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">def</span> <span style="COLOR: #000000">walk_tree(root):<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">root.children:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">n</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">root.children:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> walk_tree(n)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> k</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">[root.value]<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> p</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">root.parent<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">p:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> k.append(p.value)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> p</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">p.parent<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> k.reverse()<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> results.append(k)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">测试输出</span><span style="COLOR: #008000"><br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span><span style="COLOR: #0000ff">if</span> <span style="COLOR: #800080">__name__</span><span style="COLOR: #000000">==</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">__main__</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> rs</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">get_all(NUMS)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> f</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">open(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">results.txt</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">w</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/></span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">k</span> <span style="COLOR: #0000ff">in</span> <span style="COLOR: #000000">rs:<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> f.write(str(k)</span><span style="COLOR: #000000">+</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">\n</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br/><img width="11" align="top" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"/> f.close()</span></div>
<p><br/>.</p>
<br/><img src ="http://www.blogjava.net/zqc/aggbug/122137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2007-06-05 14:47 <a href="http://www.blogjava.net/zqc/archive/2007/06/05/122137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法3:计算超大数字整数乘法</title><link>http://www.blogjava.net/zqc/archive/2006/09/25/71819.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Mon, 25 Sep 2006 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/09/25/71819.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/71819.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/09/25/71819.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/71819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/71819.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 还不能处理负数和小数点package s1;import java.util.Stack;import java.util.Vector;/** *//** * A multiply simulation * for example :  * 56 X 67 =  * *     56 *   x 67 * ---------- *    392 *   336 *------------ *  ...&nbsp;&nbsp;<a href='http://www.blogjava.net/zqc/archive/2006/09/25/71819.html'>阅读全文</a><img src ="http://www.blogjava.net/zqc/aggbug/71819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2006-09-25 20:40 <a href="http://www.blogjava.net/zqc/archive/2006/09/25/71819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于getParameterNames()</title><link>http://www.blogjava.net/zqc/archive/2006/06/18/53546.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Sat, 17 Jun 2006 20:51:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/06/18/53546.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/53546.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/06/18/53546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/53546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/53546.html</trackback:ping><description><![CDATA[前2天写代码时候发现,HttpServletRequest的getParameterNames() 方法返回的Enumeration相对于页面参数的物理顺序刚好是相反的,所以实现@ToList标签时候需要先用一个Stack来对所有参数进行反转.不知tomcat在这个api方法上是怎么实现的,为什么就倒过来。c语言函数可以根据不同的call类型来指定不同的压栈的顺序，莫非这个惯例也被用到servlet里面来了，挺有意思的东西，看来需要留意一下。<img src ="http://www.blogjava.net/zqc/aggbug/53546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2006-06-18 04:51 <a href="http://www.blogjava.net/zqc/archive/2006/06/18/53546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Comments on Mock-Based Testing</title><link>http://www.blogjava.net/zqc/archive/2006/06/04/50308.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Sun, 04 Jun 2006 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/06/04/50308.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/50308.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/06/04/50308.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/50308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/50308.html</trackback:ping><description><![CDATA[
		<p>很好的一篇文章，深入说了很多关于测试的东西。<br /><br />A article from Technoetic<a title="Posts by Steve Bate" href="http://blog.technoetic.com/author/steve/"><font color="#000000"><br />- Posted in </font></a><a title="View all posts in Software Dev." href="http://blog.technoetic.com/categories/software-development/" rel="category tag">Software Dev.</a><a title="Posts by Steve Bate" href="http://blog.technoetic.com/author/steve/"><font color="#000000">, </font></a><a title="View all posts in Agile" href="http://blog.technoetic.com/categories/software-development/agile-techniques/" rel="category tag">Agile</a><a title="Posts by Steve Bate" href="http://blog.technoetic.com/author/steve/"><font color="#000000"> by </font></a><a title="Posts by Steve Bate" href="http://blog.technoetic.com/author/steve/"><strong>Steve Bate</strong></a><br /><br />I recently read a blog entry with <a href="http://weblogs.asp.net/jsgreenwood/archive/2004/12/29/343963.aspx">criticisms of mock-based testing</a>. The author raised several “issues” with using mocks to support unit testing. I’m commenting here since the author has closed comments on the original blog entry.</p>
		<p>
				<strong>Issue 1: Poor integration tests, as everything is being tested in isolation</strong>
		</p>
		<p>I’ve had good experience with mock-based testing. However, it’s obvious that mocks will only test classes in isolation. I use both unit tests and integration tests (sometimes called system or acceptance tests) together. The need for integration tests is not an issue for mock-based techniques and is not a good reason to use less mocks. It’s just a different aspect of testing. A more common issue in my experience is that people in the agile community who are new to testing often don’t understand these different aspects of testing and seem to believe that mock-based unit testing and integration testing are mutually exclusive options. The lack of common terminology in the community only worsens the problem. For some people, a “unit” is a class or small group of tightly coupled classes. For others, it’s a large portion of the software product. Most agile developers seem to call every test they write a unit test. It’s become so confusing for some teams that I’ve seen terminology like “integration unit tests” being used to describe testing strategies.</p>
		<p>But, back to the topic. Poor integration testing is simply the result of lack of integration tests. Mocks do not <em>cause</em> a lack of integration tests. A team makes that choice, probably based on a weak understanding of the tradeoffs between isolation (unit) and integration (system) testing.<br /><a id="more-69"></a><br /><strong>Issue 2: Mocks add complexity to the software design.</strong></p>
		<blockquote>
				<p>“I’ve seen numerous occasions where the introduction of mocks has added a large amount of complexity to an otherwise simple design. This complexity leads to higher implementation costs, a higher cognitive load on the developers working on the system, and higher maintenance costs (as there’s more code to maintain). “</p>
		</blockquote>
		<p>The author appears to focused on the increased use of interfaces when using mock-based testing and expresses the opinion that interfaces should only be used where we’d want to be able to replace one implementation with another. First, there are other reasons to use interfaces. In general, interfaces are useful for managing dependencies between software components or subsystems. This can be beneficial even if the implementations do not change (see <a href="http://www.objectmentor.com/resources/articles/dip.pdf">The Dependency Inversion Principle</a>).</p>
		<p>A modular software design will generally make it easier to use mock-based testing <em>without altering the design specifically for the mocks</em>. However, there are times when the software must be modified to support testing. Fortunately, the changes needed to support testing often, if done well, support the modularity goal.</p>
		<p>In my experience, extra interfaces don’t add a significant maintenance overhead. Most effort is spent implementing the interface. The time writing the interface itself (or extracting it using an IDE’s refactoring tools) is negligible.</p>
		<p>
				<strong>My Conclusions</strong>
		</p>
		<p>In almost every case, I see the “simplicity” gained by not using mocks overshadowed by complex test setups to initialize large groups of dependent objects. The dark side of integration testing is that it’s often very slow for large numbers of tests. Some teams are using continuous integration tools like Cruise Control to run their “unit tests” (usually they are actually integration tests). This delays the feedback about broken builds but is often necessary because the tests run so slow. I realize there other reasons for using CC, but this is a common one from what I’ve seen and heard.</p>
		<p>I’ve worked on teams where we had thousands of tests that ran in less than 15-20 seconds total on a developer workstation. This was a direct result of heavy use of mock-based testing. We also had a slower suite of integration tests that required 4-5 minutes to run. We didn’t need a continuous integration server because we were able to integrate and run our unit tests before every commit to the source control system. The team integrated 10-20 times/day and broken builds were practically nonexistent over the several years I worked with them. In the very rare cases when the build did break, it was typically fixed in a matter of minutes.</p>
		<p>The other benefit of the isolation testing enabled by mocks is the ability to pinpoint problems much more quickly. It’s a form of the divide and conquer problem solving strategy, only the divide part is already done. The conquering is relatively easy compared to tracking down the cause of test failures when many classes are being exercised in a test.</p>
		<p>My experience was that our mock based unit tests caught about 98% of the code problems before the code was ever committed to source control. The integration tests caught about another 1% beyond that (almost always because of a flaw in the mock-based testing) and manual testing caught the other 1%. </p>
		<div class="meta" align="right">- Posted in <a title="View all posts in Software Dev." href="http://blog.technoetic.com/categories/software-development/" rel="category tag">Software Dev.</a>, <a title="View all posts in Agile" href="http://blog.technoetic.com/categories/software-development/agile-techniques/" rel="category tag">Agile</a> by <b><a title="Posts by Steve Bate" href="http://blog.technoetic.com/author/steve/">Steve Bate</a></b></div>
<img src ="http://www.blogjava.net/zqc/aggbug/50308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2006-06-04 18:53 <a href="http://www.blogjava.net/zqc/archive/2006/06/04/50308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Waterfall framework 开发日志</title><link>http://www.blogjava.net/zqc/archive/2006/05/24/47845.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Wed, 24 May 2006 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/05/24/47845.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/47845.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/05/24/47845.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/47845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/47845.html</trackback:ping><description><![CDATA[
		<p>TODO:<br />继续测试和改进,不满意的地方:@ToSession标签<br /><br />更新日志:<br /><br />2006-06-18 增加和改进 @ToList 标签,用来修饰一个参数为java.util.List&lt;T&gt;的setter方法 <br />2006-05-23 增加 VelocityView接口,方便velocity视图调用.<br />2006-05-23 增加 WebParam接口,封装掉request和response以及ServletContext</p>
		<p>2006-05-22 增加 5.1 初始化 velocity <br />2006-05-21 增加 4.1 - 4.2 HttpSession操作<br /><br /><br />更新note:<br />1.HttpServletRequest的<a href="file:///D:/jakarta-tomcat-4.1.30/servlet%20api/javax/servlet/ServletRequest.html#getParameterNames()"><strong><font face="Courier New">getParameterNames</font></strong></a><font face="Courier New">()</font> 方法返回的Enumeration相对于页面参数的物理顺序刚好是相反的,所以实现@ToList标签时候需要先用一个Stack来对所有参数进行反转.不知tomcat在这个api方法上是怎么实现的,为什么就倒过来。c语言函数可以根据不同的call类型来指定不同的压栈的顺序，莫非这个惯例也被用到servlet里面来了，挺有意思的东西，看来需要留意一下。<br /></p>
		<p>问题和解决方式:<br /><br />1.关于@ToSession标签.如果是登陆的话,那么就有个判断条件决定某个login token是否应该被加到session中,这时候可以在@ToSession标记的getter方法中加入逻辑判断,来决定返回一个token实体或者null(这样做有点古怪..).<br /><br />2.路径的问题.比如一个<a href="http://host/logic/bbs/admin/ListUsers.wff">http://host/logic/bbs/admin/ListUsers.wff</a> 摸版的相关资源目录(比如,图片,css,js等)就必须存在webproject/bbs/admin响应的目录下,有点像struts的多模块.<br /><br />开始:<br /><br />Ruby on Rails有个设计思想是用编码规定代替繁琐的配置文件。jvm平台已经有一些类似ror的实现，比如<br />grails(<a href="http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released">http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released</a>)</p>
		<p>虽然由于java自身的局限，它很难做出像ruby或者groovy那样动态语言那样随心所欲的动作，但是利用它的运行时反射、动态代理等特性来尽可能实现“用编码规定代替繁琐的配置文件”这一思想。<br />下面转入正题。</p>
		<p>ServletAPI对HTTP协议进行了封装,通过配置Web.xml来把不同的请求转发给不同的servlet来处理。Web框架则用一个ActionServlet，根据自己的对Action的定义来转发请求。<br />抛开那些繁琐的配置文件，设想一下这样一种方法:</p>
		<p>1.Web动作的处理和响应</p>
		<p>假设这样一个POST请求:</p>
		<p>  &lt;form action="logic/group/NewTopic.wff" method="post"&gt;</p>
		<p>Web动作实现Bean:<br />   org.qqsns.web.logic.group.NewTopic   <br />注意后面的logic/group/NewTopic和logic.group.NewTopic, 动作类和Web动作是通过请求路径和包名相互关联。<br />这样，对Web动作的响应就依赖于编译期的代码的组织结构而不是执行期的配置文件。这样的好处是避免了维护繁琐的配置文件,特别是在没有IDE支持的情况下。</p>
		<p>org.qqsns.web.logic.group.NewTopic类是一个实现net.wff.servlet.WebAction接口的POJO，下面是NewTopic中execute的方法片段:   <br /> <br /> //Only method must be implemented for interface net.wff.servlet.WebAction<br /> public String execute(WebParam param, VelocityView view)<br /> throws ServletException, IOException{<br />  ...<br />  //return "redirect /success.html";  //请求重定向<br />  return "/success.jsp";              //请求转发<br />}<br />execute方法的返回值手动指定了一个转发或重定向的路径。</p>
		<p>2.输入验证</p>
		<p>普通的Web框架都带数据输入验证功能,一般复杂程度和功能强大与否成正比。<br />这里简单地要求从setter方法里抛出一个包含验证信息的异常，以此来实现输入异常处理。<br />       <br />普通setter方法<br />public void setName(String name){ <br />  this.name = name;<br />}</p>
		<p>添加输入验证后的setter方法</p>
		<p>public void setName(String name) throws InputException{    <br /> if(name.length()&lt;3)<br />    throw new InputException("Topic name must has a length greater than 3"); <br />  this.name = name;<br />}</p>
		<p>在WaterFallServlet如何中处理验证信息:</p>
		<p>    WebAction wa = <br />    (WebAction)Class.forName(classPath).newInstance();<br />          //procces forwarding<br />          try {<br />    ActionHelper.setProperties(request,wa);<br />   } catch (InputException e) {<br />    //return to input view<br />    //header:referer<br />    String rtn = request.getHeader("referer");<br />    //clear old errors<br />    if(rtn.indexOf("?")!=1){<br />     rtn = rtn.substring(0,rtn.indexOf("?"));<br />    }<br />    rtn=rtn+"?error="+URLEncoder.encode(e.getMessage(),"UTF-8");<br />    response.sendRedirect(rtn);<br />    return;<br />   }</p>
		<p>这样验证信息通过请求参数传回到输入页面.</p>
		<p>3.数据绑定</p>
		<p>假设有这样的html输入:</p>
		<p>    &lt;input type="text" name="name"/&gt;<br />    &lt;input type="text" name="number"/&gt;<br />    &lt;input type="text" name="price"/&gt;<br />    <br /> 下面是NewTopic中execute的方法全部:   <br /> <br /> public String execute(WebParam param, VelocityView view)<br /> throws ServletException, IOException{<br />  System.out.println(getName());<br />  System.out.println(getNumber());<br />  System.out.println(getPrice());<br />  System.out.println(getLength());<br />  return "/success.html";<br />}<br />    <br />自动从request注入parameter,这也是Struts DynamicActionForm的好处之一。<br />不过这里实现更类似多了类型转换的&lt;jsp:setProperty name="bean" property="*"/&gt;<br />因为Name的类型是String,Number的类型是Integer,Price的类型是float,length的类型是double.至于其他复杂的类型,也许jsf的转换器是个更好的主意。<br />这样就初步解决了数据的输入绑定和验证。余下的就是业务逻辑的问题。</p>
		<p>4.如何操作Session中的信息<br /> <br /> 获取session中的信息:</p>
		<p>  @FromSession(<br />     sessionKey=User.key<br />     )<br /> public void setCurrentUser(String currentUser) {<br />  this.currentUser = currentUser;<br /> }</p>
		<p> 信息保存到session中: </p>
		<p>  @ToSession(<br />      sessionKey = User.key  <br />    )<br /> public String getName() {<br />  if(login())return name;<br />  else return null;<br /> }</p>
		<p> 这2个方法定义在WebAction的实现类中。<br /> 框架在execute()之前执行@FromSession动作，在execute()之后执行@ToSession动作。<br /> 这里使用了annotation,所以要求必须是jdk5.0以上版本.<br /> <br /> 5.1 Velocity<br />  waterfall启动时候自动在WEB-INF目录下寻找并初始化Velocity.properties文件<br /> 操作:<br /> public String execute(WebParam param, VelocityView view)<br /> throws ServletException, IOException{<br />  view.addElement("msg","Hello");<br />  view.go("index.vm");<br />  return null;<br />}<br /><br /></p>
<img src ="http://www.blogjava.net/zqc/aggbug/47845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2006-05-24 16:58 <a href="http://www.blogjava.net/zqc/archive/2006/05/24/47845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3.0中HQL中文不能的解决办法</title><link>http://www.blogjava.net/zqc/archive/2006/05/23/47564.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Mon, 22 May 2006 19:06:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/05/23/47564.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/47564.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/05/23/47564.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/47564.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/47564.html</trackback:ping><description><![CDATA[忙乎了一晚上,还从MYSQL换到了HSQL数据库,最后发现是Hibernate3.0自己的问题,还没具体搞清楚具体是怎么回事,不过救急是够用了.<br /><br />&lt;property   name="hibernate.query.factory_class"&gt;org.hibernate.hql.classic.ClassicQueryTranslatorFactory&lt;/property&gt;<img src ="http://www.blogjava.net/zqc/aggbug/47564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2006-05-23 03:06 <a href="http://www.blogjava.net/zqc/archive/2006/05/23/47564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个WEB框架功能的分析:用编码规定代替配置文件</title><link>http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Wed, 17 May 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/46608.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/46608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/46608.html</trackback:ping><description><![CDATA[
		<p>
				<strong>R</strong>uby on Rails有个设计思想是:<strong>用编码规定代替繁琐的配置文件</strong>。jvm平台已经有一些类似ror的实现，比如<br />grails:<a href="http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released">http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released</a><br /><br />虽然由于java自身的局限，它很难做出像ruby或者groovy那样动态语言那样随心所欲的动作，但是利用它的运行时反射、动态代理等特性来尽可能体现“用编码规定代替繁琐的配置文件”这一思想。下面就转入正题。</p>
		<p>ServletAPI对HTTP协议进行了封装,通过配置Web.xml来把不同的请求转发给不同的servlet来处理。Web框架则用一个ActionServlet，根据自己的对Action的定义来转发请求。<br />抛开那些繁琐的配置文件，设想一下这样一种方法:</p>
		<p>
				<strong>1.Web动作的处理和响应</strong>
		</p>
		<p>假设这样一个POST请求:</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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">form </span>
				<span style="COLOR: #ff0000">action</span>
				<span style="COLOR: #0000ff">="logic/group/NewTopic"</span>
				<span style="COLOR: #ff0000"> method</span>
				<span style="COLOR: #0000ff">="post"</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>Web动作实现Bean:</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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">org.qqsns.web.logic.group.NewTopic</span>
		</div>
		<p>注意后面的<em>logic/group/NewTopic</em>和<em>logic.group.NewTopic</em>, 动作类和Web动作是通过请求路径和包名相互关联。<br />这样，对Web动作的响应就依赖于<strong>编译期的代码的组织结构</strong>而不是<strong>执行期的配置文件</strong>。这样的好处是避免了维护繁琐的配置文件,特别是在没有IDE支持的情况下。</p>
		<p>org.qqsns.web.logic.group.NewTopic类是一个实现net.wff.servlet.WebAction接口的POJO，下面是NewTopic中execute的方法片段:   </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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">Only method must be implemented for interface net.wff.servlet.WebAction</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> String execute(HttpServletRequest request, HttpServletResponse response)<br /><img id="Codehighlighter1_192_291_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_291_Open_Text.style.display='none'; Codehighlighter1_192_291_Closed_Image.style.display='inline'; Codehighlighter1_192_291_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_192_291_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_192_291_Closed_Text.style.display='none'; Codehighlighter1_192_291_Open_Image.style.display='inline'; Codehighlighter1_192_291_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> ServletException, IOException</span>
				<span id="Codehighlighter1_192_291_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_192_291_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">return "redirect /success.html";  </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">请求重定向</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">  </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/success.jsp</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;              </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">请求转发</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</span>
						<span style="COLOR: #000000">}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p> execute方法的返回值手动指定了一个转发或重定向的路径。</p>
		<p>
				<strong>2.输入验证</strong>
		</p>
		<p>普通的Web框架都带数据输入验证功能,一般复杂程度和功能强大与否成正比。<br />这里简单地要求从setter方法里抛出一个包含验证信息的异常，以此来实现输入异常处理。<br />       <br />普通setter方法</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">
				<img id="Codehighlighter1_32_55_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_55_Open_Text.style.display='none'; Codehighlighter1_32_55_Closed_Image.style.display='inline'; Codehighlighter1_32_55_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_32_55_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_55_Closed_Text.style.display='none'; Codehighlighter1_32_55_Open_Image.style.display='inline'; Codehighlighter1_32_55_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setName(String name)</span>
				<span id="Codehighlighter1_32_55_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_32_55_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.name </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>添加输入验证后的setter方法</p>
		<p>
		</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">
				<img id="Codehighlighter1_54_179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_179_Open_Text.style.display='none'; Codehighlighter1_54_179_Closed_Image.style.display='inline'; Codehighlighter1_54_179_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_54_179_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_179_Closed_Text.style.display='none'; Codehighlighter1_54_179_Open_Image.style.display='inline'; Codehighlighter1_54_179_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setName(String name) </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> InputException</span>
				<span id="Codehighlighter1_54_179_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_54_179_Open_Text">
						<span style="COLOR: #000000">{    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(name.length()</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">3</span>
						<span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/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"> InputException(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Topic name must has a length greater than 3</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.name </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>WaterFallServlet是如何处理验证信息的:</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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">WebAction wa </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    (WebAction)Class.forName(classPath).newInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">procces forwarding</span>
				<span style="COLOR: #008000">
						<br />
						<img id="Codehighlighter1_116_165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_165_Open_Text.style.display='none'; Codehighlighter1_116_165_Closed_Image.style.display='inline'; Codehighlighter1_116_165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_116_165_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_165_Closed_Text.style.display='none'; Codehighlighter1_116_165_Open_Image.style.display='inline'; Codehighlighter1_116_165_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #000000">          </span>
				<span style="COLOR: #0000ff">try</span>
				<span style="COLOR: #000000"> </span>
				<span id="Codehighlighter1_116_165_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_116_165_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    ActionHelper.setProperties(request,wa);<br /><img id="Codehighlighter1_192_505_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_505_Open_Text.style.display='none'; Codehighlighter1_192_505_Closed_Image.style.display='inline'; Codehighlighter1_192_505_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_192_505_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_192_505_Closed_Text.style.display='none'; Codehighlighter1_192_505_Open_Image.style.display='inline'; Codehighlighter1_192_505_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />   }</span>
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">catch</span>
				<span style="COLOR: #000000"> (InputException e) </span>
				<span id="Codehighlighter1_192_505_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_192_505_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">return to input view<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">header:referer</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    String rtn </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> request.getHeader(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">referer</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">clear old errors</span>
						<span style="COLOR: #008000">
								<br />
								<img id="Codehighlighter1_339_391_Open_Image" onclick="this.style.display='none'; Codehighlighter1_339_391_Open_Text.style.display='none'; Codehighlighter1_339_391_Closed_Image.style.display='inline'; Codehighlighter1_339_391_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_339_391_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_339_391_Closed_Text.style.display='none'; Codehighlighter1_339_391_Open_Image.style.display='inline'; Codehighlighter1_339_391_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(rtn.indexOf(</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">1</span>
						<span style="COLOR: #000000">)</span>
						<span id="Codehighlighter1_339_391_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_339_391_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     rtn </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> rtn.substring(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,rtn.indexOf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">?</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    rtn</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">rtn</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">?error=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">URLEncoder.encode(e.getMessage(),</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">UTF-8</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    response.sendRedirect(rtn);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />   }</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>这样验证信息通过请求参数传回到输入页面.</p>
		<p>
				<strong>3.数据绑定</strong>
		</p>
		<p>假设有这样的html输入: </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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">input </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000"> name</span>
				<span style="COLOR: #0000ff">="name"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">input </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000"> name</span>
				<span style="COLOR: #0000ff">="number"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">input </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000"> name</span>
				<span style="COLOR: #0000ff">="price"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p> 下面是NewTopic中execute的方法全部:   </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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> String execute(HttpServletRequest request, HttpServletResponse response)<br /><img id="Codehighlighter1_117_282_Open_Image" onclick="this.style.display='none'; Codehighlighter1_117_282_Open_Text.style.display='none'; Codehighlighter1_117_282_Closed_Image.style.display='inline'; Codehighlighter1_117_282_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_117_282_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_117_282_Closed_Text.style.display='none'; Codehighlighter1_117_282_Open_Image.style.display='inline'; Codehighlighter1_117_282_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> ServletException, IOException</span>
				<span id="Codehighlighter1_117_282_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_117_282_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getName());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getNumber());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getPrice());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getLength());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/success.html</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>自动从request注入parameter,这也许是很多人喜欢Struts DynamicActionForm的原因之一。<br />不过这里实现更类似多了类型转换的&lt;jsp:setProperty name="bean" property="*"/&gt;<br />因为Name的类型是String,Number的类型是Integer,Price的类型是float,length的类型是double.至于其他复杂的类型,也许jsf的转换器是个更好的主意。<br />这样就初步解决了数据的输入绑定和验证。余下的就是业务逻辑的问题。WaterfallWebFramework源代码:<br /><a href="/Files/zqc/WaterfallWebFramework.rar">http://www.blogjava.net/Files/zqc/WaterfallWebFramework.rar</a> (<strong>只有一个配置文件,其中只有1行配置信息!</strong>)</p>
		<p>以上就是框架的主要功能。<strong>用编码规定代替配置文件</strong>，也许这会是一种更加高效率的开发方式。<br /></p>
<img src ="http://www.blogjava.net/zqc/aggbug/46608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2006-05-17 13:12 <a href="http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天给jails加了件外套,用swt写的.感觉还不错^_^</title><link>http://www.blogjava.net/zqc/archive/2006/05/06/44701.html</link><dc:creator>where the amazing happens</dc:creator><author>where the amazing happens</author><pubDate>Fri, 05 May 2006 16:27:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/05/06/44701.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/44701.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/05/06/44701.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/44701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/44701.html</trackback:ping><description><![CDATA[今天给jails加了件外套<img height="19" src="http://www.blogjava.net/Emoticons/cake.gif" width="17" border="0" />,用swt写的.感觉还不错^_^<br />下载(附带eclipse的工程文件)  <a href="http://zqc53.512j.com/others/JailsReleaseWithEclipse.rar">http://zqc53.512j.com/others/JailsReleaseWithEclipse.rar</a><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/zqc/7370/r_Snap6.jpg" /><img src ="http://www.blogjava.net/zqc/aggbug/44701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">where the amazing happens</a> 2006-05-06 00:27 <a href="http://www.blogjava.net/zqc/archive/2006/05/06/44701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>