<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tower Jing::Thanksgiving</title>
	<atom:link href="http://www.taoer.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.taoer.com</link>
	<description>How alone SOLO::随来而去</description>
	<lastBuildDate>Mon, 01 Feb 2010 12:56:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://www.taoer.com/wp-includes/js/jquery/jquery.js?ver=1.3.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
jQuery.ajax({type:'GET',url:'http://www.taoer.com/wp-content/plugins/wp-postviews-plus/postviews_plus.php',data:'todowppvp=add&type=/feed/&id=1',cache:false,dataType:'script'});
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>eclipse使用debugrun和jboss来调试断点</title>
		<link>http://tech-notes.taoer.com/2010/02/01/use-eclipse-debugrun-breakpoint-program/</link>
		<comments>http://tech-notes.taoer.com/2010/02/01/use-eclipse-debugrun-breakpoint-program/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 12:50:35 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=576</guid>
		<description><![CDATA[debugrun.zip是debugrun运行的批处理文件
1.将debugrun.bat复制到如下目录： 
X:\&#8230;\BuildPro\jboss-4.0.3SP1\bin 
其中，前面的“X:\&#8230;”为每个人的实际物理目录 
2.打开debugrun.bat，找到如下内容并进行编... ]]></description>
			<content:encoded><![CDATA[<p><a href='http://www.taoer.com/wp-content/uploads/2010/02/debugrun.zip'>debugrun.zip</a>是debugrun运行的批处理文件</p>
<p>1.将debugrun.bat复制到如下目录： </p>
<p>X:\&#8230;\BuildPro\jboss-4.0.3SP1\bin </p>
<p>其中，前面的“X:\&#8230;”为每个人的实际物理目录 </p>
<p>2.打开debugrun.bat，找到如下内容并进行编辑 </p>
<p>set DEBUG_OPTS=-Xdebug -Xnoagent <a href="http://-Djava.com" title="http://-Djava.com" target="_blank">-Djava.com</a>piler=NONE -Xrunjdwp:transport=dt_socket,address=9595,server=y,suspend=n </p>
<p>其中，address=9595是端口号，待会儿需要在eclipse中填入的，这个可以改成你想要的，也可以不进行修改 </p>
<p>3.双击debugrun.bat启动。 </p>
<p>4.选择你的项目，点击工具栏中的debug按钮下的&#8221;Open Debug Diaglog&#8230;&#8221;</p>
<p><img src="http://www.taoer.com/wp-content/uploads/2010/02/step4.png" alt="" title="step4" width="434" height="468" class="alignnone size-full wp-image-577" /></p>
<p>5.在弹出的窗口中，从左侧选择&#8221;Remote Java Application&#8221;，右键点击，选择&#8221;New&#8221;，会出现如下图： </p>
<p><img src="http://www.taoer.com/wp-content/uploads/2010/02/step5.png" alt="" title="step5" width="555" height="442" class="alignnone size-full wp-image-578" /></p>
<p>如图，把端口号修改成debugrun中实际设置的端口号9595，然后点击&#8221;Apply&#8221;应用改变，然后点击&#8221;Debug&#8221;运行。</p>
<p>6.然后在eclipse中会出现如下视图，<br />
<img src="http://www.taoer.com/wp-content/uploads/2010/02/step6.png" alt="" title="step6" width="555" height="98" class="alignnone size-full wp-image-579" /></p>
<p>这里就是待会儿要用到的debug试图了。</p>
<p>7.打开你的eclipse，首先选择一个程序来设置断点，例如：<br />
<img src="http://www.taoer.com/wp-content/uploads/2010/02/step7.png" alt="" title="step7" width="452" height="256" class="alignnone size-full wp-image-581" /> </p>
<p>8.好了，然后运行你的程序到你设置的断点，运行后再切换到eclipse，来看看debug视图</p>
<p>这个是debug窗口的左侧视图<br />
<img src="http://www.taoer.com/wp-content/uploads/2010/02/step8-1.png" alt="" title="step8-1" width="555" height="256" class="alignnone size-full wp-image-582" /> </p>
<p>这个是debug窗口的右侧视图<br />
<img src="http://www.taoer.com/wp-content/uploads/2010/02/step8-2.png" alt="" title="step8-1" width="555" height="256" class="alignnone size-full wp-image-582" /> </p>
<p>这个断点结束后，可以点击左侧视图的&#8221;Resume&#8221;来继续下面程序的执行<br />
<img src="http://www.taoer.com/wp-content/uploads/2010/02/step9.png" alt="" title="step9" width="555" height="163" class="alignnone size-full wp-image-584" /></p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2010/02/01/use-eclipse-debugrun-breakpoint-program/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java的传值与传引用</title>
		<link>http://tech-notes.taoer.com/2010/01/01/java-reference-point-value-notes/</link>
		<comments>http://tech-notes.taoer.com/2010/01/01/java-reference-point-value-notes/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 04:47:26 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=568</guid>
		<description><![CDATA[java的传值与传引用
java中，基本数据类型都是传值，比如int，double，lang，
java中，对象都是传引用，
特例，String对象是传值操作
=赋值操作是传引用操作
克隆分为影子克隆和深克隆
下面以图片... ]]></description>
			<content:encoded><![CDATA[<p>java的传值与传引用</p>
<p>java中，基本数据类型都是传值，比如int，double，lang，<br />
java中，对象都是传引用，<br />
特例，String对象是传值操作<br />
=赋值操作是传引用操作<br />
克隆分为影子克隆和深克隆</p>
<p>下面以图片来说明各个不同的操作：<br />
<a href="http://www.taoer.com/wp-content/uploads/2010/01/new.jpg"><img src="http://www.taoer.com/wp-content/uploads/2010/01/new.jpg" alt="" title="new" width="400" height="298" class="alignnone size-full wp-image-569" /></a></p>
<p>new出一个新的对象a1，在内存中开辟出一块新的区域给a1使用。</p>
<p><a href="http://www.taoer.com/wp-content/uploads/2010/01/assignment.jpg"><img src="http://www.taoer.com/wp-content/uploads/2010/01/assignment.jpg" alt="" title="assignment" width="521" height="298" class="alignnone size-full wp-image-570" /></a></p>
<p>new出一个新的对象a1，在内存中开辟出一块新的区域给a1使用。同时，将a1赋值给a2，这时，也会分配内存给a2，但是a2存放的不是与a1一样的对象，而是指向a1的指针，或者说a2是a1的引用。<br />
<a href="http://www.taoer.com/wp-content/uploads/2010/01/singleClone.jpg"><img src="http://www.taoer.com/wp-content/uploads/2010/01/singleClone.jpg" alt="" title="singleClone" width="380" height="285" class="alignnone size-full wp-image-571" /></a><br />
一个很直接的克隆例子，先new一个a1出来，然后使用a1克隆的方法给a2赋值，这是内存会分配两个区域给a1和a2分别使用，二者互不相干。</p>
<p>下面来说说影子克隆与深度克隆<br />
所以影子克隆与深度克隆一个主要的区别就在于，如果一个对象A里的成员变量B是另外一个对象，影子克隆只是克隆出一份A，但是克隆出来的A里面的B还是一个指向原来A中的一个指针，而深度克隆就是出来的A中的B也是一个新的B，与原来A中的B互不相干，说的有些绕口，下面来看图。</p>
<p>先假定咱们有如下的class：<br />
class B {&#8230;&#8230;}<br />
class A { B b;}<br />
A中的一个成员变量b是B对象。</p>
<p><a href="http://www.taoer.com/wp-content/uploads/2010/01/shadowClone.jpg"><img src="http://www.taoer.com/wp-content/uploads/2010/01/shadowClone.jpg" alt="" title="shadowClone" width="487" height="275" class="alignnone size-full wp-image-572" /></a><br />
这张图说明的是影子克隆，影子克隆的结果就是a1与a2分配出了一块内存区域，b1分配出了一块内存区域，b2也是占用了内存区域，但是它是指向b1的一个指针，对b2进行改变会影响到b1跟着改变。 </p>
<p><a href="http://www.taoer.com/wp-content/uploads/2010/01/allClone.jpg"><img src="http://www.taoer.com/wp-content/uploads/2010/01/allClone.jpg" alt="" title="allClone" width="370" height="275" class="alignnone size-full wp-image-573" /></a><br />
恩，这张图说明的就是深度克隆了，给b2分配了内存，但是这时不是指向b1的一个指针了，而是实实在在的B b2对象，对b2的改变与b1没有关系。</p>
<p>java的深度克隆与影子克隆的实现方法，可以参考下面的资料。</p>
<p>参考资料：<br />
Java基本功——Reference</p>
<p><a href="http://dreamhead.blogbus.com/logs/2005/05/1189478.html" title="http://dreamhead.blogbus.com/logs/2005/05/1189478.html" target="_blank">dreamhead.blogbus.com/logs/2005/05/1189478.html</a></p>
<p>JAVA中的指针,引用及对象的clone</p>
<p><a href="http://www.ibm.com/developerworks/cn/java/l-jpointer/index.html" title="http://www.ibm.com/developerworks/cn/java/l-jpointer/index.html" target="_blank">www.ibm.com/developerworks/cn/java/l-jpointer/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2010/01/01/java-reference-point-value-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java中的ListIterator与Iterator的区别</title>
		<link>http://tech-notes.taoer.com/2009/12/29/java-listiterator-iterator-difference-usage/</link>
		<comments>http://tech-notes.taoer.com/2009/12/29/java-listiterator-iterator-difference-usage/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 02:21:55 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=566</guid>
		<description><![CDATA[Java中的ListIterator与Iterator的区别
最近在使用Iterator迭代器遍历一个List，如果List里的元素满足一些条件，就要把这个List的这个元素给remove，或者给重新设置一个新值，remove很容易，在当前迭代... ]]></description>
			<content:encoded><![CDATA[<p>Java中的ListIterator与Iterator的区别</p>
<p>最近在使用Iterator迭代器遍历一个List，如果List里的元素满足一些条件，就要把这个List的这个元素给remove，或者给重新设置一个新值，remove很容易，在当前迭代的对象中直接调用remove方法即可。<br />
但是要想改变元素的值，那就不可以了。</p>
<p>从网上搜资料，找到了ListIterator，先来简明扼要的说说二者最大的区别吧，<br />
ListIterator迭代器可以增加元素，更新元素，并且可以从后往前的来对List进行迭代等等。</p>
<p>a.ListIterator有add()方法，可以向List中添加对象，而Iterator不能；<br />
b.ListIterator和Iterator都有hasNext()和next()方法，可以实现顺序向后遍历，但是ListIterator有hasPrevious()和previous()方法，可以实现逆向（顺序向前）遍历。Iterator就不可以；<br />
c.ListIterator可以定位当前的索引位置，nextIndex()和previousIndex()可以实现。Iterator没有此功能；<br />
d.都可实现删除对象，但是ListIterator可以实现对象的修改，set()方法可以实现。Iierator仅能遍历，不能修改。 </p>
<p>因为ListIterator的这些功能，可以实现对LinkedList等List数据结构的操作。其实，数组对象也可以用迭代器来实现。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2009/12/29/java-listiterator-iterator-difference-usage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何通过action来给valueList的查询条件赋值</title>
		<link>http://tech-notes.taoer.com/2009/12/29/through-action-give-value-valuelist/</link>
		<comments>http://tech-notes.taoer.com/2009/12/29/through-action-give-value-valuelist/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 02:14:45 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=564</guid>
		<description><![CDATA[如何通过action来给valueList的查询条件赋值 
以前使用valueList来做查询条件时，总是从页面的form中进行post或者get值给valueList，比如在valueList里会有这样一段代码：
/~con1: AND fields1=[con1]~/
但是这次... ]]></description>
			<content:encoded><![CDATA[<p>如何通过action来给valueList的查询条件赋值 </p>
<p>以前使用valueList来做查询条件时，总是从页面的form中进行post或者get值给valueList，比如在valueList里会有这样一段代码：<br />
/~con1: AND fields1=[con1]~/</p>
<p>但是这次项目遇到的是根据不同的登录角色来进行条件不一样的查询，这个如果通过表单提交的方法就很麻烦而且从客户端浏览器的行为也容易被篡改，咱们可以这样。</p>
<p>在valueList对应的Action中，增加相应的doPrepare()方法，比如下面代码这样：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p564code6');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p564code6'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p5646"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code" id="p564code6"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doPrepare<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// 账户</span>
		addParam<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;customerId&quot;</span>, his.<span style="color: #006633;">getLoginedCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		removeParam<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;receiverOrPayer&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// 支付方式</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> channel <span style="color: #339933;">=</span> request.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;channel&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>StringUtils.<span style="color: #006633;">isBlank</span><span style="color: #009900;">&#40;</span>channel<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> channels <span style="color: #339933;">=</span> channel.<span style="color: #006633;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;_&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			addParam<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;channel&quot;</span>, channels<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>channels.<span style="color: #006633;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				addParam<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;channel&quot;</span><span style="color: #339933;">+</span>i, channels<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>	
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>里面主要的方法就是addParam,removeParam,这样可以在把数据交给valueList前，先进行一层处理、包装，addParam可以把值传给valueList，以供使用。</p>
<p>为什么doPrepare会被执行呢？</p>
<p>这个Class声明是这样的：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p564code7');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p564code7'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p5647"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p564code7"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ListOrderHis <span style="color: #000000; font-weight: bold;">extends</span> BaseValueListAction <span style="color: #009900;">&#123;</span>......<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>那么就来看看BaseValueListAction里面的内容吧，在这个Action中，有如下的一个方法：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p564code8');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p564code8'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p5648"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p564code8"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> prepare<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
......
<span style="color: #006633;">doPrepare</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>明白了吧，是这里来的prepare()方法调用的doPrepare()方法，咱们在子类中把doPrepare()方法给覆盖了，所以就会被执行了，那又是什么机制调用的prepare()方法呢？<br />
那就一级一级来看吧，<br />
这个BaseValueListAction声明如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p564code9');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p564code9'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p5649"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p564code9"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BaseValueListAction <span style="color: #000000; font-weight: bold;">extends</span> CRMActionSupport <span style="color: #000000; font-weight: bold;">implements</span> Preparable <span style="color: #009900;">&#123;</span>......<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>有没有发现实现的接口里也包含了Preparable类似的词组？<br />
那就来找Preparable看看，在前面有这样一行import代码如下：<br />
import com.opensymphony.xwork.Preparable;</p>
<p>在 Preparable中的代码是如何的呢？</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p564code10');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p564code10'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p56410"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p564code10"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Preparable <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * This method is called to allow the action to prepare itself.
	 *
	 * @throws Exception thrown if a system level exception occurs.
	 */</span>
	<span style="color: #000066; font-weight: bold;">void</span> prepare<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Exception</span></a><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>看来只要实现这个接口的prepare方法，就可以在咱们的action执行之前来写一些代码了。</p>
<p>这么看来，是xwork和webwork在起作用了，在网上搜罗了相关的一些资料，发现是webwork的拦截器机制在起作用，拦截器，究其根本原因，在网上找到了如下一篇文档可以很好的说明这个问题了。</p>
<p>第五课: 截取器(Interceptors)</p>
<p><a href="http://svn.opensymphony.com/svn/webwork/trunk/docs/chinese/wikidocs/TutorialLesson05.html" title="http://svn.opensymphony.com/svn/webwork/trunk/docs/chinese/wikidocs/TutorialLesson05.html" target="_blank">svn.opensymphony.com/svn/webwork/trunk/docs/chinese/wikidocs/TutorialLesson05.html</a></p>
<p>朋友们有空儿可以来看看。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2009/12/29/through-action-give-value-valuelist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java的Calendar对象需要注意的问题</title>
		<link>http://tech-notes.taoer.com/2009/12/09/java-calendar-issues-needing-attention/</link>
		<comments>http://tech-notes.taoer.com/2009/12/09/java-calendar-issues-needing-attention/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 03:52:50 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=559</guid>
		<description><![CDATA[java的Calendar对象需要注意的问题：
1.每周是从周日开始算的
周日算每周的第一天，周六算每周的最后一天。
十二月：
日 一 二 三 四 五 六
13 14 15 16 17 18 19
20 21 &#8230; 
这个引发出的问题，如果... ]]></description>
			<content:encoded><![CDATA[<p>java的Calendar对象需要注意的问题：</p>
<p>1.每周是从周日开始算的<br />
周日算每周的第一天，周六算每周的最后一天。</p>
<p>十二月：<br />
日 一 二 三 四 五 六<br />
13 14 15 16 17 18 19<br />
20 21 &#8230; </p>
<p>这个引发出的问题，如果计算12月17日这一周的周六周日的日期，咱们期望得到的是：<br />
周六：12月19日，周日：12月20日，<br />
但是实际呢？<br />
周六：12月19日，周日：12月13日</p>
<p>为什么呢？因为周日是这周的第一天，所以就这样了，在咱们得到这个值后，还需要进行处理，才能按照咱们的习惯使用。</p>
<p>2.接着第一个问题，那咱们能不能把每周的周一定为每周的第一天呢？<br />
Calendar有这样一个方法，setFirstDayOfWeek()<br />
我曾经这样使用：<br />
Calendar c = Calendar.getIntance();<br />
c.setFirstDayOfWeek(Calendar.MONDAY);<br />
从表面很好理解，设定c对象的每周的第一天是周一，其实不然！<br />
Calendar.MONDAY这个常量值就是2，不可改变。</p>
<p>3.每年中的月份不是1-12月，是0-11月。</p>
<p>4.从Date转换到Calendar用如下方法：<br />
Date d = new Date();<br />
Calendar c = Calendar.getIntance();<br />
c.setTime(d);</p>
<p>5.从Calendar转换到Date用如下方法：<br />
Calendar c = Calendar.getIntance();<br />
c.getTime();</p>
<p>6.常用的方法<br />
在YP2G_CreditPay这个项目中，有两个文件，<br />
/YP2G_CreditPay/src/java/com/yeepay/credit/common/CommonDate.java<br />
/YP2G_CreditPay/src/java/com/yeepay/credit/common/CommonDateConvert.java</p>
<p>其中CommonDate是常用对日期操作的方法。<br />
CommonDateConvert是对String,Date,Calendar对象互相转换的方法，<br />
可以提供给大家使用。</p>
<p>下面简单的说一下CommonDate主要的一些方法。</p>
<p>//传入一个日期，比较是否在后两个日期的区间之中<br />
CommonDate.isDayInSections(Calendar compareDate, Calendar beginDate, Calendar endDate)</p>
<p>//返回周几的具体日期<br />
CommonDate.getCalendarByDayOfWeek(int dayOfWeek)<br />
CommonDate.getCalendarByDayOfWeek(int dayOfWeek, Calendar calendar)</p>
<p>//返回calendar对象所在的这一月中，这个月的第几天的具体日期<br />
CommonDate.getCalendarByDayOfMonth(int dayOfMonth)<br />
CommonDate.getCalendarByDayOfMonth(int dayOfMonth, Calendar calendar)</p>
<p>//给出星期几，返回离当前日期未来最近的那个星期几的日期<br />
CommonDate.getCalendarByNearlyDayOfWeek(int dayOfWeek)</p>
<p>//给出一个月中的第几天，返回离当前日期最近的那个星期月的那天的日期<br />
CommonDate.getCalendarByNearlyDayOfMonth(int dayOfMonth)</p>
<p>//在传入的日期的基础上向后推算一天<br />
CommonDate.addOneDayToSuspendedDate(Calendar date)</p>
<p>//在传入的日期的基础上向前推算一天<br />
CommonDate.reduceOneDayToSuspendedDate(Calendar date)</p>
<p>//在传入的日期的基础上向后推算N天<br />
CommonDate.addSomeDaysToSuspendedDate(Calendar date, int days)</p>
<p>//返回一个Calendar对象，这个Calendar对象的时区被设置为GMT+8<br />
CommonDate.getCalendar()</p>
<p>//将Calendar对象设置为0点0分0秒<br />
CommonDate.setTimeToZero(Calendar calendar)</p>
<p>//为传入的每周的第几天+1天，来适应Calendar对象将周日作为每周第一天的需求<br />
CommonDate.addOneDayForCalendarWeek(int dayOfWeek)</p>
<p>7.可供参考的资料：<br />
Date类学习总结(Calendar Date 字符串 相互转换 格式化)</p>
<p><a href="http://hi.baidu.com/jiangpanfeixue/blog/item/4b778603931c16723812bb1b.html" title="http://hi.baidu.com/jiangpanfeixue/blog/item/4b778603931c16723812bb1b.html" target="_blank">hi.baidu.com/jiangpanfeixue/blog/item/4b778603931c16723812bb1b.html</a></p>
<p>JAVA的Date类与Calendar类</p>
<p><a href="http://www.cnblogs.com/springcsc/archive/2009/12/03/1616347.html" title="http://www.cnblogs.com/springcsc/archive/2009/12/03/1616347.html" target="_blank">www.cnblogs.com/springcsc/archive/2009/12/03/1616347.html</a></p>
<p>Calendar 类的setFirstDayOfWeek 方法详解 </p>
<p><a href="http://ajava.org/course/java/17121.html" title="http://ajava.org/course/java/17121.html" target="_blank">ajava.org/course/java/17121.html</a></p>
<p>关于java的calendar类和date类</p>
<p><a href="http://zhidao.baidu.com/question/56621584.html" title="http://zhidao.baidu.com/question/56621584.html" target="_blank">zhidao.baidu.com/question/56621584.html</a></p>
<p>还有白玮的有一次关于JAVA日期时间的分享，昨天我又翻了一遍，还是很有用的。我一并打包成zip包放在附件里了。</p>
<p>附件见这里：<br />
<a href='http://www.taoer.com/wp-content/uploads/2009/12/日期和时间.zip'>java的日期和时间</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2009/12/09/java-calendar-issues-needing-attention/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>db2中sql语句的另外一种update语句写法</title>
		<link>http://tech-notes.taoer.com/2009/12/07/db2-sql-update-another-implements/</link>
		<comments>http://tech-notes.taoer.com/2009/12/07/db2-sql-update-another-implements/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 07:50:30 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=554</guid>
		<description><![CDATA[一般的咱们常用的update语句结构如下：

?[Copy to clipboard]View Code SQL1
UPDATE TB SET FIELDNAME='FIELDNEWVALUE' WHERE xxx;

但是今天碰到了需要更新多个字段的情况，比如需要更新10个字段，前5个字段的值来自... ]]></description>
			<content:encoded><![CDATA[<p>一般的咱们常用的update语句结构如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p554code13');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p554code13'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p55413"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p554code13"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">UPDATE</span> TB <span style="color: #993333; font-weight: bold;">SET</span> FIELDNAME<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'FIELDNEWVALUE'</span> <span style="color: #993333; font-weight: bold;">WHERE</span> xxx;</pre></td></tr></table></div>

<p>但是今天碰到了需要更新多个字段的情况，比如需要更新10个字段，前5个字段的值来自表A，中间三个字段值来自表B，最后两个字段值来自表C，<br />
如果要是一个一个字段的写 f=&#8217;xxx&#8217;这样太麻烦了，于是乎上网搜索，发现了另外一种写法。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p554code14');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p554code14'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p55414"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p554code14"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">UPDATE</span> TB <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span>field1<span style="color: #66cc66;">,</span> field2<span style="color: #66cc66;">,</span> field3<span style="color: #66cc66;">,</span> field4<span style="color: #66cc66;">......</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">=</span> 
<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> field1<span style="color: #66cc66;">,</span> field2<span style="color: #66cc66;">,</span> field3<span style="color: #66cc66;">,</span> field4
 <span style="color: #993333; font-weight: bold;">FROM</span> A
 <span style="color: #993333; font-weight: bold;">JOIN</span> B <span style="color: #993333; font-weight: bold;">ON</span> xxx
 <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> C <span style="color: #993333; font-weight: bold;">ON</span> xxx
 <span style="color: #993333; font-weight: bold;">WHERE</span> TB<span style="color: #66cc66;">.</span>ID<span style="color: #66cc66;">=</span>A<span style="color: #66cc66;">.</span>ID <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">AND</span> xxxx<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>这个sql语句的意思就有些类似insert 常用的方法了，即首先在SET关键字后面写好待更新的字段列表，然后写“=”，在“=”后可以写一个联合查询，把需要的字段按照前面的顺序进行排列，再再WHERE子句中按照一定的条件进行关联，这样，update就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2009/12/07/db2-sql-update-another-implements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>当遇到问题，而没有求助条件的情况下，应如何</title>
		<link>http://www.taoer.com/2009/11/23/how-to-work-without-help/</link>
		<comments>http://www.taoer.com/2009/11/23/how-to-work-without-help/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 04:44:42 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=552</guid>
		<description><![CDATA[当你遇到问题了，但是google百度都找不到解决方法，根据自己以往的经验也不能解决，想求助于人但是没有资源（比如昨天加班时别的同事都下班了），这个时候怎么办？
还是要遵守咱们的，... ]]></description>
			<content:encoded><![CDATA[<p>当你遇到问题了，但是google百度都找不到解决方法，根据自己以往的经验也不能解决，想求助于人但是没有资源（比如昨天加班时别的同事都下班了），这个时候怎么办？</p>
<p>还是要遵守咱们的，自己思考问题的时间不能超过两个小时，以我昨天为例，一个在java application中调用jndi总是不成功，因为jndi是放在jboos或者tomcat这类容器中的，结果我就一直在试图single one解决这个问题。</p>
<p>其实，还有另外种方法，因为我昨天写了个添加数据库记录的service，所以要写个main方法来测试，因为没有jboos容器，一直测试不成功也解决不了jndi的调用问题，到了将近两点，已失败告终。</p>
<p>后来打车回家时候我在想，不应该用N多个小时来解决jndi的调用，没有求助环境，我可以先把其他的service写好，总结好遇到的问题，等到第二天上班有了同事在的时候再统一求助，这样时间规划上就会比我现在的情况要好的多。</p>
<p>以此为例，与大家共勉。<br />
在时间安排上各位有什么好的建议，咱们也可以共同交流。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoer.com/2009/11/23/how-to-work-without-help/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>针对于上周风控二期项目出现问题的总结</title>
		<link>http://www.taoer.com/2009/11/23/project-summary-smart-clear-work-target/</link>
		<comments>http://www.taoer.com/2009/11/23/project-summary-smart-clear-work-target/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 04:42:28 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=548</guid>
		<description><![CDATA[上周的风控二期项目算是暂时的小夭折了，原因是因为需求不明确，经过梁川的分析，我总结出如下几点和大家共勉： 
1.首先要做好、做精自己的工作，我理解自己的工作是本职工作，是所有... ]]></description>
			<content:encoded><![CDATA[<p>上周的风控二期项目算是暂时的小夭折了，原因是因为需求不明确，经过梁川的分析，我总结出如下几点和大家共勉： </p>
<p>1.首先要做好、做精自己的工作，我理解自己的工作是本职工作，是所有向上发展的基础和本钱，所以这个首当其冲的要做好。</p>
<p>2.在本职工作做好以后，可以考虑做（学习）一些跟自己发展方向相关的工作，比如我想往项目管理方向发展，我就可以做一些需求分析或者设计分析的工作，但是有一点要注意，在做这些工作的时候要多和有经验的同事、领导进行交流沟通，因为他们会对你给出发展的建议，并且在你学习这些的时候使你少走弯路，试问，谁不想快速、正确、有效的发展呢？</p>
<p>3.要时刻保持清醒的头脑，这个我举例来说明，就拿这个风控二期的项目来说吧，由于需求之前没有形成书面的可读的文档，所以蔡柯要我总结一下需求分析，我个人对需求分析也是很感兴趣，于是就很高兴的接受了工作，做了一周的需求分析，等到梁川看到的时候，发现所做的文档并不具有很好的可读性，而且也浪费了工作时间。</p>
<p>如果在接受任务之前，可以自己的想想，我现阶段的主要目标是什么，目标之一是快速对java项目上手；再或者，接受之后，可以找有经验的同事、领导进行沟通和辅导，就不会出现上面所说的问题。</p>
<p>所以我觉得，做自己感兴趣的工作是好事，有机会做自己感兴趣的工作或者对自己发展相关的工作是好的机会，但是不要被这种好事和好机会冲昏头脑，时刻清楚自己的目标，自己的能力，才能更有效的利用时间和机会来提高自己。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>另外，对整个团队而言，在这次项目中也出现了两点很重要的问题，谢谢梁川的提醒：</p>
<p>1、 对协作和主动的正确理解：原来大家理解的产品提不清楚需求就由技术来代劳的思路是不正确的。协作首先意味着团队的合作，要主动去帮助协作的伙伴去一起去成长，这样才能够长远发展。</p>
<p>这点所犯的问题体现在这个项目上的是：产品没有形成可读的需求文档，而做为技术的我们没有要求产品出需求文档，反而是我们来做，所以这点的弊端就和梁川所说的吻合，有可能我们是在“帮助”，但是这样的“帮助”并不会对团队中的伙伴成长起到任何左右，有可能反而助长了惰性，而且，也耗费了我们做为技术的开发时间，这是件很可怕的事情，在今后的工作中必须要避免。</p>
<p>2、 要及时向主管反馈工作进度及需要的帮助，让主管协助协调资源，而不是闷头就做。</p>
<p>这点我的理解是：做一项工作尤其是一项工作的周期比较长的时候，会体现出与主管随时沟通的必要性，让主管随时了解到你的工作动态，有可能有由于自己的经验、对业务的理解认知，或者看问题的角度等因素，看不到潜在的问题，但是主管可以帮助提早发现并解决，在工作开展以及时间上就可以争取主动。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taoer.com/2009/11/23/project-summary-smart-clear-work-target/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DB2 sql除法运算结果为小数时显示0的解决方法。</title>
		<link>http://tech-notes.taoer.com/2009/10/14/db2-sql-division-cast-round-coalesce/</link>
		<comments>http://tech-notes.taoer.com/2009/10/14/db2-sql-division-cast-round-coalesce/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 08:35:28 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/?p=546</guid>
		<description><![CDATA[今天在DB2下写sql的时候遇到了这样的一个问题，
【分享点1：】
SELECT field1/field2 FROM TB;
当 field1的数值 > field2的数值时，除法得出的结果... ]]></description>
			<content:encoded><![CDATA[<p>今天在DB2下写sql的时候遇到了这样的一个问题，</p>
<p>【分享点1：】<br />
SELECT field1/field2 FROM TB;<br />
当 field1的数值 > field2的数值时，除法得出的结果是<1的，即0.xxxxxx<br />
这个时候在DB2的环境下SELECT出来的值是0<br />
这个有两个解决方法</p>
<p>方法1：<br />
DB CFG的一个参数MIN_DEC_DIV_3，这个参数在GET DB CFG FOR DB中并不会列出，但却可以修改。<br />
数据库配置参数MIN_DEC_DIV_3会更改涉及小数的十进制算术运算的结果小数位。<br />
默认值为No，则小数位计算为 31-p+s-s'。<br />
如果设置为Yes，则小数位计算为 MAX(3, 31-p+s-s')。<br />
这会导致十进制小数部分始终至少具有3位的小数位。精度始终为31。</p>
<p>这个方法貌似需要通过DBA对数据库进行设置，不太靠谱儿，有另外一种方法可以曲线救国，登场：</p>
<p>将sql语句修改为：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p546code18');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p546code18'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p54618"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p546code18"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> CAST<span style="color: #66cc66;">&#40;</span>field1 <span style="color: #993333; font-weight: bold;">AS</span> DOUBLE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>field2 <span style="color: #993333; font-weight: bold;">FROM</span> TB;</pre></td></tr></table></div>

<p>就是先把field1转换成DOUBLE类型的，这样计算出来的就会得出小数点了，会显示出0.xxxxxx</p>
<p>【分享点2：】<br />
额，接下来，需要对得出的小数点位数进行约束，那就用四舍五入吧，</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p546code19');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p546code19'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p54619"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p546code19"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> ROUND<span style="color: #66cc66;">&#40;</span>CAST<span style="color: #66cc66;">&#40;</span>field1 <span style="color: #993333; font-weight: bold;">AS</span> DOUBLE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>field2<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> TB;</pre></td></tr></table></div>

<p>这个意思就是说四舍五入，保留两位小数点</p>
<p>【分享点三：】<br />
但是如果field1或者field2有一个字段为NULL的话，那么结果为NULL，这个时候根据逻辑需要进行如下的一个操作，<br />
如果数据列的值为NULL，将其设置为0，那么sql就要这么写</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup><a href="javascript:;" onclick="copycode('p546code20');">[Copy to clipboard]</a></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p546code20'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p54620"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p546code20"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> ROUND<span style="color: #66cc66;">&#40;</span>COALESCE<span style="color: #66cc66;">&#40;</span>CAST<span style="color: #66cc66;">&#40;</span>field1 <span style="color: #993333; font-weight: bold;">AS</span> DOUBLE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>field2<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> TB;</pre></td></tr></table></div>

<p>COALESCE这个函数系统的用法如下:<br />
a. 输入参数为字符类型，且允许为空的，可以使用COALESCE(inputParameter,&#8221;)把NULL转换成&#8221;;<br />
b. 输入类型为整型，且允许为空的，可以使用COALESCE(inputParameter,0)，把空转换成0；<br />
c. 输入参数为字符类型，且是非空非空格的，可以使用COALESCE(inputParameter,&#8221;)把NULL转换成&#8221;，然后判断函数返回值是否为&#8221;；<br />
d. 输入类型为整型，且是非空的，不需要使用COALESCE函数，直接使用IS NULL进行非空判断。</p>
<p>好，就这么多了，OVER。。。</p>
<p>参考：<br />
DECIMAL数据类型相除后的精度和小数位和数据库配置参数</p>
<p><a href="http://www-01.ibm.com/support/docview.wss?uid=csc1a671ee5bc525954a4825711c002d4edb" title="http://www-01.ibm.com/support/docview.wss?uid=csc1a671ee5bc525954a4825711c002d4edb" target="_blank">www-01.ibm.com/support/docview.wss?uid=csc1a671ee5bc525954a4825711c002d4edb</a></p>
<p>min_dec_div_3 － 十进制分隔小数位为 3 配置参数</p>
<p><a href="http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0004470.htm" title="http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0004470.htm" target="_blank">publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0004470.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2009/10/14/db2-sql-division-cast-round-coalesce/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>windows+apache安装awstats</title>
		<link>http://tech-notes.taoer.com/2009/09/09/windows-apache-awstats-cronolog-geoip/</link>
		<comments>http://tech-notes.taoer.com/2009/09/09/windows-apache-awstats-cronolog-geoip/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 03:18:52 +0000</pubDate>
		<dc:creator>SuperTaoer</dc:creator>
				<category><![CDATA[工作分享]]></category>
		<category><![CDATA[程序 技术 周边]]></category>

		<guid isPermaLink="false">http://www.taoer.com/2009/09/09/windows-apache-awstats-cronolog-geoip/</guid>
		<description><![CDATA[由于需要，需要在一台windows服务器上安装日志统计工具，自然而然的就想到了awstats。
以前有做过在linux下配置awstats，这次再试试windows的。。。
首先需要下载几个工具，当然都是运行在windows... ]]></description>
			<content:encoded><![CDATA[<p>由于需要，需要在一台windows服务器上安装日志统计工具，自然而然的就想到了awstats。</p>
<p>以前有做过在linux下配置awstats，这次再试试windows的。。。</p>
<p>首先需要下载几个工具，当然都是运行在windows平台的。</p>
<p>perl5<br />
cronolog<br />
awstats</p>
<p>下载地址分别为：<br />
perl5: <a href="http://www.activestate.com/activeperl/" title="http://www.activestate.com/activeperl/" target="_blank">www.activestate.com/activeperl/</a><br />
cronolog: <a href="http://cronolog.org/download/index.html" title="http://cronolog.org/download/index.html" target="_blank">cronolog.org/download/index.html</a><br />
awstats: <a href="http://awstats.sourceforge.net/#DOWNLOAD" title="http://awstats.sourceforge.net/#DOWNLOAD" target="_blank">awstats.sourceforge.net/#DOWNLOAD</a></p>
<p>好，先安装perl5，然后从cronolog的压缩包中把cronolog.exe提取出来，<br />
解压缩awstats压缩包，放到你想要的目录中留待备用。<br />
<span id="more-544"></span><br />
假设目录结构如下：<br />
D:\<br />
   awstats\<br />
           per5\<br />
                bin\<br />
                    perl.exe<br />
           cronolog\<br />
                    cronolog.exe<br />
           awstats-6.9\<br />
                       wwwroot\<br />
                               js\<br />
                               icon\<br />
                               css\<br />
                               classes\<br />
                               cgi-bin\<br />
                       tools\<br />
                       docs\<br />
                       README.TXT</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>现在先来修改apache的配置文件。<br />
这里需要在配置文件末尾增加如下代码（让apache可以访问到awstats的目录）:<br />
Alias /awstatsclasses &#8220;D:/awstats/awstats-6.9/wwwroot/classes/&#8221;<br />
Alias /awstatscss &#8220;D:/awstats/awstats-6.9/wwwroot/css/&#8221;<br />
Alias /awstatsicons &#8220;D:/awstats/awstats-6.9/wwwroot/icon/&#8221;<br />
ScriptAlias /awstats/ &#8220;D:/awstats/awstats-6.9/wwwroot/cgi-bin/&#8221;<br />
#<br />
# This is to permit URL access to scripts/files in AWStats directory.<br />
#<br />
<Directory "D:/awstats/awstats-6.9/wwwroot/"><br />
    Options None<br />
    AllowOverride None<br />
    Order allow,deny<br />
    Allow from all<br />
</Directory></p>
<p>再来加一行，设置记录日志格式的，假设日志记录在D:/Logs/httpd<br />
LogFormat &#8220;%h %l %u %t \&#8221;%r\&#8221; %>s %b \&#8221;%{Referer}i\&#8221; \&#8221;%{User-Agent}i\&#8221;" combined<br />
LogFormat &#8220;%h %l %u %t \&#8221;%r\&#8221; %>s %b&#8221; common<br />
CustomLog &#8220;|D:/awstats/cronolog/cronolog.exe D:/Logs/httpd/access_awstats.%Y%m%d&#8221; combined</p>
<p>注：如果有虚拟站点，放在虚拟站点里配置比较合理</p>
<p>好了，apache的配置文件搞好了，重启apache，就可以让你的设置生效，接下来在log目录下就可以看到记录了，<br />
接下来进行awstats的配置文件</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>进入到：D:\awstats\awstats-6.9\wwwroot\cgi-bin 目录。<br />
找到默认的awstats.model.conf文件，复制出来两份到当前目录，一份取名为：<br />
common.conf，另一份取名为：awstats.www.domain.com.conf，具体的名字根据你的域名更改吧。<br />
common.conf不用去管，打开awstats.www.domain.com.conf，把里面的内容清空，换成如下内容：</p>
<p>#包含通用的配置文件<br />
Include &#8220;common.conf&#8221;<br />
#按日期时间分割的日志文件的位置<br />
LogFile=&#8221;D:/Logs/httpd/access_awstats.%YYYY-24%MM-24%DD-24.txt&#8221;<br />
#记录日志文件的类型，这个如果是apache的话不用修改<br />
LogType=W<br />
#记录日志文件的类型，这个如果是apache，LogFormat是combined的话不用修改<br />
LogFormat=1<br />
#日志每条记录每列的分隔符，一般不用修改<br />
LogSeparator=&#8221; &#8221;<br />
#记录日志的域名<br />
SiteDomain=&#8221;www.domain.com&#8221;<br />
#主机别名<br />
HostAliases=&#8221;127.0.0.1&#8243;<br />
#存放分析日志结果的目录，这个目录一定要存在<br />
DirData=&#8221;./data&#8221;<br />
#cgi-bin目录，这个一般不用修改<br />
DirCgi=&#8221;/cgi-bin&#8221;<br />
#icon图标存在的目录，这个需要修改成/awstatsicons<br />
DirIcons=&#8221;/awstatsicons&#8221;</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>好了，进行完如上配置，可以开始测试了，先用命令行方式，进入到D:\awstats\awstats-6.9\wwwroot\cgi-bin目录，<br />
然后执行：<br />
D:/awstats/perl5/bin/perl.exe awstats.pl -config=www.domain.com，不出意外的话，会显示出如下信息：<br />
Create/Update database for config &#8220;./awstats.www.domain.com.conf&#8221; by AWStats ver<br />
sion 6.9 (build 1.925)<br />
From data in log file &#8220;D:/Logs/httpd/access_awstats.20090907.txt&#8221;&#8230;<br />
Phase 1 : First bypass old records, searching new record&#8230;<br />
Searching new records from beginning of log file&#8230;<br />
Phase 2 : Now process new records (Flush history on disk after 20000 hosts)&#8230;<br />
Jumped lines in file: 0<br />
Parsed lines in file: 4896<br />
 Found 0 dropped records,<br />
 Found 0 corrupted records,<br />
 Found 0 old records,<br />
 Found 4896 new qualified records.</p>
<p>接下来就该考虑如何用web方式来显示了，<br />
cgi-bin目录下有两个pl文件，分别为，awredir.pl，awstats.pl<br />
将这两个文件打开，把第一行的：#!/usr/bin/perl都修改成：#!D:/awstats/perl5/bin/perl.exe</p>
<p>然后打开web浏览器，输入： <a href="http://www.domain.com/awstats/awstats.pl?config=www.domain.com" title="http://www.domain.com/awstats/awstats.pl?config=www.domain.com" target="_blank">www.domain.com/awstats/awstats.pl?config=www.domain.com</a><br />
或者：http://127.0.0.1/awstats/awstats.pl?config=www.domain.com<br />
127.0.0.1替换成你的服务器ip，就可以看到awstats的统计界面了。。。</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>接下来给awstats加一个需要用户名才可以访问的功能。<br />
将刚才的awstats.www.domain.com.conf文件打开，添加如下两行<br />
AllowAccessFromWebToAuthenticatedUsersOnly=1<br />
AllowAccessFromWebToFollowingAuthenticatedUsers=&#8221;yourAuthUserName&#8221;</p>
<p>然后使用apache的http验证机制，进入到你的apache安装的bin目录下，执行：<br />
htpasswd.exe -c .authPasswd yourAuthUserName<br />
接下来按照命令行提示，输入两次密码，就会出现了一个.authPasswd文件了，<br />
将这个生成的文件移动到你想要放的位置，并且在上面的<Directory "D:/awstats/awstats-6.9/wwwroot/">&#8230;&#8230;</Directory><br />
中增加如下内容<br />
AuthType Basic<br />
AuthName &#8220;auth&#8221;<br />
AuthUserFile D:/awstats/awstats-6.9/wwwroot/cgi-bin/.authPasswd<br />
Require valid-user require</p>
<p>其中AuthUserFile要改成你相应的密码文件位置。<br />
重启apache，再次访问刚才的网址，就会让你输入你设置好的用户名和密码了。</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>再接下来，给awstats增加一个显示来访IP归属地的功能。<br />
这里有两个解决方案，一个是采用Geo-IP，另外一个是采用QQWry.Dat<br />
我这里采用的是后者，<br />
先来下载三个东西：</p>
<p><a href="http://www.ieasy.org/download/qqhostinfo.pm" title="http://www.ieasy.org/download/qqhostinfo.pm" target="_blank">www.ieasy.org/download/qqhostinfo.pm</a></p>
<p>这个是显示来访IP归属地的插件，下载后放到cgi-bin/plugins目录中</p>
<p><a href="http://www.ieasy.org/download/qqwry.pl" title="http://www.ieasy.org/download/qqwry.pl" target="_blank">www.ieasy.org/download/qqwry.pl</a></p>
<p>这个是分析QQWry.Dat的perl脚本，放在同一目录。</p>
<p>QQWry.Dat 这个从网上搜索下下载吧，是IP归属地的地址库，一搜一大堆。</p>
<p>好了，上面的工作做完了，接着来修改配置文件，在最后继续增加如下内容：<br />
LoadPlugin=&#8221;qqhostinfo&#8221;</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>BUT！！！运行后效果并不好，所以还是老老实实的采用GEO-IP吧，哈哈。。。<br />
先进入到perl5的bin目录： D:\awstats\perl5\bin<br />
然后执行如下命令：<br />
ppm install Geo::IP::PurePerl<br />
ppm install Geography::Countries<br />
ppm install IP::Country<br />
ppm install Geo-IPfree<br />
ppm install  Net-Xwhois</p>
<p>再下载个GeoIP.dat</p>
<p><a href="http://www.big-cat.cn/wp-content/uploads/2008/05/GeoIP.dat" title="http://www.big-cat.cn/wp-content/uploads/2008/05/GeoIP.dat" target="_blank">www.big-cat.cn/wp-content/uploads/2008/05/GeoIP.dat</a></p>
<p>如果下载链接失效，也是网上搜索一下儿下载吧。<br />
下载好后放到cgi-bin目录</p>
<p>好，接下来打开插件<br />
# 开启 GeoIP 反查模块<br />
LoadPlugin=&#8221;geoip GEOIP_STANDARD D:/awstats/awstats-6.9/wwwroot/cgi-bin/ipdata/GeoIP.dat&#8221;<br />
# 开启 IP 反查的外挂<br />
LoadPlugin=&#8221;geoipfree&#8221;<br />
# 开启 decodeutfkeys 外挂，解决&#8221;用以搜索的关键词&#8221;乱码<br />
LoadPlugin=&#8221;decodeutfkeys&#8221;</p>
<p>现在把刚才生成的data目录下的数据文件删除掉，使用<br />
D:/awstats/perl5/bin/perl.exe awstats.pl -config=www.domain.com<br />
命令重新生成，这个时候儿，出现了如下错误：<br />
Error: Conflict between plugin &#8216;geoipfree&#8217; and &#8216;geoip&#8217;. They both implements the &#8216;must be unique&#8217; function &#8216;GetCountryCodeByAddr&#8217;.<br />
是说这两个插件产生了冲突，所以我把LoadPlugin=&#8221;geoipfree&#8221;这样给注释掉了<br />
#LoadPlugin=&#8221;geoipfree&#8221;</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>最后，再使用bat批处理+计划任务，设置成每天0点10分自动执行</p>
<p>批处理如下：<br />
@ECHO OFF<br />
D:<br />
cd &#8220;D:\awstats\awstats-6.9\wwwroot\cgi-bin\&#8221;<br />
D:/awstats/perl5/bin/perl.exe awstats.pl -config=www.domain.com</p>
]]></content:encoded>
			<wfw:commentRss>http://tech-notes.taoer.com/2009/09/09/windows-apache-awstats-cronolog-geoip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 4.317 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-03-15 10:14:53 -->
