<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>编程.读书.思考</title>
    <description>人都不笨,努力就是啦......</description>
    <link>http://lighter.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>五一游玩闲记</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/189454" style="color:red;">http://lighter.javaeye.com/blog/189454</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          游玩的地点: 厦门<br /><br /><span style="color: blue">闲聊饭记:</span><br />4.30 建行大楼饭堂楼下吃中午饭;厦门特色小吃黄则和店晚饭,花生汤,加一些小吃<br /><br />5.1  好又多旁边打包M记回宿舍当午饭;晚饭是厦门特色沃头粥/石码五香/香芋饼<br /><br />5.2  午餐在筷客餐厅解决;晚间吃比较正宗的沙茶面<br /><br />5.3  早上去老虎城喝大碗的咸豆腐花/冰豆腐花,KFC吃午饭,晚上去吃九分熟的牛排西餐,感觉特好吃的<br /><br /><span style="color: blue">游玩的路线:</span><br />4.30 <br />海湾公园: 海边走走,散散心,风景挺漂亮的一个公园,人少,靠海,树多,规划也比较好一些; <br />中山路: 厦门最出名的步行街,一直延伸到海边的的一条街道,骑楼风格的,闽南风味很重的<br /><br />5.1  <br />南普陀寺: 厦门著名古刹，居于鹭岛名山五老峰前，背依秀奇群峰，面临碧澄海港，风景绝佳.<br />厦门大学: 和南普陀寺相连着,当地最出名一所院校,风景挺唯美的<br />鼓浪屿: 厦门最出名的旅游景点啦,很多人都知道的;从轮渡搭船过去,去观光日光岩,坐缆车,去百鸟园观赏一下各种各样的鸟儿,当然还不少了夜晚里怡情的音乐厅<br /><br />5.2  <br />园博园: 林花卉界的园林盛会,其园林设计和音乐喷泉都是非常美丽的,山,水,风景如画;晚上七点到八点,最美丽的景点当属音乐喷泉,有一种动感的美丽<br /><br />5.3 <br />中山路: 逛街,买一些特产,主要是一些松干果和一些馅饼(日光岩馅饼,阿吉仔馅饼等等)<br />环岛路: 搭一路从轮渡到会展中心的车,一路上可以看到整个环岛路的美丽,被称为世界上最美丽的马拉松跑道,海边的风景真的令人心旷神怡<br />会展中心: 和她两个人一起骑双座的自行车,从会展中心的一头骑到另一边,边看海景,边吹海风,边看街道边的园林风格设计以及各种雕像,很舒服很自在,也是最美丽的回忆之一,也挺浪漫的感觉
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/189454#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 17:39:36 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/189454</link>
        <guid>http://lighter.javaeye.com/blog/189454</guid>
      </item>
      <item>
        <title>javascript学习笔录(二)</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/186020" style="color:red;">http://lighter.javaeye.com/blog/186020</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、预装图象<br /><pre name="code" class="java">function doPreload(){
	var the_images = new Array('kwmatt.jpg','matbon.jpg','lunchMat.jpg');
	preloadImages(the_images);
}

function preloadImages(the_images_array) {
	for(loop = 0; loop &lt; the_images_array.length; loop++){
   		var an_image = new Image();
		an_image.src = the_images_array[loop];
	}
}</pre><br />doPreload()函数创建了需要预装的图象名的数组，并把数组作为参数传送到preloadImages()函数, preloadImages()函数包<br />含了一个循环，每次循环都创建一个新的图象对象，并把图象名设到它的src属性中。<br /><br />2、创建一个Javascript对象<br />(1)、最常见的方法<br />比如，创建一个宠物<br /><pre name="code" class="java">function Pet(the_pet_name, the_form_number){
	this.age = 0;
	this.hunger = Math.random() * 5;  // random number between 0 and 4.99
	this.health = Math.random() * 5 + 1 ;  // random number between 1 and 3.99
	this.happiness = Math.random() * 5;
	this.pet_name = the_pet_name;
	this.form_number = the_form_number;
	window.document.forms[the_form_number].pet_name.value = the_pet_name;
}</pre><br /><br />这个构造函数有两个参数：宠物名字和要显示其信息的表单号。要创建两个宠物，我们这么<pre name="code" class="java">做： 
var pet1 = new Pet("barney",0);
var pet2 = new Pet("betty",1);</pre><br /><br />(2).工厂方式<br /><pre name="code" class="java">     function createobject(){
        var o=new Object();
        o.a=1;
        o.b="w";
        o.c=function(){};
        return o;
}</pre><br /> 当然，你可以给这个函数传入参数进行定制，但是对函数的创建就重复了。<br /> 它还有个相近的版本，但是这个版本可以用new来创建<br /><pre name="code" class="java">function createobject(){
        this.a=1;
        this.b="w";
        this.c=function(){};
}</pre><br />(3).使用对象的prototype属性，用一个空构造函数来设置对象名，然后所有的属性和方法都直接用prototype来赋予<br /><pre name="code" class="java">function o(){};
o.prototype.a=1;
o.prototype.b=function(){};</pre><br />此方法也是用new来创建新对象的。<br />    <br />(4).JSON方式来创建<br /><pre name="code" class="java">    var o={
    a:1,
    b:"aa"
    c:function(){}
}</pre><br /><br />3、eval()函数，这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。<br />通过eval()函数，可以获取难以索引的对象，代码如下：<br /><pre name="code" class="java">function simpleSwap(){
	var the_image = prompt("change parrot or cheese","");
	var the_image_name = "window.document." + the_image;
	var the_image_object = eval(the_image_name);
	the_image_object.src = "ant.gif";
}</pre><br /><br />4、四种手段来设置文本框的文本的简单例子：<br />如果在一个表单里有一个文本框，象这样： <br /><pre name="code" class="java">&lt;form name="the_form">
&lt;input type="text" name="the_text_box">
&lt;/form></pre><br /><br />JS代码如下所示：<br />我们可以用四种手段来设置文本框的文本,代码如下：<br /><pre name="code" class="java">var the_form_name = "the_form";
var the_element_name = "the_text_box";

(1)、window.document.forms[0].elements[0].value = "hello!"; 
(2)、window.document.forms[the_form_name].elements[the_element_name].value = "hello!"; 
(3)、window.document.the_form.the_text_box.value = "hello!"; 
(4)、var the_element_string = "window.document." + the_form_name + "." + the_element_name; 
     var the_element = eval(the_element_string);
     the_element_string.value = "hello!"; </pre><br /><br />5、常看的JS错误：<br /><div class="quote_title">引用</div><div class="quote_div">混淆变量名或函数名<br />偶然地使用了保留字<br />偶然给变量加上了引号，或忘了给字符串加引号...</div><br /><br />6、优化JavaScript代码 <br /><div class="quote_title">引用</div><div class="quote_div">(1)、限制循环内的工作量<br />(2)、定制if-then-else语句，按最可能到最不可能的顺序<br />(3)、最小化重复执行的表达式</div>
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/186020#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 17:34:47 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/186020</link>
        <guid>http://lighter.javaeye.com/blog/186020</guid>
      </item>
      <item>
        <title>javascript学习笔录(一)</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/185887" style="color:red;">http://lighter.javaeye.com/blog/185887</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、可以使用 <pre name="code" class="java">var toy = (monkey_behavior=="good") ? "videogames" : "rocks";</pre> 类似语句，减少代码使容易理解<br /><br />2、要使JavaScript中各种同名变量不会发生混淆，你可以在声明变量时在变量前面加上var。在一个函数内用var声明后灯的变量叫做局部变量，它只存在于该函数内部。通常情况下你应该尽量使用局部变量。<br />这里是用var声明后的正确的JavaScript代码：<br /><br /><pre name="code" class="java">function fahrenToCelsius(faren){
    var temp = (faren - 32) * 5 / 9;
    return temp;
}
function convertTemp(){
    var temp = prompt("what temperature Fahrenheit? ","50");
    var celsius = badFahrenToCelsius(temp);
    alert(temp + " degrees Fahrenheit is " + 
        celsius + " degrees Celsius.");
} </pre><br /><br />3、字符串处理<br />javascript字符串处理函数 <a href="http://blog.csdn.net/banmuhuangci/archive/2005/12/23/559985.aspx" target="_blank">http://blog.csdn.net/banmuhuangci/archive/2005/12/23/559985.aspx</a><br /><br />Js字符串操作函数大全     <a href="http://www.phpweblog.net/kiyone/archive/2007/04/19/1135.aspx" target="_blank">http://www.phpweblog.net/kiyone/archive/2007/04/19/1135.aspx</a><br /><br />4、简单的学习数组的例子<br /><pre name="code" class="java">var phone_book = new Array();

phone_book["happy"]  = "(203) 555-1234";
phone_book["sleepy"] = "(203) 555-2345";
phone_book["sneezy"] = "(203) 555-4321";
phone_book["sleazy"] = "(203) 555-3245";
phone_book["sneery"] = "(203) 555-3213";
phone_book["bleary"] = "(203) 555-2365";
phone_book["tweaked"] = "(203)555-1664";</pre><br /><br />表单的代码如下：<br /><pre name="code" class="java">&lt;form name="the_form">
&lt;b>Name:&lt;/b>
&lt;select onChange = "displayNumber(phone_book,this.options[selectedIndex].value);">
&lt;option value="happy">Happy
&lt;option value="sleepy">Sleepy
&lt;option value="sneezy">Sneezy
&lt;option value="sleazy">Sleazy
&lt;option value="sneary">Sneery
&lt;option value="bleary">Bleary
&lt;option value="tweaked">Tweaked
&lt;/select>
&lt;p>	
&lt;b>Number:&lt;/b>
&lt;input type="text" name="number_box"
value="">
&lt;/form></pre><br /><br />指定的JS函数<br /><pre name="code" class="java">function displayNumber(phone_book, entry){
	var the_number = phone_book[entry];
	window.document.the_form.number_box.value = the_number;
}</pre><br /><br />5、cookies学习<br />cookies局限性在于：不是每个人的浏览器都欢迎cookies．即便是用户的浏览器欢迎cookies，但用户也有可能拒绝cookies的访问（大部分人还是欢迎的）每个域名只分配２０个cookies，所以要节省着什么它们．Cookies不得大于4 KB，当然4,000字节的容量是足够的了．<br /><br />设置一个基本的cookie很容易．你所需做的只是在一个cookie_name=value表单中生成一个字符串，然后设置document.cookie属性．唯一的技巧：cookie值中不能有空格，逗号或分号．好在你无需担心这些问题，因为有一系列的函数可以帮你对cookies属性编码和解码：<br /><br />(1)、保存一个cookie:<br /><pre name="code" class="java">function setCookie(){
var the_name = prompt("What's your name?","");
var the_cookie = "wm_javascript=username:" + escape(the_name);
document.cookie = the_cookie;
alert("Thanks, now go to the next page.");
}</pre><br /><br />(2)、读取cookie范例的代码:<br /><pre name="code" class="java">function readCookie(){
    var the_cookie = document.cookie;
    var broken_cookie = the_cookie.split(":");
    var the_name = broken_cookie[1];
    var the_name = unescape(the_name);
    alert("Your name is: " + the_name);
}</pre><br /><br />(3)、读取和编写多重cookies:<br />编写的代码很简单如下：<br /><pre name="code" class="java">var the_cookie ="my_happy_cookie=happiness_and_joy";
document.cookie = the_cookie;

var another_cookie= "my_other_cookie=more_joy_more_happiness";
document.cookie = another_cookie;</pre><br /><br />读取的代码如下：<br /><pre name="code" class="java">function WM_readCookie(name){
if(document.cookie == '')
    return false;
  return unescape(WM_getCookieValue(name));
}

function WM_getCookieValue(name){
  var firstChar,lastChar;
  var theBigCookie = document.cookie;
  firstChar = theBigCookie.indexOf(name);
  if(firstChar != -1){
  firstChar += name.length + 1;
  lastChar = theBigCookie.indexOf(';', firstChar);

  if(lastChar == -1) lastChar = theBigCookie.length;
  return theBigCookie.substring(firstChar, lastChar);
} else{
   return false;
  }
}</pre><br /><br />(4)、设置cookie失效的时间<br /><pre name="code" class="java">function setCookie(){
    var the_name = prompt("What's your name?","");
    var the_date = new Date("December 31, 2023");
    var the_cookie_date =the_date.toGMTString();

    var the_cookie = "my_cookie=" + escape(the_name);
    the_cookie = the_cookie +";expires=" + the_cookie_date;
    document.cookie = the_cookie;
}</pre><br /><br />(5)、cookie路径和域<br />路径"path"用于设置可以读取一个cookie的最顶层的目录．将cookie的路径设置为你的网页最顶层的目录可以让该该目录下的所有网页都能访问该cookie．<br /><pre name="code" class="java">function setCookie(){
 var the_name = prompt("What's your name?","");
 var the_cookie = "cookie_puss=" + escape(the_name) + ";" ;
 var the_cookie = the_cookie + "path=/;";
 var the_cookie = the_cookie + "domain=webmonkey.com;";
 document.cookie = the_cookie;
}</pre><br /><br />6、定时的用法<br />(1)、设置定时的功能<br />其关键指令是setTimeout()和clearTimeout()方法。利用setTimeout(), 指令可以在未来<br />的某个指定时间执行特定指令。如果你改变主意，你可以用clearTimeout()取消setTimeout的定时<br /><pre name="code" class="java">var the_timeout = setTimeout("alertAndRedirect ();",3000);
function alertAndRedirect(){
	alert('ok!  exhale!');
	window.location.replace("timing.htm");
}</pre><br /><br />(2)、定时循环<br /><pre name="code" class="java">var the_count = 0;
var the_timeout;
function doTimer(){
	window.document.timer_form.the_text.value = the_count;
	the_count += 2;
	the_timeout = setTimeout("doTimer();", 2000);
}</pre><br /><br />表单部分的代码如下：<br /><pre name="code" class="java">&lt;input type="button" value="stop timer" onClick="clearTimeout(the_timeout);"></pre><br /><br />(3)、复杂一点的定时例子<br /><pre name="code" class="java">function writeTime() {
  var today = new Date();
  var hours = today.getHours();
  var minutes = today.getMinutes();
  var seconds = today.getSeconds();

  minutes = fixTime(minutes);
  seconds = fixTime(seconds);

  var the_time = hours + ":" + minutes + ":" + seconds;
  window.document.the_form.the_text.value = the_time;

  //每半秒钟执行一次该函数
  the_timeout= setTimeout('writeTime();',500);
}

function fixTime(the_time) {
if (the_time &lt;10) { the_time = "0" + the_time; } 
	return the_time; 
} </pre><br /><br />或者下面的例子：<br /><pre name="code" class="java">function alertInAMinute(){
	var the_string = "hello";
	the_timeout = setTimeout("alert(" + the_string + ");",60000);
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/185887#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 14:16:48 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/185887</link>
        <guid>http://lighter.javaeye.com/blog/185887</guid>
      </item>
      <item>
        <title>TestNG系列2:TestNG初接触</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/184231" style="color:red;">http://lighter.javaeye.com/blog/184231</a>&nbsp;
          发表时间: 2008年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先来看一个非常简单的例子,代码如下：<br /><pre name="code" class="java">import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class SimpleTest {
	@BeforeClass
	public void setUp() {
		System.out.println("init()");
	}

	@Test(groups = { "fast" })
	public void aFastTest() {
		System.out.println("Fast test");
	}

	@Test(groups = { "slow" })
	public void aSlowTest() {
		System.out.println("Slow test");
	}
}</pre><br /><br />在安装有TestNG插件的Eclipse开发环境下，运行结果如下：<br /><div class="quote_title">引用</div><div class="quote_div">init()<br />Fast test<br />Slow test<br />PASSED: aFastTest<br />PASSED: aSlowTest<br /><br />===============================================<br />    example1.SimpleTest<br />    Tests run: 2, Failures: 0, Skips: 0<br />===============================================<br /><br /><br />===============================================<br />testNG<br />Total tests run: 2, Failures: 0, Skips: 0<br />===============================================</div><br />至于红条绿条界面的截图就不截上来的，因为例子比较简单啦。在该例子中setUp()方法会任何的test方法前被调用，这一点和JUnit是一模一样的。<br /><br />创建一个TestNG测试用例：<br /><span style="color: blue">1、不需要继承任何类或实现特定的接口<br /><br />2、虽然上面的例子采用了JUnit的一些特定的习惯,但我们可以为测试的方法起任意的名称,如果你的喜欢的话,因为利用annotations就告诉TestNG哪一些方法就是指定的测试的方法(见代码中的@Test)<br /><br />3、一个方法可以属于一个或多个group.我们可以任意指定哪一些group的测试方法被触发,如果不指定,默认情况下全部的测试方法都会被执行到.</span><br /><br /><pre name="code" class="java">例如下面，我们不在eclipse运行上面的测试用例，首先，写一个ant的执行脚本，类似：
&lt;project default="test">

 &lt;path id="cp">
   &lt;pathelement location="lib/testng-testng-4.4-jdk15.jar"/>
   &lt;pathelement location="build"/>
 &lt;/path>

 &lt;taskdef name="testng" classpathref="cp"
          classname="org.testng.TestNGAntTask" />

 &lt;target name="test">
   &lt;testng classpathref="cp" groups="fast">
     &lt;classfileset dir="build" includes="example1/*.class"/>
   &lt;/testng>
 &lt;/target>

&lt;/project></pre><br />运行结果如下：<br /><div class="quote_title">引用</div><div class="quote_div">c:> ant<br />Buildfile: build.xml<br /><br />test:<br />[testng] Fast test<br />[testng] ===============================================<br />[testng] Suite for Command line test<br />[testng] Total tests run: 1, Failures: 0, Skips: 0<br />[testng] ===============================================<br /><br /><br />BUILD SUCCESSFUL<br />Total time: 4 seconds</div><br />这时，我们可以清楚地看到"slow"组的group测试方法就没有被调用，也是group存在的一个原因.
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/184231#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Apr 2008 22:52:51 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/184231</link>
        <guid>http://lighter.javaeye.com/blog/184231</guid>
      </item>
      <item>
        <title>TestNG系列1:TestNG简介及插件</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/184225" style="color:red;">http://lighter.javaeye.com/blog/184225</a>&nbsp;
          发表时间: 2008年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、什么是TestNG <br /><div class="quote_title">引用</div><div class="quote_div">TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架，但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如：*支持JSR 175注释（JDK 1.4利用JavaDoc注释同样也支持）<br /> *灵活的Test配置<br /> *支持默认的runtime和logging JDK功能<br /> *强大的执行模型（不再TestSuite）<br /> *支持独立的测试方法。</div><br /><br />二、安装Eclipse的TestNG插件<br />    * 选择菜单"Help / Software updates / Find and Install."<br />    * 接着选择"Search for new features to install".<br />    * 点击"New remote site."<br />    * 在URL文本框输入"http://beust.com/eclipse"，并写上description文本框信息.<br />    * 确定其勾选，点击确定，等候一会根据其提示信息完成其插件安装<br />    如果该方法不行的话，就上官方网站下载，或者下载附件中的目前最新的TestNG的jar包.<br /><br />三、在eclipse环境下的一些办面展示：<br />TestNG的Eclipse插件允许你在eclipse环境运行你的TestNG测试,而且更容易观察到它们的运行结果.TestNG在on code.google.com网站有发布其项目,项目名称是叫testng-<br />eclipse.<br /><br />1 - 安装后<br />假如你已经安装TestNG插件,重启Eclipse同时选择菜单"Window/Show View/Other...",你就会看到TestNG视图就会列在java视图分类里面.<br /><img src="http://testng.org/pictures/view.png" /><br />2 - 创建TestNG运行配置环境<br />如果你已经创建包含一些TestNG annotations的类文件,并且(或者)有一个或多个testng.xml文件,你就可以创建一个TestNG运行的配置环境.选择Run/Run...(or Run/ Debug...)菜单同时创建一个新的TestNG配置.<br /><img src="http://testng.org/pictures/launch.png" /><br />你可以改变配置的名称,也可以最过图片上方的的"Browse..."按钮来选择一个项目project.<br />然后,你就可以选择用下面的方式来运行你的TestNG测试用例啦.<br /><br />2.1 - 类文http://lighter.javaeye.com/admin/blogs/new<br />编程.读书.思考 - 博客管理- JavaEye技术网站件<br /><img src="http://testng.org/pictures/classes.png" /><br /><br />2.2 - 整个groups<br /><img src="http://testng.org/pictures/groups.png" /><br /><br />2.3 - 自定义的文件<br /><img src="http://testng.org/pictures/suites.png" /><br /><br />2.4 - 可以运行特定的方法<br /><img src="http://testng.org/pictures/outline.png" /><br /><br />3 - 查看测试的结果<br /><img src="http://testng.org/pictures/success.png" /><br />[img]<br />http://testng.org/pictures/failure.png[/img]<br /><br />4 - 将JUnit测试转换为TestNG测试用例<br />当你在编辑一个JUnit类的时候,可以按下Ctrl-1(快捷键),插件就会给你提示将其转换为TestNG测试用例,可以JDK5 annotations<br /><img src="http://beust.com/pics/quickfix1.png" /><br />或者JavaDoc annotations形式来表示.<br /><img src="http://beust.com/pics/quickfix2.png" />
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/184225#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Apr 2008 22:19:07 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/184225</link>
        <guid>http://lighter.javaeye.com/blog/184225</guid>
      </item>
      <item>
        <title>经常上的几个网站</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/180432" style="color:red;">http://lighter.javaeye.com/blog/180432</a>&nbsp;
          发表时间: 2008年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          经常上的几个网站<br /><br />1、<a href="http://www.google.com" target="_blank">http://www.google.com</a><br />这一个不用多说了，基本工作上遇到的一些困难都可以利用它来解决，搜索大大增加其工作的便快捷性。自己一直设为主页的网站，简洁有用,而且自己订阅了一些google的news，经常使用其Reader看一下自己订阅一下论坛和博客文章，用gmail来管理自己其他几个经常用的邮箱，同时用google的照片空间来分享自己的一些照片。当然，这是自己最常登录的一个网站。<br /><br />2、<a href="http://www.chinadaily.com.cn/" target="_blank">http://www.chinadaily.com.cn/</a><br />看新闻比较好去的地方，边看新闻，又可以使自己的英文阅读水平不至于落下很多，以前喜欢在网易上面看新闻，不过现在大多都是chinadaily上面看一下新闻。因为相比其他英文网站，主要是速度快，而且新闻更新速度也比较快速。同时，有时间无聊的时候，也会上http://www.chinaview.cn/这一个英文网站的，不过相对而言比较少去。<br /><br />3、<a href="http://www.javaeye.com" target="_blank">http://www.javaeye.com</a><br />最常上的技术网站，经常在这里写博客，看看一些技术发展的动态。国外的技术网站，经常去的无非是那几个theserverside,onjava,info等，那里讨论气氛倒挺好的，贴子不多，但经常出现一些很激烈，很吸引人眼球的话题。<br /><br />4、<a href="http://sports.sina.com.cn/" target="_blank">http://sports.sina.com.cn/</a><br />最常上的体育类的网站，当自己想快速地浏览一下体育新闻的话，一般会登录到这一个网站查阅一番。<br /><br />5、<a href="http://www.tingroom.com/" target="_blank">http://www.tingroom.com/</a><br />中午休息时分，有时候会上去看一下的一个网站，主要是关于英文听力的，资料比较多一些，有很多听力资料和经典的英文文章。<br /><br />6、<a href="http://www.mapbar.com/" target="_blank">http://www.mapbar.com/</a><br />每当自己和朋友出去玩的时候，最常登录查询公车路线，周边地图的一个网站，资料比较齐全。如果查询不到结果的话，再利用google的map来定位搜索一下，基本上整个游玩的路程就可以确定了。网络在一定程度上改变自己生活的节奏和方式。<br /><br />7、<a href="http://blog.csdn.net/" target="_blank">http://blog.csdn.net/</a><br />非常无聊的时候上去的一个网站，比较令人失望，水贴的东西太多。自己的博客也是从csdn搬迁过来的，那里气氛感觉也不是太好。<br /><br />8、<a href="http://sourceforge.net/" target="_blank">http://sourceforge.net/</a><br />挖掘一下东东的好地方,隐藏了不少好东西，一般情况都是用open-open查询一下自己可能需要的东西，然后sourceforge看一下其介绍的开源项目。
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/180432#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Apr 2008 13:27:53 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/180432</link>
        <guid>http://lighter.javaeye.com/blog/180432</guid>
      </item>
      <item>
        <title>Small Potatoes,Tales of the Oft Forgotten</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/177551" style="color:red;">http://lighter.javaeye.com/blog/177551</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">An article called “2007 Moving China, top 10 impressive small potatoes” was posted on a forum on rednet.cn, listing 10 touching stories of ordinary people. The story caught netizens’ attention and admiration.<br /><br />While CCTV, the government television channel awards winners handpicked by a carefully chosen group of dignitaries with a program called "2007 Moving China", this list of ordinary folk was created after a round of voting online.<br /><br />"Compared to the models chosen by the media, these common people impress us even more," said one netizen on a posting.<br /><br />Some of those listed didn’t make great achievements. Some showed bravery, while others resisted the temptation of money, and still others followed their hearts and did well in their careers.<br /><br />These "small potatoes" move China. Though they are small in size, weak in power, sometimes even struggling for life, the online list of people moved the public because of these people’s high moralities and consistent kindness.<br /><br /></div><br />The link:<br /><a href="http://www.chinadaily.com.cn/china/china_2008tales_page.html" target="_blank">http://www.chinadaily.com.cn/china/china_2008tales_page.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/177551#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Mar 2008 10:56:35 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/177551</link>
        <guid>http://lighter.javaeye.com/blog/177551</guid>
      </item>
      <item>
        <title>从自身体会谈一谈测试</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/157990" style="color:red;">http://lighter.javaeye.com/blog/157990</a>&nbsp;
          发表时间: 2008年01月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          论坛上关于测试的帖子很多,而且有一部分是一些大牛写的,看得也比较有感触.在这一个帖子里面主要谈一下,自己关于测试的一些理解.<br /><br />还是从我目前所处项目组的情况说起吧,整个项目开发的架构是从DAO层-BS层-BIZ层-Action展现层,典型的J2EE分层的结构,从名字中就可以看得出DAO层是只对数据库进行操作的,BS层主要处理大量的业务方法,而BIZ层是干什么用的呢?其实BIZ主要是负责事务管理和用户的权限控制的;另外,Action当然是表示层的东西啦,搞java开发的地球人都听说过这一个称谓。在这里，并不想评论公司开发的架构的思想怎样怎样，毕竟论坛里面已讨论了N次，在这里只是想把自身对单元测试的一些体会写出来。开发的时候主要用到的技术情况主要有JSF/WebWork+hibernate+spring，前台方面还大量用了Ext和DWR两个东东。<br /><br />就目前的项目里20多人，真正愿意写单元测试的其实并不多，大多是怕写测试代码影响了他自己的开发速度，其实这根本是一个伪命题。写代码以及测试的代码相对整个开发流程而言,并不多,相反比较的是你想好怎样去实现这一个功能,还有实现该功能后针对的调整维护会占用比较大的时间.<br /><br />就目前我对于自己开发的模块，是这样写测试代码的:<br />对于所有的util公共方法，我基本上都用JUnit来测试。从自身体会来讲，用JUnit来测试一些输出输入很简单，但里面算法处理比较复杂的时候，更显得其测试特别特别有用，这一点感触最深。说到测试，就不能不提一下重构。从我自身体会觉得，如果一个程序员自己没有真正地写过一些的JUnit测试，就对"有效的测试给了重构更多的信心"类似于这样的言语说理解很深刻的话，我根本就不信，根本就是从书上学来的放出来的屁话。我自身是从尝试写JUnit测试到现在变得非常自然地写JUnit测试，因为这样做给了我更大的信心，心里就知道了"哦，这和我想要的一样啦,我可以往下面走了"。顺便八卦一下，半年多来，感觉对自己的开发影响比较大的两本书是&lt;&lt;agile java>>和&lt;&lt;重构>>。<br /><br />对于很多的DAO方法，我都是这样做的:<br />利用构建好的一个Hibernate的Flush方法的Interceptor拦截器,实现了里面的public Object invoke(MethodInvocation invocation) throws Throwable方法后,再构建一个BaseDAOTest来继承于spring的AbstractTransactionalDataSourceSpringContextTests测试类来对大部分的DAO方法进行测试.具体不知道怎样做的朋友,可以搜索一下论坛,有大把这样的例子.<br /><br />对于大部分的BS和BIZ层方法，是利用EasyMock测试驱动写的。在我们的这样的项目组里面的，因为分层多，每一个层次的职责很明确，每一层都是用接口隔离开的，所以这样对EasyMock这样的Mock框架就大有用途了。可惜的是,只能用EasyMock1.2的包,因为我们开的的环境只能用1.4的java SDk。如果可以用EasyMock2.x版本上的时候，测试的代码量就会少一些，但需要JDK 1.5以上的版本啊。没有试过JMock，不知道好不好用。<br /><br />说到Action层方面，我有一个疑问，想请教一下大家。目前我们项目里面有两个专门进行验收测试的人员，也就是每天对每一个页面的一些细节功能都进行测试，有BUG的话会记录在JIRA或其他的缺陷管理工具上面。现在Action层我们是用JSF，大多情况下是调用BIZ层的接口进行一个数据的展现和编辑,而且很多方法都和EXT,DWR都有一些交互动作。在这种情况下，如果我还是用Mock的情况下，感觉就显得有测试比较脆弱---毕竟项目里面有两个专门进行验收测试的人员,每天都会进行一些回归测试。 所以我想问一下，对于这种情况的Action怎样测试才比较好,才能达到比较好的效果或者就采用目前的形式---根本就没有针对Action这一层写测试?
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/157990#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jan 2008 13:05:55 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/157990</link>
        <guid>http://lighter.javaeye.com/blog/157990</guid>
      </item>
      <item>
        <title>看到的一些JavaEye现象</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/157499" style="color:red;">http://lighter.javaeye.com/blog/157499</a>&nbsp;
          发表时间: 2008年01月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          吃完饭,闲暇之余，挖挖坑，种种树,浇浇花；把近一年来看到的一些JavaEye现象，用一个大坑种出来,大家也可以施施肥或浇灌一下:<br /><br />1、呼吁大家帮助帮助患白血病的eastviking<br />   对于所有的javaeyer而言，都是打心里地希望eastviking能够康复起来,能够回到这一个圈子谈谈程序,灌灌水.<br />   <a href="http://www.javaeye.com/topic/119917" target="_blank">亲爱的朋友们, 我需要你们的帮助</a>  <br />   <a href="http://www.javaeye.com/topic/152415" target="_blank">呼吁大家帮助帮助患白血病的eastviking</a>  <br />   <br />2、作为新年的贺礼，JavaEye2.5元旦上线<br /><br />3、2007年12月15日下午7点13分59秒，JavaEye注册会员突破10万(但不知道马甲有多少啊??)<br /><br />4、取消以前的回贴就加分的制度，好主意。<br /><br />5、Quake Wang入伙，推出新闻频道<br /><br />6、海版出现了N个"别装了"系列的帖子:<br />   自从"罪魁祸首"的daquan198163,提出的"<a href="http://www.javaeye.com/topic/140570" target="_blank">都别装了，难道你们不想交流一下薪资问题？</a>",此君带头，风云涌动,开启了"别装了"系列帖子的先河。<br />   老庄的"<a href="http://www.javaeye.com/topic/146963" target="_blank">都别装了，难道你们上班不开小差？</a>"<br />   silent2007的"<a href="http://www.javaeye.com/topic/145931" target="_blank">都别装了，难道你们不想拉私活？</a>"<br />   当然还有,evanyuan的"<a href="http://www.javaeye.com/topic/145736" target="_blank">都别装了，难道你们不想交流一下投资收益</a>"<br />   number017的"<a href="http://www.javaeye.com/topic/145828" target="_blank">都别装了,难道你不想脱掉伪装？</a>"<br />   抛出异常的爱的"<a href="http://www.javaeye.com/topic/154218" target="_blank">别装了.....你难到没想到过失业呢?</a>"  <br />   还有最近的刑天战士的"<a href="http://www.javaeye.com/topic/154374" target="_blank">都别装了，难道你们平时不玩游戏吗？</a>"<br />   imjl 的"<a href="http://www.javaeye.com/topic/154728" target="_blank">都别装了，难道你们不想明年换一换工作吗？</a>"  <br />   整个"别装了"系列在一定的程序上都反映了作为程序员的我们内心所想的某些事情。<br /><br />7、ajax论坛出现了Ext讨论热潮<br /><br />8、ruby论坛一如具往;RoR方面的讨论没有想像的那样宁静，但也没有想像那样火爆,稳步前进...<br /><br />9、读书篇： <br />   robbin的 <a href="http://www.javaeye.com/topic/52992" target="_blank">Java程序员的推荐阅读书籍 </a><br />   江南白衣的 <a href="http://calvin.javaeye.com/blog/57670" target="_blank">架构师书单</a>  <br />   其他的,自己去挖掘一下论坛,或许能挖掘到你想象不到的收获。<br /><br />10、"飓风1026"事件风波 <br /><br />11、T1和小三的故事<br /><a href="http://www.javaeye.com/topic/154132" target="_blank">给我未来的女孩</a> <br /><div class="quote_title">引用</div><div class="quote_div">这些年一个人独自走来<br />数学的魅力也难以让我不时时向往与美丽女孩共度闲暇时光的日子<br />我渴望与我志趣相投的伴侣的出现<br />希望能在30岁来临的之际找到我一生的挚爱</div><br />这一句话，已入选javaEye经典语录<br /><br />12、MM关注的<br />黄月亮的"<a href="http://www.javaeye.com/topic/74577  " target="_blank">主题：五一逛街穿什么（转）</a>"<br /><br />其他有没有东西呢，写不下去，有兴趣的就接龙，把在坛子里面感触深的事件说出来....
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/157499#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Jan 2008 19:00:40 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/157499</link>
        <guid>http://lighter.javaeye.com/blog/157499</guid>
      </item>
      <item>
        <title>年末了,也来一个年度自我总结</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/156179" style="color:red;">http://lighter.javaeye.com/blog/156179</a>&nbsp;
          发表时间: 2008年01月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          年末了,也来一个年度自我总结<br /><br /><span style="color: blue"><span style="font-size: medium">技术方面：</span></span><br /><div class="quote_title">引用</div><div class="quote_div">1、今年大学本科毕业，和两位同班同学进了同一家公司作java程序员开发,大家很有缘分，大学的时候一起做项目，大学毕业还是在同一个公司一起做项目。<br /><br />2、这一年自己自评进步了很多，从一个很懵懂的开发人员逐渐地成熟很多，最大的改变是单元测试和重构已经成为每天的面包和水一样，离开这两样东西，你根本对自己写的代码没有太大的信心(请允许我从重构经典书中半偷窃了这一句话)，特别在项目后期需要做一些需求变化的时候。自己每天最最常用的工具箱：eclipse,junit,easyMock,spring自带的简化功能和测试类，Oracle的pl/sql工具，飞鸽,MS office简化版。一年内感触比较很深的两本书，&lt;&lt;agile java>>,&lt;&lt;重构>>。<br /><br />3、看的书籍上的转变，现在的自己不太想去去追流一些热门的语言，只想把大学没有打扎实一些基础重新打扎实了，自己想认真坚持地学习算法基础、数据结构基础、系统原理、编译和数据处理等基础知识,当然英语绝对不能落下。所以现在什么动态语言对自己的吸引已经下降了很多很多，暂时没有也去看的念头。<br /><br />4、努力成为一名有一些良好习惯的程序员。无论怎样，对于TDD自己有着执着的追求，能写出简单有效的代码是自己追求的一个目标。自己最大的体会是，当你认真地去带着体会去写单元测试的时候，突然到了某一天你就会发觉，写单元测试是多少自然而然的事情，特别在处理一些复杂问题的时候,过程比较复杂，但输出输入比较简单，这时候单元测试的作用我自己是感触最深关于这一点。</div><br /><br /><span style="color: blue"><span style="font-size: medium">旅游方面：</span></span><br /><div class="quote_title">引用</div><div class="quote_div">1、出差到北京三个多月,去了故宫，长城，天坛，香山，王府井，西单等等;也是第一次到帝都出差，工作，游玩!<br /><br />2、目前在厦门，厦门的风景暂时没有怎样去挖掘，只是去鼓浪屿去踏踏青，去厦大去看看风景，打打球，去中山路买点东西；其他的景点没有怎样去过。<br /><br />3、过年啦，2月1号回广州!公司放假十二天了，自己休假几天，一共超过半个月了，这样的假期感觉还可以，不赖。</div><br /><br /><span style="color: blue"><span style="font-size: medium">经济方面：</span></span><br /><div class="quote_title">引用</div><div class="quote_div">1、买了一台AOC的22寸液晶显示器回家，把家里17的老CRT显示器替代掉了。<br /><br />2、自己用的索爱T628坏了，故买了一部nokia 6300手机自用；老实说，这一部手机对自己而言，挺实用的<br /><br />3、借了一千元给以前在大学同宿舍一起住了两年的同学<br /><br />4、购入一部nokia 6300手机给老妹，她的手机也差不多坏，变得有点神经质<br /><br />5、分两次一共借了1500元给一个初中的老同学--目前在广药的好朋友来的；他家里比较困难，又是贷款上学，支持一下<br /><br />6、捐了两次款，能力有限，每次都是二百元。希望患有白血病的eastviking梁伟能够顺利地康复，战胜病魔，早日出院，这也是所有的JavaEyer都很关心一件事!人非草木，孰能无情!<br /><br />7、近期准备入手一部相机，单反暂时玩不起，太贵了一些，特别是后期投入的成本。自己是对摄影有一些的兴趣，但不是十分狂热的那一种，所以准备买一个中端的家用数码相机即可。合适的就是好的。打算买松下的fz18,肯高的多膜UV镜和品胜的S006电池,乐摄宝的 Nova Mini AW小型摄影挎包，4G的创见SDHC4G-class6卡。摄影技术很菜，正在学习中。<br /><br />8、留一些钱，准备回家过年，半年没有回家了，也不知道买一些什么好一些的补品给父母。其实对父母而言，看到儿女孝心，一家人其乐融融一起吃饭才是最开心的。</div><br /><br /><div class="quote_title">引用</div><div class="quote_div">自己最喜欢的一句话：如果你不努力，你还剩下什么呢？</div><br />一口气写下了上面的文字，当作年度总结的随记。<br />lighter书于2008年1月15日，下午时分
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/156179#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Jan 2008 18:04:15 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/156179</link>
        <guid>http://lighter.javaeye.com/blog/156179</guid>
      </item>
      <item>
        <title>The Contract for Equality[java]</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/155780" style="color:red;">http://lighter.javaeye.com/blog/155780</a>&nbsp;
          发表时间: 2008年01月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          As we Know,The Java API documentation for the equals method in Object provides a list of what defines an equivalence relation between two objects:<br /><br />Reflexivity: <pre name="code" class="java">x.equals(x)</pre> <br />Symmetry: <pre name="code" class="java">x.equals(y) if-and-only-if (iff) y.equals(x)</pre> <br />Transitivity:<br /> <pre name="code" class="java">if x.equals(y) and y.equals(z), then x.equals(z)</pre> <br />Consistency:<br /> <pre name="code" class="java">x.equals(y) returns a consistent value given consistent state</pre> <br />Comparison to null: <pre name="code" class="java">!x.equals(null)</pre> <br /> <br /><br />let's look a simple example,the test code:<br /><pre name="code" class="java">import junit.framework.TestCase;

public class CourseTest extends TestCase {
	public void testCreate() {
		Course course = new Course("CMSC", "120");
		assertEquals("CMSC", course.getDepartment());
		assertEquals("120", course.getNumber());
	}

	public void testEquality() {
		Course courseA = new Course("NURS", "201");
		Course courseAPrime = new Course("NURS", "201");
		assertEquals(courseA, courseAPrime);

		Course courseB = new Course("ARTH", "330");
		assertFalse(courseA.equals(courseB));

		// reflexivity
		assertEquals(courseA, courseA);

		// transitivity
		Course courseAPrime2 = new Course("NURS", "201");
		assertEquals(courseAPrime, courseAPrime2);
		assertEquals(courseA, courseAPrime2);

		// symmetry
		assertEquals(courseAPrime, courseA);

		// consistency
		assertEquals(courseA, courseAPrime);

		// comparison to null
		assertFalse(courseA.equals(null));
		
		assertFalse(courseA.equals("CMSC-120"));
	}
}</pre><br /><br /><br />the class is:<br /><pre name="code" class="java">public class Course {

	private String department;

	private String number;

	public Course(String department, String number) {
		this.department = department;
		this.number = number;
	}

	public String getDepartment() {
		return department;
	}

	public String getNumber() {
		return number;
	}

	@Override
	public boolean equals(Object object) {
		if (object == null)
			return false;
		if (!(object instanceof Course))
			return false;
		Course that = (Course) object;
		return this.department.equals(that.department)
				&& this.number.equals(that.number);

	}
}</pre><br />see about:&lt;&lt;agile java>> Lession 9,The Contract for Equality
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/155780#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jan 2008 20:43:18 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/155780</link>
        <guid>http://lighter.javaeye.com/blog/155780</guid>
      </item>
      <item>
        <title>来改善你的switch语句</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/150915" style="color:red;">http://lighter.javaeye.com/blog/150915</a>&nbsp;
          发表时间: 2007年12月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          善用多态来改善你的switch语句<br /><br />        下面举的这一个例子,其实和&lt;&lt;重构>>第一章里面的那一个经典实例很像的,&lt;&lt;重构>>一本书绝对是一本好书,非常不错值得推荐的一本书。<br /><br />	举一个例子,是我现在的一个项目里面一位同事写的一小段代码,代码如下,它可以根据不同的操作符进行加减乘除方面的操作,而且这一些操作很有可能发生一些变化。当重构成我的现在每天的面包和水的时候，我看到switch语句，就想能不能把改良一下。虽然改善后，代码量是增加，但从可维护的角度来讲，我个人认为还是值得的,特别在你需要的操作的Switch语句里面很有可能发生需求变化的时候。<br /><br />	<pre name="code" class="java">private void cacuData(DataRange dataRange, char oper) {
		double firstData = Double.parseDouble(dataRange.getFirstData());
		double secondData = Double.parseDouble(dataRange.getSecondData());
		switch (oper) {
		case '+':
			dataStack.push("" + (firstData + secondData));
			break;
		case '-':
			dataStack.push("" + (firstData - secondData));
			break;
		case '*':
			dataStack.push("" + (firstData * secondData));
			break;
		case '/':
			divisionProcess(firstData, secondData);
			break;
		}
	}

	/** 处理除数方法； */
	private void divisionProcess(double firstData, double secondData) {
		if (Math.abs(secondData) &lt; Math.pow(10, -5)) {
			dataStack.push("-1");
		} else {
			dataStack.push("" + (firstData / secondData));
		}
	}</pre><br /><br />   我看到firstData,secondData就想能不能把它们放到一个Range范围的类里面是不是更好呢,于是新建了一个<br />  <pre name="code" class="java"> public class DoubleDataRange{
	private final double firstData;

	private final double secondData;

	public DoubleDataRange(double firstData, double secondData) {
		this.firstData = firstData;
		this.secondData = secondData;
	}
	
	public double getFirstData() {
		return firstData;
	}

	public double getSecondData() {
		return secondData;
	}
  }</pre><br /><br />然后我们再新建一系列操作方面的类，为每一个操作类新增一个类,也是这一次重构最核心的东西，其代码如下：<br /><pre name="code" class="java">abstract class Operation{
	abstract void  cacuData(DoubleDataRange dataRange,SSheetStack dataStack);
}

class PlusOperation extends Operation {
	void cacuData(DoubleDataRange range, SSheetStack dataStack) {
		dataStack.push("" + (range.getFirstData() + range.getSecondData()));
	}
}

class SubtractOperation extends Operation {
	void cacuData(DoubleDataRange range, SSheetStack dataStack) {
		dataStack.push("" + (range.getFirstData() - range.getSecondData()));
	}
}

class MultiplyOperation extends Operation {
	void cacuData(DoubleDataRange range, SSheetStack dataStack) {
		dataStack.push("" + (range.getFirstData() * range.getSecondData()));
	}
}

class DivisionOperation extends Operation {
	void cacuData(DoubleDataRange range, SSheetStack dataStack) {
		if (Math.abs(range.getSecondData()) &lt; Math.pow(10, -5)) {
			dataStack.push("-1");
		} else {
			dataStack.push("" + (range.getFirstData() / range.getSecondData()));
		}
	}
}</pre><br /><br />接下来的工作就很简单啦，把以前两段代码全部删除掉，换上如下的代码,虽然这一个时候也有Switch语句，但它只是纯粹地变成了一个取operation的类而已，并没有包含任何的操作。<br />	<pre name="code" class="java">private void cacuData(DataRange dataRange, char oper) {
		setOperation(oper);
		double firstData = Double.parseDouble(dataRange.getFirstData());
		double secondData = Double.parseDouble(dataRange.getSecondData());
		operation.cacuData(new DoubleDataRange(firstData,secondData), dataStack);
	}
	
	private Operation operation;
	
	private void  setOperation(char oper){
		switch (oper) {
		case '+':
			operation = new PlusOperation();
			break;
		case '-':
			operation = new SubtractOperation();
			break;
		case '*':
			operation = new MultiplyOperation();
			break;
		case '/':
			operation = new DivisionOperation();
			break;
		}
	}
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/150915#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Dec 2007 13:10:36 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/150915</link>
        <guid>http://lighter.javaeye.com/blog/150915</guid>
      </item>
      <item>
        <title>java动态代理笔录</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/150140" style="color:red;">http://lighter.javaeye.com/blog/150140</a>&nbsp;
          发表时间: 2007年12月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          大家都清楚Spring的AOP方面工作是很优秀,但是其内在的基础的东西,还是有一大部分不太了解的,其AOP大量用了ThreadLocal,这一个在前面已做了介绍了,还有一个比较重要的怎样用动态代理组装成AOP.<br /><br />   说到动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包啦.spring和hibernate选择了同样的CGlib包,具体表现在:Hibernate主要是利用cglib生成pojo的子类并override get方法来实现lazy loading机制，Spring则是利用cglib来实现动态代理。<br /><br />  接下来我们就来看看动态代理这两个情况是怎样实现的吧.其实通过demo是比较容易理解一样东西的.所以打算写一个简单的例子来表达我的意思,大家都知道JavaEye社区可以发新帖子,可以修改自己的帖子,所以我们定义下面的一个接口.<br /><pre name="code" class="java">
package lighter.javaeye.com;

public interface JavaEyeForum {
	void postTopic(int topicId);

	void editTopic(int topicId);
}</pre><br /><br />当然,有接口啦,我们自然而然的为它写一个实现的类,作为演示并没有实质性的代码的:<br /><pre name="code" class="java">package lighter.javaeye.com;

public class JavaEyeForumImpl implements JavaEyeForum {
	public void postTopic(int topicId) {
		System.out.println("发布帖子,帖子的ID号为："+topicId);
	}
	public void editTopic(int topicId) {
		System.out.println("编辑帖子,帖子的ID号为："+topicId);
	}
}</pre><br />因为一般情况下,你发布帖子和编辑要处在事务范围之内(假设的),所以我们新写下面的一个功能类TransactionManager,想让在postTopic和editTopic方法前后分别调用下面的beginTransaction和endTransaction方法. <br /><pre name="code" class="java">package lighter.javaeye.com;

public class TransactionManager {
	public static void beginTransaction(String methodName){
		System.out.println(methodName + "开始事务管理!");
	}	
	public static void endTransaction(String methodName){
		System.out.println(methodName + "事务管理结束!\n");
	}
}</pre><br /><br />剩下的问题就是,我们用方式把TransactionManager里面的两个方法织入到JavaEyeForumImpl类里面方法的合适的位置,很简单地,我们只需要写一个处理的Handler类,如下:<br /><pre name="code" class="java">package lighter.javaeye.com;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TransactionHandler implements InvocationHandler {
	private Object target;
	public TransactionHandler(Object target) {
		this.target = target;
	}
	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		TransactionManager.beginTransaction(method.getName());
		Object obj = method.invoke(target, args);
		TransactionManager.endTransaction(method.getName());
		return obj;
	}
}</pre><br />在上面的类中的invoke方法中,"Object obj = method.invoke(target, args);"前后的语句指定调用前该前做,调用后该做什么.<br />接下来,就是写一个测试类啦<br /><pre name="code" class="java">package lighter.javaeye.com;

import java.lang.reflect.Proxy;
public class TestDynamicProxy {
	public static void main(String[] args) {
		JavaEyeForum target = new JavaEyeForumImpl();
		TransactionHandler handler = new TransactionHandler(target);
		JavaEyeForum proxy = (JavaEyeForum) Proxy.newProxyInstance(target
				.getClass().getClassLoader(),target.getClass().getInterfaces(), handler);
		proxy.postTopic(100);
		proxy.editTopic(999);
	}
}</pre><br />测试类,请仔细看 Proxy.newProxyInstance这一个方法的第二个参数必须指定target.getClass().getInterfaces()这一个接口后,动态代理才能起效. 这是为什么说平时我们说jdk 中的动态代理有时候比较麻烦，那是还要指定特定的接口的原因.<br />测试代码运行结果如下:<br /><div class="quote_title">引用</div><div class="quote_div">postTopic 开始事务管理!<br />发布帖子,帖子的ID号为：100<br />postTopic事务管理结束!<br /><br />editTopic 开始事务管理!<br />编辑帖子,帖子的ID号为：999<br />editTopic事务管理结束!</div><br /><br />接下来我们来看看怎样用CGLib来生成动态代理,首先把TestDynamicProxy.java和TransactionHandler.java两个类删除掉,免得影响视线嘛,呵呵;然后再新建一个CglibProxy代理类.<br /><pre name="code" class="java">package lighter.javaeye.com;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
 * net.sf.cglib.proxy.Enhancer和MethodInterceptor在CGLib中负责完成代理对象创建和方法截获处理,
 * 产生的是目标类的子类而不是通过接口来实现方法拦截的，Enhancer主要是用于构造动态代理子类来实现拦截，MethodInterceptor（扩展了
 * Callback接口）主要用于实现around advice（AOP中的概念）
 */
public class CglibProxy implements MethodInterceptor {
	private Enhancer enhancer = new Enhancer();
	public Object getProxy(Class clazz) {
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);
		return enhancer.create();
	}
	public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
		String methodName = obj.getClass().getName()+"."+method.getName();
		TransactionManager.beginTransaction(methodName);
		Object result = proxy.invokeSuper(obj, args);
		TransactionManager.endTransaction(methodName);
		return result;
	}
}</pre><br /><br />然后,我们再写一个测试类如下:<br /><pre name="code" class="java">package lighter.javaeye.com;

public class TestCGLibProxy {
	public static void main(String[] args) {
		CglibProxy proxy = new CglibProxy();
		JavaEyeForum forum = (JavaEyeForum)proxy.getProxy(JavaEyeForumImpl.class);
		forum.postTopic(999);
		forum.editTopic(999);
	}
}</pre><br />测试的结果如下:<br /><div class="quote_title">引用</div><div class="quote_div">lighter.javaeye.com.JavaEyeForumImpl$$EnhancerByCGLIB$$155ad1e9.postTopic 开始事务管理!<br />发布帖子,帖子的ID号为：999<br />lighter.javaeye.com.JavaEyeForumImpl$$EnhancerByCGLIB$$155ad1e9.postTopic事务管理结束!<br /><br />lighter.javaeye.com.JavaEyeForumImpl$$EnhancerByCGLIB$$155ad1e9.editTopic 开始事务管理!<br />编辑帖子,帖子的ID号为：999<br />lighter.javaeye.com.JavaEyeForumImpl$$EnhancerByCGLIB$$155ad1e9.editTopic事务管理结束!</div><br /><br />参考资料:<br /><a href="http://www.nirvanastudio.org/java/cglib-指南.html" target="_blank">http://www.nirvanastudio.org/java/cglib-指南.html</a>  cglib 指南<br /><a href="http://www.moon-soft.com/doc/45039.htm" target="_blank">http://www.moon-soft.com/doc/45039.htm</a>   Java-AOP编程入门<br /><a href="http://www.javaeye.com/topic/98178" target="_blank">http://www.javaeye.com/topic/98178</a>  [深入了解Java ClassLoader、Bytecode 、ASM、cglib]
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/150140#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Dec 2007 15:14:25 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/150140</link>
        <guid>http://lighter.javaeye.com/blog/150140</guid>
      </item>
      <item>
        <title>url传递中文参数笔录</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/150060" style="color:red;">http://lighter.javaeye.com/blog/150060</a>&nbsp;
          发表时间: 2007年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          url传递中文参数笔录<br /><br />我们在处理一些遗留系统的时候,通常有可能遇到处理有一些链接是带有中文,而且是传递到另一个页面的,而这另一个页面有可能把拿到的数据放到数据库中去,这时候往往会造成乱码的问题,特别在不同的系统的时候更是如此.<br /><br />假定,我们现在有一个name的参数,能通过"/pages/a.jsp?name=博客"传递到下一个页面,这时候,我们可以这样做:<br /><br />1、首先用JS的encodeURI的方法作一些转换,如下<br />   <pre name="code" class="java">passName = encodeURI(name);</pre><br />   转换之后的字符会产生一些"%"字符，而这一些字符在URL的时候通常是不能传递的，或者通常出问题的；所以我下一步这样做:<br />            <pre name="code" class="java">  function ReplaceAll(oriStr,oldStr,newStr){
			if(oriStr == null || oriStr == "")
				return "";
			if(oriStr.indexOf(oldStr) == -1)
				return oriStr;
			oriStr = oriStr.replace(oldStr,newStr);
			return ReplaceAll(oriStr, oldStr, newStr);
		}</pre><br />  在定义了一个ReplaceAll函数后，我们接着可以这样写：<br />  <pre name="code" class="java">passName = ReplaceAll(passName,"%","_PERCENT_");</pre><br />  这个时候，前台转化的工作完成，就把passName挂到链接中去即可啦.<br /><br />2、接下来就是后台方面的工作啦:<br />   根据参数取得值，然后再用String的repaceAll方法把值转换回来。<br />  <pre name="code" class="java"> name = request.getParameter("name").replaceAll("_PERCENT_", "%");</pre><br />   这样就行了吗？还差一步啦，接着就用java的URLDecoder.decode转换一下就大功告成啦，没有什么复杂的东西啦.<br />  <pre name="code" class="java"> name = URLDecoder.decode(name,"UTF-8");</pre><br /><br />总结：url传递中文参数最好解决办法就是---不要在url传递中文参数
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/150060#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Dec 2007 19:35:50 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/150060</link>
        <guid>http://lighter.javaeye.com/blog/150060</guid>
      </item>
      <item>
        <title>北京雪景</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/147235" style="color:red;">http://lighter.javaeye.com/blog/147235</a>&nbsp;
          发表时间: 2007年12月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今早,北京的同事发过来照片,说北京已经下雪啊,唉,遗憾啊,至今都还没有看到下雪的我,不过没有关系,把照片晒出来让大家欣赏一下吧<br /><br />在宿舍向下拍的照片<br /><img src="http://lh6.google.com/wuguangcheng/R1zETAihOtI/AAAAAAAABRw/ojaaOvjxMc8/s800/DSCF0917.JPG" /><br /><br />走下宿舍,在小区里面拍的照片<br /><img src="http://lh5.google.com/wuguangcheng/R1zEjwihOuI/AAAAAAAABR4/1PaQIXkhcTw/s800/DSCF0938.JPG" /><br /><br />随拍<br /><img src="http://lh4.google.com/wuguangcheng/R1zE4gihOvI/AAAAAAAABSA/NUAwnxHAfW0/s800/DSCF0939.JPG" /><br /><br />随拍<br /><img src="http://lh6.google.com/wuguangcheng/R1zFVAihOwI/AAAAAAAABSI/vO2jLifxT-Y/s800/DSCF0940.JPG" />
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/147235#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Dec 2007 13:04:18 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/147235</link>
        <guid>http://lighter.javaeye.com/blog/147235</guid>
      </item>
      <item>
        <title>小心给servlet忽悠了</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/146276" style="color:red;">http://lighter.javaeye.com/blog/146276</a>&nbsp;
          发表时间: 2007年12月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          你真的会写线程安全的servlet吗?<br /><br />很多人认为servlet随便怎样写可以的,反正是线程安全的,没有什么关系的.那我们来看看下面的这一个例子吧.<br />首先要看一下小段的servlet代码,如下:<br /><pre name="code" class="java">public class Test extends HttpServlet {
   String name;

   protected void doPost (HttpServletRequest req,
                       HttpServletResponse res) {
     name = req.getParameter("name");
     ...
     out.println(name + ", thanks for visiting!");
   }
}</pre><br /><br />我相信不少人的代码在经意或不经意间都这样写过,然后自己一个跑一下程序,可以啦,然后就不再理会啦,上面的程序是有问题的,假如有两个用户同时用到这一段代码的程序的功能,就有可能会出现如下这种情况:<br /><br /><div class="quote_title">引用</div><div class="quote_div">	Thread 1:	assign "A" to name<br />	Thread 2:	assign "B" to name<br />	Thread 1:	print "B, thanks for visiting!"<br />	Thread 2:	print "B, thanks for visiting!"</div><br /><br />怎样改写呢?其实也比较简单的,比较出名的找bug的工具Fortify推荐如下一种方式如下:<br /><pre name="code" class="java">public class Test extends HttpServlet {

   protected void doPost (HttpServletRequest req, HttpServletResponse res) {
	RequestHandler handler = new RequestHandler();
	handler.handle(req, res);
   }
}

public class RequestHandler {

   String name;

   public void handle(HttpServletRequest req, HttpServletResponse res) {
     name = req.getParameter("name");
     ...
     out.println(name + ", thanks for visiting!");
   }
}</pre><br /><br />请记得这一句话:<br /><div class="quote_title">引用</div><div class="quote_div"><span style="color: blue"><strong><span style="font-size: 11pt">Do not use Servlet member fields for anything but constants. (i.e. make all member fields static final).</span></strong></span></div><br /><br />刚才今天我的一个同事也写了类似上面的有bug的那一个servlet程序,我也改造过来了;<br />不过是用了另一种方式实现的,用的是ThreadLocal这一个关键类,伪代码如下:<br /><pre name="code" class="java">public class Test extends HttpServlet {
	private static final ThreadLocal parameterLocal = new ThreadLocal();  
	
	private static final ThreadLocal filesLocal = new ThreadLocal();      
	
	protected Map getFiles() {
		Map files = (HashMap)filesLocal.get();
		if(files==null){
			files = new HashMap();
			filesLocal.set(files);
		}
		return files;
	}

	protected  Map getParameters() {
		Map parameters = (HashMap)parameterLocal.get();
		if(parameters==null){
			parameters = new HashMap();
			parameterLocal.set(parameters);
		}
		return parameters;
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) {
			.....//可以通过getParameters()返回Map对象
			log.info(getParameters().get("possess"));
	
			Iterator iterator = getFiles().values().iterator(); //可以通过getFiles()返回Map对象
			FileItem item = (FileItem) iterator.next();
			.....
	}
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/146276#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 05 Dec 2007 18:53:53 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/146276</link>
        <guid>http://lighter.javaeye.com/blog/146276</guid>
      </item>
      <item>
        <title>ThreadLocal浅解</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/145281" style="color:red;">http://lighter.javaeye.com/blog/145281</a>&nbsp;
          发表时间: 2007年12月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果有看到spring的一些源码的同学都知道，ThreadLocal对象在spring几乎在每一个重要的类的都存在其身影。到底ThreadLocal是有什么用的呢，让我们来揭开其面纱吧。<br /><br />   <span style="font-size: 11pt"><span style="color: blue">假如某一个对象是非线程安全的,在多线程的环境下,对对象的访问则须采用synchronized或lock/unlock进行线程同步,采用这样的方法限制了并发的访问,会带来比较大的性能损失.当然,我们可以在无须同步的的情况下,来化解线程安全的问题---就是采用ThreadLocal.</span></span><br /><br />   <span style="font-size: 11pt"><span style="color: blue">其实可以把ThreadLocal看成一个线程的局部变量,我们可以通过ThreadLocal为每一个线程提供了单独的副本.</span></span><br /><br />  <span style="font-size: 11pt"><span style="color: blue"> ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突.因为每一个线程都拥胡自己的变量副本,从而也就没有必要对该变量进行同步了.</span></span><br /><br />  <span style="font-size: 11pt"><span style="color: blue"> ThreadLocal提供了线程安全的共享对象,在编写多线程代码的时候,可以把不安全的变量封装进ThreadLocal.</span></span><br /><br />   <span style="font-size: 11pt"><span style="color: blue">其实从另一个角度上看,对于多线程的资源共享的问题,同步机制采用了"以时间换空间"的方式,而ThreadLocal则采用了"以空间换时间"的方式。[注:这一句话来自 向同事借看的&lt;&lt;精通spring2.x企业开发详解>>一书第九章]</span></span><br /><br />   举一个例子，先说明一下各类的用途如下：<br />   Log类是用来将程序的log记录存放在log.txt里面的,进行分配线程的工作<br />   TSLog产生Log的类，实例由每个线程所拥有<br />   ClientThread调用Log的线程<br /><br />首先来看看Log类的写法：<br /><pre name="code" class="java">public class Log {
    private static final ThreadLocal tsLogCollection = new ThreadLocal();

    // 加入一个log
    public static void println(String s) {
        getTSLog().println(s);
    }

    // 关闭log
    public static void close() {
        getTSLog().close();
    }

    // 取得线程特有的log,注意每一个线程都有一个副本的log，所以无论怎样调用TSLog的内容，都不会出现数据出错的现象
    private static TSLog getTSLog() {
        TSLog tsLog = (TSLog)tsLogCollection.get();

        //如果线程是第一次呼叫，就建立新挡案并登陆log
        if (tsLog == null) {
            tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt");
            tsLogCollection.set(tsLog);
        }

        return tsLog;
    }
}</pre><br /><br /><br />再来看看最普通不过的TSLog类<br /><pre name="code" class="java">import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;

public class TSLog {
    private PrintWriter writer = null;

    //  初始化writer字段
    public TSLog(String filename) {
        try {
            writer = new PrintWriter(new FileWriter(filename));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //  加入一笔log
    public void println(String s) {
        writer.println(s);
    }

    //  关闭log
    public void close() {
        writer.println("==== End of log ====");
        writer.close();
    }
}</pre><br /><br />再写一个ClientThread类：<br /><pre name="code" class="java">public class ClientThread extends Thread {
    public ClientThread(String name) {
        super(name);
    }
    public void run() {
        System.out.println(getName() + " BEGIN");
        for (int i = 0; i &lt; 10; i++) {
            Log.println("i = " + i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
        Log.close();
        System.out.println(getName() + " END");
    }
}</pre><br /><br />简单的类的类如下：<br /><pre name="code" class="java">public class Main {
    public static void main(String[] args) {
        new ClientThread("A").start();
        new ClientThread("B").start();
        new ClientThread("C").start();
    }
}</pre><br /><br />会产生A_log.txt,B_log.txt,以及c_log.txt三个文件，每一个文件的内容都是为<br />[quote]main: i=1 <br />main: i=2<br />....<br />main: i=10[/quote]<br /><br /><br />其实ThreadLocal的方法很简单的，只有一个set,get,remove,还有一个initialValue()等四个方法而已。<br /><br />再来看一个例子：<br /><pre name="code" class="java">public class SequenceNumber {
	private static ThreadLocal&lt;Integer> seqNum = new ThreadLocal&lt;Integer>(){
		public Integer initialValue(){
			return 0;
		}
	};
	public int getNextNum(){
		seqNum.set(seqNum.get()+1);
		return seqNum.get();
	}
	
	public static void main(String[] args) 
	{
         SequenceNumber sn = new SequenceNumber();  
         TestClient t1 = new TestClient(sn);
         TestClient t2 = new TestClient(sn);
         TestClient t3 = new TestClient(sn);
         t1.start();
         t2.start();
         t3.start();
	}	
	private static class TestClient extends Thread
	{
		private SequenceNumber sn;
		public TestClient(SequenceNumber sn) {
			this.sn = sn;
		}
		public void run()
		{
			for (int i = 0; i &lt; 3; i++) {
				System.out.println("thread["+Thread.currentThread().getName()+"] sn["+sn.getNextNum()+"]");				
			}
		}
	}
}
</pre>运行结果如下：<br />[quote]thread[Thread-2]sn[1]<br />thread[Thread-0]sn[1]<br />thread[Thread-1]sn[1]<br />thread[Thread-2]sn[2]<br />thread[Thread-0]sn[2]<br />thread[Thread-1]sn[2]<br />thread[Thread-2]sn[3]<br />thread[Thread-0]sn[3]<br />thread[Thread-1]sn[3][/quote]<br /><br />从结果可以看出，ThreadLocal为每一个线程都提供了一个对象的副本<br /><br />注：核心代码来源为&lt;&lt;Java多线程设计模式>>和向同事借看的&lt;&lt;精通spring2.x企业开发详解>>一书第九章<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><pre name="code" class="java"></pre>[quote]
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/145281#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 01 Dec 2007 13:16:52 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/145281</link>
        <guid>http://lighter.javaeye.com/blog/145281</guid>
      </item>
      <item>
        <title>大道至简</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/143827" style="color:red;">http://lighter.javaeye.com/blog/143827</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;&lt;大道至简>>是国内水平相当高的老程序周爱民写的,只有短短的一百页多一点,这一本书没有纸版的,只有电子版的,是因为出版社觉得太薄了,不愿意出版.<br /><br />这一本电子书,也是我下一届的师弟发给我的.以前也并不知道这一本书,谢谢他一下,也正因为他,才知道这一本小册子的书.<img src="/images/smiles/icon_arrow.gif"/><br /><br />里面的前言,作者这样写得:<br /><div class="quote_title">引用</div><div class="quote_div">补充声明：我保留在传统媒体(书籍、杂志)上刊载、出版本书的权利。但允许任何人在网络上非商业性地、自由地、不加修改地传播这本书的电子版本。</div><br /><br />所以我就上传这一本书和大家共同分享一下,也符合作者心中的想法.<br /><br />书很薄,很容易看完的,想一想,还有有收获的.....
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/143827#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 Nov 2007 21:44:02 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/143827</link>
        <guid>http://lighter.javaeye.com/blog/143827</guid>
      </item>
      <item>
        <title>体会Observer/Observable模式</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/143138" style="color:red;">http://lighter.javaeye.com/blog/143138</a>&nbsp;
          发表时间: 2007年11月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在现在的项目中，后台有一块程序感觉用Observer/Observable模式比较好一些，所以和同事就写这样一个很简单的demo出来，记录下来，当作记录吧。里面的用到的API是Doug Lea这一大牛写的concurrent包，已经成为了java1.5的标准库了。但我们只能1.4的JDK，所以用concurrent包来代替实现同样的功能。<br />有一个Pojo类如下：<br /><pre name="code" class="java">public class Account {

	private int numOne;

	private int numTwo;

	private int sum;

	public int getNumOne() {
		return numOne;
	}

	public void setNumOne(int numOne) {
		this.numOne = numOne;
	}

	public int getNumTwo() {
		return numTwo;
	}

	public void setNumTwo(int numTwo) {
		this.numTwo = numTwo;
	}

	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}
}</pre><br /><br />再写一个在通知观察者之前需要做什么工作的类：<br /><pre name="code" class="java">import edu.emory.mathcs.backport.java.util.concurrent.Callable;

public class AccountTask implements Callable {
	
       private int numOne,numTwo;
	
	public AccountTask(int numOne , int numTwo){
		this.numOne = numOne;
		this.numTwo = numTwo;
	}
	
	/**
	 * 计算numOne和numTwo的值并相加
	 */
	public Object call() throws Exception {
		int resultNum = this.numOne + this.numTwo;
		return String.valueOf(resultNum);
	}
}</pre><br /><br />然后后，想想啊，就是写一个观察者嘛：<br /><pre name="code" class="java">import java.util.Observable;
import java.util.Observer;

public class PaddingDBObserver implements Observer {

	/** 假设的数据保存 */
	private int [][] db = new int [10][10];
	
	public void update(Observable o, Object arg) {
		if (arg instanceof Account) {
			Account obj = (Account)arg;
			int rowNum = obj.getNumOne();
			int colNum = obj.getNumTwo();
			db[rowNum][colNum] = obj.getSum(); //假设数据保存的，在这一个例子里面并没有什么用
			System.out.println("填充[" + rowNum + "][" + colNum +"]=" + obj.getSum());
		}
	}
}</pre><br /><br />再就是，写一个最核心的Observable类啦，如下：<br /><pre name="code" class="java">import java.util.Observable;

import edu.emory.mathcs.backport.java.util.concurrent.ExecutionException;
import edu.emory.mathcs.backport.java.util.concurrent.ExecutorService;
import edu.emory.mathcs.backport.java.util.concurrent.Executors;
import edu.emory.mathcs.backport.java.util.concurrent.Future;

public class ServiceThread extends Observable implements Runnable{

	private static final long serialVersionUID = 7010111816402017124L;

	private volatile int numOne;

	private volatile int numTwo;

	public ServiceThread(int numOne, int numTwo) {
		this.numOne = numOne;
		this.numTwo = numTwo;
	}
	/**
	 * 线程运行
	 */
	public void run() {
		/** 创建一个使用单个 worker 线程的 Executor，以无界队列方式来运行该线程。 */
		ExecutorService executor = Executors.newSingleThreadExecutor();
		/** 提交一个返回值的任务用于执行，返回一个表示任务的未决结果的 Future */
		Future future = executor.submit(new AccountTask(numOne, numTwo));
		try {
			String result = (String) future.get();
			int sum = Integer.parseInt(result);

			Account obj = new Account();
			obj.setNumOne(this.numOne);
			obj.setNumTwo(this.numTwo);
			obj.setSum(sum);

			setChanged();
			super.notifyObservers(obj);
		} catch (InterruptedException e) {
		} catch (ExecutionException e) {
		}
		/** 线程关闭 */
		executor.shutdown();
	}
}</pre><br /><br />最后，就是再随便添加一个执行的类，如下： <br /><pre name="code" class="java">import edu.emory.mathcs.backport.java.util.concurrent.ExecutorService;
import edu.emory.mathcs.backport.java.util.concurrent.Executors;

public class AccountMain {

	/** 线程池 */
	private ExecutorService pool = null;
	
	public void start() {
		/** 创建一个可重用固定线程集合的线程池，以共享的无界队列方式来运行这些线程。 */
		pool = Executors.newFixedThreadPool(10);

		for (int i = 0; i &lt; 10; i++) {
			for (int j = 0; j &lt; 10; j++) {
				ServiceThread st = new ServiceThread(i, j);
				st.addObserver(new PaddingDBObserver());
				pool.execute(st);
			}
		}
		/** 关闭线程池 */
		pool.shutdown();
	}

	/**
	 * 测试程序
	 * @param args
	 */
	public static void main(String[] args) {
		AccountMain am = new AccountMain();
		am.start();
	}
}
</pre><br /><br />执行的结果：<br /><div class="quote_title">引用</div><div class="quote_div">填充[0][2]=2<br />填充[0][9]=9<br />填充[0][5]=5<br />填充[0][1]=1<br />.........<br />填充[1][8]=9<br />填充[1][7]=8<br />.......<br />填充[2][8]=10<br />填充[3][2]=5<br />填充[3][3]=6<br />..........</div>
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/143138#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Nov 2007 19:20:36 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/143138</link>
        <guid>http://lighter.javaeye.com/blog/143138</guid>
      </item>
      <item>
        <title>Java 5.0多线程编程学习资料笔录</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/143037" style="color:red;">http://lighter.javaeye.com/blog/143037</a>&nbsp;
          发表时间: 2007年11月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于Java 5.0多线程编程的学习,可以参考一下网上的下面的几篇文章:<br /><br />Java 5.0多线程编程(sun公司的文章,很值得一看)<br /><a href="http://gceclub.sun.com.cn/Concurrency/Java5_Multi_Thread.html" target="_blank">http://gceclub.sun.com.cn/Concurrency/Java5_Multi_Thread.html</a><br /><br />还有一篇The Java Tutorials的文章.<br /><a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html" target="_blank">http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html</a><br /><br />还有就是--><br />学习笔记 - java.util.concurrent 多线程框架:<br /><a href="http://www.ismayday.com/?p=170" target="_blank">http://www.ismayday.com/?p=170</a><br /><br /> JDK1.5中的线程池使用简介:<br /><a href="http://www.simplelife.cn/html/study/java/concurrent/threadPoolIn1.5.html" target="_blank">http://www.simplelife.cn/html/study/java/concurrent/threadPoolIn1.5.html</a><br /><br />读书笔记：多线程程序设计23个要点:<br /><a href="http://www.bitscn.com/java/lines/200709/113843.html" target="_blank">http://www.bitscn.com/java/lines/200709/113843.html</a><br /><br />Java 5.0 多线程编程实践:<br /><a href="http://www.javaresearch.org/html/article/53551.htm" target="_blank">http://www.javaresearch.org/html/article/53551.htm</a><br /><br />把上面的几篇文章看了后,以后就可以翻一翻javaDoc的文档就可以了啦.当然,前提是你对以前线程的那一些知识点必须掌握得比较牢固.所以推荐一本书&lt;&lt;java多线程设计模式>>,很经典的一本书来的.
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/143037#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Nov 2007 13:33:19 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/143037</link>
        <guid>http://lighter.javaeye.com/blog/143037</guid>
      </item>
      <item>
        <title>最近的技术学习安排</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/141412" style="color:red;">http://lighter.javaeye.com/blog/141412</a>&nbsp;
          发表时间: 2007年11月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上周星期天的时候,从北京过来厦门了,厦门这边的气候比北京好一些,比较暖和。因为厦门这边宿舍回去之后是不能上网，要自己拉网线的，正合我意---回去可以看看书，看看开源项目的一些优秀的源代码，充充电嘛。<br /><br />    最近自己打算看技术上一些内容：<br /><br />1、把Spring的源码IoC部分最核心的代码看懂，理解明白，不能总是用Spring框架而不明白它里面是怎样实现的；其实看Spring的源码也挺好玩有趣的。其实把一两个优秀的框架的源码从头到尾认认真真的看一两遍，对自己的收获还是挺大的。<br /><br />2、继续补上线程的内容，多线程方面的内容实在太博大精深啦，刚好项目也有用到这一方面的内容，努力努力。<br /><br />3、还有就是继续学习怎样更好写测试代码。没有什么代码是不能测试的，只是说有一些代码很难测试而已。如果说很多代码难以测试，那想一想，Spring框架是怎样测试的。
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/141412#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 17 Nov 2007 21:06:02 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/141412</link>
        <guid>http://lighter.javaeye.com/blog/141412</guid>
      </item>
      <item>
        <title>离开北京项目组前随记</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/139562" style="color:red;">http://lighter.javaeye.com/blog/139562</a>&nbsp;
          发表时间: 2007年11月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          不知不觉间,到北京已经过了三个月多了,在这三个多月使自己认识了很多可爱可泣的同事们,也发生了很多有趣的事情.后天中午就要飞去厦门啦,有点舍不得北京组，但也有一些兴奋,毕竟又有新项目可以做啦,自己猜的话去到厦门后去做指标库的项目吧,到时过去后不知道给龙哥怎样折磨,呵呵.<br /><br />     当初来北京,是为开发中国建设银行里面的ERPF报表装数卸数的项目,上线已一个多月,后面客户提出了一些新需求,不过也一一解决,现在就剩下年报方面的工作,不过以军哥的经验绝对可以完美地完成了。自己从他身上也学习了不少的东西，对他很感激。其实每一个人都有自己的优点,都有给别人学习的一面.<br /><br />     来北京项目组这么久,也该介绍一下同事给人认识吧.不然很多人说让这么多帅哥不介绍给别人简直是一种浪费啊.<br /><br />     第一个要被我拿来"祭刀牺牲"的人,当仁不让是苏哥啦.关于苏哥的事迹,几天几夜十八张嘴还不能说完.苏哥的为人实在很好很好,对我们员工很关心,呵呵,打一个例子啦,刚来北京的时候,因为宿舍的床位不够,所以他自己睡了床垫,让我睡硬床上,就这样苏哥就睡了三个多月的床垫啦.唉,都是我的错啊.当然,冷笑话的出场也离不开苏哥啦.我们称他为苏哥,但建行的有一些却亲切地叫他为"小苏"。其实往心里想一想苏州美女也挺漂亮的,苏哥不去当苏MM实在太亏了啊，不然江湖上就可以称他为"苏眉"了，多好听的名字啊。<br /><br />     接下来有两位重要人物出场啦.一位是和洪七公同姓的,在这里就称"小洪"吧,其实在日常一直叫其名的,并没有叫成"小洪";另一位是文哥,在北京项目目前最元老级的人物,我在猜,可能过多几个月还在北京的,文哥就可能成为了古董级的人物啦.小洪同志对人真的没有得说,一个字"好",他是那一种对工作极其负责认真,想一次性把自己的工作认真做好的家伙,不想翻工,这一点实在不错,很让我佩服;在生活上,小洪同志对自己比较吝啬的,对别人又是非常的慷慨,能帮助就帮助别人.整个北京项目,在军哥没有买相机之前,星期六日有同伙出去游玩的时候,都会借小洪的相机,小洪总是慷慨地答应.上帝啊，可怜的相机啊,上辈子受了什么苦,让这么多人来折磨你啊-^^-.说到文哥,典型的帅气的小伙子,当然是属于前辈啦,资历比较深啦,在北京项目组仅次于苏哥和军哥.文哥侍人很好,说话很斯文,最经典的两句话是:接电话时充满磁性的"你好",还有别人赞扬他的时候,他就说"真的啊?"的口气,实在太酷了,怎一个帅字了得.<br /><br />     我这一个差劲的文字导演啊,接下来是安排谁出来啊.等一下安排不当,给项目组的人看到,岂不是招来杀身之祸,罪过罪过.嗯,咽,嗯,考虑再三，随同上面的几个人物,接下来要介绍的大人物是小罗啦,我称为他为"小罗"、"小小罗"、"肥罗"，就因为他的姓是叫"罗"的啦。幸好他没有看到我在这边也把他称之为"罗卜"、"波箩"，不然的话，我可能会七马分尸啦。老实说，小罗同志是北京项目最憨厚的一个人，有点胖胖的，看上来就是很善良心肠很软的人，但看官都知道，心肠软的一般都会给我捉弄的啦。在很多个周末的时候,就我们两个对他那一个15寸的IBM笔记本电脑上网看英超联赛。小罗同学以前是极喜欢切尔西啊，很大的原因是因为有穆里尼奥那一个酷极的主教练，我也满喜欢老穆同学的，因为他实在太酷了,特别是欧冠打巴萨的几场比赛太经典了。唉，去到厦门就不知道有没有看球啦。不过北京项目后面加的新同事肖大侠也是喜欢看球的，也加以前的容枝兄，阵容也满为可观的。<br /><br />     接下来不得不说军哥这一个大人物啦。北京项目我们开发的时候，都是军哥一个人在主导江山啊，毕竟他工作多年，有很地方值得我学习啦，敬业认真负责。军哥为北京项目项目组做出最大的贡献是：1、引导了整个ULAP程序正常开发 2、发明"XW"这一个风靡北京项目许久的关键词。客官，这一个"XW"是啥意思呢，嗯，想一想吧，就是就是"虚伪"嘛。军哥第二点的发明贡献不亚于当年小行星撞地球造成地球恐龙灭亡的事迹。国庆后一个星期当忠哥离开北京项目组去新疆项目组的时候，还念念不忘地说"你们这一帮擢人实在是太XW啦"。"擢"字嘛，也是火星语来的，各位自己读读看吧,也属于地球的经典语录。<br /><br />    下面是安排鑫哥出场啦。鑫哥的家最属于离北京最近，回去也只要五个小时左右。鑫哥负责装卸数的运维方面的工作，在北京项目组unix系统和Oracle的一些知识除了苏哥后就是他玩得最炫啦。鑫哥也是一个很老实的人，侍大家都很不错很好说话。就现在在五楼办公室的位置，鑫哥就坐在我的后面，有时候有问题的时候就我们两个讨论一起解决分行提上来的一些关于装卸数的一些问题。鑫哥，在北京项目组喜欢去健身，学学跳舞啦，不像我啊，老了啊，现在是年轻人的世界啦。呵呵。自从龙哥离开北京项目组后，北京项目组的健身事业就一落千丈啊，幸好鑫哥一个人苦苦支撑着大梁啊。<br /><br />    还有呢，还有呢，项目组的容枝兄和王礼大哥忍不住要跳出来指骂我了，你这一个小子啊，干嘛不写我们两个啊，前面把一帮擢人都说完，也是时候该讲他们的风花雪月的情事啦。好吧，好吧，命令下来，不得不说啊。想一下国庆的时候，容枝的GF从深圳千里迢迢从深圳过来的，容枝兄基本在国庆前几天朝思暮想的,为伊消得人憔悴啊，那一种急切的心情，我和小洪同学当时也看得出来啊。在国庆期间的时候，容枝做了一件感动天地惊泣鬼神的大事，为了让他的GF睡房间，他一个睡了五六天的客厅啊;"老实人啊，老实人啊"苏哥国庆后回北京后这么说容枝兄的。10月3号五人去长城玩的时候，容枝兄的表现也令人难忘啊，呵呵。王礼大哥，最经典的时候就是每一次杀人的时候都是胡言乱语的，他当警察的时候，让人觉得是杀人；当他是做杀手的时候，让人觉得他是警察,有时候说的话实在令人太搞笑。王礼大哥，可以说北京项目组最搞笑一个人啦，除了苏哥外。 王礼每一个周末的时候都特别地忙了，因为他的GF在北理工，经常过去探望，非常不错的痴情男子啊，为他的GF上刀山下油锅啊；不过很诚心老实说一句，王礼大哥也是很憨厚老实的人啊，不像我啊。<br /><br />    "喂，该吃饭啦"，刚来北京项目组不久的肖峰和彭敏叫我去吃饭啊。当然这是中午的时候他们叫我一起去吃饭的啦.呵呵,就算我怎样混蛋,也不能把他们两个给忘记了呢，不然他们俩要怪我这一个小子没有义气啦。肖峰是一个帅气的小伙子，做事很简干,在玩杀人游戏的时候他经常拿到角色的，我真怀疑他是不是在作弊啊。彭敏这一个家伙一看就让人觉得他是一个很老实的一个人，做事很实在，任劳任怨啊，真是像小洪同学啊。<br /><br />    嗯！嗯！嗯！最后出场啦，当然是自己啦。自己就不用介绍啦，老实人一个嘛(别踩我啊)。<br /><br />    乱七八糟地写了上面的文字，纪念一下在北京项目组里面这一些非常有趣的同事们......
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/139562#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Nov 2007 22:21:37 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/139562</link>
        <guid>http://lighter.javaeye.com/blog/139562</guid>
      </item>
      <item>
        <title>香山踏秋游记</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/138870" style="color:red;">http://lighter.javaeye.com/blog/138870</a>&nbsp;
          发表时间: 2007年11月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          10月29日的时候和同事一起去香山赏红叶,放松一下,呼吸一下市郊清新的空气.从湾子搭车到六里桥南,本来想再搭公车过去香山的,没有想到一大堆在等去香山的车,所以几个人打的去香山,反正摊分也不贵嘛.<br />下面就是秀一下拍的照片,拍照的技术比较烂,看看即可啦,在google的照片空间地址如下:<br /><a href="http://picasaweb.google.com/wuguangcheng" target="_blank">http://picasaweb.google.com/wuguangcheng</a><br /><br />在香炉峰上拍的:<br /><img src="http://lh3.google.com/wuguangcheng/RyXIkI6Z-XI/AAAAAAAABFY/gz5hpf1cTfw/s800/DSC_0066.JPG" /><br /><br />红叶:<br /><img src="http://lh6.google.com/wuguangcheng/RyXIw46Z-YI/AAAAAAAABFg/t1_OMK-2vRs/s800/DSC_0068.JPG" /><br /><br />香山全景:<br /><img src="http://lh4.google.com/wuguangcheng/RyXJJY6Z-dI/AAAAAAAABGI/za5BpEWMFmk/s800/DSC_0121.JPG" /><br /><br />如此蓝色的天:<br /><img src="http://lh6.google.com/wuguangcheng/RyXJJ46Z-eI/AAAAAAAABGQ/Ln2r1Kwj89s/s800/DSC_0130.JPG" /><br /><br />深秋的那一片红叶:<br /><img src="http://lh5.google.com/wuguangcheng/RyXJgo6Z-jI/AAAAAAAABHQ/bxles3AUgKo/s800/DSC_0164.JPG" /><br /><br />黄红叶:<br /><img src="http://lh6.google.com/wuguangcheng/RyXJ246Z-nI/AAAAAAAABH0/U1mI9XTCUY0/s800/DSC_0100.JPG" />
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/138870#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Nov 2007 21:32:13 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/138870</link>
        <guid>http://lighter.javaeye.com/blog/138870</guid>
      </item>
      <item>
        <title>关于ClassLoader工作机制小记</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/138653" style="color:red;">http://lighter.javaeye.com/blog/138653</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          类装载器就是寻找类或接口字节文件进行解析并构造JVM内部对象表示的组件.<br />在java中,类装载器把一个类装入JVM中,要经过如下的步骤:<br /><div class="quote_title">引用</div><div class="quote_div">1、装载：查找和导入CLass文件<br />2、链接：执行校验(检查载入Class文件数据的正确性)，准备(给类的静态变量分配存储空间)和解析(将符号引用转成直接引用)步骤，<br />  其中解析步骤是可以选择的。<br />3、初始化：对类的静态变量，静态代码块执行初始化工作。</div><br /><br />   类装载工作是由classloader及其子类负责，classLoader是一个重要的java运行时系统组件，它负责在运行时查找和装入Class字节文件。<br /><br />    JVM在运行的时候会产生三个classLoader：根装载器(不是ClassLoader的子类，由c++编写的，负责装载JRE的核心类库如rt.jar,charsets.jar)，ExtClassLoader和AppClassLoader。而ExtClassLoader扩展目标ext中的JAR类包；AppClassLoader负责装载Classpath路径下面的类包。<br /><br /><span style="color: blue"><strong>    三者的关系是:根装载器是ExtClassLoader的父装载器，而ExtClassLoader是AppClassLoader的父装载器</strong>。</span><br /><br /><pre name="code" class="java">		ClassLoader loader = Thread.currentThread().getContextClassLoader();
		System.out.println("current loader:"+loader);//打印出AppClassLoader
		System.out.println("parent loader:"+loader.getParent());//打印出ExtClassLoader
		System.out.println("grandparent loader:"+loader.getParent().getParent());//打印出null值,因为根装载器是用C++编写的，所以找不到返回null</pre><br /><br />    JVM装载类时使用"全盘负责委托机制"。"全盘负责"是指当一个ClassLoader装载一个类时，除非显式另一个ClassLoader，该类所依赖入引用的类也由这个ClassLoader载入；"委托机制"是指先托父装载器寻找目标类，只有在找不到的情况下才从自己的类路径中查找并装载目标类。
          <br/>
          <span style="color:red;">
            <a href="http://lighter.javaeye.com/blog/138653#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Nov 2007 23:06:23 +0800</pubDate>
        <link>http://lighter.javaeye.com/blog/138653</link>
        <guid>http://lighter.javaeye.com/blog/138653</guid>
      </item>
      <item>
        <title>用jdbcTempate调用存储过程,处理BLOB/CLOB小记</title>
        <author>lighter</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lighter.javaeye.com">lighter</a>&nbsp;
          链接：<a href="http://lighter.javaeye.com/blog/138256" style="color:red;">http://lighter.javaeye.com/blog/138256</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1、利用spring的jdbcTemplate调用存储过程</strong><br />假如我们有P_GET_TOPIC_NUM这一个存储过程,有两个参数,第一个参数userId是传进去的,第二个参数是传出来的,举例如下:<br /><br /><pre name="code" class="java">	public int getUserTopicNum(final int userId) {
		String sql = "{call P_GET_TOPIC_NUM(?,?)}";
		//使用	Object execute(String callString, CallableStatementCallback action)接口
		Object obj = getJdbcTemplate().execute(sql,new CallableStatementCallback(){
			public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
				cs.setInt(1,userId);
				cs.registerOutParameter(2, Types.INTEGER);
				cs.execute();
				return new Integer(cs.getInt(2));
			}	
		});
	    return ((Integer)obj).intValue();
	}</pre><br /><br /><br /><strong>2、spring定义了一个以统一的方式操作各种数据库的Lob类型数据的LobCreator(保存的时候用),同时提供了一个LobHandler为操作二进制字段和大文本字段提供统一接口访问。</strong><br />举例，例子里面的t_post表中post_text字段是CLOB类型,而post_attach是BLOG类型：<br /><br /><pre name="code" class="java">public class PostJdbcDao extends JdbcDaoSupport implements PostDao {
	private LobHandler lobHandler;
	private DataFieldMaxValueIncrementer incre;
	public LobHandler getLobHandler() {
		return lobHandler;
	}
	public void setLobHandler(LobHandler lobHandler) {
		this.lobHandler = lobHandler;
	}
	public void addPost(final Post post) {		
		String sql = "