<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>leo_faith</title>
    <description>精于心，简于形！</description>
    <link>http://leo-faith.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>JAVA单向链表的实现</title>
        <author>leo_faith</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://leo-faith.javaeye.com">leo_faith</a>&nbsp;
          链接：<a href="http://leo-faith.javaeye.com/blog/223961" style="color:red;">http://leo-faith.javaeye.com/blog/223961</a>&nbsp;
          发表时间: 2008年08月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
package com.leo_faith.www;

public class Node {
	Object data;

	Node next;

	Node(Object d) {
		data = d;
		next = null;
	}
}
</pre><br /><pre name="code" class="java">
package com.leo_faith.www;

public class LinkList {

	/* 用变量来实现表头 */
	private Node Head = null;

	private Node Tail = null;

	private Node Pointer = null; //point to previous

	private int Length = 0;

	public void deleteAll() {// 清空整个链表
		Head = null;
		Tail = null;
		Pointer = null;
		Length = 0;
	}

	// 链表复位，使第一个节点成为当前节点
	public void reset() {
		Pointer = null;
	}

	// 判断链表是否为空
	public boolean isEmpty() {
		return (Length == 0);
	}

	// 判断当前结点是否为最后一个结点
	public boolean isEnd() {
		if (Length == 0)
			throw new java.lang.NullPointerException();
		else if (Length == 1)
			return true;
		else
			return (cursor() == Tail);
	}

	// 返回当前结点的下一个结点的值，并使其成为当前结点
	public Object nextNode() {
		if (Length == 1)
			throw new java.util.NoSuchElementException();
		else if (Length == 0)
			throw new java.lang.NullPointerException();
		else {
			Node temp = cursor();
			Pointer = temp;
			if (temp != Tail)
				return (temp.next.data);
			else
				throw new java.util.NoSuchElementException();
		}
	}

	// 返回当前结点的值
	public Object currentNode() {
		Node temp = cursor();
		return temp.data;
	}

	// 在当前结点前插入一个结点，并使其成为当前结点
	public void insert(Object obj) {
		Node e = new Node(obj);
		if (Length == 0) {
			Tail = e;
			Head = e;
		} else {
			Node temp = cursor();
			e.next = temp;
			if (Pointer == null)
				Head = e;
			else
				Pointer.next = e;
		}
		Length++;
	}

	// 返回链表的大小
	public int size() {
		return Length;
	}

	// 将当前结点移出链表，下一个结点成为当前结点，
	// 如果移出的结点是最后一个结点，
	// 则第一个结点成为当前结点
	public Object remove() {
		Object temp;
		if (Length == 0)
			throw new java.util.NoSuchElementException();
		else if (Length == 1) {
			temp = Head.data;
			deleteAll();
		} else {
			Node cur = cursor();
			temp = cur.data;
			if (cur == Head)
				Head = cur.next;
			else if (cur == Tail) {
				Pointer.next = null;
				reset();
			} else
				Pointer.next = cur.next;
			Length--;
		}
		return temp;
	}

	// 返回当前结点的指针
	private Node cursor() {
		if (Head == null)
			throw new java.lang.NullPointerException();
		else if (Pointer == null)
			return Head;
		else
			return Pointer.next;
	}

	// 链表的简单应用举例
	public static void main(String[] args) {
		LinkList a = new LinkList();
		for (int i = 1; i &lt;= 10; i++)
			a.insert(new Integer(i));
		System.out.println("The currentNode is:" + a.currentNode());
		while (!a.isEnd())
			System.out.println("The nextNode is:" + a.nextNode());
		a.reset();
		while (!a.isEnd()) {
			a.remove();
		}
		a.remove();
		a.reset();
		if (a.isEmpty()) {
			System.out.println("There is no Node in List");
		}
	}
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://leo-faith.javaeye.com/blog/223961#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 04 Aug 2008 18:20:16 +0800</pubDate>
        <link>http://leo-faith.javaeye.com/blog/223961</link>
        <guid>http://leo-faith.javaeye.com/blog/223961</guid>
      </item>
      <item>
        <title>MySql的一些东西（转载）</title>
        <author>leo_faith</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://leo-faith.javaeye.com">leo_faith</a>&nbsp;
          链接：<a href="http://leo-faith.javaeye.com/blog/186317" style="color:red;">http://leo-faith.javaeye.com/blog/186317</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          连续几天安装配置和连接Mysql数据库，今天终于成功了，回想这几天，真的是甜酸苦辣都有，单mysql就重装了不下10次，而在eclipse上编写的连接数据库的程序总是报错．我都已经down了oracal准备放弃mysql了，不过．．．就象电视剧演的那样，转机总是在这个时候出现，<br />先是看到了saulzy关于mysql4.1.11版本的安装介绍，接着又找到了一款不错的mysql 界面插件，最后在网友的帮助下把mysql的JDBC驱动配好并连通了．一连5天，日子真不好过阿，不过这个过程中，我也觉得自己学到不少东西，呵呵，反正都撑过来了，就要继续往前走．现在，就这几天弄的总结一下，希望对同是正在学习JAVA技术的同道中人能有帮助．<br /><br />　　(相关链接："配置Eclpise+tomcat并实现JSP的编写与部署")<br /><br />一． 软件下载<br />　　Mysql<br />　　下载版本：4.1.11<br />　　http://dev.mysql.com/downloads/mysql/4.1.html<br /><br />　　JDBC驱动<br />　　下载版本：3.1.8<br />　　http://dev.mysql.com/downloads/connector/j/3.1.html<br /><br />　　Mysql界面插件:mysql-front<br />　　下载版本镜像：HongKong（我下回来安装就是中文版了）<br />　　http://www.mysqlfront.de/download.html<br /><br />二． 软件安装<br />　　1.安装mysql<br />　　请参阅相关文章，推荐文章：http://blog.csdn.net/saulzy/archive/2005/04/23/359648.aspx<br /><br />　　2.JDBC驱动：mysql-connector-java-3.1.8<br />　　这只是一个压缩包，并不需要安装，只要将其解压，我么使用的是文件夹mysql-connector-java-3.1.8里的文件：mysql-connector-java-3.1.8-bin.jar．<br /><br />　　3. Mysql界面插件:mysql-front<br />　　这是一个安装程序，按照提示安装就可以了．<br /><br />三． 环境配置<br />　首先，我要说明的是我现在tomcat的安装路径是: D:\Program Files\Java\Tomcat；JDK的安装路径是：D:\Program Files\Java\j2sdk。<br /><br />　　在这里，需要配置环境变量的是JDBC驱动．在配置前先要把刚才说到的mysql-connector-java-3.1.8-bin.jar本地硬盘某处（我放的地方：D:\Program Files\Java\mysqlforjdbc），然后根据你放的地方，配置classpath，我的配置是这样的：<br /><br />　　D:\Program files\Java\j2sdk\lib\tools.jar;<br /><br />　　D:\Program Files\Java\j2sdk\lib\mysql-connector-java-3.1.8-bin-g.jar;<br /><br />　　D:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.8-bin.jar<br />　　配置这个的目的是让你的java应用程序找到连接mysql的驱动．<br /><br /> 配置完环境变量后还有很重要一步就是为JSP连接数据库配置驱动，这个其实很简单，就是把mysql-connector-java-3.1.8-bin.jar拷到某些文件夹里就行了，我在网上看了很多资料问了很多人，各种说法都有，我综合了一下，为了保险，我都全做了，呵呵，反正就是拷一个400K的文件而已，现列出要把mysql-connector- java-3.1.8-bin.jar拷进去的文件夹，如下：<br />　　D:\Program Files\Java\Tomcat\common\lib<br />　　D:\Program Files\Java\Tomcat\shared\lib<br /><br />四． 数据库的使用<br /><br />　　Mysql安装完毕以后，还有一些要注意的地方（推荐文章）：http://blog.csdn.net/saulzy/archive/2005/04/23/359811.aspx<br /><br /> 就象在文章提到的，mysql安装好后最重要一样就是要看数据库有没有作为系统服务启动了，所以在大家进行数据库操作前，应要看看，在操作系统的开始－＞运行－＞输入services.msc，确定你在安装时你设置的关于mysql的那个服务已经启动，这样你在操作数据库时不会报连接不上的错误．<br /><br />　　上面提到了一个较方便的mysql界面插件，但是这个界面是我在已经开始使用mysql后才找到的，刚开始我是在dos下用命令行进行操作的．虽然那个界面也可以进行建库啊，设定权限等操作，但是，我觉得懂得在使用命令行也是一个很重要的技能，所以我先从命令行开始说，怎样简单使用mysql．到后面会谈及mysql－front的使用．<br /><br />　　现在我想在mysql里建一个数据库shujuku，以及在数据库里建一个表biao．具体的命令如下（假设mysql我是刚安装好的）<br /><br />　　1. 进入dos状态（记住命令行的要运行在mysql的安装目录下的bin目录的）<br /><br />　　2. 连接mysql<br />　　输入：mysql –h localhost –u root –p<br /> 输入在安装时已设好的密码，就近入了mysql的命令编辑界面了。<br /><br />　　3. 使用mysql的基本命令(在mysql命令行编辑每输入完命令后最后一定要有分号，不然会报错)<br />　　显示数据库：show databases;<br />　　使用数据库：use 数据库名；<br /><br />　　4．建库<br />　　命令：create database shujuku;<br /><br />　　5.为数据库设置权限（用户和密码）<br />　　命令：grant all privileges on shujuku.* to test@localhost identified by “123456”;<br />　　当你执行完这个命令以后，只要你再以用户名：test,密码：123456登录时你就只可以对shujuku这个数据库操作，这样避开使用root，对数据库的安全有很大帮助．<br /><br />　　6.建表<br />　　命令：create table biao(id int(8) primary key,name varchar(10));<br /><br /> 剩下来的与标准sqsl命令基本上是一样的，具体操作略<br />　　值得一提的是，你在命令行上输入＂？＂，就会有mysql命令的简单帮助，如下：<br /><br /> 呵呵，那样，我们还可以知道退出，就是＂exit＂，呵呵！<br /><br />五． 关于mysql-front的使用<br />　　我找了好几个mysql的界面工具，觉得最简洁方便还是mysql-front，可惜的是要收费，不过还好有试用期，呵呵，可以先感受感受一下，最重要一点是mysql-front有简体中文版的，英文不好的我用起来就舒服多了．下面简单说说使用吧．<br /><br />　　首先，安装就不用说了，有向导，而且很简单．安装好后第一次运行时会跳出来一个要求添加对话的框，在这里你可以添加例如上面已经设定好的shujuku，过程如下:<br />　　当你在注册的复选框里填上你在上面mysql设定好的用户名和密码后，在选择数据库框里就有shujuku 的数据库了，选上，按确定．进入mysql-fron后，你就会看到下面的界面，这是你就可以进行操作了．<br /><br />　　要说明的是，你还可以把root用户也加进去，这要你在mysql-fron的界面上选设置－＞对话－＞新建，再按上面进行就可以，出了root你还可以加入更多的用户，方法还是一样的，设置不同的用户，是方便对不同数据库进行管理，呵呵，root是权限最高的，可不要随便让别人使用你的root用户，保正你数据库的安全．<br /><br />六． JSP连接mysql<br />　　现在就是尝试用jsp连接mysql了<br />　　我在eclipse里建了个test_mysql.jsp页面，代码如下：<br /><br />&lt;%@ page contentType="text/html; charset=gb2312" %><br />&lt;%@ page language="java" %><br />&lt;%@ page import="com.mysql.jdbc.Driver" %><br />&lt;%@ page import="java.sql.*" %><br />&lt;%<br />//驱动程序名<br />String driverName="com.mysql.jdbc.Driver";<br />//数据库用户名<br />String userName="cl41";<br />//密码<br />String userPasswd="123456";<br />//数据库名<br />String dbName="db";<br />//表名<br />String tableName="dbtest";<br />//联结字符串<br /><br />String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;<br /><br />Class.forName("com.mysql.jdbc.Driver").newInstance();<br /><br />Connection connection=DriverManager.getConnection(url);<br /><br />Statement statement = connection.createStatement();<br /><br />String sql="SELECT * FROM "+tableName;<br /><br />ResultSet rs = statement.executeQuery(sql);<br /><br />//获得数据结果集合<br />ResultSetMetaData rmeta = rs.getMetaData();<br /><br />//确定数据集的列数，亦字段数<br />int numColumns=rmeta.getColumnCount();<br /><br />// 输出每一个数据值<br />out.print("id");<br />out.print("|");<br />out.print("num");<br />out.print("&lt;br>");<br />while(rs.next()) {<br />  out.print(rs.getString(1)+" ");<br />  out.print("|");<br />  out.print(rs.getString(2));<br />  out.print("&lt;br>");<br />}<br />out.print("&lt;br>");<br />out.print("数据库操作成功，恭喜你");<br />rs.close();<br />statement.close();<br />connection.close();<br />%><br />　　然后把test­_mysql.jsp部署到tomcat处，如何部署可参考"配置Eclpise+tomcat并实现JSP的编写与部署"，在浏览器中就可以看到结果了。<br /><br />　　希望这篇文章的你有帮助！Good luck!
          <br/>
          <span style="color:red;">
            <a href="http://leo-faith.javaeye.com/blog/186317#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Apr 2008 11:49:25 +0800</pubDate>
        <link>http://leo-faith.javaeye.com/blog/186317</link>
        <guid>http://leo-faith.javaeye.com/blog/186317</guid>
      </item>
      <item>
        <title>答复: [疑惑]js动态加载中的事件触发</title>
        <author>leo_faith</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://leo-faith.javaeye.com">leo_faith</a>&nbsp;
          链接：<a href="http://leo-faith.javaeye.com/blog/178416" style="color:red;">http://leo-faith.javaeye.com/blog/178416</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          代码代表我的思想,就是不用去检查状态,靠xhr计数来得知是否完毕.<br />完毕了就执行代码.<br /><br />核心方法:<br /><br />void A9Loader.asyncImportClass(String clzz)<br />    async import an js and export like java<br />    @param clzz (String) eg:'com.trydofor.a9text.parser.a9text'<br /><br />void A9Loader.runAfterImport(Function func)<br />    run the func when all class imported<br />    @param func (Function)<br /><br />你可以修改修改,改成你适用的.<br />这段代码,经过严格测试,在a9text的异步动态载入中表现还不错.<br /><br /><pre name="code" class="js">
/**
UTF8(BOM)  GPL  trydofor.com  Feb.2008
===========================================================

void A9Loader.tagLoadScript(String url)
    load the js/text by html tag(script)
    @param url (String) the url of script

void A9Loader.syncImportClass(String clzz)
    sync import an js and export like java
    @param clzz (String) eg:'com.trydofor.a9text.parser.a9text'

void A9Loader.asyncImportClass(String clzz)
    async import an js and export like java
    @param clzz (String) eg:'com.trydofor.a9text.parser.a9text'

void A9Loader.runAfterImport(Function func)
    run the func when all class imported
    @param func (Function)

void A9Loader.syncLoadText(String url)
    sync load a text
    @param url (String)

void A9Loader.asyncLoadText(Function func,String|Array urls)
    sync load a text or Array of text
    @param func (Function) function(String|Array urls,String|Array texts)
    @param url  (String or Array of String)

void A9Loader.setStdout(Function func)
    show the stdout info of a9loader
    @param func (Function) function(info)
void A9Loader.setStderr(Function func)
    show the stderr info of a9loader
    @param func (Function) function(info)
    
Object A9Loader.__$(String clzz)
    get class object by class name. eg
    A9Loader.__$('com.trydofor.a9text.parser.a9text')
    return com.trydofor.a9text.parser.a9text
    
String A9Loader.getCorePath()
    get the path of a9loader.js
String A9Loader.getPagePath()
    get the path of html page
String A9Loader.getPageName()
    get the name of html page
String A9Loader.getPageInfo()
    get the querystring of html page
Object A9Loader.getPageArgs()
    get the querystring's key-value pairs of html page
*/

var __A9Loader__ = function()
{
    var __selfConf__ = {name:"a9loader.js",extn:'.js',info:"__info__.js"};
    var __pageInfo__ = {core:"",path:"",name:"",info:"",args:{}};
    var __stdHandler__ = {stdout:null,stderr:null};
    var __asyncTextTask__ = {num:0,map:{}};
    var __asyncClzzTask__ = {rcnt:0,clzz:[],func:[]};
    var __clzzInfoPools__ = {}; //{clzz,pubs,deps,text,impl}

    __init__(); // init
    
    //
    function __tagLoadScript__(url)
    {
        __checkType__(url,"string","url@__tagImportScript__");
        try
        {
            var element=document.createElement('SCRIPT'); 
            element.setAttribute('src', url); 
            var parrent = document.getElementsByTagName("head").item(0)||document.body;
            parrent.appendChild(element);
        }catch(e){
            document.write("&lt;script type='text/javascript' src='"+url+"'>&lt;/script>");
            document.close();
        }
    }
    
    function __syncImportClass__(clzz)
    {
        __checkType__(clzz,"string","clzz@__syncImportClass__");
        new __clzzTask__(clzz,false);
    }
    
    function __asyncImportClass__(clzz)
    {
        __checkType__(clzz,"string","clzz@__asyncImportClass__");
        //new __clzzTask__(clzz,true);
        new __clzzTask__(clzz,self.location.protocol.indexOf('file')&lt;0);
    }
    
    function __runAfterImport__(func)
    {
        __checkType__(func,"Function","func@__runAfterImport__");
        __stdout__("__runAfterImport__:"+func);
        __asyncClzzTask__.func.push(func);
        __clzzTaskCallback__();
    }
    
    function __syncLoadText__(url)
    {
        __checkType__(url,"string","url@__syncLoadText__");
        var xhr = __newXHRequest__();
        var resText = null;
        try{
            xhr.open("GET",url,false);
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
            xhr.send(null);
            resText = xhr.responseText;
        }finally{
            xhr.abort();
            delete xhr;
        }
        return resText;
    }

    /**
     * async load text by one or more url,
     * when all text is loaded,the func will be called back.
     * @param func &lt;Function> function(&lt;String|Array>urls,&lt;String|Array>text)
     * @param urls &lt;String|Array> 
     */
    function __asyncLoadText__(func,urls)
    {
        __checkType__(func,"Function","func@__asyncLoadText__");
        __checkType__(urls,"string","urls@__asyncLoadText__");
        
        __asyncTextTask__.num++;
        var task = {};
        task.id = __asyncTextTask__.num;
        task.func = func;
        task.urls = urls
        task.xhrs = [];
        
        if(typeof(urls) == 'string'){
            task.xhrs[0] = new __textTask__(urls,task.id);
        }else{
            for(var i=0;i&lt;urls.length;i++){
                task.xhrs[i] = new __textTask__(urls[i],task.id);
            }
        }
        __asyncTextTask__.map[task.id] = task;
    }
    
    /////////////////// helper functions  ///////////////////
    
    function __clzzTask__(clzz,async)
    {
    	//(step,init:0,info:1,text:2,impl:3)
    	if(typeof(__clzzInfoPools__[clzz]) != 'undefined' 
    	   && __clzzInfoPools__[clzz]['text'] != null) return;
    	
    	if(async == null||async != false) async = true;
    	else async = false;
    	
    	__asyncClzzTask__.rcnt++;
    	__asyncClzzTask__.clzz.push(clzz);
    	
        __stdout__("__clzzTask__:"+clzz+","+async);
        
    	if(typeof(__clzzInfoPools__[clzz]) == 'undefined'){
	    	__clzzInfoPools__[clzz] = {'clzz':clzz,'pubs':null,'deps':null,'text':'','impl':null};
    	}
    	
    	//document.body.innerHTML +="&lt;br>"+clzz;
    	var clzzUri = __pageInfo__.core+clzz.replace(/\./g,'/')+__selfConf__.extn;
    	var infoUri = clzzUri.substring(0,clzzUri.lastIndexOf('/')+1)+__selfConf__.info;
    	
        // get info (async|sync)
        if(__clzzInfoPools__[clzz]['pubs'] == null){
    		__asyncClzzTask__.rcnt++;
            var xhrInfo = __newXHRequest__();
            if(async){
                xhrInfo.onreadystatechange = function(){
                    if(xhrInfo.readyState == 4){
                        var infoText = null;
                        if (xhrInfo.status == 0 || xhrInfo.status == 200 || xhrInfo.status == 304 ){
                            infoText=xhrInfo.responseText;
                        }else{
                            // do something
                        }
                        xhrInfo.abort();
                        delete xhrInfo;
                        //
                        if(infoText != null)eval(infoText);
                        __asyncClzzTask__.rcnt--;
                        __clzzTaskCallback__();
                    }
                }
            }
            
            xhrInfo.open('GET',infoUri,async);
            xhrInfo.setRequestHeader('If-Modified-Since','0');
            xhrInfo.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
            xhrInfo.send(null);
            
            if(!async){
                var infoText=xhrInfo.responseText;
                xhrInfo.abort();
                delete xhrInfo;
                if(infoText != null)eval(infoText);
                __asyncClzzTask__.rcnt--;
                __clzzTaskCallback__();
            }
        }
    	
        // get text (async|sync)
        var xhrClzz = __newXHRequest__();
        if(async){
	        xhrClzz.onreadystatechange = function(){
	            if(xhrClzz.readyState == 4){
	                if (xhrClzz.status == 0 || xhrClzz.status == 200 || xhrClzz.status == 304 ){
	                	__clzzInfoPools__[clzz]['text']=xhrClzz.responseText;
	                }else{
	                    // do something
	                }
	                xhrClzz.abort();
	                delete xhrClzz;
	                __asyncClzzTask__.rcnt--;
	                __clzzTaskCallback__();
	            }
	        }
        }
        
        xhrClzz.open('GET',clzzUri,async);
        xhrClzz.setRequestHeader('If-Modified-Since','0');
        xhrClzz.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
        xhrClzz.send(null);
        
        if(!async){
        	__clzzInfoPools__[clzz]['text']=xhrClzz.responseText;
			xhrClzz.abort();
            delete xhrClzz;
            __asyncClzzTask__.rcnt--;
        	__clzzTaskCallback__();
        }
        
        // inner function
    	function __info__(scriptName,publicMemeber,dependencs){
    		var clzzBall = clzz.substring(0,clzz.lastIndexOf('.')+1);
    		var clzzName = clzzBall + scriptName.substring(0,scriptName.lastIndexOf(__selfConf__.extn));
            
    		if(typeof(__clzzInfoPools__[clzzName]) == 'undefined'){
	    		__clzzInfoPools__[clzzName] = {'clzz':clzzName,'pubs':publicMemeber,'deps':dependencs,'text':null,'impl':null};
    		}else{
    			__clzzInfoPools__[clzzName]['pubs']=publicMemeber;
    			__clzzInfoPools__[clzzName]['deps']=dependencs;
    		}
    		
    		__stdout__("__info__:"+clzzName);
    		
    		if(dependencs!= null){
    			for(var i=0;i&lt;dependencs.length;i++){
    				if(dependencs[i].indexOf('.')&lt;0) dependencs[i] = clzzBall+dependencs[i];
    				new __clzzTask__(dependencs[i],async);
    			}
    		}
    	}
    }
    
    function __clzzTaskCallback__()
    {
    	__stdout__("__clzzTaskCallback__:"+__asyncClzzTask__.rcnt);
    	
    	if(__asyncClzzTask__.rcnt > 0) return;
    	
    	__asyncClzzTask__.rcnt ++;
		do{
	    	var ci = __asyncClzzTask__.clzz.length;
	    	var fi = __asyncClzzTask__.func.length;
	    	for(var i=0;i&lt;ci;i++){
	    		__initAndExportClzz__(__asyncClzzTask__.clzz.shift());
	    	}
	    	for(var i=0;i&lt;fi;i++){
	    		try{
	    		    var func = __asyncClzzTask__.func.shift();
	    		    __stdout__("__asyncClzzTask__.func:"+i+"\n"+func);
	    			func();
	    		}catch(e){ __stderr__("__clzzTaskCallback__:"+e)};
	    	}
		}while(__asyncClzzTask__.rcnt&lt;=1 && (ci>0 ||fi>0))
		
		__asyncClzzTask__.rcnt --;
    }
    
    function __initAndExportClzz__(clzz)
    {
    	if(typeof(__clzzInfoPools__[clzz]) == 'undefined' 
    	   || __clzzInfoPools__[clzz]['impl'] != null
    	   || __clzzInfoPools__[clzz]['text'] == null
    	   ) return;
    	
    	// deps check
    	var cip = __clzzInfoPools__[clzz];
    	cip['impl'] = 'ready'; // avoid looping deps
    	//__stdout__("check@__initAndExportClzz__:"+clzz);
		for(var i=0;cip['deps']!=null && i&lt;cip['deps'].length;i++){
            __stdout__("deps@__initAndExportClzz__:"+clzz+"->"+cip['deps'][i]);
			__initAndExportClzz__(cip['deps'][i]);
		}
		__stdout__("init@__initAndExportClzz__:"+clzz);
    	// init clzz
    	var clzzScript = ["__clzzInfoPools__[clzz].impl = function(){\n"];
    	if(cip['pubs']!=null)
	        for(var i=0;i&lt;cip['pubs'].length;i++)
	    		clzzScript.push("var " + cip['pubs'][i] + ";\n");
    	clzzScript.push(cip['text']);
        clzzScript.push("\nreturn { __$:function(s){return eval(s)}\n");
    	if(cip['pubs']!=null)
	        for(var i=0;i&lt;cip['pubs'].length;i++)
            	clzzScript.push(","+cip['pubs'][i]+":"+cip['pubs'][i]+"\n");
        clzzScript.push("};\n");
        clzzScript.push("}();\n");
        
        try{
            eval(clzzScript.join(''));
        }catch(e){
            throw "bad clzz :"+clzz+" :\n"+e;
        }
        delete clzzScript;
        
        // export ball
        var ballScript = [];
        var ballPart = clzz.split('.');
        if(ballPart.length>1){
        	ballScript.push("if(typeof("+ballPart[0]+")=='undefined')"+ballPart[0]+"={};\n");
	        var ballCell = ballPart[0];
	        for(var i=1;i&lt;ballPart.length-1;i++){
	            ballCell += "['"+ballPart[i]+"']";
	            ballScript.push("if(typeof("+ballCell+")=='undefined') "+ballCell+"={};\n");
	        }
        }
        
        ballScript.push("if(typeof("+clzz+")!= 'undefined'){ throw '"+clzz+" exists';}\n");
        ballScript.push("else{"+clzz+"=__clzzInfoPools__[clzz].impl;}\n");
        try{
            eval(ballScript.join(''));
        }catch(e){
        	throw "bad ball :"+clzz+" :\n"+e;
        }
        delete ballScript;
        
        // alias pubs
        var aliasScript = [];
        if(cip['pubs']!=null)
	        for(var i=0;i&lt;cip['pubs'].length;i++){
	    		aliasScript.push("if(typeof("+cip['pubs'][i]+")!='undefined'){__stderr__('conflict:"+cip['pubs'][i]+"@"+clzz+"');}\n");
	    		aliasScript.push("else{"+cip['pubs'][i]+"=__clzzInfoPools__[clzz].impl['"+cip['pubs'][i]+"']}\n");
	        }
        eval(aliasScript.join(''));
		delete aliasScript;
    }
    /**
     * do xmlhttprequest as a thread of task group
     * @param url
     * @param taskid task group id
     */
    function __textTask__(url,taskid)
    {
        var text = null;
        var done = false;
        
        var xhr = __newXHRequest__();
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4){
                if (xhr.status == 0 || xhr.status == 200 || xhr.status == 304 ){
                    text = xhr.responseText;
                    done = true;
                    __textTaskCallback__(taskid);
                }else{
                    // do something
                }
                xhr.abort();
                delete xhr;
            }
        }
        xhr.open('GET',url,true);
        xhr.setRequestHeader('If-Modified-Since','0');
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
        xhr.send(null);
        //
        this.isDone = function(){return done;}
        this.getUrl = function(){return url;}
        this.getText = function(){return text;}
    }
    
    function __textTaskCallback__(taskid)
    {
        if(typeof(__asyncTextTask__.map[taskid]) == 'undefined') return;
        
        var xhrs = __asyncTextTask__.map[taskid].xhrs;
        var isAllDone = true;
        for(var i=0;i&lt;xhrs.length;i++){
            if(!xhrs[i].isDone()){
                isAllDone = false;
                break;
            }
        }
        //alert(taskid+"::"+xhrs.length+":"+isAllDone)
        if(isAllDone){
            var task = __asyncTextTask__.map[taskid];
            if(typeof(task.urls) == 'string'){
                task.func(task.xhrs[0].getUrl(),task.xhrs[0].getText());
            }else{
                var urls  = [];
                var texts = [];
                for(var i=0;i&lt;xhrs.length;i++){
                    urls[i]  = xhrs[i].getUrl();
                    texts[i] = xhrs[i].getText();
                }
                task.func(urls,texts);
            }
            
            delete __asyncTextTask__.map[taskid];
        }
    }    
    
    function __newXHRequest__()
    {
        if(window.XMLHttpRequest) // Gecko
        {
            return new XMLHttpRequest() ;
        }
        else if(window.ActiveXObject) // IE
        {
            var activeXo = ['MSXML2.XMLHTTP','Microsoft.XMLHTTP'] ;
            for(var i=0;i&lt;activeXo.length;i++)
                try {return new ActiveXObject(activeXo[i]);}catch (e){};
        }
        else
        {
            throw "can not create XMLHttpRequest on your browser";
        }
    }
    
    function __checkType__(para,type,info)
    {
        var mess = "para:"+para+" should be "+type+" ::"+info;
        if(para == null) throw mess;
        if(para instanceof Array && type != "Array"){
            for(var i=0; i&lt;para.length; i++) {
            	if(typeof(para[i]) == type) continue;
            	try{
            	   if(eval("para[i] instanceof "+type)) continue;
            	}catch(e){};
                throw mess;
            }
            return;
        }else{
            if(typeof(para) == type || eval("para instanceof "+type)) return;
        }
        throw mess;
    }
    
    function __stderr__(info){
        if(__stdHandler__.stderr != null){
            try{__stdHandler__.stderr(info);}catch(e){alert(e)};
        }
    }
    function __stdout__(info){
        if(__stdHandler__.stdout != null){
            try{__stdHandler__.stdout(info);}catch(e){alert(e)};
        }
    }
    
    function __init__()
    {
        // CORE
        var scriptTags = document.getElementsByTagName("SCRIPT");
        for(var i=0;i&lt;scriptTags.length;i++)
        {
            var src = scriptTags[i].src;
            var pos = src.lastIndexOf(__selfConf__['name']);
            if( pos == (src.length - __selfConf__['name'].length))
            {
                __pageInfo__['core'] = src.substring(0,pos);
                break;
            }
        }
        // PAGE
        var theURL = self.location.href;
        var questPos = theURL.indexOf('?');
        var pureUrl = questPos&lt;0?theURL:theURL.substring(0,questPos);
        var slashPos = pureUrl.lastIndexOf('/') + 1;
        
        __pageInfo__['path'] = theURL.substring(0,slashPos);
        __pageInfo__['name'] = questPos>slashPos ? theURL.substring(slashPos,questPos):theURL.substr(slashPos);
        // URL_ARGS
        if(questPos > slashPos)
        {
            var queryString = theURL.substr(questPos+1);
            var equalPos = 0;
            var keyValArray = queryString.split("&");
            for( var i = 0 ; i &lt; keyValArray.length; i++)
            {
                equalPos = keyValArray[i].indexOf("=");
                if(equalPos > 0)
                    __pageInfo__['args'][keyValArray[i].substring(0,equalPos)] = keyValArray[i].substr(equalPos+1);
                else
                    __pageInfo__['args'][keyValArray[i]] = "";
            }
            __pageInfo__['info'] = queryString;
        }
    }
    
    // export public members
    this.tagLoadScript    = __tagLoadScript__;
    this.syncImportClass  = __syncImportClass__;
    this.asyncImportClass = __asyncImportClass__;
    this.runAfterImport   = __runAfterImport__;
    this.syncLoadText     = __syncLoadText__;
    this.asyncLoadText    = __asyncLoadText__;
    
    this.setStdout       = function(f){if(f instanceof Function)__stdHandler__.stdout = f;};
    this.setStderr       = function(f){if(f instanceof Function)__stdHandler__.stderr = f;};
        
    this.__$              = function(s){return __clzzInfoPools__[s].impl;}
    this.getCorePath      = function(){ return __pageInfo__['core']; };
    this.getPagePath      = function(){ return __pageInfo__['path']; };
    this.getPageName      = function(){ return __pageInfo__['name']; };
    this.getPageInfo      = function(){ return __pageInfo__['info']; };
    this.getPageArgs      = function(){ var t={};for(var k in __pageInfo__['args'])t[k]=__pageInfo__['args'][k]; return t;};
}

// init instance
if(typeof(A9Loader) == 'undefined' || !(A9Loader instanceof __A9Loader__))
{
    A9Loader = new __A9Loader__();
    
    /*
    var _console_ = null;
    var stdout = function(info){
        if(_console_ == null){
            _console_= window.open("","A9LoaderConsole","width=680,height=600,resizable,scrollbars=yes");
            _console_.document.write("&lt;meta content='text/html; charset=utf-8' http-equiv='content-type'>&lt;body style='font-size:12px'>&lt;/body>");
        }
    	_console_.document.write("&lt;pre>"+info+"&lt;/pre>");
    }
    var stderr = function(info){
        stdout("[ERR]"+info);
    }
    
	A9Loader.setStdout(stdout);
	A9Loader.setStderr(stderr);
	*/
}

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://leo-faith.javaeye.com/blog/178416#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 14:51:36 +0800</pubDate>
        <link>http://leo-faith.javaeye.com/blog/178416</link>
        <guid>http://leo-faith.javaeye.com/blog/178416</guid>
      </item>
      <item>
        <title>Java同步机制总结--synchronized</title>
        <author>leo_faith</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://leo-faith.javaeye.com">leo_faith</a>&nbsp;
          链接：<a href="http://leo-faith.javaeye.com/blog/177779" style="color:red;">http://leo-faith.javaeye.com/blog/177779</a>&nbsp;
          发表时间: 2008年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          不久前用到了同步，现在回过头来对JAVA中的同步做个总结，以对前段时间工作的总结和自我技术的条理话。JAVA中synchronized关键字能够作为函数的修饰符，也可作为函数内的语句，也就是平时说的同步方法和同步语句块。假如再细的分类，synchronized可作用于instance变量、object reference（对象引用）、static函数和class literals(类名称字面常量)身上。<br />在进一步阐述之前，我们需要明确几点：<br />A．无论synchronized关键字加在方法上还是对象上，他取得的锁都是对象，而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。<br />B．每个对象只有一个锁（lock）和之相关联。<br />C．实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制。<br />接着来讨论synchronized用到不同地方对代码产生的影响： <br /><br />假设P1、P2是同一个类的不同对象，这个类中定义了以下几种情况的同步块或同步方法，P1、P2就都能够调用他们。 <br /><br />1．  把synchronized当作函数修饰符时，示例代码如下：<br />Public synchronized void method(){<br />//….<br />}<br />这也就是同步方法，那这时synchronized锁定的是哪个对象呢？他锁定的是调用这个同步方法对象。也就是说，当一个对象P1在不同的线程中执行这个同步方法时，他们之间会形成互斥，达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。<br />上边的示例代码等同于如下代码：<br />public void method()<br />{<br />synchronized (this)      //  (1)<br />{<br />       //…..<br />}<br />}<br /> (1)处的this指的是什么呢？他指的就是调用这个方法的对象，如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程，才能够调用P1的同步方法，而对P2而言，P1这个锁和他毫不相干，程式也可能在这种情形下摆脱同步机制的控制，造成数据混乱：（<br />2．同步块，示例代码如下：<br />public void method(SomeObject so) {<br /> synchronized(so)<br />{<br />       //…..<br />}<br />}<br />这时，锁就是so这个对象，谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时，就能够这样写程式，但当没有明确的对象作为锁，只是想让一段代码同步时，能够创建一个特别的instance变量（他得是个对象）来充当锁：<br />class Foo implements Runnable<br />{<br />       private byte[] lock = new byte[0];  // 特别的instance变量<br />    Public void method()<br />{<br />       synchronized(lock) { //… }<br />}<br />//…..<br />}<br />注：零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码：生成零长度的byte[]对象只需3条操作码，而Object lock = new Object()则需要7行操作码。<br />3．将synchronized作用于static 函数，示例代码如下：<br />      Class Foo <br />{<br />public synchronized static void method1()   // 同步的static 函数<br />{<br />//….<br />}<br />public void method2()<br />{<br />       synchronized(Foo.class)   //  class literal(类名称字面常量)<br />}<br />       }<br />   代码中的method2()方法是把class literal作为锁的情况，他和同步的static函数产生的效果是相同的，取得的锁很特别，是当前调用这个方法的对象所属的类（Class，而不再是由这个Class产生的某个具体对象了）。<br />记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不相同，不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。<br />能够推断：假如一个类中定义了一个synchronized的static函数A，也定义了一个synchronized 的instance函数B，那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时，不会构成同步，因为他们的锁都不相同。A方法的锁是Obj所属的那个Class，而B的锁是Obj所属的这个对象。 <br /><br />小结如下：<br />搞清楚synchronized锁定的是哪个对象，就能帮助我们设计更安全的多线程程式。<br /><br /> <br />更有一些技巧能够让我们对共享资源的同步访问更加安全：<br />1．  定义private 的instance变量+他的 get方法，而不要定义public/protected的instance变量。假如将变量定义为public，对象在外界能够绕过同步方法的控制而直接取得他，并改变他。这也是JavaBean的标准实现方式之一。<br />2．  假如instance变量是个对象，如数组或ArrayList什么的，那上述方法仍然不安全，因为当外界对象通过get方法拿到这个instance对象的引用后，又将其指向另一个对象，那么这个private变量也就变了，岂不是很危险。 这个时候就需要将get方法也加上synchronized同步，并且，只返回这个private对象的clone()――这样，调用端得到的就是对象副本的引用了。
          <br/>
          <span style="color:red;">
            <a href="http://leo-faith.javaeye.com/blog/177779#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 30 Mar 2008 14:49:26 +0800</pubDate>
        <link>http://leo-faith.javaeye.com/blog/177779</link>
        <guid>http://leo-faith.javaeye.com/blog/177779</guid>
      </item>
      <item>
        <title>十分钟让你看懂中国经济形势(如何应对高房价)</title>
        <author>leo_faith</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://leo-faith.javaeye.com">leo_faith</a>&nbsp;
          链接：<a href="http://leo-faith.javaeye.com/blog/174089" style="color:red;">http://leo-faith.javaeye.com/blog/174089</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文以最浅显的道理阐述经济的真相。不会有任何所谓的学术妓女们常用来欺骗人民的深奥的学术理论，还事实以清白，真相只有一个，让我们擦亮眼睛，洞观今天发生的一切。本文在以下几方面阐述中国经济的真相。 <br />　　　　<br />　　1、 什么是经济发展？ <br />　　简单的讲经济发展就是有钱，但钱从何来？钱只能印出来。那么到底是什么使印钞机不停的运转？<br /><br />　  假设一个岛上有1000口人，与世隔绝，人与人之间交换物品过活，但有时候你手里用来交换的东西不一定就是对方想要的，怎么办？于是人们就用都喜欢的金银作为交换的东西，于是交换方便了。但金银要磨损，携带也不方便，当交换活动频繁时，发现这个东西太繁琐，限制了交换活动，于是为了解决这个问题，想了一个办法，就是由岛上的管理者发行一种符号，用它来代替金银，于是钞票出现了。 <br /><br />　  刚开始这种钞票可以随时得兑换金银。大家都很放心，因为钞票就是金银。可是岛上金银的产量太小，当人们的交换活动更加频繁时，钞票不够用了，只能暂停交换。暂停交换的后果就是大家不生产别人想要的东西了，因为虽然别人用，但交换不出去，套用现在的话说就是经济发展减速了。 <br /><br />    于是大家想了一个办法，成立一家钱庄，这个钱庄是大家的，由钱庄来发行钞票，印出的钞票借给想用钱的人，然后这个人有钱了再还给钱庄。于是银行就出现了。 <br />　　　　<br />　  银行的出现，能保证交换活动更持续的进行，大家都拼命的生产，岛上的东西越来越多，银行根据产品的生产数量，不停的印制钞票，以保证交换能更深入的进行。 <br />　　　　　　<br />　　后来人们的交换活动更频繁了，一家钱庄太少了，于是出现了很多钱庄，总要有个管钱庄的吧，于是指定一家钱庄管理其他钱庄，并且钞票只能由这家钱庄印刷，然后通过其他钱庄借给用钱的人，中央银行就这么也出现了。 <br />　　<br />　　2、什么是对外贸易？ <br />　　　　　　<br />　　有一天岛上的人发明了船，于是就到处划船跑，发现了另一个岛屿，那上面也有人，也有钞票，也像自己岛上这么活动。但自己岛上生产的东西多，那个岛上生产的东西少，1元钱在自己的岛上能买1斤大米，那个岛上的一元钱只能买半斤大米，于是另外岛上的钱来这个岛上买东西时只能2元换1元才行。于是汇率出现了。算好汇率后，他们开始互相买卖东西到对方岛上，这就是对外贸易。对外贸易丰富了人们的生活生产需要，使交换活动到了一个空前的高潮。 <br />　　　　　　<br />　　3、什么是通货膨胀？ 　　<br />　　　　<br />　　由于岛上生产的产品太多了，以至于没法准确估计到底该发行多少钞票，发行多了的时候，因为没有那么多产品可买，产品就开始涨价，发行少了呢就开始降价，为了保证价格稳定，央行要求各钱庄要把一部分钱放在央行里面用来调节产品的价格，根据价格情况多放和少放。这就是存款准备金率。 <br />　　　　　　<br />　　可是有一部分聪明人开始怎么才能把钱弄到自己手上，他在海边捡了一颗石子，说这个石子值100万快钱，把它卖给了一个人，这个人觉得整个岛上的钱加一起也没有100万啊，怎么办，于是向钱庄借，钱庄也没有这么多钱，于是把印钞机打开，印了这100万，借给了他买了这个石子。 　　<br />　　　　<br />　　然后这个人开始卖这个石子，100万卖给了第二个人，由于第一个卖石子的人把钱花了，所以岛上的钱多了，所以这一百万可以筹集到，多买些产品就有了。但当把这个石子以200万转让的时候，钱庄只能又印了100万钞票，就这样钞票越印越多，可是当这个石子不停的流动转让时，大家并不觉得岛上的钱多，产品价格还是原来的那样。可是当这个石子不流通或流通的慢时，大家觉得钱多了，可是如果当持有石子的人把它扔到大海里，那就等于岛上凭空多出N多个100 　　<br />　　　　<br />　　万来，怎么办，央行最害怕的就是这颗石子没了。它没了岛上产品的价格就会飞涨，就会通货膨胀。那么持有石子的人就绑架了岛上的经济。 <br />　　　　　　<br />　　4、房价能绑架中国经济吗？ <br />　　　　　　<br />　　中国的房地产已经使中国央行发行了太多的人民币，如果房价下降，等于把那颗石子投进了海里，那么多印出来的钱会使中国产品价格飞涨，会发生严重的通货膨胀。 <br />　　　　　　<br />　　看似房价与石子毫无相干，可是他们的属性是一样的，就是价格和价值严重的背离。实际上房地产的崩盘受害最大的并不是中国的商业银行，而是整个中国经济体系。为什么政府迟迟没有把房价降下来，不是降不下来，如果真想降房价，只需要一道政令，房地产价格会在一夜之间土崩瓦解。可是后果谁能承担，严重通货膨胀谁来负责？ <br />　　　　　　<br />　　房地产业已经绑架了中国的经济，是无可置疑的，是客观实在的，没有人能改变。 <br />　　　　　　<br />　　不管谁是总理，廉洁也好，贪污也好，都希望社会和谐，可这是一个棘手的问题。 　　<br />　　　　<br />　　5、房价和通货膨胀有关系吗？ 　　<br />　　　　<br />　　可更棘手的问题还不仅仅在这里。如果降房价，面对的是马上的通货膨胀，可不降房价，那么面对的就是更严重的通货膨胀，何去何从？ <br />　　　　　　<br />　　所以最可靠的办法就是稳定房价，然后在社会产品增加时，减少货币的投放量，加上其他政策如加息、增加商业银行准备金率、缩小信贷规模等辅助手段，来使中国经济软着陆，这是最好的办法，我们看到的一切政令也是这个逻辑。不信的话，可以查阅一下近年来政府发布的一系列调控房地产业的措施。 　　<br />　　　　<br />　　可是为什么房价不稳定而且更加的疯长呢？难道是开发商与政府在博弈吗？告诉你在中国没有人能和党叫板，几个肚子大点的开发商是没有这个实力的。实际上是幕后的另一只黑手在和中国政府博弈，这支黑手就是外资，以美国为代表的帝国主义攫取中国人民血汗的黑手。 <br />　　　　　　<br />　　6、房价高涨的原动力是什么？ 　　　　<br />　　<br />　　使房价上涨的动力很多，房价上涨对其有利的人就是动力之一，比如：为了GDP和个人利益的地方政府、为了赚钱的开发商、炒房族、以至于买了房的所谓“房奴”都是是房价上涨的动力，可是最大的原动力不是这些，是外资，是美国的以攫取超额利润的各大财团。 <br />　　　　　　<br />　　开发商作为商人，为了赚取高额利润不是什么伤天害理的事情，可是各行各业都有商人，难道想赚就有吗？那除非是神话。房地产业的开发商也一样，不是他们想赚多少就有多少的。根据价值规律，当商品的价格和价值严重背离时，会有一种趋向正常价格回归的力量钳制价格的上涨，可是在中国的房地产业，这种规律似乎不起作用，一个重要的原因是忽视了一个参考范围的原因，如果以中国经济本身而言确实打破了这个规律，可是目前的情况是有一股力量在维持着房地产业的价格，即托市，那么谁在托市呢？ <br />　　　　　　<br />　　谁能在房地产业失控能得到巨额利润的人就是托市的人。 <br />　　　　　　<br />　　讨论这个问题前，现看一下中国的外汇储备情况。中国的外汇储备在近几年迅速由1、2千亿突破万亿，并且还在迅速的增长，难道是中国人民奋发图强，挣来的吗？这个不需要证明，看中国的GDP增幅就知道，外汇储备的增长速度明显大于GDP的增幅。显然不是挣来的，那么除了挣来的一部分，那么就是所谓的 <br />　　　　　　<br />　　“国际热钱”的涌入，而国际热钱的涌入的目的只有一个，就是要取得高额的回报。 <br />　　　　　　<br />　　国际热钱进入中国市场后，首先要兑换成人民币，那么一下子哪有这么多人民币呢？只有一个办法就是让印钞机没日没夜的工作，然后这笔钱用来托住已是烫手山芋的房地产市场，就是拼命的投资房地产业，当房地产价格因背离价值而向下波动时，通过托市再把它抬高，反复如此，给人的表象就是房产价格决没有偏离价值。导致房价越涨越高。 <br />　　　　　　<br />　　而开发商呢，他们一到房子将要卖不出去的时候，就有人出高价买下来，他们怎么会降价，如果没有这部分资金在运作，别说是开发商联盟，就是全国只有一个开发商，价格也会降下来，没有人买了，难道等房子发霉吗？ <br />　　　　　　<br />　　那么外资持有这么多高价房产做什么？不怕砸到手里吗？ <br />　　　　　　<br />　　不怕！为什么呢？在这个资本运作的过程中，有一个冤大头在最底下接着呢，是谁呢？就是中国的商业银行，由于火爆的房地产市场，一流的流通性，近年来没有看到任何萎缩的迹象，放了贷款就盈利，为什么不贷款呢？没有理由不放贷款。 <br />　　　　　　<br />　　加之中国老百姓买房的心情，外资可以轻易的把高价房转嫁到中国的银行和消费者身上，连炒房的农民都能赚到一杯羹，职业的外资会赔钱吗？ <br />　　　　　　<br />　　那么房价一直涨下去，会怎样呢？请看下一节：“7、房价一直涨下去，开发商会笑还是会哭？什么情况下会笑？什么情况下会哭？” <br />　　　　　　<br />　　7、房价一直涨下去，开发商会笑还是会哭？什么情况下会笑？什么情况下会哭？ <br />　　　　　　<br />　　在中国政府近几年来密集的几十道金牌的调控下，房价还是如脱了缰的野马一样狂奔不止。暂且不论何时能停止上涨的势头，毕竟房价在目前还是上涨的，所以我们就看看房价上涨不止会带来什么。 <br />　　　　　　<br />　　首先：由于GDP上涨，中国政府为了维持上文说的“保持产品交换的继续”要不断地投放人民币，即开动印钞机。只要房地产这个石子还没有投入到大海里去，还有一定的流通性，那么就不会有通货膨胀的发生。 <br />　　　　　　<br />　　其次：开发商会在这个过程中也赚取巨大的利润。 <br />　　　　　　<br />　　再次：能看到的是，炒房族会赚钱、所谓的买房的“房奴”会增值。 <br />　　　　　　<br />　　都赚钱！可是在这个过程中到底谁亏了呢？钱从哪里来呢？如果你是有炒股的经验就会知道，如果投资价格和价值背离的商品，你赚的钱就是别人赔的钱，那么套用到房地产上，就是买房自住的人，现在看似增值，那是镜中月、水中花，你不变现就不是你的。再有就是当价格完全回归真实价值的时候，有时甚至会到真实价值一下，被高价房套住的投资者。还有一个就是开发商！ 　　　　<br />　　<br />　　为什么说开发商也有赔钱呢？大家知道商人的本性是赚钱，赚取利润。如果一个商人投机一次就永远都不做这个生意了，他是赚钱了，可他不是商人，这种商业行为没有意义。由于商人的本性，所以赚来的钱会继续扩大再生产，在能赚钱的领域不断的加大投资。这个道理从生活中就可看出来，越是做大生意的人总喊没钱，因为要更大的流动资金来维持其扩大再生产的需要。 <br />　　　　　　<br />　　所以一旦房价回归真实的价值之时，就是有一大批开发商崩溃之日。这个是不以任何人的意志和任何行为为转移的。如果现在有开发商逃离房地产业的角斗场，那么跑得慢的就是最后的输家。如果都不跑，就像击鼓传花一样，最后拿到接力棒的就是接盘者。有句话叫：“出来混迟早是要还的”。也许只不过是方式不一样，看谁的运气好而已。 　　<br />　　　　<br />　　可是现在却没有任何的开发商赔钱的迹象，有的是开发商不断的赚钱，老百姓送钱都来不及。只是因为目前房价还在上涨，房产还在不断的流动。 <br />　　　　　　<br />　　一个巨大的问题来了，这样不断上涨的房价何时是个头啊，请看下一节：“8、坐在华尔街办公室的财团们是如何吸干中国山区一个农民的血汗的” <br />　　　　　　<br />　　8、坐在华尔街办公室的财团们是如何吸干中国山区一个农民的血汗的 　　<br />　　　　<br />　　毛主席说过：“帝国主义没有睡大觉,而是天天在蠢蠢欲动,在图谋不轨,想达到他们的罪恶目的。诚然他们的气焰的确没有以前那么嚣张,但他们确实在活动着。”是不是冷战结束就代表着人类的和平得以实现呢？“一句上帝面前人人平等”就能掩盖帝国主义噬血的本质吗？人人平等的理念是对的，但它只不过是帝国主义用来欺骗人们的伎俩罢了，说到和做到永远是两码事。 <br />　　　　　　<br />　　国际财团通过国际热钱涌入中国，使人民币加大发行量，然后通过房地产炒作，把中国的国内价格水平无限制的提高，GDP的增长又一次使人民币的发行量被迫提高。国际财团心黑手狠，双管齐下，目的就是使中国经济热到烫手，热到让每个中国人为之疯狂。 <br />　　　　　　<br />　　我们暂不去关心这个过程，我们放眼未来，看看这一过程的结果是什么样呢？换句话说财团的目的是什么呢？ <br />　　　　　　<br />　　很明显，中国人最不愿意看到的事情，就是财团们最乐见的结果。先做个假设，比如国际热钱在投资的中国房地产领域里上演最后的疯狂后，然后把房产成功解套全部变现，如果此时人民币兑美元的汇率达到美国预期最高时，汇率是热钱逃离时需要相乘的那个倍数，会发生什么谁都能想到，所有热钱会一夜之间全部兑换美元逃离。财团们会赚得沟满壕平，中国市场上除了钱就是钱，能遮住天的大把人民币将成为中国人民的噩梦。 <br />　　　　　　<br />　　这是中国人最不愿意看到的事情，也是财团最乐见的结果。近期美国不断的通过政治、贸易等手段逼迫人民币升值，而中国政府迟迟不升值或小范围的升值，远远没有达到美国政府的预期，这是在出口处的中美之间的博弈。美国逼迫人民币升值的狼子野心昭然若揭！ <br />　　　　　　<br />　　顺便提一句，如果真的这个升值预期达到了，中国楼市将重演日本上世纪90年代崩盘的历史。只是那时中国经济也会像日本一样进入一个连续低迷不振的不归路。 <br />　　　　　　<br />　　在这种攸关民族生存的问题上，政府会坐视不管吗？就算是退一步来讲，一个完全不负责任的政府遇到这种情况，因为这个资本运作同时也极大侵犯了政府的利益，也会拼命反搏的。 <br />　　　　　　<br />　　那么中国政府会以什么样的方式来化解这一“经济危机”呢？请看下一节：“在有关这场围绕房价和通货膨胀之间的各方博弈中可能选择的中庸路线”。 <br />　　　　　　<br />　　9、在有关这场围绕房价和通货膨胀之间的各方博弈中可能选择的中庸路线 　　<br />　　　　<br />　　我一直相信：物极必反，中庸，是老祖宗留给后人解决棘手问题的杀手锏！ <br />　　　　　　<br />　　既然是中国房地产“绑架”了中国的经济，那么我们就从“绑架”说起。何为“绑架”，应该是相对弱的一方，拿着相对强的一方的“要害”，使相对强的一方即便有能力对付弱的一方，但碍于投鼠忌器，无力可施。 <br />　　　　　　<br />　　我们先来看看绑架双方的阵容和各自手上的筹码。房地产业的主体是开发商，所以开发商算一方，它绑架的要害是中国经济，那中国经济是谁的要害呢？是中国人民的要害，代表中国人民的，目前只能是中国政府。中国政府算一方。外资呢？它是煽风点火者，划到开发商一方。中国政府一方有公权力，可以通过税收、财政、经济政策、行政手段对开发商阵营施力，开发商阵营通过源源不断的后备资金来绑架中国经济，且不断的提高赎金。 <br />　　　　　　<br />　　问题已经摆在这里，怎么办呢？冲上去一枪击毙，那歹徒非撕票不可，太极端不可行。所以有为政府开出药方，只要实现了某某一条既可降低房价的主意，就犹如这一枪击毙一样是不可行的。我们想象如何解救绑架事件的，首先要稳定住对方的情绪，再一步步地靠近，但这种靠近虽会引起歹徒的敌意，但不会导致他撕票，然后再进一步稳定情绪，再靠近，然后条件成熟时，再稳准狠，即保证人质的安全，又要保证歹徒一举拿下。这才是真正的营救。 <br />　　　　　　<br />　　所以中庸才是解决棘手问题的杀手锏。极端、盲目、冒进是要不得的。 <br />　　　　　　<br />　　针对如何解决中国房地产市场的绑架问题，就要围绕问题的关键部分一步步地施加反作用力，然后一举成功，才是正道。 　　　　<br />　　<br />　　第一个关键的部分就是汇率，中国政府会严把汇率关，我们可以预期的是，人民币兑美元的汇率决不会过快升值，但会小幅升值，就是要稳定对方的情绪，如果一点不升，对方会狗急跳墙，如果升的过快，是给自己掘墓，所以为什么中国汇率升幅总是犹抱琵琶半遮面，看看美国政府的态度跟一个绑匪是多么的贴切，我要一瓶果汁，为什么拿来半瓶水。可又说不出什么来，毕竟还能暂时解渴。 <br />　　　　　　<br />　　第二个关键是限制资产流动性，既然房地产能绑架中国经济，说明它举足轻重，限制房产的流通性，就可以限制资产的流动性，注意这里是两个概念，“资产流动性”和“房产流通性”。两者完全不同，但又息息相关。房产流通性减弱，资产流动性减弱，那么需要印刷的人民币就减少。就像那个石子，不流通马上通胀，不涨价流通没问题，可是行不通，外资也不同意。既然是不断的上涨价格，只能一步步地限制房产流通，只要房产流通性少一点，通胀就会显现一点，然后再通过上调准备金率和加息等柔性政策来调整一点，用柳叶棉丝掌来化解泰森的一记重拳，以绵柔克强刚、化千钧于无形，这就是中国政府的策略（这好像是中国人最擅长的事情）。我们从官方媒体就能看到相关的消息，楼市签约率在下降，即流通性在下降，然后物价开始有所涨幅，如猪肉等副食产品，但央行马上上调准备金率和加息，来稳定物价。不知各位看官是否也看出些端倪。可预期的是，到完全化解危机之前，会不断地加息和调高准备金率，同时房产流通性会越来越弱，这个预言是否准确可在以后的央行政策上验证。等完全消除了由于经济过热导致的通货膨胀预期，那么就是房地产价格回归真实价值之时。 <br />　　　　　　<br />　　不管你看到没看到，这已是最后的疯狂，我们从两方面来分析： <br />　　　　　　<br />　　第一，如果这场博弈以外资胜利而告终，那么中国经济将步日本90年代持续下滑的深渊，由于外资撤走，房市赖以生存的支柱坍塌，房价会一落千丈，可到时候不管是开发商还是老百姓都将承受经济下滑之苦，持有的货币迅速贬值，即便房价落下，也不一定买的起。这是中国政府和中国人民不可接受的，也是无法接受的。 <br />　　　　　　<br />　　第二，如果外资以失败而告终，即在汇率上把住出口，让房价回归真实价值，把外资同样套在中国，这才是胜利的前提。那么以美国财团为首的帝国主义噬血者必将疯狂报复，会在投资、出口等各方面对中国施加压力。我们今天人民币升值没有达到美国预期，已经导致中国出口到美国的产品受打压，进而引起了众多的贸易摩擦，由此可见一斑。我们知道，经济发展的三套马车是，投资、出口和消费，在投资、出口领域遭到报复会影响中国经济的发展，但我相信不会影响我们的发展速度，别忘了还有一套马车是“消费”，房价下降后，如果你是爱国者，请现在保护好你的钱包，到时千万别羞羞答答，要果断地出手买房，中国经济会在消费领域异军突起，继续独占世界经济引擎的鳌头。 　　　　<br />　　<br />　　所以我们要相信我们的政府，配合我们的政府，政府在事关全局的问题上是和老百姓站在一起的，政府是水上承载的舟，人民是水，没有水，何以载舟。
          <br/>
          <span style="color:red;">
            <a href="http://leo-faith.javaeye.com/blog/174089#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 13:34:23 +0800</pubDate>
        <link>http://leo-faith.javaeye.com/blog/174089</link>
        <guid>http://leo-faith.javaeye.com/blog/174089</guid>
      </item>
      <item>
        <title>java基础</title>
        <author>leo_faith</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://leo-faith.javaeye.com">leo_faith</a>&nbsp;
          链接：<a href="http://leo-faith.javaeye.com/blog/162529" style="color:red;">http://leo-faith.javaeye.com/blog/162529</a>&nbsp;
          发表时间: 2008年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、最常见的，抽象类和接口的区别<br />我们可以这么说，其实抽象类是特例的接口，但是它又成为了类，所以有了些类的特性，少了点接口的特性，接口是能实现多个的，而只能继承一个父类！接口只是一个行为的规范或规定，它仅仅承诺了能调用的方法，接口可以用于支持回调，而继承不具有这样的特性！<br />如果预计要创建组件的多个版本，则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类，所有继承类都随更改自动更新。另一方面，接口一旦创建就不能更改。如果需要接口的新版本，必须创建一个全新的接口。<br />如果创建的功能将在大范围的全异对象间使用，则使用接口。抽象类应主要用于关系密切的对象，而接口最适合为不相关的类提供通用功能。 <br />如果要设计小而简练的功能块，则使用接口。<br />如果要设计大的功能单元，则使用抽象类。 <br />如果要在组件的所有实现间提供通用的已实现功能，则使用抽象类。抽象类允许部分实现类，而接口不包含任何成员的实现。<br />二、集合类 List/Set/Map...的区别和联系<br />这个也是很容易混淆的，这也是提高程序运行效率的关键所在。<br /><br />1、Array ， Arrays<br />Java所有“存储及随机访问一连串对象”的做法，array是最有效率的一种。<br />1)、效率高，但容量固定且无法动态改变。<br />array还有一个缺点是，无法判断其中实际存有多少元素，length只是告诉我们array的容量。<br />2)、Java中有一个Arrays类，专门用来操作array。<br />    arrays中拥有一组static函数，equals()：比较两个array是否相等。array拥有相同元素个数，且所有对应元素两两相等。<br />    fill()：将值填入array中。<br />    sort()：用来对array进行排序。<br />    binarySearch()：在排好序的array中寻找元素。<br />    System.arraycopy()：array的复制。<br /><br />2、Collection ， Map<br />若撰写程序时不知道究竟需要多少对象，需要在空间不足时自动扩增容量，则需要使用容器类库，array不适用。<br />1)、Collection 和 Map 的区别<br />容器内每个为之所存储的元素个数不同。<br />Collection类型者，每个位置只有一个元素。<br />Map类型者，持有 key-value pair，像个小型数据库。<br />2)、各自旗下的子类关系<br />Collection<br />    --List： 将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。<br />          --ArrayList / LinkedList / Vector<br />    --Set ： 不能含有重复的元素<br />          --HashSet / TreeSet<br />Map<br />    --HashMap<br />    --HashTable<br />    --TreeMap<br />3)、其他特征<br />*  List，Set，Map将持有对象一律视为Object型别。<br />*  Collection、List、Set、Map都是接口，不能实例化。<br />   继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class，这些才可被实例化。<br />*  vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。<br />*  同步性:Vector是线程安全的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的 <br />*  数据增长:当需要增长时,Vector默认增长为原来一倍，而ArrayList却是原来的一半<br /><br />3、Collections<br />Collections是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。<br />相当于对Array进行类似操作的类——Arrays。<br />如，Collections.max(Collection coll); 取coll中最大的元素。<br />    Collections.sort(List list); 对list中元素排序<br /><br />4、如何选择？<br />1)、容器类和Array的区别、择取<br />   *  容器类仅能持有对象引用（指向对象的指针），而不是将对象信息copy一份至数列某位置。<br />   *  一旦将对象置入容器内，便损失了该对象的型别信息。<br />2)、<br />  *  在各种Lists中，最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时，使用LinkedList()；<br />     Vector总是比ArrayList慢，所以要尽量避免使用。<br />  *  在各种Sets中，HashSet通常优于HashTree（插入、查找）。只有当需要产生一个经过排序的序列，才用TreeSet。<br />     HashTree存在的唯一理由：能够维护其内元素的排序状态。 <br />  *  在各种Maps中<br />     HashMap用于快速查找。<br />  *  当元素个数固定，用Array，因为Array效率是最高的。<br /><br />结论：最常用的是ArrayList，HashSet，HashMap，Array。<br /><br />5、注意：<br />1)、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。<br />2)、Set和Collection拥有一模一样的接口。<br />3)、List，可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个，get(0)...。(add/get)<br />4)、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。<br />5)、Map用 put(k,v) / get(k)，还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。<br />   HashMap会利用对象的hashCode来快速找到key。<br />   *hashing<br />    哈希码就是将对象的信息经过一些转变形成一个独一无二的int值，这个值存储在一个array中。我们都知道所有存储结构中，array查找速度是最快的。所以，可以加速查找。<br />发生碰撞时，让array指向多个values。即，数组每个位置上又生成一个梿表。<br />6)、Map中元素，可以将key序列、value序列单独抽取出来。<br />使用keySet()抽取key序列，将map中的所有keys生成一个Set。<br />使用values()抽取value序列，将map中的所有values生成一个Collection。<br />为什么一个生成Set，一个生成Collection？那是因为，key总是独一无二的，value允许重复。<br /><br />6.Hashtable和HashMap的区别：<br />1)Hashtable是Dictionary的子类，HashMap是Map接口的一个实现类；<br />2)Hashtable中的方法是同步的，而HashMap中的方法在缺省情况下是非同步的。即是说，在多线程应用程序中，不用专门的操作就安全地可以使用Hashtable了；而对于HashMap，则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决：<br />Map Collections.synchronizedMap(Map m)<br />这个方法返回一个同步的Map，这个Map封装了底层的HashMap的所有方法，使得底层的HashMap即使是在多线程的环境中也是安全的。<br />3)在HashMap中，null可以作为键，这样的键只有一个；可以有一个或多个键所对应的值为null。当get()方法返回null值时，即可以表示HashMap中没有该键，也可以表示该键所对应的值为null。因此，在HashMap中不能由get()方法来判断HashMap中是否存在某个键，而应该用containsKey()方法来判断。<br />4)HashTable使用Enumeration，HashMap使用Iterator。<br /><br />以上只是表面的不同，它们的实现也有很大的不同。<br /><br />5)HashTable中hash数组默认大小是11，增加的方式是 old*2+1。HashMap中hash数组的默认大小是16，而且一定是2的指数。<br />6)哈希值的使用不同，HashTable直接使用对象的hashCode，代码是这样的：<br />int hash = key.hashCode();<br />int index = (hash & 0x7FFFFFFF) % tab.length;<br />而HashMap重新计算hash值，而且用与代替求模：<br />int hash = hash(k);<br />int i = indexFor(hash, table.length);<br />static int hash(Object x) {<br />　　int h = x.hashCode();<br />　　h += ~(h &lt;&lt; 9);<br />　　h ^= (h >>> 14);<br />　　h += (h &lt;&lt; 4);<br />　　h ^= (h >>> 10);<br />　　return h;<br />}<br />static int indexFor(int h, int length) {<br />　　return h & (length-1);<br />}
          <br/>
          <span style="color:red;">
            <a href="http://leo-faith.javaeye.com/blog/162529#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Feb 2008 17:13:15 +0800</pubDate>
        <link>http://leo-faith.javaeye.com/blog/162529</link>
        <guid>http://leo-faith.javaeye.com/blog/162529</guid>
      </item>
      <item>
        <title>Ant应用---实现jbuider中工程的自动发布</title>
        <author>leo_faith</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://leo-faith.javaeye.com">leo_faith</a>&nbsp;
          链接：<a href="http://leo-faith.javaeye.com/blog/94723" style="color:red;">http://leo-faith.javaeye.com/blog/94723</a>&nbsp;
          发表时间: 2007年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;gb2312&quot;</span><span>&nbsp;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">project</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;WebProject&quot;</span><span>&nbsp;</span><span class="attribute">default</span><span>=</span><span class="attribute-value">&quot;dist&quot;</span><span>&nbsp;</span><span class="attribute">basedir</span><span>=</span><span class="attribute-value">&quot;.&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comments"><!-- Set global properties for this build --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;src.beans&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./src/bean&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!--源文件存放目录 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;src.pages&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./src/web&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!--源WEB应用存放目录包括页面目录和WEB-INF目录 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;src.confs&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./src/conf&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!--源配置文件存放目录 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;depend.libs&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./depend/lib&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="comments"><!--依赖库文件存放目录 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;depend.classes&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./depend/classes&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="comments"><!--依赖类文件存放目录 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;build&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./build&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;</span><span class="comments"><!--编译后的类文件存放目录 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dist&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./dist&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span><span class="comments"><!--编译后发布文件存放目录 包括可用的WEB应用 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dist.lib&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./dist/lib&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span><span class="comments"><!--编译的类打包文件存放目录 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dist.zyglapp&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;./dist/zyglapp&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span><span class="comments"><!--未用 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;appname&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;zyglapp&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span><span class="comments"><!--编译后应用名称 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comments"><!--  Set the ClassPath for compile --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">path</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;project.classpath&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">pathelement</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;.&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">pathelement</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;${depend.classes}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">fileset</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${depend.libs}&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;*.jar&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">fileset</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">path</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comments"><!-- Make the directory of compile needs --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;init&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mkdir</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${build}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mkdir</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${dist.lib}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comments"><!-- Complie the source code --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;compile&quot;</span><span>&nbsp;</span><span class="attribute">depends</span><span>=</span><span class="attribute-value">&quot;init&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">javac</span><span>&nbsp;</span><span class="attribute">srcdir</span><span>=</span><span class="attribute-value">&quot;${src.beans}&quot;</span><span>&nbsp;</span><span class="attribute">destdir</span><span>=</span><span class="attribute-value">&quot;${build}&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">classpath</span><span>&nbsp;</span><span class="attribute">refid</span><span>=</span><span class="attribute-value">&quot;project.classpath&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">javac</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comments"><!-- Package the Web files to a Directory --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dist&quot;</span><span>&nbsp;</span><span class="attribute">depends</span><span>=</span><span class="attribute-value">&quot;compile&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mkdir</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${src.pages}/WEB-INF/lib&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">copy</span><span>&nbsp;</span><span class="attribute">todir</span><span>=</span><span class="attribute-value">&quot;${src.pages}/WEB-INF/lib&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">fileset</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${depend.libs}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">copy</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">copy</span><span>&nbsp;</span><span class="attribute">todir</span><span>=</span><span class="attribute-value">&quot;${src.pages}/WEB-INF/classes&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">fileset</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${build}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">fileset</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${depend.classes}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">copy</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">copy</span><span>&nbsp;</span><span class="attribute">todir</span><span>=</span><span class="attribute-value">&quot;${dist}/${appname}&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">fileset</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${src.pages}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">copy</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">copy</span><span>&nbsp;</span><span class="attribute">todir</span><span>=</span><span class="attribute-value">&quot;${dist}/${appname}/conf&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">fileset</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${src.confs}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">copy</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mkdir</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${dist}/${appname}/log&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">delete</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${src.pages}/WEB-INF/lib&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">delete</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${src.pages}/WEB-INF/classes&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">delete</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${dist.lib}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;clean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">delete</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${build}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">delete</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${dist}&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag"><span class="tag-name">project</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://leo-faith.javaeye.com/blog/94723#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Jun 2007 15:37:00 +0800</pubDate>
        <link>http://leo-faith.javaeye.com/blog/94723</link>
        <guid>http://leo-faith.javaeye.com/blog/94723</guid>
      </item>
  </channel>
</rss>