<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>zgd</title>
    <description></description>
    <link>http://zgd.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>一份未使用的rails ppt</title>
        <author>zgd</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zgd.javaeye.com">zgd</a>&nbsp;
          链接：<a href="http://zgd.javaeye.com/blog/212013" style="color:red;">http://zgd.javaeye.com/blog/212013</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ppt是去年11月准备的,并未完全完成
          <br/>
          <span style="color:red;">
            <a href="http://zgd.javaeye.com/blog/212013#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Sun, 06 Jul 2008 11:55:54 +0800</pubDate>
        <link>http://zgd.javaeye.com/blog/212013</link>
        <guid>http://zgd.javaeye.com/blog/212013</guid>
      </item>
      <item>
        <title>mercurial&amp;git的远程模式</title>
        <author>zgd</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zgd.javaeye.com">zgd</a>&nbsp;
          链接：<a href="http://zgd.javaeye.com/blog/208603" style="color:red;">http://zgd.javaeye.com/blog/208603</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          mercurail和git是一个很自由的版本管理软件,我们随时可以在自己的机器上任意一个目录启用版本管理,不需要任何服务器.但是,当我们需要跟别人协作的时候,应该怎么处理呢.我们可以N个人之间互相乱pull来push去,但是这样的网状结构并不方便管理,非常容易混乱,一般来说,我们会指定一个中央源,大家都把代码push到中央源.我认为它们的远程模式有如下几种:<br /><br />1.U盘 <br />最常见的情况就是我在家和公司都要使用同一份源代码,于是我就会把中央源定在U盘上,而家里和公司的电脑各有一份本地副本,代码提交到本地,然后push 到U盘上.例如我会在U盘上建立一个sparkle_repo的目录,放少量代码和一些文档用git管理.也有不少人是这样用SVN的,不过经常会遇到盘符变化的问题. <br />优点是完全不需要网络,缺点也很明显,如果要跟朋友协作的话将会相当麻烦<br /><br />2.网上邻居共享文件夹 <br />很简单,在本地网络随便找一台机器共享一个完全读写的文件夹,然后把中央源放在上面,适合公司内部的简单使用. <br />优点是简单,缺点是,别人都能完全读写文件夹,干什么事情都可以了,包括删除整个目录.你当然可以进行权限认证,但是认证通过之后,一样可以做任何事情<br /><br />3.ssh <br />功能丰富的ssh对于传送文件当然不在话下(我工作的时候都是用ssh而不是ftp传送文件),最适合有个人ssh主机的情况,例如拥有一个 dreamhost的空间,你只要在ssh帐户下随便开一个目录就能作为中央源,但是如果你要跟朋友协作的话,你还是得告诉他你的ssh帐号,又或者你对机器有足够的控制权可以让两个ssh帐号访问到同一个目录.另外,ssh比网络邻居要好的地方是你可以控制能够通过ssh的指令,这样可以只允许 mercurial/git的指令通过,防止有意或无意的删除目录<br /> 以上三种模式其实原理是一样的,就是通过一个大家都可以读写的目录进行协作<br /><br />4.私有协议<br /> mercurial&git都可以启动一个daemon server进行使用,mercurial启动的port是8000,其实是使用http协议的,而经常见到的git://xxxxx就是git的私有协议.由于要启动额外的daemon,你必须对机器有一定的控制权才行,例如你不能在dreamhost这样使用.<br /><br />5.http模式 <br />git只能通过http进行查看和pull,不能进行push操作,有点像viewcvs那样.这点来说,mercurial就比较厉害了,官方包里面提供了一个hgweb.cgi文件,通过配置这个cgi文件,我们可以在一个apache环境中提供push功能,也就是说我们可以在dreamhost上这样使用mercurial,非常棒(下一篇文章我将介绍怎么在dreamhost使用mercurial)<br /><br />6.Don’t push to me, I will pull from you <br />是不是有点像IOC(Don’t call me, I will call you).我阅读到相关资料的时候,看见这样一种模式,简直有如脑袋哐当一声.我们太以中央式版本管理的思路来想分布式版本管理了,认为一定要有一个中央源,然后大家都push数据到中央,而且还要认证什么的.git提出的这种模式,就是没有中央源,但是有中央人,并不是大家push到中央,而是中央从大家那里pull,其他人只要用某种形式,例如共享文件夹,或者http等方法公开你的副本,然后发email什么的通知中央人到你的副本中pull.<br />例如我sparkle负责整个项目,然后我只从各个模块的主管的源那里pull数据,而各个模块的主管从他的手下coder pull数据(事实上使用git的大型项目都是分成多个级别的),我熟悉模块主管,所以我知道他们是可信的,至于他们的数据从哪里来的我不关心,而他们也对他们的手下coder信任,从他们那里pull数据,如此一级一级下去.这种处理模式,一来不需要认证的部分,二来中央的数据是可控的,就是我负责,而不是多个人push的模式那样,并不一定能确定是否正确,第三点,可以分级.<br /><br /><a href="http://weavesky.com/2008/06/23/mercurial-git-remote/" target="_blank">http://weavesky.com/2008/06/23/mercurial-git-remote/</a>
          <br/>
          <span style="color:red;">
            <a href="http://zgd.javaeye.com/blog/208603#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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jun 2008 12:39:05 +0800</pubDate>
        <link>http://zgd.javaeye.com/blog/208603</link>
        <guid>http://zgd.javaeye.com/blog/208603</guid>
      </item>
      <item>
        <title>[原创]Ibatis with MapBean</title>
        <author>zgd</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zgd.javaeye.com">zgd</a>&nbsp;
          链接：<a href="http://zgd.javaeye.com/blog/160162" style="color:red;">http://zgd.javaeye.com/blog/160162</a>&nbsp;
          发表时间: 2008年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用了两年的Hibernate之后，对ORM深有感触。一方面，ORM可以令到我们从OO角度来思考数据，屏蔽了数据库的差异（其实 Hibernate被吹的最厉害就是那个分页，其实分页没什么技术含量，而且ROR都把分页从核心抽离了）。另一方面，性能问题，例如必须select才能update，必须select全部，必须update全部，cache带来的后遗症，javabean关联问题（一对多，多对一，多对多等）， lazyload问题<br /><br />Hibernate一直说，他生成的sql比一般程序员的要好，可以减少很多问题。但是，我倒是认为用Hibernate反而因为对程序员的要求更高导致更多问题。而且我现在认为，SQL才是王道，至少目前是。<br /><br />于是在新项目中启用Ibatis，这一年来的使用感觉很不错，全程使用细粒度的SQL语句，虽然多写了很多SQL语句，但是感觉到项目在自己的控制中<br /><br />我只用了Ibatis 40%不到的功能，可能大家会觉得不可思议。我没有用cache，没有用关联，没有用resultMap，甚至，连JavaBean也没有用<br /><br />在大家都在讨论PO，VO，DTO的时候，我的系统里面一个JavaBean都没有<br /><br />首先我问问，JavaBean是用来做什么的，存储数据，每一个PO，其实就约等于一个表里面的一行数据<br /><br />我举一个真实一点的例子，一个user表<br /><pre name="code" class="java">
public class User {
  private int id;
  private String name;
 
  // 省略getter/setter一大段
}
</pre><br />不知道大家有没有用eclipse生成JavaBean getter/setter的痛苦，至少非常枯燥。整个JavaBean实现了什么功能？完全没有<br /><br />好了我开谜底了，我用的是HashMap<br /><br />什么，HashMap？是不是听错了<br /><br />没听错，请问有什么事情是上面那个那么普通的JavaBean能做到的，而HashMap不能做到的呢<br /><br />用HashMap没有具体属性的类型啊，那不是变成动态语言一样了，而且我要在JavaBean里面加逻辑怎么办<br /><br />好吧，这是我想到的两个问题（如果你也有别的问题可以留意提出来）<br /><br />首先，现在不同以前了，动态语言的优势慢慢提高了，像动态语言有什么不好，我从ROR里面学了很多不错的思想<br /><br />其次是要加逻辑怎么办，这个问题，之前在Javaeye讨论充血模型还是贫血模型不可开交，最后还是没什么结论，目前还是一片贫血的情况，你可以翻一下你的项目里面的JavaBean，至少大多数的Bean都是没有意义的getter/setter。BO跟PO混杂在一起也很多人不建议的。至于逻辑，大可以写在util包里面，我都把整个model包去掉了，强化一下util不成么，呵呵<br /><br />再次，数据库的列，跟JavaBean的属性两者，本来就是冗余的，如果我们修改数据库结构，就还要修改相应的JavaBean，或者影射文件。当然我这种做法更依赖数据库。另外，ROR的名字转换功能可以令到代码中的调用名字更好看一些，我觉得也不是非常有必要的实现<br /><br />直接使用HashMap不太方便，尤其是类型转换上，于是我实现了一个MapBean的类，其实这个类很简单，关键是用HashMap代替JavaBean的思想<br /><pre name="code" class="java">
public class MapBean extends HashMap&lt;String, Object> {
	public MapBean() {
	}
 
	public MapBean(Object... args) {
		put(args);
	}
 
	public int getInt(Object key) {
		return getInt(key, 0);
	}
 
	public int getInt(Object key, int defaultInt) {
		Integer i = (Integer) get(key);
		return i == null ? defaultInt : i;
	}
 
	public String getString(Object key) {
		return (String) get(key);
	}
 
	public String getString(Object key, String defaultValue) {
		String value = (String) get(key);
		return value == null ? defaultValue : value;
	}
 
	public Timestamp getTimestamp(Object key) {
		return (Timestamp) get(key);
	}
 
	public void put(Object... args) {
		for (int i = 1; i &lt; args.length; i += 2) {
			put(String.valueOf(args[i - 1]), args[i]);
		}
	}
 
	public JSONObject toJson() {
		return JSONObject.fromObject(this);
	}
 
	public JSONObject toJson(String... keys) {
		xxx
	}
 
	public String toJsonString() {
		return toJson().toString();
	}
}
</pre><br />这个类主要是方便做类型转换，加入了getInt，getString等方法，另外因为我的系统里面大量使用了JSON，也有一些HashMap向JSON转换的辅助方法，还有一个特别处理过的put方法和构造器，有什么用呢，看下面的例子<br /><br />MapBean params = new MapBean("id",userId,"name",username,"sex",0,"online",true);<br /><br />如果你直接用HashMap实现以上功能，要写五行代码，就这个差别而已，呵呵<br /><br />当然如果你用JavaBean的话，你也可以写一个对应的构造函数<br /><br />接下来，我们在sql-map-config.xml中加入<br /><pre name="code" class="xml">
&lt;typeAlias alias="mapbean" type="xxxxxxx.MapBean" />
</pre><br />就可以用mapbean的别称来引用这个类了<br /><br />例如具体的SQL xml是这样的<br /><pre name="code" class="xml">
&lt;select id="getWorkManagerSystemRole" resultClass="mapbean"
	parameterClass="mapbean">
	select * from work_manager_system_role where
	system_id=#system_id# and user_id=#user_id#
&lt;/select>
</pre><br />其实我已经把Ibatis当成SQL wrapper来用了，我曾经评估过Spring的JDBC Template，不过功能始终差少少，或许以后我把JDBC Template再强化一下来代替Ibatis吧<br /><br /><a href="http://weavesky.com/2008/01/29/ibatis-with-mapbean/" target="_blank">http://weavesky.com/2008/01/29/ibatis-with-mapbean/</a>
          <br/>
          <span style="color:red;">
            <a href="http://zgd.javaeye.com/blog/160162#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/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Jan 2008 16:36:58 +0800</pubDate>
        <link>http://zgd.javaeye.com/blog/160162</link>
        <guid>http://zgd.javaeye.com/blog/160162</guid>
      </item>
      <item>
        <title>[原创]sexy Quartz</title>
        <author>zgd</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zgd.javaeye.com">zgd</a>&nbsp;
          链接：<a href="http://zgd.javaeye.com/blog/144515" style="color:red;">http://zgd.javaeye.com/blog/144515</a>&nbsp;
          发表时间: 2007年11月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个系统里面经常需要做一些定时任务，比如说定时清空今日得分，或者定时清理临时文件。简单的定时任务很容易实现，用线程或者用Timer就可以了，但是始终需要自己写大量代码才能实现复杂的需求。<br /><br />于是便有Quartz。不过，Quartz太久没有更新了，而且它太复杂。由于我的系统是基于Spring构建的，所以我希望能使用Spring支持的scheduling类库，可惜Spring只支持commonj和Quartz，正确来说，在Java界，并没有别的scheduling类库了，而commonj只是一个interface，没有具体的实现，似乎在Weblogic之类的里面有实现。<br /><br />当然，也有另外一个选择，也是轻量级的脚本语言常用的做法，就是使用Linux的crontable，可以实现比较复杂的定时。不过，脚本语言调用数据库并不是很方便(应该说我们的团队技术累积上的问题)，如果用crontable启动Java，每次启动的成本又比较高。<br /><br />在评估过各种方案之后，我还是选择了使用Quartz，首先从Spring的辅助类开始入手吧。<br /><br />题外话，在一个集群的环境里面(也就是多个Tomcat的环境下)，定时任务应该是独立的应用，也就是不应该在每一个Tomcat里面都启动Quartz或者定时线程。另外，在Tomcat的应用里面，也是尽量不要使用线程，有可能一点点小错误就会导致整个Tomcat崩溃(其实我们还是使用很多的，呵呵)。<br /><br />根据Quartz的使用行为，一个任务我们至少需要一个Job、一个JobDetail、一个Trigger(真复杂)<br /><pre name="code" class="java">
    JobDetail jobDetail = new JobDetail("myJob",               // job name
                                      sched.DEFAULT_GROUP,   // job group
                                      DumbJob.class);        // the java class to execute
    Trigger trigger = TriggerUtils.makeDailyTrigger(8, 30);
    trigger.setStartTime(new Date());
    trigger.setName("myTrigger");
    sched.scheduleJob(jobDetail, trigger);
</pre><br />首先！！我在这里要明确一个事情。Job类是没有状态的！！<br />这是什么概念呢，就是说，你实现的一个Job(例如上面的代码的DumbJob)，并不是由你自己new出来的，留意一下new JobDetail的代码，传入的参数是DumbJob.class，而不是一个具体的job实例。Quartz帮你吧Job new一份出来，并且调用相应的接口，并没有别的功能。<br /><br />这里会带来一个什么问题呢，我们先来看看Spring的辅助类。<br /><br />Spring有两个辅助类可以产生JobDetail类，需要留意的是，Spring并不辅助产生Job类，也就是Spring认为Job类不需要管理。<br /><br />我们先看看第一个，JobDetailBean<br /><pre name="code" class="java">
    &lt;bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">
      &lt;property name="jobClass" value="example.ExampleJob" />
      &lt;property name="jobDataAsMap">
        &lt;map>
          &lt;entry key="timeout" value="5" />
        &lt;/map>
      &lt;/property>
    &lt;/bean>
</pre><br />不知道大家有没有看出问题在哪里。property jobClass是一个类名，并不是一个实例名！也就是跟Quartz的调用一样，是Quartz负责帮你new一个example.ExampleJob类出来，也就是说你不能对Job类进行任何形式的注入(IOC)，比如说，我们的example.ExampleJob是一个DAO，需要传入DataSource进行DB操作，没辙。<br /><br />因此，Spring提供了另外一个JobDetail辅助类MethodInvokingJobDetailFactoryBean<br /><pre name="code" class="java">
    &lt;bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
      &lt;property name="targetObject" ref="exampleBusinessObject" />
      &lt;property name="targetMethod" value="doIt" />
    &lt;/bean>
</pre><br />你可以留意到，property targetObject是一个ref，指向的是一个常规的Spring管理的Bean。<br /><br />但是！<br /><br />MethodInvokingJobDetailFactoryBean很不友好。首先，它是通过反射调用的，而不是Interface，因此我们必须要看了Spring的xml才能知道谁被调用了，你还可能会写一大堆property targetMethod=doIt，而且Job Interface是会传入一个JobExecutionContext，这个被miss了。<br />其次，如果我们需要大量的Job的话(因为我就是做一个专门用来定时的应用)，Spring的配置文件会变得非常臃肿，我希望Job和JobDetail不需要Spring专门管理，只要他是一个Spring管理的Bean，并且实现了Job这个接口就ok了。<br /><br />这里补充一个事情，我们跳过了Trigger的部分，每一个JobDetail必须配备一个相应的Trigger，因此配置文件是你之前想象中的两倍那么大，而且你还得给每一个Bean命名一个ID，而这个类你以后都不会用到。<br /><br />我的目标是：<br />1、只要是实现了Job接口的Spring管理的Bean，自动加入scheduling，根本不用关心JobDetail的存在，也不会有注入的问题<br />2、所有Job均使用CronTrigger，并且通过配置文件设定Cron Expressions<br /><br />通过研究MethodInvokingJobDetailFactoryBean和Quartz的代码，我明白到JobDetail是有状态的，而MethodInvokingJobDetailFactoryBean正是利用这点来实现具体效果的，于是便有了我一下这些辅助代码<br /><br />首先<br />，需要一个DummyJob，由于Quartz的主入口始终是Job类<br /><pre name="code" class="java">
    public class DummyJob implements Job {
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		Job job = (Job) context.getMergedJobDataMap().get("methodInvoker");
		if (job != null) {
			job.execute(context);
		}
	}
    }
</pre><br />jobDataMap就是JobDetail存储状态的地方，DummyJob唯一要做的就是，知道实际的Job类，并且调用它<br /><br />接下来是戏玉了<br /><pre name="code" class="java">
		Map&lt;String, Job> jobMap = context.getBeansOfType(Job.class);
		for (Map.Entry&lt;String, Job> entry : jobMap.entrySet()) {
			String taskName = entry.getKey();
			String cronExpression = props.getProperty(taskName);
			if (cronExpression == null) {
				logger.warn("[{}] don't have a cronExpression", taskName);
				continue;
			}

			try {
				Trigger trigger = new CronTrigger(taskName + "Trigger", null,
						cronExpression);
				JobDetail jobDetail = new JobDetail(taskName + "Job", null,
						DummyJob.class);
				jobDetail.getJobDataMap()
						.put("methodInvoker", entry.getValue());
				scheduler.scheduleJob(jobDetail, trigger);
			} catch (ParseException e) {
				logger.error("", e);
			} catch (SchedulerException e) {
				logger.error("", e);
			}
		}
</pre><br />从Spring context里面读取所有实现了Job的类遍历，props是从文件里面读取相应的cronExpression配置。<br /><pre name="code" class="java">
				JobDetail jobDetail = new JobDetail(taskName + "Job", null,
						DummyJob.class);
				jobDetail.getJobDataMap()
						.put("methodInvoker", entry.getValue());
</pre><br />这两句是关键<br /><br />于是，Quartz变得更sexy了<br /><br />----------<br />欢迎踩场<br />http://weavesky.com/2007/11/28/sexy-quartz
          <br/>
          <span style="color:red;">
            <a href="http://zgd.javaeye.com/blog/144515#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Wed, 28 Nov 2007 14:51:55 +0800</pubDate>
        <link>http://zgd.javaeye.com/blog/144515</link>
        <guid>http://zgd.javaeye.com/blog/144515</guid>
      </item>
  </channel>
</rss>