<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-26572176</id><updated>2011-10-20T10:59:18.147+08:00</updated><category term='OriginalText'/><category term='AJAX'/><category term='Oracle'/><category term='CSS'/><category term='Java'/><category term='news'/><category term='Linux'/><category term='C/C++'/><category term='.NET'/><category term='daybook'/><title type='text'>雾雨楼</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default?start-index=101&amp;max-results=100'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>548</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26572176.post-2910483751164113595</id><published>2007-04-15T22:53:00.000+08:00</published><updated>2007-04-15T22:55:42.090+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>JSF 可以让AJAX 不使用JavaScript</title><content type='html'>【IT168 专稿】很多JSF专家表示，JSF（JavaServer Faces）可以在不需要编写JavaScript代码的情况下开发异步的JavaScript 和 XML应用程序。&lt;br /&gt;　　 在服务器端Java（ServerSide Java）研讨会3月22日的一次会议上，SUN公司的高级工程师Ed Burns说：开发人员可以使用JSF开发出企业级的AJAX应用程序，这些应用经过了充分的行业证明，具有良好的健壮性，可靠性，易用性和伸缩性。&lt;br /&gt;　　 Ed Burn还表示：“可以通过不同的方式来使用JSF和AJAX。 其中一种方式是同时使用JSF和Project Dynamic Faces 或DynaFaces。 通过这种方式，使用者不需要JavaScript的知识，如果使用者喜欢使用JavaScript还可以构建功能更加强大的应用程序。另一种方法是使用AJAX支持的JSF组件，这种方法只需要有对AJAX很少的知识就可以。另外开发人员还可以只使用AJAX或使用一种AJAX框架。” 　　B 　　 urns说：“除了Project Dynamic Faces，还有其他的方式来同时使用JSF和AJAX，其中包括使用ICEsoft公司的 ICEfaces, Ajax2JSF, AjaxAnywhere 和Backbase。”Google公司的Adam Bosworth可以告诉你为什么AJAX在经历失败后又会成功。（点击此连接到相应页面）。&lt;br /&gt;　　 Burns还说：“早在AJAX还不是如此强大之前，JSF的面向对象设计已经为JSF可以在AJAX中使用做了准备。JSF的如下主要特性使得它对于AJAX来说是友好的，其中包括灵活的可扩展组件模型，明确的请求处理生命周期（Request Processing Lifecycle）和一个灵活的可扩展渲染模型。&lt;br /&gt;　　 Burns 说,AJAX的成功在于其具有的如下理念：JavaScript对页面的开发人员来说透明，但却可以被组件开发者看到；通过状态管理使客户端和服务器端轻松保持同步等。使用JSF和AJAX还可以解决跨浏览器的问题。同时，Project Dynamic Faces将AJAX强大的功能引入到已有的和未来的利用JSF开发的应用。&lt;br /&gt;    在2007年于纽约召开的AJAX World大会上，位于康涅狄格州斯坦福德的Virtua公司首席咨询师Kito Mann做了一个名为“看啊，不用JavaScript也可以（Look Ma, No JavaScript）”的讲演，表达了和Burns一样的观点。Mann讲演的主旨是：“使用JSF，可以在不编写任何JavaScript代码的情况下构建应用程序。” Mann说，JSF是针对于JAVA的一种标准的web用户界面框架，其规范包括服务器端用户界面组件，事件模型，一组基本的用户界面组件和基本的应用结构。Mann还是JSFCentral.com的创建者之一。JSFCentral.com是一个由使用JSF技术的开发人员，架构师和经理组成的社区。另外，他还是Java 社区Process' JSF专家组的成员之一。      曼恩说，JSF还提供广泛的工具支持和用RAD(快速应用开发)模式的方法去开发Java Web。此外, JSF是建立在Servlet API之上的，并且促进了第三方用户界面组件市场的发展,他说。     总体来说,“JSF提供透明的AJAX支持，”曼恩说。"我们的想法就是JSF编程模型能与AJAX一起工作。" 有多种支持JSF的IDES(集成开发环境),包括Sun的Java Studio Creator，BEA 的Workshop Studio，Oracle的 JDeveloper 和 Exadel Studio Pro (现在在JBoss umbrella旗下)，曼恩说。 而且，JSF架构加上AJAX支持很容易，他说。     事实上，曼恩说JSF有三个主要的AJAX集成策略。&lt;br /&gt;    一是把AJAX支持加到现有组件中，二是把AJAX支持直接集成到JSF组件中，三是对现有AJAX控件封装成一个JSF组件，曼恩说。     用在第一种方法中的技术包括Exadel的Ajax4JSF，Ideo技术的开源AjaxAnywhere offering和Sun的DynaFaces,，曼恩说。&lt;br /&gt;支持AJAX直接集成到JSF组件的产品或技术包括Simplica的ECruiser，Infragistics的NetAdvantage，Sun的Project Woodstock，和来自ICEsoft, Backbase and Exadel的技术，曼恩说。     封装现有的AJAX控件到JSF中，两个主要的选择是Sun’s jMaki和Dojo Foundation’s Dojo Faces，他说。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2910483751164113595?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2910483751164113595/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2910483751164113595' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2910483751164113595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2910483751164113595'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/jsf-ajax-javascript.html' title='JSF 可以让AJAX 不使用JavaScript'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-4209798406679091303</id><published>2007-04-15T07:35:00.000+08:00</published><updated>2007-04-15T07:36:43.829+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>JDK早期版本中使用Java 5语言特性</title><content type='html'>&lt;div class="dots"&gt;         作者: Brian Goetz, 　出处:developerWorks 中国,　责任编辑: 叶江,　&lt;div class="posted"&gt;2007-03-27 09:12&lt;/div&gt;     &lt;/div&gt;                 &lt;h5&gt;　　本文将演示如何在 JDK 早期版本中使用 Java 5 的语言特性……&lt;/h5&gt;    &lt;div class="guanggao"&gt;&lt;span id="contentAdv"&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;　　Java 5 添加了许多强大的语言特性：泛型、枚举、注释、自动装箱和增强的 for 循环。但是，许多工作组仍然被绑定在 JDK 1.4 或以前的版本上，可能需要花些时间才能使用新版本。但是，这些开发人员仍然可以使用这些功能强大的语言特性，同时在 JVM 早期版本上部署。&lt;/p&gt; &lt;p&gt;　　随着最新的 Java 6.0 的发布，您可能认为 Java 5 的语言特性是 “旧的新特性”。但是即使在现在，当我询问开发人员在开发时使用的 Java 平台的版本时，通常只有一半人在使用 Java 5 —— 另一半则只能表示羡慕。他们非常希望使用 Java 5 中添加的语言特性，例如泛型和注释，但仍有许多因素妨碍他们这样做。&lt;/p&gt; &lt;p&gt;　　不能利用 Java 5 特性的开发人员包括那些开发组件、库或应用程序框架的开发人员。因为他们的客户可能仍然在使用 JDK 1.4 或以前的版本，并且 JDK 1.4 或以前的 JVM 不能装载用 Java 5 编译的类，所以使用 Java 5 语言特性会把他们的客户基数限制在已经迁移到 Java 5 的公司。&lt;/p&gt; &lt;p&gt;　　另一类经常避免使用 Java 5 的开发人员是使用 Java EE 的开发人员。许多开发团队不愿在 Java EE 1.4 及以前的版本上使用 Java 5，因为担心其应用服务器的厂商不支持 Java 5。这些开发人员要迁移到 Java EE 5 可能还有待时日。除了 Java EE 5 和 Java SE 5 规范之间的滞后，商业 Java EE 5 容器没有必要在规范刚刚制定好就能使用，企业也没有必要在应用服务器出现下一个版本时就立即升级，而且在升级应用服务器之后，可能还需要花些时间在新平台 上验证其应用程序。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;Java 5 语言特性的实现&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　Java 5 中添加的语言特性 —— 泛型、枚举、注释、自动装箱和增强的 for 循环 —— 不需要修改 JVM 的指令集，几乎全部是在静态编译器(javac)和类库中实现的。当编译器遇到使用泛型的情况时，会试图检查是否保证了类型安全(如果不能检查，会发出 “unchecked cast”)，然后发出字节码，生成的字节码与等价的非泛型代码、类型强制转换所生成的字节码相同。类似的，自动装箱和增强的 for 循环仅仅是等价的 “语法糖”，只是更复杂的语法和枚举被编译到普通的类中。&lt;/p&gt; &lt;p&gt;　　在理论上，可以采用 javac 生成的类文件，在早期的 JVM 中装入它们，这实际上正是 JSR 14(负责泛型的 Java Community Process 工作组)的成立目的。但是，其他问题(例如注释的保持)迫使类文件的版本在 Java 1.4 和 Java 5 之间变化，因此妨碍了早期 JVM 中装入用 Java 5 编译的代码。而且，在 Java 5 中添加的有些语言特性依赖于 Java 5 库。如果用 javac -target 1.5 编译类，并试图将它装入早期 JVM 中，就会得到 UnsupportedClassVersionError，因为 -target 1.5 选项生成的类的类文件版本是 49，而 JDK 1.4 只支持版最大为 48 的类文件版本。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;for-each 循环&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　增强的 for 循环有时叫做 for-each 循环，编译器编译它的时候，情形与程序员提供旧式 for 循环一样。for-each 循环能够迭代数组或集合中的元素。清单 1 显示了用 for-each 在集合上迭代的语法：&lt;/p&gt; &lt;p&gt;　　清单 1. for-each 循环&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;　　Collection fooCollection = ...&lt;br /&gt;　　for (Foo f : fooCollection) {&lt;br /&gt;　　doSomething(f);&lt;br /&gt;　　}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　编译器把这个代码转换成等价的基于迭代器的循环，如清单 2 所示：&lt;/p&gt; &lt;p&gt;　　清单 2. 清单 1 基于迭代器的等价循环&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;　　for (Iterator iter=f.iterator(); f.hasNext();) {&lt;br /&gt;　　Foo f = iter.next();&lt;br /&gt;　　doSomething(f);&lt;br /&gt;　　}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　编译器如何知道提供的参数有一个 iterator() 方法呢? javac 编译器的设计者可能已经内置了对集合框架的理解，但是这种方法有些不必要的限制。所以，创建了一个新的接口 java.lang.Iterable(请参阅清单 3 )，并翻新集合类使其实现 Iterable 接口。这样，不是在核心集合框架上构建的容器类也能利用新的 for-each 循环。但是这样做会形成对 Java 5 类库的依赖，因为在 JDK 1.4 中没有 Iterable。&lt;/p&gt; &lt;p&gt;　　清单 3. Iterable 接口&lt;/p&gt; &lt;p&gt; &lt;/p&gt;   　　public interface Iterable {&lt;br /&gt;　　Iterator iterator();&lt;br /&gt;　　}&lt;br /&gt;&lt;strong&gt;枚举和自动装箱&lt;/strong&gt; &lt;p&gt;　　正像 for-each 循环一样，枚举也要求来自类库的支持。当编译器遇到枚举类型时，生成的类将扩展库类 java.lang.Enum。但是，同 Iterable 一样，在 JDK 1.4 类库中也没有 Enum 类。&lt;/p&gt; &lt;p&gt;　　类似的，自动装箱依赖于添加到原始包装器类(例如 Integer)的 valueOf() 方法。当装箱需要从 int 转换到 Integer 时，编译器并不调用 new Integer(int)，而是生成对 Integer.valueOf(int) 的调用。valueOf() 方法的实现利用 享元(flyweight)模式 为常用的整数值缓存 Integer 对象(Java 6 的实现缓存从 -128 到 127 的整数)，由于消除了冗余的实例化，可能会提高性能。而且，就像 Iterable 和 Enum 一样，valueOf() 方法在 JDK 1.4 类库中也不存在。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;变长参数&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　当编译器遇到用变长参数列表定义的方法时，会把其转换成包含正确组件类型数组的方法;当编译器遇到带有变长参数列表方法的调用时，就把参数装进数组。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;注释&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　定义了注释的之后，可以用 @Retention 对它进行注释，它可以决定编译器对使用这个注释的类、方法或字段执行什么处理。已经定义的保持策略有 SOURCE (在编译时舍弃注释数据)、CLASS (在类文件中记录注释)或 RUNTIME (在类文件中记录注释，并在运行时保留注释，这样就可以反射地访问它们了)。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;其他的库依赖关系&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在 Java 5 之前，当编译器遇到尝试连接两个字符串的情况时，会使用帮助器类 StringBuffer 执行连接。在 Java 5 及以后的版本中，转而调用新的 StringBuilder 类，JDK 1.4 及以前的类库中不存在该类。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;访问 Java 5 特性&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　因为语言特性对库支持的依赖，即使使用 Java 5 编译器生成的类文件能够装入早期 JVM 版本，执行也会因为类装入错误而失败。但是，通过对字节码进行适当转换，仍有可能解决这些问题，因为这些遗漏的类并不包含实际的新功能。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;JSR 14&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在 Java 泛型规范(以及其他 Java 5 新添加的语言特性)的开发期间，在 javac 编译器中添加了试验性的支持，以便让它能使用 Java 5 的语言特性，并生成能在 Java 1.4 JVM 上运行的字节码。虽然这些特性不受支持(甚至是文档)，但许多开源项目都使用了它们，使得开发人员能使用 Java 5 语言特性编码，并生成能在早期 JVM 上使用的 JAR 文件。而且，既然 javac 是开源的，那么这个特性有可能得到第三方的支持。要激活这些特性，可以用 -source 1.5 和 -target jsr14 选项调用 javac。&lt;/p&gt; &lt;p&gt;　　javac 的 JSR 14 目标模式使编译器生成与 Java 5 语言特性对应的 JDK 1.4 兼容字节码：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　&lt;strong&gt;泛型和变长参数：&lt;/strong&gt;编译器在泛型出现的地方插入的强制转换不依赖类库，所以能够在 Java 5 之前的 JVM 上很好地执行。类似的，编译器在出现变长参数列表的地方生成的代码也不依赖类库。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;for-each 循环：&lt;/strong&gt;当迭代数组时，编译器生成归纳变量和标准的数组迭代语法。当在 Collection 上迭代时，编译器生成标准的基于迭代器的语法。当在非集合的 Iterable 上迭代时，编译器生成错误。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;自动装箱：&lt;/strong&gt;编译器不生成对包装器类的 valueOf() 方法的调用，而是生成对构造函数的调用。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;字符串连接：&lt;/strong&gt;javac 的 JSR 14 目标模式使编译器生成对 StringBuffer 的调用而不是对 StringBuilder 的调用。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;枚举：&lt;/strong&gt;javac JSR 14 目标模式对枚举没有特殊支持。尝试使用枚举的代码会失败，在寻找 java.lang.Enum 基类时出现 NoClassDefFoundError。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　　使用 JSR 14 目标模式允许在 “简易” 情况下编写使用泛型、自动装箱和 for-each 循环的代码，这对多数项目来说可能足够了。这很方便，如果不支持的话，编译器会一次生成基本兼容的字节码。&lt;/p&gt; &lt;p&gt;……&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-4209798406679091303?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/4209798406679091303/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=4209798406679091303' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4209798406679091303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4209798406679091303'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/jdkjava-5.html' title='JDK早期版本中使用Java 5语言特性'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-1798732268627003908</id><published>2007-04-15T07:24:00.000+08:00</published><updated>2007-04-15T07:25:19.783+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google的巨额财富之困</title><content type='html'>天极ChinaByte 特稿(杨剑) “Google的确主动积极，而且出手迅速。”拥有计算机科学博士学位，服务器软件Jigsaw的开发人贝尔德-史密斯说。 &lt;p&gt;　　2005年6月，身为工程师的贝尔德-史密斯(Anselm Baird-Smith)正在考虑是否离开eBay的时候，接到了Google的电话。没过几天，Google的高层管理人员就对他进行了面试，摊出一份 颇有诱惑力的合同：六位数的年薪加限制性股票。而Google首席执行长施密特(Eric Schmidt)甚至亲自打来电话，敦促史密斯尽快倒戈。Google向贝尔德-史密斯开出的条件促使eBay提出了用现金奖励换取贝尔德-史密斯留任的 做法。虽然，史密斯最后拒绝了Google，但Google在人才方面的“狼子野心”已经昭然若揭了。&lt;/p&gt; &lt;p&gt;　　BEA的亚当博斯沃思(Adam Bosworth)、微软公司的李开复、eBay的路易斯莫尼尔(Louis Monier)则没有抵挡住Google的金元攻势，Google甚至从MCI挖来了有互联网之父美誉的文顿塞弗(Vinton Cerf)。&lt;/p&gt; &lt;p&gt;　　Google的人才“挖角”让它树敌不少，微软首席执行长史蒂夫·鲍尔默甚至为此大发雷霆，公开指责Google的行为。但Google显然不 在乎这些，迅速增长的财富让Google有足够的实力应付这些麻烦。当然，Google吸引人才的除了金钱可能还有其它原因，比如轻松自由的工作氛围。&lt;/p&gt; &lt;p&gt;　　但是，现在或者未来Google却将面临一些麻烦。&lt;/p&gt; &lt;p&gt;　　麻烦的根源正是Google大肆“挖角”的保障，那些巨额的财富与当初大手大脚“利诱”人才的行为。&lt;/p&gt; &lt;p&gt;　　美国《圣荷西信使报》报道，在即将迎来上市三周年之际，Google面临着巨大成功所带来的棘手难题——早期创业员工的流失。随着最后一笔期权行权期的临近，一批创业元老即将成为百万富翁，并随时可能选择离开。&lt;/p&gt; &lt;p&gt;　　《圣荷西信使报》看到的可能只是一个即将来到的麻烦，实际上，几乎所有被Google“利诱”来的人才都面临着这个问题。&lt;/p&gt; &lt;p&gt;　　“当工作已经缺乏乐趣，而你又拥有可以享受乐趣的财富，你会怎么选择?”为Google最赚钱的业务“Adwords”命名的道格·爱德华兹(Doug Edwards)显然具有权威的发言权，他用实际行动为大多数面临抉择人作出了表率，那就是辞职。&lt;/p&gt; &lt;p&gt;　　另外一种情况是，无论Google的工作环境怎样自由，一些人还是喜欢自己掌控一切的感觉。“我进Google只为了一个目的，我再也不想为别 人拼命工作了，除了为自己。”曾经为Google员工奉献了许多美味佳肴的大厨查理·艾尔斯(Charlie Ayers)在执行完期权后就离职了。现在他正计划在加州帕洛阿尔托市(Palo Alto)开一家餐馆，自己做自己的老板。&lt;/p&gt; &lt;p&gt;　　Google可能还要继续因为自己的巨额财富与“慷慨”付出代价，因为，它的人才战略让它的员工几乎都能成为百万富翁，前提是执行完Google给予他们的期权。&lt;/p&gt; &lt;p&gt;　　虽然，目前大多数执行完首批期权的员工仍然留在Google，但实际上，他们现在拥有的财富已经够他们挥霍一辈子了。&lt;/p&gt; &lt;p&gt;　　看银行户头上的数字跳跃性的增长让人非常享受。但是当财富积累到只是一个数字，又有多少人禁得住把虚拟的数字变为实际享受的诱惑呢?&lt;/p&gt; &lt;p&gt;　　后记：“铁打的营盘流水的兵”，每个企业都面临人才流动的问题。也许这对Google来说不是问题，因为它可以继续用它的财富吸引新的人才。只 不过它的慷慨也许让它在老员工上损失更大一些罢了。其实，不止Google，中国的百度同样也将面临这个问题，谁让他们的员工财富增长的太快了呢? &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-1798732268627003908?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/1798732268627003908/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=1798732268627003908' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1798732268627003908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1798732268627003908'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/google_6021.html' title='Google的巨额财富之困'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3965895615269114203</id><published>2007-04-15T07:19:00.001+08:00</published><updated>2007-04-15T07:19:43.057+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>中国加入Google全球开发者日活动</title><content type='html'>2007年4月12日 （北京）－Google（谷歌）宣布，公司将于2007年5月31日在全 球10个国家的分支机构举办“开发者日”活动。这次全球活动的主题是“Google 开发者日：为你的网站添砖加瓦”。活动期间，Google（谷歌）将就API和开发者工具举行研讨会、主旨演讲和即兴讨论。整个活动从悉尼拉开序幕（澳大 利亚东部标准时间5月31日上午9时）， 27个小时之后，在Google（谷歌）总部山景城落幕（美国太平洋标准时间5月31日晚7时）。同时举办这次活动的国家还包括中国北京、巴西圣保罗、英 国伦敦、法国巴黎、西班牙马德里、德国汉堡、日本东京、和俄罗斯莫斯科。　&lt;br /&gt;&lt;br /&gt;　　Google（谷歌）搜索产品和用户体验副总裁Marissa Mayer女士说：“我们希望为开发者提供一次相互联谊、学习最新技术以及向Google开发者产品团队提出疑问并得到解答的机会。对Google而言， 这也是一次从开发者群体中获取反馈、寻求进一步改善开发者产品途径的机会。”　　&lt;br /&gt;&lt;br /&gt;　　在中国，Google（谷歌）是第一次举办“开发者日”的活动。出全球共有内容关于开发者与Google（谷歌）现有产品的整合扩展外，中国还将增加关于Linux和开源的专门话题。&lt;br /&gt;&lt;br /&gt;　　“Google（谷歌）开发者日”上，Google（谷歌）中国将讲解Google的API和各种工具，帮助开发者提升各自产品的效率，更好 地和Google结合，惠泽千百万的用户。Google（谷歌）中国希望能够通过自己的力量使中国的开发者在网络上开发出数以千计的新应用软件，无论这些 应用软件是迎合了大众市场的需求，还只是仅仅解决了一个小众的问题。&lt;br /&gt;　&lt;br /&gt;　　另一方面，Google（谷歌）是开源和Linux操作系统的受益者；Google也举办了像暑期编程大赛、在 code.google.com上发布开源项目这样的活动，回馈开源社区和Linux社区。在中国，越来越多来自不同组织的开源开发者们渴望与开源的领袖 和专家进行面对面的沟通。正因为此，Google（谷歌）将在“开发者日”上介绍开源文化与技术，满足来自技术性用户的迫切需求。&lt;br /&gt;&lt;br /&gt;　　今年5月参加Google（谷歌）中国“开发者日”的演讲嘉宾有Google Geo API项目的工程师安兴华、Google Data API项目工程师杨骏、Guice项目经理Bob Lee、Google（谷歌）软件工程师周欣、Python语言发明人Guido Van Rossum、Google（谷歌）开源项目工程师 Jon Trowbridge和开源项目SCIM作者&lt;br /&gt;&lt;br /&gt;　　Google（谷歌）软件工程师苏哲。他们演讲的主题包括：“Google Geo API”、“Google Data API”、“用Guice开发Java应用”、“Google Web Toolkit”、“Python语言”、“Google与开源”以及“Linux平台的国际化和本地化编程”。&lt;br /&gt;&lt;br /&gt;　　Google（谷歌）中国区总裁李开复表示：“Google（谷歌）中国要有长期的发展，要给Google（谷歌）的中国用户们带来惊喜，不 但需要Google（谷歌）中国工程师们的努力，更要仰仗中国杰出的开发者们。我们欢迎技术精英能在Google（谷歌）开放的平台上，利用Google API和其它开发工具为中国互联网带来创新，让中国用户享受到更先进的产品和应用。”　　&lt;br /&gt;&lt;br /&gt;　　关于“Google（谷歌）开发者日”的报名注册以及其他相关信息，请访问“Google（谷歌）开发者日”网站：　　&lt;br /&gt;&lt;br /&gt;　　&lt;a href="http://www.google.com/events/developerday/zh_CN/details.html" class="article" target="_blank"&gt;http://www.google.com/events/developerday/zh_CN/details.html&lt;/a&gt;&lt;a href="http://www.enet.com.cn/"&gt;&lt;img src="http://images.enet.com.cn/end.gif" target="_blank" align="absmiddle" border="0" height="11" width="11" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3965895615269114203?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3965895615269114203/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3965895615269114203' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3965895615269114203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3965895615269114203'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/google_5310.html' title='中国加入Google全球开发者日活动'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2868307214889311554</id><published>2007-04-15T07:13:00.000+08:00</published><updated>2007-04-15T07:17:07.164+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google在中国的尴尬两年 误把国际化当成本土化</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" width="585"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" height="10"&gt;&lt;div id="NewsFrom"&gt; &lt;span id="HomeUrl"&gt;http://www.jrj.com　&lt;/span&gt; &lt;span id="spFromStr"&gt;&lt;/span&gt;2007年04月14日 00:36  &lt;span id="chgFromStr"&gt;&lt;span style="color:#800080;"&gt;财经时报&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td height="8"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td align="center" height="8"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span id="dv_font1"&gt;【&lt;a href="http://comment.jrj.com.cn/MessageBoard/show_review.aspx?NewsID=2150754&amp;newsFrom=2&amp;amp;stockcode=" class="ffun"&gt;&lt;u&gt;评论&lt;/u&gt;&lt;/a&gt;】【字体：&lt;a class="ffun" id="ftb" href="javascript:ChangeShow(1);" target="_self"&gt;大&lt;/a&gt; &lt;a id="ftn" href="javascript:ChangeShow(2);" class="ft" target="_self"&gt;中&lt;/a&gt; &lt;a class="ffun" id="fts" href="javascript:ChangeShow(3);" target="_self"&gt;小&lt;/a&gt;】&lt;/span&gt; &lt;/td&gt; &lt;td&gt;【页面调色版  &lt;/td&gt; &lt;td&gt; &lt;table border="0" cellpadding="0" cellspacing="2"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td style="" onclick="SetBgColor('EDF0F5');" bgcolor="#edf0f5"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;td style="" onclick="SetBgColor('FAFBE6');" bgcolor="#fafbe6"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;td style="" onclick="SetBgColor('FFF2E2');" bgcolor="#fff2e2"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;td style="" onclick="SetBgColor('FDE6E0');" bgcolor="#fde6e0"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;td style="" onclick="SetBgColor('F3FFE1');" bgcolor="#f3ffe1"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;td style="" onclick="SetBgColor('DAFAF3');" bgcolor="#dafaf3"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;td style="" onclick="SetBgColor('EAEAEF');" bgcolor="#eaeaef"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;td style="" onclick="SetBgColor('FFFFFF');" bgcolor="#ffffff"&gt;&lt;img src="http://info.jrj.com.cn/news/main/ver0701/images/1.gif" height="8" width="9" /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/td&gt; &lt;td&gt;】&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;    &lt;br /&gt;　　本报记者 李国训  &lt;p&gt;　　“Google在中国的做法，使它在美国及欧洲的声誉受到损害。”  &lt;/p&gt;&lt;p&gt;　　四月的北京，春意正浓。但对于Google中国（谷歌）掌门人李开复来说，却是一个十分艰难的时期。  &lt;/p&gt;&lt;p&gt;　　这位46岁的中年男人此前在苹果电脑、SGI、微软等知名公司的职业生涯可谓一帆风顺，但在Google却意外遭遇了多次危机：最早一 次是在两年前，他因跳槽至Google而与微软打了长达半年的官司；而这一次，他则因“词库门”事件背上了“剽窃”的罪名，过去两年累积的个人声望也由此 受到影响。 &lt;/p&gt;&lt;p&gt;　　更不幸的是，最近几日，美国贸易代表计划向世贸组织就中国对美国公司拥有的版权保护不力提出申诉的消息正传得沸沸扬扬，Google这个美国公司剽窃中国公司技术专利的事件，也很快引起了美联社、路透社等众多海外媒体的高度关注。  &lt;/p&gt;&lt;p&gt;　　李开复的个人遭遇，也被人视为Google在华600多天的黯淡轨迹的一个缩影。从2005年轰轰烈烈进入中国至今，Google耗资 甚多，但收获惨淡，其在国内搜索市场的份额从33％惨跌到20％，竞争对手百度则从43.4％飙升至55.3％。这样的尴尬结局着实富有讽刺意味。 &lt;/p&gt;&lt;p&gt;　　Google在中国的尴尬两年，已令Google创始人赛吉·布林感到懊悔不已。不久前他说：“Google在中国的做法，使它在美国及欧洲的声誉受到损害。”“词库门”事件的频频升级，想必也坚定了他的判断。  &lt;/p&gt;&lt;p&gt;　　前后600天，李开复和他的谷歌到底经历了哪些事情，竟然走到了难以收场的地步？Google在中国难道要重蹈雅虎、Ebay等国外公司类似的命运？Google如何避免“中国式失败”？种种话题，也引起了业内的激烈争论。  &lt;/p&gt;&lt;p&gt;　　&lt;b&gt;“词库门”事件始末&lt;/b&gt;  &lt;/p&gt;&lt;p&gt;　　一切都要从“词库门”事件说起。这一事件不仅激发了搜狐与Google两个公司之间的口水战，也暴露了谷歌各方面深层次的危机。  &lt;/p&gt;&lt;p&gt;　　导火索源于4月4日。当日上午，谷歌在京发布了输入法产品。以往Google发布新产品大多比较低调，但这次却不同，李开复采取的是“高调曝光”的策略。大概在他看来，谷歌输入法显然是本土化战略中的重要一环。  &lt;/p&gt;&lt;p&gt;　　但事件的发展很快就出乎了李的意料。当日下午，业内几大论坛就出现了关于Google涉嫌抄袭搜狗输入法词库的质疑。  &lt;/p&gt;&lt;p&gt;　　早在一年前，搜狐就推出了搜狗输入法产品。质疑者发现，谷歌输入法词库不仅与搜狗输入法高度重合，而且完全是抄袭搜狐输入法，证据确凿，谷歌无法自圆其说。  &lt;/p&gt;&lt;p&gt;　　以独特创新而闻名全球的Google，居然会抄袭一家中国公司的产品！这样的消息无疑振聋发聩。很快，各大网络媒体以及众多博客就出现 了质疑Google的声音，一些Gfans（Google爱好者）则奋力反击。一时间，互联网硝烟弥漫，网民与网民之间，搜狐与谷歌之间的口水战由此揭 开。 &lt;/p&gt;&lt;p&gt;　　随即，谷歌通过自己的网络“黑板报”发出一份文字声明，承认词库确实包含了一些非Google的数据源，并向用户及搜狐公司等表示歉意。但这种“害羞”的道歉并没有得到搜狐的原谅。  &lt;/p&gt;&lt;p&gt;　　4月8日，搜狐正式发表公开声明，谴责Google盗用其开发的搜狗拼音输入法词库的“不道德行为”，要求Google立即停止这一行为，并声称谷歌道歉缺乏诚意，要求保留采取进一步行动的权利。  &lt;/p&gt;&lt;p&gt;　　4月9日，搜狐公司CEO张朝阳更明确提出：谷歌不仅盗用了搜狐的词库，更剽窃了搜狐将搜索与输入法结合的创意，谷歌必须停止输入法产品的下载服务。  &lt;/p&gt;&lt;p&gt;　　在整个口水战的过程中，一些意外插曲也让谷歌的名声进一步蒙羞。知名博客王小峰（按摩乳）提及谷歌公关公司和他接触的细节，令许多网民吃惊不已。随后更有爆料者称，谷歌为了请奥美公司进行危机公关，耗资达120万元。  &lt;/p&gt;&lt;p&gt;　　由此导致的恶劣影响可想而知。Google在国内的公关形象一直被坊间形容成“无比贞烈”，而在“词库门”后，这一公关形象已荡然无存。  &lt;/p&gt;&lt;p&gt;　　这一事件也折射出了谷歌的众多管理问题：输入法产品从立项到推出历经了很长的一段时间，为何直接盗用竞争对手词库的事情，上层却毫不知情？谷歌发布这款本无创意的跟风产品，为何会选择高调方式，这无疑把自己推向了舆论的风口浪尖。  &lt;/p&gt;&lt;p&gt;　　更有舆论指出，李开复在谷歌的600多天，仅仅是忙于经营个人品牌，而对搜索业务很少过问，甚至对搜索了解甚少。因为这一年来，李开复忙于在各个高校巡出演讲，但谷歌的产品却几乎不见改善。  &lt;/p&gt;&lt;p&gt;　　&lt;b&gt;本土化“地雷”&lt;/b&gt;  &lt;/p&gt;&lt;p&gt;　　实际上，在过去两年，谷歌也推出了一些的本土化措施，但遗憾的是，这些措施也和谷歌输入法一样，不仅没有使Google在中国获得应有的尊重，反而招来了Gfans们的诸多抱怨。  &lt;/p&gt;&lt;p&gt;　　2005年年底，告别官司的李开复决定在中国公司大肆招兵买马。从那时起，他帮助Google中国做了以下几件事：一是在中国启动域名Google.cn，一是给自己取了个中文名字“谷歌”，还有就是推出导航网址，以及最近的输入法产品。  &lt;/p&gt;&lt;p&gt;　　但是，这些动作无不遭到了激烈的批评：独立域名被视为Google为应对中国国情而推出阉割版，违背了“不作恶”的原则：“谷歌”的名字更是被Gfans们千夫所指；模仿hao123推出的导航网站草草收场；而输入法产品则倒在了搜狐的脚下。  &lt;/p&gt;&lt;p&gt;　　这期间，谷歌也做了另外一些事情。比如投资国内最大的下载网站迅雷，与中国移动签订合作拓展无线互联网搜索市场等。这些事情尽管对长期有益，但由于产品开发进度缓慢，并不能从根本上扭转谷歌在搜索市场的颓势。  &lt;/p&gt;&lt;p&gt;　　相比之下，谷歌的竞争对手们的产品却不断推陈出新，而且更有创新味道。百度推出了新闻、博客、视频、虚拟货币等众多新产品，用户黏合度进一步得到提高；雅虎中国经过一年震荡后也推出了“百业窗”等多种产品；搜狗推出的输入法也使其获得颇高的美誉度。  &lt;/p&gt;&lt;p&gt;　　而Google在华两年最大的“成绩”，就是让国内信徒们的梦想幻灭。甚至连业内知名博客洪波最近也私下称，他信仰的是美国的Google，而绝不是中国的谷歌。  &lt;/p&gt;&lt;p&gt;　　“本土化，应该是在了解本土用户消费心理的基础上进行的创新服务，而不仅仅是模仿。个人认为Google在对本土用户的了解方面还有很大距离。”4月10日，塞迪顾问分析师常燕杰接受《财经时报》采访时，对谷歌过去两年本土化战略作出了消极的评价。  &lt;/p&gt;&lt;p&gt;　　更有业内人士认为，谷歌最大的失败是误把国际化当成了本土化。李开复来到中国，也把美国式的松散管理带入中国，但这种美国文化在中国其实行不通。否则就很难理解，为何在过去600多天内，谷歌几乎没有推出一项像样的产品。  &lt;/p&gt;&lt;p&gt;　　&lt;b&gt;根源在于战略摇摆&lt;/b&gt;  &lt;/p&gt;&lt;p&gt;　　4月10日，易观国际CEO于扬在接受《财经时报》采访时认为，谷歌在过去600天的总体表现确实很失败。但究其根源，谷歌并非本土化做得不好，而是其品牌及战略摇摆不定导致。  &lt;/p&gt;&lt;p&gt;　　于扬认为，由于谷歌是舶来品。因此无论它叫“Google”还是“谷歌”，都很难为国内普通老百姓所接受，谷歌想走草根化路线难度很大，国内三四级城市的网民很难接受。  &lt;/p&gt;&lt;p&gt;　　Google的优势在于，它在高端用户心目中享有极高的口碑，Gfans对Google情有独钟。于扬认为，这就注定Google在中 国一开始就面临两难选择：如果继续满足高端用户，那么三四级城市的低端用户就会失去；假如走草根化，满足低端用户的需求，又会伤害高端用户的感情。 &lt;/p&gt;&lt;p&gt;　　“谷歌总要牺牲一方。它正确的做法应该是先满足高端用户，在巩固这个市场之后，再逐渐渗透低端市场。”于扬认为，从谷歌中国过去两年的表现来看，它们的做法恰好相反，无论是取名、推网址还是输入法，都更像是争夺低端市场。  &lt;/p&gt;　　于扬总结说，谷歌的失败在于，它没有搞清品牌战略和定位问题，因此也没有搞清楚自己的用户群，自然也就难以制定出合适的战略。“战略就是取舍，是决定做什么和不做什么，谷歌却眉毛胡子一把抓，结果就是流量不断地失去，用户喜好度不断下降。”&lt;br /&gt;　　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2868307214889311554?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2868307214889311554/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2868307214889311554' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2868307214889311554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2868307214889311554'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/google_15.html' title='Google在中国的尴尬两年 误把国际化当成本土化'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-5593580884712802897</id><published>2007-04-11T08:31:00.000+08:00</published><updated>2007-04-11T08:32:33.393+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>为何不使用spring、struts2、easyjweb等开源框架</title><content type='html'>该不该使用各种各样的开源框架,我想这是很多程序员自己也困惑的问题。有的由于对框架的不熟悉，有的是为了程序的优化，还有一些就是觉得开源框架用起来不顺手。&lt;br /&gt;　　关于这个问题，一个在政府做技术主管的朋友这样说：&lt;br /&gt;“1年前,我非常疯狂的喜欢spring velocity webwork struts ....只要是开源的我都忍不住去试着用用。我也在很多项目中使用一些开源技术，其结果是大家怨声多于表扬。其实不是这些技术不好，是我们不会合适去应用。&lt;br /&gt;　　我一直在思考一个问题.是不是我们太热衷于“实现”而忘记了“设计”，我最近几天的思考的问题是：“jsp+javabean”其实也是个好框架，关键在于你如何去应用好设计模式。” &lt;p&gt;    　我认为关键还是要在于我们对这些框架的掌握程度。再好的技术,再好的框架,再简单易用的东西,肯定都有一定的门槛，都存在一定的学习曲线．框架封装了很多底层的东西，尽管其没有限制我们在框架中自己应用一些底层的，但大多数时候我们仍然不知道如何着手．&lt;br /&gt;    "大家怨声多于表扬"，之所以这样，我觉得还是他们对框架的核心掌握得不透彻所至．程序员的一个成就感及自豪感，来源于程序员自生对系统、对电脑的一种控 制力．也就是：＂我想让他干嘛就干嘛＂．普通的jsp+javabean，这是最简单的．当然也最容易“控制”．尽管控制他做的事情可能并不强大，写出的 东西有可能难以维护、扩展，但始终是“控制”了。因此，大家很喜欢。&lt;br /&gt;    而使用其它框架，很多基础的控制交由了这些框架处理了，尽管这些框架提供了很好的基础平台，好的设计模式供我们使用，但需要我们首先对他有一个比较深入的 理解。否则就谈不上控制，只能照猫画虎般的照着做．一但程序出来的不是我们想要的东西，一但人机交互的结果出现偏差，很多时候就让我们无能为力。在现实 中，不是所有使用的这些框架的人，都熟悉这些框架的原理及内核，都能控制这些框架工作，一但有一些不愉快的尝试，怨声多于表扬也就难免了．&lt;/p&gt; &lt;p&gt;    总结志来就是：再好的屠龙刀，只有我们对其非常熟悉、并对其有一种控制能力以后，使用起来才会得心应手，否则更多的人宁愿选择使用自己砍的木棍，虽然威力 差一点，但于少能用他来把一些阿猫阿狗或者是街头混混唬住．当然，也有练到手中没刀，心中有刀的，比如小马哥，此时选择使用什么都无所谓了．&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-5593580884712802897?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/5593580884712802897/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=5593580884712802897' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5593580884712802897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5593580884712802897'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/springstruts2easyjweb.html' title='为何不使用spring、struts2、easyjweb等开源框架'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-6062821892970089337</id><published>2007-04-10T08:47:00.000+08:00</published><updated>2007-04-10T08:48:33.666+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google测试语音本地搜索服务 挑战黄页</title><content type='html'>北京&lt;a href="http://weather.qq.com/preend.htm?dc125.htm" target="_blank"&gt;&lt;img alt="点击查看北京及更多城市天气预报" src="http://weather.qq.com/images/endnew/weather_icon.gif" border="0" /&gt;&lt;/a&gt;时间4月7日消息 本周五，Google宣布测试手机语音识别服务，用户可以就可以查询本地信息。此举，将对电话黄页目录服务商发起挑战。   &lt;p style="text-indent: 2em;"&gt;现在，Google邀请美国用拨打1-800-GOOG-411 (1-800-466-4411)，以测试免Google Voice Local Search提供的费语音激活服务。GOOGLE指出，“使用这项服务，你可以在Google地图上快速地得到本地信息。你无需电脑，也无需互联网接入， 你甚至不需要手机键盘。” &lt;/p&gt;  &lt;p style="text-indent: 2em;"&gt;就在此前，微软宣布以8亿美元的价格收购语音搜索服务商Tellme Networks。这也是微软在近五年内的最大一起收购。改善服务质量、降低搜索技术价格，都在不断推动微软、Google和雅虎等由网络广告市场向付费呼叫市场过渡。 &lt;/p&gt;  &lt;p style="text-indent: 2em;"&gt;Kelsey Group组织的分析师预测，美国的目录服务市场每年的收入为94亿美元。在全球，由Opus Research组织提供的数据显示，市场规模达到了130亿美元。 &lt;/p&gt;  &lt;p style="text-indent: 2em;"&gt;用户可以通过手机或是固定电话使用Google语音本地搜索服务。手机用户可以通过发送文本信息获得列表内容。Google表示，要通过计算机系统优化这项服务，增强对用户要求的识别能力。目前，语音本地搜索服务仅在美国推出，也仅提供美国本地厂商的列表。(靳生玺) &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-6062821892970089337?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/6062821892970089337/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=6062821892970089337' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6062821892970089337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6062821892970089337'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/google_9053.html' title='Google测试语音本地搜索服务 挑战黄页'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3501227522473058423</id><published>2007-04-10T08:45:00.001+08:00</published><updated>2007-04-10T08:45:37.931+08:00</updated><title type='text'>Google推个性化地图新服务 让用户画新地图</title><content type='html'>&lt;p&gt;Google公司日前推出一项新服务，可以让用户们在其在线地图上自己画新地图。 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;作为周二推出的新计划的一部分，Google将为人们提供免费工具软件以便人们创建一些个性化地图，那些地图或者是人们根据对周边的了解而画，或者是人们最喜欢去的地方，那些地图可以将所有相关的信息都集中起来。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;绘制地图的人可以选择将信息公开或者保密。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;现在已经可以从网络上获得大量的mashup，它们是由数千张混合地图组成，上面记载了从当地房地产市场到附近火山活动的所有信息。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;但是要将所有的信息都整合到一幅在线地图上往往需要人们具备一定的计算机编码知识和技术。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;Google已经根据众多用户的要求修改了它的工具，将制作地图mashup的操作简化到只需点击几下鼠标那样简单。Google公司希望简化了操作之后可以让无数的网民都能制作出无数可以保存在其搜索索引中的高度专业化地图。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;到目前为止，Google为驾驶导航和商务查询服务提供的地图都已经有两年没有更新了。Google地图产品经理杰西卡李认为，让用户制作地图将有助于为其他用户提供更新的地图。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;李说：“这是一个巨变，即便现在我们放开与所有开发商的合作关系，我们也永远无法绘制出象我们的用户们画出的那样高质量、有水准的地图。”&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;在测试这些新工具的时候，Google自己的工程师分别绘制了美国66号公路、夏威夷群岛中的考艾岛、职业联盟棒球馆以及2004年总统大选时使用的各种投票图案。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;如果Google可以成功地建立起一个海量个性化地图的数据库，它的网站将会变得更加流行。如果得偿所愿，Google将拥有更多做网络广告的机会。去年它在网络广告上的纯利润达到了31亿美元。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;这项服务还可以提高Google旗下YouTube网站的流量，因为新工具中有一项功能是将YouTube上面的视频嵌入个性化地图之中。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;据comScore公司提供的最新统计数据显示，Google地图已经吸引了大量的流量，仅 今年2月份它的美国网民访问量就达到了2220万人次。Google地图也因此跻身同类排名的第三位，仅次于美国在线的Mapquest服务（4510万 人次）和雅虎（2910万人次）。地图mashup的概念最初是由一位名叫保罗拉德马赫的计算机动画片制作工程师推广开来的。Google公司因此聘请拉 德马赫到其地图部门工作。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3501227522473058423?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3501227522473058423/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3501227522473058423' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3501227522473058423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3501227522473058423'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/google_10.html' title='Google推个性化地图新服务 让用户画新地图'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-5729348901864028037</id><published>2007-04-10T08:42:00.000+08:00</published><updated>2007-04-10T08:44:49.949+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>提倡公司员工平等主义 Google创始人年薪1美元</title><content type='html'>对于一个上市不到3年来股价增长近5倍、创造出1000多亿美元市值的公司来说，它的管理层薪水应该会拿到怎样一个天文数字呢？美国搜索引擎巨头谷歌 (google)公司4月4日提交的财务报告向人们揭出了谜底。根据这份报告，谷歌现任首席执行官和公司的两名共同创始人2006年一整年的薪水只有1美 元。&lt;br /&gt;&lt;br /&gt;　　&lt;strong&gt;三巨头全是1元&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　　这三人分别为谷歌现任首席执行官埃里克·施密特、公司创始人拉里·佩奇和谢尔盖·布林。据悉，施密特、佩奇和布林去年全年从公司获得的总收入分别为55.74万美元、3.85万美元和1724美元。其中，3人的薪水均为1美元。&lt;br /&gt;&lt;br /&gt;　　由于施密特担任首席执行官，他从公司获得的收入高于两名创始人，但55万多美元收入中，有53万多美元为个人安保补贴；佩奇虽总收入高于布林，但绝大部分收入为个人交通补贴，布林的收入更是只包括1美元薪水和1723美元奖金，其中包括1000美元休假奖金。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;　　他们其实富可敌国&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　不过，他们确实有底气接受这种相对较低的待遇，因为如果把手中的公司股票资产算上的话，他们每个人都拥有富可敌国的财富。&lt;br /&gt;&lt;br /&gt;　　根据《福布斯》杂志3月份出版的最新排名，布林佩奇以166亿美元并列美国亿万富翁排行榜第26位，施密特则排在第116位。&lt;br /&gt;&lt;br /&gt;　　美联社说，谷歌公司2004年8月上市以来，这3名公司高管始终在公司内部倡导一种平等主义氛围，除公司开出的象征性收入外，他们拒绝接受更多薪金待遇。在这种氛围下，不管公司高层还是普通职员，所有1万多名员工每年享受到的休假奖金均为1000美元。&lt;br /&gt;&lt;br /&gt;　　根据谷歌公司提交证券交易委员会的报告，公司决策层已经同意在2007年继续“享受”全年1美元的薪水待遇，拒绝“涨薪”。据悉，除施密特、佩奇和布林外，谷歌公司已经有几百名员工成为百万富翁。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-5729348901864028037?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/5729348901864028037/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=5729348901864028037' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5729348901864028037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5729348901864028037'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/google1.html' title='提倡公司员工平等主义 Google创始人年薪1美元'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2952594796865475678</id><published>2007-04-10T08:41:00.000+08:00</published><updated>2007-04-10T08:42:07.241+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>雅虎两大遗憾：未收购Google又错过Facebook</title><content type='html'>4月6日消息，据国外媒体报道，在雅虎的历史上，没有收购Google是一大遗憾。而分析师日前又指出，错过Facebook将成为雅虎的另一大个遗憾。 &lt;p&gt;　　2001年，雅虎原本有机会收购Google，但雅虎并未抓住。如今，投资机构Needham分析师马克·梅又认为，雅虎现在又犯了同样的错误，那就是没有收购Facebook。&lt;/p&gt; &lt;p&gt;　　受Google并购YouTube的影响，去年10月曾有消息称，雅虎将以10亿美元收购美国第二大社交网站Facebook，但遭到Facebook的拒绝。去年11月，又有报道称，雅虎有意以16.2亿美元收购Facebook。但最终，雅虎还是空手而归。&lt;/p&gt; &lt;p&gt;　　马克认为，雅虎的报价过低。目前，Facebook经拥有2100万注册用户，其中93%为活跃用户，60%的用户至少每天访问网站一次。Facebook每年的页面访问量（PV）是雅虎预期的2倍还多。&lt;/p&gt; &lt;p&gt;　　当初，雅虎预计Facebook每位用户的月PV为1061，而事实上应该为2329。据业内人士预计，Facebook目前的市值约为32亿美元。而Facebook的创始人Peter Thiel则认为，应该值80亿美元。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2952594796865475678?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2952594796865475678/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2952594796865475678' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2952594796865475678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2952594796865475678'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/googlefacebook.html' title='雅虎两大遗憾：未收购Google又错过Facebook'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-1482242925580873810</id><published>2007-04-10T08:40:00.000+08:00</published><updated>2007-04-10T08:41:13.778+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google工程师透露海缆中断未造成太大损失</title><content type='html'>　4月6日消息，Google(谷歌)资深软件工程师谷雪梅透露，Google在全球很多地方建有数据中心，因此去年发生的海缆中断并未给Google造成太大损失。&lt;br /&gt;&lt;br /&gt;　　去年12月26日台湾南部海域发生了里氏7.1级地震，损坏了通过台湾和菲律宾之间吕宋海峡的7条海底光缆，导致大陆、港台、日本、新加坡和韩国等地区的通讯中断。&lt;br /&gt;&lt;br /&gt;　　由于地震导致我国出口海底光缆受损，国外网站基本都不能访问，像MSN和hotmail曾经很多天不能正常使用，而Google的访问一直基本保持正常。&lt;br /&gt;&lt;br /&gt;　　谷雪梅向新浪科技透露，虽然没有在中国大陆设置数据中心，但是Google在我国香港、日本和印度等都有数据中心。&lt;br /&gt;&lt;br /&gt;　　“当时很多用户都是不经海缆出口，而是直接访问离我国很近的印度数据中心的内容，”谷雪梅表示，一处数据中心或者链路受损，用户便会自动访问其它最近的数据中心。&lt;a href="http://www.enet.com.cn/"&gt;&lt;img src="http://images.enet.com.cn/end.gif" target="_blank" align="absmiddle" border="0" height="11" width="11" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-1482242925580873810?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/1482242925580873810/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=1482242925580873810' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1482242925580873810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1482242925580873810'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/google.html' title='Google工程师透露海缆中断未造成太大损失'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7026078182086425510</id><published>2007-04-10T08:38:00.000+08:00</published><updated>2007-04-10T08:40:42.269+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Vista爆安全漏洞 专家警告慎装Google输入法</title><content type='html'>CNET科技资讯网 4月6日北京报道(孙莹) 面对Google最新发布的谷歌输入法1.0版，安全专家今日发出警告：Vista用户请不要安装，否则将会造成严重的系统漏洞。 &lt;p&gt;　　反病毒专家透露，由于微软Vista操作系统输入法接口存在本地登录权限提升漏洞，Vista用户如果输入法默认状态设置为谷歌拼音或极点中文输入法，Vista系统登录密码将形同虚设，电脑可轻易被他人操控，黑客和病毒可以据此获得系统管理权限，进行多种危险操作。&lt;/p&gt; &lt;p&gt;　　瑞星安全专家分析，黑客可以利用该漏洞在无管理员密码的情况下登录系统，获得系统SYSTEM权限，从而完全控制&lt;span class="yqlink"&gt;&lt;form class="yqin" action="http://www.iask.com/n" method="post"&gt;&lt;input name="k" value="%B2%D9%D7%F7%CF%B5%CD%B3" type="hidden"&gt;&lt;/form&gt;&lt;a href="http://www.iask.com/n?k=%B2%D9%D7%F7%CF%B5%CD%B3" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="操作系统"&gt;操作系统&lt;/a&gt;&lt;/span&gt;，他们可以删除文件、格式化硬盘、安装木马……，使得Vista的安全机制行同虚设。谷歌&lt;span class="yqlink"&gt;&lt;form class="yqin" action="http://www.iask.com/n" method="post"&gt;&lt;input name="k" value="%CA%E4%C8%EB%B7%A8" type="hidden"&gt;&lt;/form&gt;&lt;a href="http://www.iask.com/n?k=%CA%E4%C8%EB%B7%A8" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="输入法"&gt;输入法&lt;/a&gt;&lt;/span&gt;刚刚发布，网上就出现了利用该漏洞攻击Vista系统的"教程"，即使不懂电脑的人，也可以按照这些操作取得管理员权限。&lt;/p&gt; &lt;p&gt;　　金山毒霸反&lt;span class="yqlink"&gt;&lt;form class="yqin" action="http://www.iask.com/n" method="post"&gt;&lt;input name="k" value="%B2%A1%B6%BE" type="hidden"&gt;&lt;/form&gt;&lt;a href="http://www.iask.com/n?k=%B2%A1%B6%BE" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="病毒"&gt;病毒&lt;/a&gt;&lt;/span&gt;工程师李铁军指出，如果将Google拼音或极点中文输入法安装到Vista上，并设置为缺省状态，将重现当年Windows2000输入法漏洞，恶意用户可以利用该漏洞在没有获得本机用户许可的情况下，入侵用户电脑。&lt;/p&gt; &lt;p&gt;　　据介绍，Windows 2000系统也曾因为输入法漏洞而出现过类似问题，在默认安装的情况下，Windows 2000中的简体中文输入法不能正确地检测当前的状态，导致在系统登录界面中提供了不应有的功能。进而，一些别有用心的用户可以通过直接操作该计算机的键 盘得到当前系统权限，运行他选择的代码、更改系统配置、新建用户、添加或删除系统服务、添加、更改或删除数据，或执行其他操作。后来微软发布了专门的补丁 程序。&lt;/p&gt; &lt;p&gt;　　安全专家指出，目前看来，Vista系统在防止输入法漏洞方面并没有得到改善，仍然十分容易遭到某些安全性能低下的输入法影响。从前段时间大家 所关注的ANI漏洞到输入法漏洞，表明Vista在某些方面延续了Windows 2000、XP等"前辈"的缺点，因此其宣称的"划时代"的安全性，实在不能让人放心。&lt;/p&gt; &lt;p&gt;　　对于此安全漏洞，专家比喻成门和门框之间出现的缝隙，微软和Google都有一定责任。此外，Vista上的这类漏洞不仅在谷歌输入法上存在， 其它输入法软件同样可能形成这样的漏洞。截止目前，Google已经发布了相关补丁，但由于部分Vista用户不能及时下载补丁或某些输入法仍存在此漏 洞，漏洞仍然会给Vista用户带来一定的风险。&lt;/p&gt; &lt;p&gt;　　安全专家建议用户，一方面立即下载Google发布的相关漏洞补丁，同时，最好也是最直接的办法是在Vista上使用系统自带的输入法软件，或者等待微软发布补丁程序，以及输入法提供商发布不存在漏洞的新版本。 &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7026078182086425510?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7026078182086425510/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7026078182086425510' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7026078182086425510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7026078182086425510'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/04/vista-google.html' title='Vista爆安全漏洞 专家警告慎装Google输入法'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3845600382144865521</id><published>2007-03-30T17:12:00.000+08:00</published><updated>2007-03-30T17:19:17.065+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google公司十大彩色幽默</title><content type='html'>发生在Google公司的幽默，就像Google公司的标志一样，斑斓多彩。&lt;br /&gt;&lt;br /&gt;　　第一，CEO教秘书使用传真机。&lt;br /&gt;&lt;br /&gt;　　一位刚到公司上班的秘书在一台传真机面前看上去很困惑，这时候来了另一位准备发传真的同事，他就耐心地帮助这位秘书发了传真，并教她如何使用这个复杂玩意。这位秘书十分感谢此兄，就问他怎么称呼，他说自己叫施密特。&lt;br /&gt;&lt;br /&gt;　　施密特是Google公司的CEO。在Google公司，每个人的所有事情都得自己做，包括CEO。&lt;br /&gt;&lt;br /&gt;　　第二，Google牌的颜色汽水。&lt;br /&gt;&lt;br /&gt;　　每年4月1日愚人节，Google公司的天才们都会想出一些怪招来幽大家一默，其中一个是Google牌的颜色汽水，据说有人还把这些子虚乌有的东西拿到eBay上去拍卖!&lt;br /&gt;&lt;br /&gt;　　在月球上建立研发中心是另一个愚人玩笑，还真有人上当了，要申请加入Google未来的月球研发中心。&lt;br /&gt;&lt;br /&gt;　　第三，愚人节后遗症波及Gmail。&lt;br /&gt;&lt;br /&gt;　　愚人节玩笑开多了，真的都被当成了假的。Gmail正好在4月1日发布，很多人以为这又是Google这帮聪明家伙的玩笑，而且，那时候并没有企业曾经免费提供如此大容量(1GB，现在超过了2GB)的邮箱。&lt;br /&gt;&lt;br /&gt;　　最初，这个消息甚至被不少内部员工也认为是假消息，可见愚人节玩笑后遗症之“流毒”深远矣。&lt;br /&gt;&lt;br /&gt;　　第四，足不出户轻松度过一个月。&lt;br /&gt;&lt;br /&gt;　　一位刚加入Google的新员工，由于尚未租到房子，就在公司生活了一个月。他的生活远比汤姆·汉克斯在机场(一部电影的情节，记不得名字 了)的生活爽得多。一日三餐自然不用愁，到处都是可以睡觉的舒服的沙发，洗澡可以在十分高级的洗手间完成，锻炼身体可以去折腾游泳机和跑步机，偶尔还可以 在钢琴室里活动活动手腕，比在自己家里还悠哉。据说他居然做到了一个月足不出户!&lt;br /&gt;&lt;br /&gt;　　第五，一百英尺之内必有食物。&lt;br /&gt;&lt;br /&gt;　　一百英尺之内必有食物!这是Google内部一条规矩。一位工程师觉得并没有做到这一点，就量了一下他与最近的食物之间的距离，果真发现超过 了100英尺，距离是120英尺。于是他幽默地要求后勤部门改进自己的服务，对方的回答十分经典:你的头顶就是餐厅，距离你绝对没有超过100英尺!&lt;br /&gt;&lt;br /&gt;　　第六、超乎想像的招聘技巧。&lt;br /&gt;&lt;br /&gt;　　如果你是互联网上的名人或技术高手，那么你很有可能已经被Google的HR盯上了。他们会使用一个小伎俩:每当你用Google搜索自己的 名字时，就可能在搜索结果页面上出现一个小提示――“你愿意加入Google吗”(Do you want to join Google)。&lt;br /&gt;&lt;br /&gt;　　Google曾经在通往硅谷的高速公路上打了一个巨幅广告牌，上面只有一个简单的题目，很多路过的工程师可能比较好奇，就会试图解答出这个题目。等解答出这个题目后，将其答案输入浏览器地址栏，就进入了Google公司的招聘页面。&lt;br /&gt;&lt;br /&gt;　　第七，CEO与工程师共享办公室。&lt;br /&gt;&lt;br /&gt;　　CEO施密特刚刚加入Google时，Google所有员工都没有自己独立的办公室，但员工们还是觉得有必要给他老人家一个相对安静的办公场所，就给他安排了一个十分小的独立办公室。&lt;br /&gt;&lt;br /&gt;　　施密特不久就发现了自己的“特殊化”，于是他坚决要“跟群众打成一片”，在他的坚持下，于是他跟另外一个工程师共享了一个小办公室。所以，迄今为止，Google依然没有一个员工拥有独立办公室。&lt;br /&gt;&lt;br /&gt;　　第八，万圣节上的奶牛和麦当娜。&lt;br /&gt;&lt;br /&gt;　　Google公司的创始人与其他所有年轻人一样，都十分喜欢万圣节，并身体力行地在公司内部组织的万圣节上扮演千奇百怪的形象。其中最经典的两次是奶牛和麦当娜。&lt;br /&gt;&lt;br /&gt;　　这两次扮相都很夸张，那对母性的标志十分突出，以至于不少同事纷纷好奇地拽这对标志，情形十分好玩。&lt;br /&gt;&lt;br /&gt;　　第九，节约空间的游泳机。&lt;br /&gt;&lt;br /&gt;　　Google有不少游泳爱好者，但苦于公司已无地方建筑游泳池，于是一位Google员工根据跑步机的原理构想了一套游泳机方案:这个机器的 一侧不停地涌入循环水流，游泳者朝水流的相反方向去游，只要控制好水的流速，你永远游不到尽头。而恰好，居然有公司能够提供类似产品，于是Google就 定制了一套。&lt;br /&gt;&lt;br /&gt;　　第十，“跑腿”公司大行其道。&lt;br /&gt;&lt;br /&gt;　　王朔在《顽主》中描述的“三替公司”(好像是替人排忧、替人解难、替人铲事?呵呵)，绝对在Google这里能够揽到足够多的生意。Google公司花钱找了很多“跑腿”的公司和个人，帮助员工办理一些个人事务，如车辆维修、上牌照等，当然，这些对员工都是免费的。&lt;br /&gt;转自：IT人论坛&lt;br /&gt;朱三&lt;a href="http://www.enet.com.cn/"&gt;&lt;img src="http://images.enet.com.cn/end.gif" target="_blank" align="absmiddle" border="0" height="11" width="11" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3845600382144865521?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3845600382144865521/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3845600382144865521' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3845600382144865521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3845600382144865521'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_30.html' title='Google公司十大彩色幽默'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-1674244247060381033</id><published>2007-03-30T17:11:00.000+08:00</published><updated>2007-03-30T17:12:31.364+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>中文地标！在Google Earth中找《越狱》之路</title><content type='html'>片名：《Prison Break》  &lt;p&gt;　　译名：《越狱》&lt;/p&gt;  &lt;p&gt;　　地区：美国　类型：剧情类连续剧&lt;/p&gt;  &lt;p&gt;　　片长：从2005年8月29日起播出出品：福克斯(Fox)&lt;/p&gt;  &lt;p&gt;　　导演：桑福德-布克斯塔弗、博比-罗斯、布莱特-雷纳&lt;/p&gt;  &lt;p&gt;　　剧情简介：迈克尔-斯科菲尔德正陷于无望的困境中——他的哥哥林肯-巴罗斯被认定犯有谋杀罪被投入了福克斯河监狱的死囚牢。虽然所有的证据都指 出林肯就是凶手，迈克尔坚信兄长是无辜的。林肯的死刑执行日越来越逼近，在没有其他选择的情况下，迈克尔持枪闯入了一家银行，被捕入狱后来到了林肯的身 边。身为建筑工程师的迈克尔参与了监狱的改造工程而对这里了若指掌，他设计了完整的越狱计划，入狱的唯一目的就是要把林肯救出生天并还其清白。&lt;/p&gt;  &lt;p&gt;　　林肯的昔日女友维罗妮卡-多诺万是谋杀案的辩方律师，她相信林肯是被陷害的。在继续调查的过程中，维罗妮卡发现这远不是一桩单纯的谋杀案，被害 人之死牵扯了许多大人物的利益——副总统的身影渐渐从幕后显现。而随着调查的深入，危险也在迫近维罗妮卡，证人相继神秘被杀，林肯的家人也遭遇不幸，而追 杀维罗妮卡的神秘人物，竟然是联邦调查局的秘密探员。&lt;/p&gt;  &lt;p&gt;　　与此同时，迈克尔在狱中艰难地准备着越狱计划，意想不到的人和事接连出现在通向自由的道路上。&lt;/p&gt;  &lt;p&gt;　　随着《越狱》的热播，有网友用Google Earth搜索到了剧情中的实际地点。赶快拿来和大家分享。&lt;/p&gt;  &lt;p align="center"&gt;&lt;img alt="" src="http://pic.enorth.com.cn/0/02/15/06/2150670_071939.jpg" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;img alt="" src="http://pic.enorth.com.cn/0/02/15/06/2150671_878159.jpg" /&gt;&lt;/p&gt; &lt;br /&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://pic.enorth.com.cn/0/02/15/06/2150672_877003.jpg" /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://pic.enorth.com.cn/0/02/15/06/2150673_069534.jpg" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;img alt="" src="http://pic.enorth.com.cn/0/02/15/06/2150674_801864.jpg" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;img alt="" src="http://pic.enorth.com.cn/0/02/15/06/2150675_936033.jpg" /&gt;&lt;/p&gt;  &lt;div align="center"&gt; &lt;a href="http://www.enorth.com.cn/sys/viewpic/default.html?url=http://pic.enorth.com.cn/0/02/15/06/2150676_209617.jpg" target="_blank"&gt;&lt;img src="http://pic.enorth.com.cn/0/02/15/06/2150676_209617.jpg" border="0" width="500" /&gt;&lt;/a&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-1674244247060381033?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/1674244247060381033/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=1674244247060381033' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1674244247060381033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1674244247060381033'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google-earth_30.html' title='中文地标！在Google Earth中找《越狱》之路'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-4563272125108635916</id><published>2007-03-30T17:04:00.000+08:00</published><updated>2007-03-30T17:09:12.216+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>雅虎不限空间邮箱再革命？</title><content type='html'>&lt;span class="font14"&gt; 3月27日，雅虎公司宣布，将从五月份开始取消对免费邮箱用户的1G空间限制，用户可以彻底结束过去整理、删除邮件的历史。在邮箱服务即将迎来十岁生日的时候，雅虎公司用这样一个特殊的举动予以“祝寿”。可惜的是，中国和日本的用户此次暂时被排除在外。&lt;br /&gt;&lt;br /&gt;　　正如雅虎公司所表态，他们正在考虑面向中日市场的空间策略。基本上可以判断，不久之后，雅虎的不限空间邮箱也将正式向中国广大用户提供。&lt;br /&gt;&lt;br /&gt;　 　不限空间在门户免费电子邮箱服务的历史上，可谓一个里程碑式的事件。笔者认为，雅虎这一举动将对电子邮件服务市场产生革命性的影响，不论是在中国还是在 全球，不限空间将变成一种“标配”，而没有能力提供足够存储空间的电子邮件服务商将会退出市场。此外，不限空间的免费邮件将会进一步削弱收费电子邮件服务 的诱惑力和价值，让更多的用户从收费转向免费。&lt;br /&gt;&lt;br /&gt;　　从最初的4M，到100M，再到250M，最后到1G，雅虎公司邮箱容量的变化映 射着互联网免费邮箱服务竞争的轨迹，而容量不断升级的背后，是存储价格的不断下降。作为一个近距离观察的例子，我们可以看到PC所用的硬盘已经下跌到了每 G几元人民币的价格。对于雅虎、谷歌等腰缠万贯的门户巨头来说，海量存储的成本已经大大下降。&lt;br /&gt;&lt;br /&gt;　　在存储下降的同时，用户收藏的旧邮 件对于门户来说，不在是一个包袱反而是生财之道。最典型的莫过于谷歌公司，他们在每一封邮件正文旁插入了上下文相关的关键词广告，用户每一次阅读信件，带 给谷歌的是财富，用户保存的邮件越多，这种财富也越多。对于雅虎而言，即使不插入广告，用户在邮箱里停留的时间越长，其”眼球价值”也就越高，邮箱中的新 闻提示、产品提示以及广告链接插入都是开发资源的上佳形式。所以，旧邮件在当今来说，已经成为一种可以“盘活”的文本资源。&lt;br /&gt;&lt;br /&gt;　　存储的下降和旧邮件的新价值，可以说是雅虎取消空间限制的两大动机所在。实际上，谷歌公司最近取消了Gmail服务的邀请限制，面向全球用户开放，也是看到了免费邮箱服务对于各项门户服务的拉动能力。&lt;br /&gt;&lt;br /&gt;　 　笔者认为，按照互联网三巨头的竞争惨烈程度，谷歌微软公司取消空间限制将只是时间问题。实际上，取消空间限制带有一定的“噱头”意义。比如，雅虎公司邮 箱副总裁克雷默提到，监测表明许多用户使用的邮箱空间少于1G，因此，即使宣布取消限制，并不会给雅虎带来“洪水猛兽”般的用户负载。微软2G和谷歌 2.8G的空间之前已经领先于雅虎公司，这两家势必不会让雅虎的“不限空间”成为独家专利。&lt;br /&gt;&lt;br /&gt;　　雅虎以及三巨头可以预见的不限空间，势必对于国内免费和收费邮箱提供商造成冲击。&lt;br /&gt;&lt;br /&gt;　　中国的免费邮箱巨头网易公司，目前报出的空间上限高达3G。为了保持国内市场的老大地位，网易很可能也会抛出“不限空间”新政策。&lt;br /&gt;&lt;br /&gt;　 　随着网易163邮箱的Ajax化，免费邮箱的水准已经进入到一个全新的层次。实际上，笔者在使用网易邮箱时，并未感觉到和Gmail或者雅虎的明显区 别。反过来，国内一些冠之以“VIP”头衔的收费邮箱，使用体验甚至比网易免费差了一个档次，笔者不禁佩服这些提供商的收费“勇气”。&lt;br /&gt;&lt;br /&gt;　　以网易为代表的免费邮箱在杀毒、封杀垃圾邮件等方面已经具备了丝毫不弱于收费邮箱的水准。随着雅虎掀起的免费不限空间新高潮，收费邮箱的发展似乎已经到了尽头。&lt;br /&gt;&lt;br /&gt;　　综上所述，雅虎邮箱宣布取消空间限制，这对互联网邮箱服务将产生历史性的影响。雅虎和谷歌势必效仿，在中国，网易基本上也会跟进，其余实力不济的的免费邮箱提供商和各路底气不足的收费邮箱将会加速被用户淘汰。&lt;br /&gt;&lt;br /&gt;　　大约十年前，宁波小伙子丁磊开发的WEB软件在全中国“繁衍”了大大小小的免费邮箱提供商。十年之后，Ajax和不限空间将让邮箱服务向四、五家巨头集中。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-4563272125108635916?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/4563272125108635916/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=4563272125108635916' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4563272125108635916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4563272125108635916'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_9038.html' title='雅虎不限空间邮箱再革命？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-1038342096548692485</id><published>2007-03-30T17:02:00.000+08:00</published><updated>2007-03-30T17:04:47.664+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>比较Java EE 5平台和J2EE 1.4平台</title><content type='html'>本文对 JavaTM Platform Enterprise Edition 5 ("Java EE 5") 与 Java 2 Platform Enterprise Edition 1.4 ("J2EE 1.4") 二者的开发过程进行了比较，并演示了 Java EE 5 技术是如何简化 Java 应用程序的开发。为了显示新的开发模型比旧的模型更为简单，我们将使用 NetBeans IDE 5.5 创建一个应用程序，该应用程序与在使用 NetBeans IDE 5.0 开发 J2EE 应用程序的快速入门指南中创建的应用程序相同。 &lt;p&gt;　　在本文中，将创建一个用于访问数据库的 Web 应用程序。在该 Web 应用程序中，将使用 IDE 从数据库生成实体类，然后创建一个 Servlet 来显示信息。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;先决条件&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　本文假定您已具备了以下技术的一些基本知识或编程经验：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　Java 编程&lt;/li&gt;&lt;li&gt;　　NetBeans IDE&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　　&lt;strong&gt;本教程所需的软件&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在学习之前，您需要在计算机中安装以下软件：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　NetBeans IDE 5.5&lt;/li&gt;&lt;li&gt;　　Java Standard Development Kit (JDK) 版本 5.0 或版本 6.0&lt;/li&gt;&lt;li&gt;　　Sun Java System Application Server Platform Edition 9&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　　&lt;strong&gt;为 IDE 配置应用服务器&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在学习本教程之前，必须在 IDE 中注册 Sun Java System Application Server Platform Edition 9 的实例。在本练习中，我们将在 IDE 中注册 Sun Java System Application Server。&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　从主菜单中，选择“工具”&gt;“服务器管理器”。&lt;/li&gt;&lt;li&gt;　　单击“添加服务器”。选择 "Sun Java System Application Server"，并为此实例指定一个名称，然后，单击“下一步”。&lt;/li&gt;&lt;li&gt;　　指定应用服务器的安装目录(例如，C:\Sun\Appserver)。&lt;/li&gt;&lt;li&gt;　　将“注册本地缺省域”单选按钮保留为选中状态，然后选择一个域。&lt;/li&gt;&lt;li&gt;　　(可选)单击“下一步”，输入管理员用户名和口令。如果不希望在 IDE 用户目录中存储用户名和口令，可以将这些字段保留为空。IDE 将在每次需要此信息时提示您输入。&lt;br /&gt;　　注意：缺省管理员口令是 adminadmin。&lt;/li&gt;&lt;li&gt;　　单击“完成”。IDE 将注册该服务器，并在“运行环境”窗口的“服务器”节点下面列出该服务器。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　　&lt;strong&gt;建立 Web 应用程序项目&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在 NetBeans IDE 5.0 快速入门中，我们创建了一个具有 EJB 模块和 Web 模块的完整企业应用程序。之所以这样做是因为：在 J2EE 1.4 平台中进行开发时，必须将实体 Bean 和会话 Bean 放置在 EJB 模块中。要从 Web 模块访问实体 Bean，我们必须添加查询代码。&lt;/p&gt; &lt;p&gt;　　而在 Java EE 5 平台上开发的示例中，不需要开发完整的企业应用程序，因为我们不需要 EJB 模块或会话 Bean。只需创建一个简单的 Web 应用程序，然后将实体类直接放置在该 Web 应用程序中即可。&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　选择“文件”&gt;“新建项目”(Ctrl-Shift-N)。从 "Web" 类别中，选择“Web 应用程序”。&lt;/li&gt;&lt;li&gt;　　将项目命名为 CustomerBook，将服务器设置为 Sun Java System Application Server，将 Java EE 版本设置为 Java EE 5，然后单击“完成”。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　　&lt;strong&gt;对 Web 应用程序进行编码&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　与在 J2EE 1.4 平台中创建 Web 应用程序相比，在 Java EE 5 平台中进行 Web 应用程序编码要更快、更容易。但是我们仍然需要进行一些基本的设置，如建立数据库连接，但是在创建连接池和数据源后，开发工作会变得更容易，这是因为在 Java EE 5 平台中进行开发时，容器可以完成更多的工作。&lt;/p&gt; &lt;p&gt;　　由于容器具有持久性管理功能，因此，我们不需要编辑用来配置 CMP 映射或指定 finder 方法的部署描述符。实际上，我们在本示例中根本不需要任何部署描述符。在 Java EE 5 平台中，持久性不再局限于 EJB 组件。Java EE 5 引入了 Java 持久性 API，非 EJB 组件(如 Web 应用程序)也可以使用它。&lt;/p&gt; &lt;p&gt;　　此外，使用 Java EE 5 技术时，您不再需要 J2EE 1.4 开发中所需的许多样板代码。由于简化了 EJB 开发，因此只需很少的接口，查询也变得更为简单了，并且通过标注方式，组件定义和资源注入变得简单而清晰。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;管理持久性&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;　　在 NetBeans IDE 5.0 快速入门中，我们创建了 CMP 实体 Bean 并在 ejb-jar.xml 中定义了部署描述符，用来管理持久性和对象关系映射。在 Java EE 5 平台中进行开发时，我们不再需要使用部署描述符为容器提供管理持久性的信息，只需创建持久性单元，指定要使用的数据源和实体管理器，然后让容器完成管理实 体和持久性的工作即可。容器会在运行时发现实体 Bean。&lt;/p&gt; &lt;p&gt;　　持久性单元的创建可以通过在 persistence.xml 中定义来完成。如果项目或模块中不存在 persistence.xml，则需要创建该文件。可以通过“新建持久性单元”向导将持久性单元添加到项目中，该向导将有助于我们创建 persistence.xml 并定义持久性单元的属性。注意：也可以在“新建 - 实体类”向导中创建持久性单元。创建实体类时，如果不存在持久性单元，该向导将提示我们进行创建。&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　选择“新建文件”(Ctrl-N) 打开“新建文件”向导。&lt;/li&gt;&lt;li&gt;　　从“持久性”类别中，选择“持久性单元”，然后单击“下一步”。&lt;/li&gt;&lt;li&gt;　　保留向导建议的持久性单元的缺省名称。&lt;/li&gt;&lt;li&gt;　　使用“持久性提供程序”下拉列表中列出的 TopLink(缺省)。&lt;br /&gt;　　缺省提供程序是 TopLink Essential.jar。TopLink Essential.jar 包含了 Java 持久性的库。并且实体管理器位于 TopLink Essential.jar 中。&lt;/li&gt;&lt;li&gt;　　使用“数据源”下拉列表中列出的缺省 jdbc/sample 数据源。&lt;br /&gt;　　缺省数据源 jdbc/sample 用于连接到与 Sun Java System Application Server 捆绑在一起的 Java DB 数据库。&lt;/li&gt;&lt;li&gt;　　单击“完成”。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　　单击“完成”后，将为项目创建 persistence.xml，并在源代码编辑器中将其打开。通过单击源代码编辑器工具栏中的 "XML"，可以查看 persistence.xml 的 XML 视图。此文件包含了 Java EE 5 容器管理应用程序的实体和持久性所需的所有信息。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;创建实体类&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在 J2EE 1.4 平台中进行开发时，创建实体 Bean 后会将它们放置在 EJB 模块中，即使应用程序是简单的 Web 应用程序也是如此。每个实体 Bean 需要若干个接口，而且您必须在 ejb-jar.xml 中配置部署描述符以定义实体 Bean 以及每个实体 Bean 的接口、持久性和 finder 查询。&lt;/p&gt; &lt;p&gt;　　在 Java EE 5 中，我们可以使用简单的实体类，而且可以将实体类放置在 Java EE 5 应用程序中的任意位置，而不是创建实体 Bean 并将它们放置在 EJB 模块中。同时，为 Java EE 5 应用程序编写类要比在 J2EE 1.4 平台中编写类更容易，因为您可以使用标注来定义组件和注入资源。&lt;/p&gt; &lt;p&gt;　　现在我们将使用“新建 - 通过数据库生成实体类”向导来基于关系数据库创建实体类。&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　启动 Java DB 数据库，方法是：从主菜单中选择“工具”&gt;“Java DB 数据库”&gt;“启动 Java DB 服务器”。&lt;/li&gt;&lt;li&gt;　　选择“新建文件”(Ctrl-N) 打开“新建文件”向导。从“持久性”类别中，选择“通过数据库生成实体类”，然后单击“下一步”。&lt;/li&gt;&lt;li&gt;　　在“新建 - 通过数据库生成实体类”向导中，从“数据源”下拉列表中为数据库选择 jdbc/sample 数据源，并提供口令(如有必要)，口令应为 "app"。选择数据源后，将在“可用表”窗格中显示可用表的列表。&lt;/li&gt;&lt;li&gt;　　从“可用表”中选择 CUSTOMER 表，然后单击“添加”。&lt;br /&gt;　　单击“添加”后，还将添加与选定表关联的任何表。此外，在本示例 中，我们还需添加 DISCOUNT_CODE 表。DISCOUNT_CODE 表以灰色显示，这是因为 CUSTOMER 表引用了该表，而且必须生成它的实体类，这样才能生成 Customer 实体类。通过在“选定的表”窗格中将鼠标悬停在表名上，可以查看灰色显示的表是如何与选定表关联的。&lt;/li&gt;&lt;li&gt;　　单击“下一步”。&lt;br /&gt;　　向导将显示选定表及其任何关联表，以及将基于选定表创建的实体类。如果要修改将生成的类的名称，则可以在“类名”字段中键入名称。&lt;/li&gt;&lt;li&gt;　　指定 ejb，将其作为生成类的包，然后单击“完成”。&lt;/li&gt;&lt;/ul&gt; &lt;a href="http://searchwebservices.techtarget.com.cn/TLimages/picview/?/imagelist/2007/085/6qicv2vtw5c0.png" target="_blank"&gt;&lt;img alt="“新建 - 通过数据库生成实体类”向导" src="http://searchwebservices.techtarget.com.cn/imagelist/2007/085/6qicv2vtw5c0s.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;单击“完成”后，IDE 将为 CUSTOMER 表和与 CUSTOMER 表关联的表生成实体类。如果在“项目”窗口中展开 ejb 源包，则可以看到 IDE 在 Web 应用程序项目的 ejb 包中创建了 Java 类 Customer.java 和 DiscountCode.java。 &lt;p&gt;　　您可以看到 IDE 只创建了两个类(为每个数据库表创建了一个类)。在“使用 NetBeans IDE 5.0 开发 J2EE 应用程序的快速入门指南”中使用“通过数据库生成 CMP 实体 Bean”时，IDE 会为每个表创建四个类。&lt;/p&gt; &lt;p&gt;　　如果您在源代码编辑器中查看 Customer.java，则会注意到已使用了 @Entity 标注将类声明为实体类。其他标注还提供了附加信息，如实体类及其属性映射的数据库表和列。&lt;/p&gt; &lt;p&gt;　　您还会注意到，通常在实体 Bean 中找到的大部分样板代码都不见了。这是因为在 Java EE 5 中，实体类不再需要诸如 ejbRemove、setMessage、setSessionContext、ejbActivate 和 ejbPassivate 之类的方法。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;对 Servlet 进行编码&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　现在我们需要将 Servlet 添加到 Web 应用程序中。在 Java EE 5 中，我们不必将资源创建和查询代码添加到 Servlet 中，而是可以使用资源注入将这些工作交给容器来执行。可以使用标注将资源直接注入到 Servlet 中，并由容器来管理请求资源的创建和查询。在这种情况下，我们希望使用在持久性单元中指定的实体管理器。&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　在“项目”窗口中右键单击项目节点，然后选择“新建”&gt; "Servlet"。&lt;/li&gt;&lt;li&gt;　　在“新建 Servlet”向导中，将 Servlet 命名为 CustomerDetails，并将 Servlet 放入名为 web 的包中。单击“完成”。单击“完成”后，将在源代码编辑器中打开 CustomerDetails.java。&lt;/li&gt;&lt;li&gt;　　在源代码编辑器中打开的 CustomerDetails.java 上，单击鼠标右键，然后选择“持久性”&gt;“使用实体管理器”，将 PersistenceContext 注入类中。IDE 将添加以下标注，该标注用于指定 Servlet 使用的持久性单元。请在类声明之上添加此标注。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=";color:#f3f3f3;" bg&gt;@PersistenceContext(name = "persistence/LogicalName", unitName = "CustomerBookPU")&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　IDE 还将添加以下标注，用于注入管理事务边界的资源：&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;@Resource&lt;br /&gt;private UserTransaction utx;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　IDE 将在 Servlet 中添加以下缺省代码：&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;　　public void persist(Object object) {&lt;br /&gt;　　try {&lt;br /&gt;　　Context ctx = (Context) new InitialContext().lookup("java:comp/env");&lt;br /&gt;　　EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName");&lt;br /&gt;　　utx.begin();&lt;br /&gt;　　// TODO:&lt;br /&gt;　　// em.persist(object); utx.commit();&lt;br /&gt;　　} catch(Exception e) {&lt;br /&gt;　　Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);&lt;br /&gt;　　throw new RuntimeException(e);&lt;br /&gt;　　}&lt;br /&gt;　　}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　此代码用于查询 @PersistenceContext 定义的持久性单元和实体管理器的实例。&lt;/p&gt;&lt;p&gt;　在 CustomerDetails.java 中，将上面所显示的生成的查询代码修改为引用实体对象。完成后，经过修改的代码应如下所示(以粗体显示的代码表示已更改的行)： &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;&lt;strong&gt;　　public Customer findByID(Integer customerNr) {&lt;br /&gt;　　Customer customer = null;&lt;/strong&gt;&lt;br /&gt;　　try {&lt;br /&gt;　　Context ctx = (Context) new InitialContext().lookup("java:comp/env");&lt;br /&gt;　　EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName");&lt;br /&gt;　　utx.begin();&lt;br /&gt;&lt;strong&gt;　　customer = em.find(Customer.class, customerNr);&lt;br /&gt;　　utx.commit();&lt;/strong&gt;&lt;br /&gt;　　} catch(Exception e) {&lt;br /&gt;　　Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);&lt;br /&gt;　　throw new RuntimeException(e);&lt;br /&gt;　　}&lt;br /&gt;&lt;strong&gt;　　return customer;&lt;br /&gt;&lt;/strong&gt;　　}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;ul&gt;&lt;li&gt;　　取消注释 processRequest 方法中的代码并添加下面以粗体显示的代码：&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;    protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;        throws ServletException, IOException {&lt;br /&gt;        response.setContentType("text/html;charset=UTF-8");&lt;br /&gt;        PrintWriter out = response.getWriter();&lt;br /&gt;        out.println("&lt;html&gt;");&lt;br /&gt;        out.println("&lt;head&gt;");&lt;br /&gt;        out.println("&lt;title&gt;Servlet CustomerDetails&lt;/title&gt;");&lt;br /&gt;        out.println("&lt;/head&gt;");&lt;br /&gt;        out.println("&lt;body&gt;");&lt;br /&gt;&lt;strong&gt;        out.println("&lt;h1&gt;Search Customer Information&lt;/h1&gt;");&lt;br /&gt;        String customerNr = request.getParameter("customer_nr");&lt;br /&gt;        if((customerNr != null) &amp;&amp;amp; !(customerNr.equals(""))) {&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;strong&gt;            Customer customer = findByID(new Integer(customerNr));&lt;br /&gt;            if(customer != null){&lt;br /&gt;                out.println("Customer's info for nr. " + customerNr + ": " + customer.getName());&lt;br /&gt;            }else{&lt;br /&gt;                out.println("Customer not found.");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        out.println("&lt;form&gt;");&lt;br /&gt;&lt;/strong&gt;        out.println("Customer number: &lt;input type="'text'" name="'customer_nr'"&gt;");&lt;br /&gt;        out.println("&lt;input type="submit" value="Select"&gt;");&lt;br /&gt;        out.println("&lt;/form&gt;");&lt;br /&gt;        out.println("&lt;/body&gt;");&lt;br /&gt;        out.println("&lt;/html&gt;");&lt;br /&gt;        out.close();&lt;br /&gt;    }&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; 　　按 Alt-Shift-F 组合键生成所有缺少的 import 语句。&lt;br /&gt;　&lt;strong&gt;运行项目&lt;/strong&gt; &lt;ul&gt;&lt;li&gt;　　在“项目”窗口中，右键单击 "CustomerBook" 项目节点，然后选择“属性”。在“项目属性”对话框的“运行”窗格中，在“相对 URL”字段中键入 /CustomerDetails，然后单击“确定”。&lt;/li&gt;&lt;li&gt;　　右键单击项目节点，然后选择“运行项目”。IDE 将启动应用服务器、生成项目，并在浏览器中打开 CustomerDetails 页。&lt;/li&gt;&lt;li&gt;　　在“客户号码”字段中输入 ID 号(例如 "1")，然后单击“提交”。Servlet 将显示具有该 ID 号的客户名称。&lt;/li&gt;&lt;/ul&gt; &lt;p align="center"&gt;&lt;a href="http://searchwebservices.techtarget.com.cn/TLimages/picview/?/imagelist/2007/085/xy5h8mm08333.png" target="_blank"&gt;&lt;img alt="显示客户信息的 Servlet" src="http://searchwebservices.techtarget.com.cn/imagelist/2007/085/xy5h8mm08333s.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-1038342096548692485?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/1038342096548692485/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=1038342096548692485' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1038342096548692485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1038342096548692485'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/java-ee-5j2ee-14.html' title='比较Java EE 5平台和J2EE 1.4平台'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3390749701232380552</id><published>2007-03-30T17:01:00.000+08:00</published><updated>2007-03-30T17:02:29.182+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>微软，您的.net为中国程序员带来了什么？</title><content type='html'>&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;往事如烟：2003年，那时我还在 念大三，像中国大多数学生一样，为到底是投诚Java还是效忠.net日夜争论，上下求索，迷茫中特别渴望有一盏明灯照亮我辈学子的前程，当时，各大媒体 的报道是市场中.net和Java平分秋色，各领风骚，我的很多师哥多曾持此般言论：跟着微软有馒头吃，这些都或多或少的影响着我们的决择。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;我 的很多同学基本是选择了.net，原因大部分是相同的：首先，我们为学校免费开发的成绩查询系统、新闻发布系统等等基本上都是基于ASP+Sql Server的，因为他们好学好用，所以抱着老子是英雄，儿子是好汉的心态，进一步学习.net是水到渠成的事情。再次，.net学习资料，开发文档可谓 一应俱全，.net的开发过程也确实易于上手，比起我那帮学Ｊａｖａ的同学，一碰到问题就得翻遍整个互联网，成天恨得Ｊａｖａ咬牙切齿，我们是舒心多了。 最后，就是个人崇拜问题了，那时候大家都是学生，除了知道Windows和微软之外，Ｕｎｉｘ、Ｌｉｎｕｘ都只是美丽的传说，谁都不曾一睹芳容。微软就是 我们心中的太阳，其他的如Sun、Bea、Ｂｏｒｌａｎｄ之流都是些乌合之众，我们靠着微软的这棵大树好乘凉，好奔个灿烂的前程。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;毕 业后，就依靠.net这个武器拼杀于各个求职现场了，很多公司需要.net技术的，可都是些小公司，那些学Java的同学找的单位都是大公司，待遇不错， 发展前景也明朗得多，多年来学Ｊａｖａ的悲情苦恨似乎一下子就烟消云散了,而我们.net派则或多或少有点郁闷，但是我们还是一样斗志昂扬的猛虎出山了， 并笑言：三年后看我们如何用.net灭了那帮竖子。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;两年来在软件业的摸爬滚打，眼界大大拓展，同时对各个平台、编程语言有了较深入的了解，所以，今天我大胆发问：微软，您的.net为中国程序员带来了什么？只为当年我的那一腔赤诚，也为我今天的许多困惑。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;我 是学.net的，两年来我一直坚守着“嫁鸡随鸡，嫁狗随狗”的传统道德，对.net，对微软不离不弃，即便在前年那个.net权威向全世界质疑.net战 略时，我还是对.net忠心不二，并轻视那权威“竖子不足与谋”。可以说，.net信仰我一直没有丢失。我是用.net的，两年来我一直在努力学习和掌握 它各方面的知识，并对开源项目ＤＮＮ深入研究，为.net这么的强大功能、这么高的开发效率而自豪，可以说，.net技术水平我一直苦苦相随。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;而 这些年，.net给我带来了什么？不错，我先要感谢.net，通过它，我学到了很多东西，也顺利的找到了工作，目前月薪也翻了几番，在北京算个入门级的白 领，表面上不错，但请仔细来观察我的路程，两年来我所有从事的项目，没有一个是大项目，准确的说，没有一个是超过30万元的项目。为什么？不是兄弟我无 能，是你微软老兄不够努力，不够大度啊。你.net绑死在Ｗｉｎｄｏｗｓ操作系统下，可真正的企业级应用谁用你漏洞百出的服务器？因而也就没有重量级的用 户采纳你才华横溢的.net。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;说 句实话（我不怕招来无数板砖），.net无论是在语言设计、框架设计等各方面都比Java来得漂亮，是真正的后起之秀，在Ｓｔｕｄｉｏ环境下编程那是行云 流水，痛哉痛哉的事情，也许我是让微软惯坏了，每次我写Ｊａｖａ程序时，一打开Ｊｂｕｉｌｄｅｒ或者Ｅｃｌｉｐｓｅ时，那慢得如牛的启动速度，极不人性化 的操作就直皱眉头，可现实是，人家Ｊａｖａ比你.net混得滋润得多，因为人家大度，人家海纳百川，所以钱财滚滚。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;每 次我们去谈项目的时候，金融、电信行业的用户就明确表示不用.net，为什么？人家的服务器都是Unix的，.net在这里连生存的机会都被你微软自己掐 死了,我连给你分辩的机会都没有。中型企业呢？人家也是因为你的Windows服务器不争气，.net不能跨平台而弃之不用。至小型企业，或者稍微囊中羞 涩一点的中型企业,.net在这里倒混得有滋有味，可惜这些企业把钱看得比命还重要，开价低得你想哭。而他们的需求也往往简单，有个内容发布系统、留言系 统等差不多够了，这些东西在网上一搜一大把，而且都做得不含糊，用得着你开发吗?好不容易有个ＯＡ的单子吧，人家小企业根本就不懂软件开发，成天变需求， 这么个小单子可以把你呛得出血，人家还说怎么做这么个东西要这多么钱？这时候，我血涌上来了，当时就想全身捆着炸药包，往微软总部冲…&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;再 来横向比较.net在各个领域的应用吧。首先，在桌面应用上，Java就难以望其项背了，用.net开发效率远高于VC,而执行效率也不含糊，你要硬说是 Delphi的再生，我也一点意见没有，可还是不太成气候啊，弄弄小程序可以，可是你做产品，有用.net的么?为什么？大多数情况下要附带个.net framework包，2000以下的系统还没法用，而且很多系统功能.net确实没法完成，可以说，桌面开发上，很长一段时间仍然是VC的天下。Web 应用上，J2EE势不可挡，ASP.net尽管很优秀，但是由于整个生态环境不好，没有超强的服务器支撑，IIS在应用上差强人意，不能够跨平台，尽管在 小客户，轻量级应用上，ASP.net有点人气，但这不过是螳臂挡车，所以说Asp.net要与J2EE争锋，那是关公战华雄，高下立判。还有一个重要的 领域，就是移动开发了，这点我现在天天祈祷，微软可千万不要软下来了，终端应用一直是你微软的强项，目前表现还算是可圈可点，你要是.net在这方面也输 给了J2ME，我只好另投名主了。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;综 上所述，目前.net在应用中处于一个非常艰难的时期，确实不像Java，首先在J2EE上大获成功，令人睹目，.net目前还没有在某个领域体现出王者 之风，罪魁祸首就是绑死在Windows上，可你要微软改变这一策略，你可以选择等待，就像当年秦香莲等陈世美一样。现实情况，对.net是坚挺，还是另 投名主，那就看各位看官的人生规划了，目前我的打算是这样的，仅供参考：&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;继 续深入学习.net，达到一个新的高度，毕竟这孩子也相当不错，尽管那些有钱的企业，大企业都对它没有兴趣，选择了.net你可能会穷一点，但是它的应用 领域是越来越清晰了，小型企业应用它肯定长驱直入，我最看好的是移动开发领域，当然这要看Windows Mobile了，它有多成功，那么.net就有多风光，但是我一直坚信在个人终端领域，微软无人可挡其锐。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;其 次，微软这些年一直高喊要向企业级进军，因为这是块利润最丰厚的领域，看看ＩＢＭ在中国混得红光满面就知道了，我们个人，当然也要跟上，钱程似锦啊。不 过，我是不会带着.net这把剑杀进来的，因为微软在企业级应用做得还很不够，我现在努力的是，学习在Unix下开发，以图进取。当然，有志向的朋友可以 有余力攻向VC++，可以做桌面应用，只可惜我们早已陷入了人民盗版的汪洋大海中，你的产品有多出众，盗版就有多厉害，何况在当下中国若非王选、王志东、 王永民之软件至尊，你要能做出成功产品，别忘了给我发封电子邮件，你的Fans我是当定了。&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;span style="font-family:Comic Sans MS;"&gt;天，慷慨生我，地，慈悲养我，天地于我，即有所爱，必有所望！既然今生选择了软件开发，就无怨无悔，我所希望做到的，仅仅是想把我的工作做好，写的软件别人能用上，愉快的用上。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3390749701232380552?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3390749701232380552/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3390749701232380552' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3390749701232380552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3390749701232380552'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/net.html' title='微软，您的.net为中国程序员带来了什么？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2009364114136097803</id><published>2007-03-30T16:53:00.000+08:00</published><updated>2007-03-30T16:55:12.106+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Java企业系统架构选择考量</title><content type='html'>现在Java领域各种技术百花齐放，名目繁多，如何根据自己的需求选择这些框架呢?特别对于初学者，在学习选择方向上也非常迷茫，如何有针对性的根据自己项目特点进行学习就变的更加重要。 &lt;p&gt;　　下面我们从一个发展角度来对J2EE/Java EE的这些框架诞生进行一番考量，可能对我们的选择有很大帮助。&lt;/p&gt; &lt;p&gt;　　首先我们需要明白一个高质量的J2EE系统是什么样子?高质量的J2EE/Java EE系统标准实际就是OO设计的标准，松耦合是OO设计的主要追求目标之一，那么无疑解耦性成为衡量J2EE/JEE质量的首要标准。实际选择中，还需要 兼顾可伸缩性/性能/开发效率等方面综合考虑。&lt;/p&gt; &lt;p&gt;　　J2EE/Java EE号称多层结构，为什么多层比两层好?因为多层结构解耦性好，带来维护拓展方便灵活。&lt;/p&gt; &lt;p&gt;　　典型的J2EE/Java EE至少划分三个层次：表现层/业务逻辑组件层/持久层。&lt;/p&gt; &lt;p&gt;　　如图，表现层英文是Presentation Layer，是实现显示功能的，这部分一般使用B/S结构来完成，当然你也可以使用专门远程客户端来实现;&lt;/p&gt; &lt;p&gt;　　业务逻辑层因为是由大量组件(Components)组成的，也可称为组件层，组件从不同角度又可分为各种类型，然后又有不同的流派，目前占主 要位置的是Model+Service，模型加服务，所以这一层又称为业务服务层Business Service;也有称为Model业务层;&lt;/p&gt; &lt;p&gt;　　持久层是负责对象持久化也就是数据库操作的层次,英文Persistence Layer。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://searchwebservices.techtarget.com.cn/TLimages/picview/?/imagelist/2007/082/88h8v5lig6e5.jpg" target="_blank"&gt;&lt;img alt="" src="http://searchwebservices.techtarget.com.cn/imagelist/2007/082/88h8v5lig6e5s.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　　SUN伙伴们推出J2EE标准时，分别对这三个层次规定了标准实现，表现层使用Jsp/Servlet技术;业务组件层使用EJB的会话 Bean;持久层使用实体Bean。同时，标准将业务层和持久层在物理上组成一个新的容器EJB容器，与表现层技术完全一样的容器，这样，J2EE技术被 细化为Web和EJB，物理上有Web容器和Web应用程序;以及EJB容器和EJB应用程序。&lt;/p&gt; &lt;p&gt;　　当然，J2EE/JEE的发展不止这些，这三个层次技术分别独立发展，高歌猛进，下面分别单独陈述，当你了解某种框架技术为什么诞生时，你可能就知道你该在什么情况下选择它们了，工具总是因目的而生!&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;表现层框架&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　J2EE/Java EE虽是多层结构，但它不是一种强制性多层结构，也就是说，你也可能做成传统两层结构，有的初学者直接使用Jsp嵌入Java代码调用数据库这样结构实际不是多层结构，还是以前的两层结构。&lt;/p&gt; &lt;p&gt;　　在Jsp中嵌入大量代码，一旦报空指针错误就很难找出问题，很多初学者下载JiveJdon 2.5后就经常碰到这个问题，因此大量有关空指针错误问题出现论坛里，为什么他们不能自己解决呢? 那是因为无法定位错误在Jsp中的位置，Tomcat等服务器只告诉我们错误在index_jsp.java(Jsp的java文件)位置，搞得一些人经 常会跑到Tomcat服务器内部翻找Jsp的Java文件，这一过程无比痛苦(为了减少初学者这种痛苦，本站暂停了JiveJdon2.5的下载)。&lt;/p&gt; &lt;p&gt;　　J2EE/Java EE的发展就是降低这种痛苦，首先想到的方式是：在Jsp调试上下苦功，要求Tomcat等服务器提供详细的错误定位;可惜到Tomcat 5.5我们也没看到这种功能;实际上，根本解决之道就是将Jsp的调试变成java组件的调试。&lt;/p&gt; &lt;p&gt;　　首先通过MVC模式规定Jsp只能等同于Html，不能包含Java代码，将Jsp和Java代码分离，可是这样分离之后，它们结合起来又麻烦了，所以，虽然你使用MVC模式，但是还是直接基于Jsp技术，带来的是开发效率的降低。&lt;/p&gt; &lt;p&gt;　　Struts框架解决了这个问题，通过ActionForm可以将Jsp和JavaBeans方便快速地结合起来，但是有人又抱怨Struts 的ActionForm限制太死，与Jsp虽能对应，只能一个ActionForm一个表单对应，而不能任意组件JavaBeans都可以和Jsp任意字 段对应，这时就出来了组件型框架JSF/Tapestry。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;业务逻辑层框架&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;可伸缩性&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　因为EJB标准的推出，业务组件层以前基本是EJB的天下，但是EJB功能实在太强大，它考虑了世界顶级大型系统需求，因此免不了显得很复杂， 当初，基本上所有的大型企业高端都是选用J2EE，选用J2EE实际是选用EJB。EJB强调的高可伸缩性为大型企业日益发展提供最大的发展空间，不再因 为企业快速发展导致整个企业系统结构都要发生根本变化,这是使用EJB的现实优势。&lt;/p&gt; &lt;p&gt;　　这种企业系统的可伸缩性不是因为EJB存在才显得重要，而是我们企业架构选择需要考量的基本因素。换句话说，无论我们使用EJB与否，这个问题 都需要考虑:一台服务器不够用怎么办?如果这台服务器死机会对企业运营带来什么影响?如果每个星期这台服务器停机维护升级会不会对企业带来打击?我的企业 系统是不是需要可靠的、几乎不当机的7x24运行?当企业系统面对大量外部访问用户时，一台服务器是否够用?多台服务器联动的需求是否涉及软件技术更换?&lt;/p&gt; &lt;p&gt;　　在这个现实因素考量后，如果觉得不是很重要，或者说将来一段时间内这些因素无所谓，那么可以不选用EJB了。&lt;/p&gt; &lt;p&gt;　　为什么有不选用EJB的理由?因为它复杂，学习起来比较困难，EJB帮助我们考虑企业中可能碰到的大部分问题，实际上，有的我们不需要，这也就是为什么说EJB是一个重量级解决方案所在。&lt;/p&gt; &lt;p&gt;　　与重量级相比的是轻量，业务组件层轻量级解决方案有Spring/HiveMidn/Jdon Framework等，轻量一词曾经因为EJB的出现而变得时髦，给人造成的感觉是：EJB花了老鼻子力气完成的那些功能，使用我轻量级解决方案可以轻而 易举也能解决，举重若轻啊，其实这是一种误解。&lt;/p&gt; &lt;p&gt;　　当曾经以轻量自居的Spring将事务机制纳入自己怀抱中时，它也开始低调轻量了，实际是不轻不重了;当然如果它把分布式计算和事务再次加入时，天平砝码也会沉下去的。&lt;/p&gt; &lt;p&gt;　　初学者总是愿意使用简单的解决方案，学习使用方便，因此比较喜欢轻量级框架技术，这是正常的，但是在使用轻量级别框架之前必须明白：你的系统将来真的只需要一台服务器即可?你的项目完成期真的非常紧急?&lt;/p&gt; &lt;p&gt;　　如果只需要一台巨强服务器，就不必选择EJB，EJB是因分布式多服务器而生，对于单台服务器，缺乏本地透明性，也就是说：你无法透过EJB直接和本地JVM或文件系统等打交道，透明性也是衡量一个框架的重要指标。&lt;/p&gt; &lt;p&gt;　　当然，重量和轻量并不完全对立，EJB3就是为了简化J2EE的使用，使得EJB不只是擅长处理大型企业系统，中小型系统也使用很方便，这实际上也是EJB轻量化的一种努力。什么是Java EE 5?&lt;/p&gt; &lt;p&gt;　　所以，对于架构选择来说，根本前提是需要明白你的系统现在或将来一段时间(注意需要考虑将来一段时间，不能只看眼前)是中小型系统还是大型系统?&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;灵活性/定制性/透明性&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　当然这个答案有时我们自己也可能很难给出，那么我们还需要从其他角度来考量EJB和非EJB之选，例如笔者曾经经历一个大型实时娱乐平台社区系统，从规模上说肯定是大型系统，设计目标10万人在线，从这个角度非选用EJB不可!&lt;/p&gt; &lt;p&gt;　　但是，EJB因为还有事务机制，虽然应用程序可以选择失效EJB事务，但是EJB容器设计因为考虑了事务，所以在其内核上总是会显得臃肿，是一 种累赘，这也是一种重量表示，不需要的东西存在肯定会影响效率，那么难道我不能根据我的需求，对EJB整体包括EJB容器进行可配置式的切割?也就是说， 我上面这个案例只需要EJB的分布式计算功能，其他的功能我都拆除，只剩余我需要的功能能运行就可以了，轻装上阵。&lt;/p&gt; &lt;p&gt;　　可惜，这种任意切割，应需而定的目标在EJB3标准还没有被重视，所幸的是，Ioc/AOP技术为这种目标实现提供了实现可能，但是，只有 Ioc/AOP还是不够，特别是看Ioc的范围，如果你只把应用系统组件纳入Ioc管理时，自由解耦只属于应用系统，我上面案例的目标还是无法达到，当你 把框架本身组件也纳入Ioc管理时，任意切割，应需而定的目标才真正实现。&lt;/p&gt; &lt;p&gt;　　Spring和EJB3属于“只把应用系统组件纳入Ioc管理”，这从JBoss 4.0版本可以看出;那什么框架会把框架本身组件也纳入Ioc管理呢?Apache的Hivemind和笔者开发的Jdon框架。&lt;/p&gt; &lt;p&gt;　　什么样的组件可以被纳入Ioc管理呢?POJO组件，POJO这个概念其实当初是针对EJB缺点而推出，EJB要求应用系统的组件必须继承或依 赖EJB容器，这样使得调试变的不方便，但是后来，POJO的概念已经不只最初这些概念，POJO代表那种与周围完全脱离关系、自由自在的Object 了，如果应用系统的Model或者Service都是POJO，意味着你的应用系统不依赖任何其他系统，解耦性灵活性高。&lt;/p&gt; &lt;p&gt;　　POJO是因为EJB而提出的，当EJB自己倾向POJO时，大家都在宣称自己是POJO时，POJO概念就没有立足点了，这也是Java领域哭笑不得的现象，但是我个人更倾向把非EJB的JavaBeans组件通称为POJO。&lt;/p&gt; &lt;p&gt;　　Hivemind的Ioc依赖注射部分功能和Jdon框架非常类似，当上百个POJO组件配置时，完全不必指定它们之间的依赖关系;你可以将自 己应用程序的组件注册到Registry中，这样Hivemind将帮助你启动这些组件，正如你在Jdon框架中将你的组件写入 mycontainer.xml中，Jdon框架也将自动启动你这些组件，并解决它们之间的互相调用，包括和框架本身组件互动。&lt;/p&gt; &lt;p&gt;　　HiveMind和Jdon框架定义的POJO Service有如下特点：&lt;/p&gt; &lt;p&gt;　　不象EJB那样缺乏本地透明化(location transparency)概念，这些POJO Service总是能定位到同样一个JVM;也不象基于XML的Web服务web services那样没有语言透明(language transparency)概念，这些POJO Service总是可以被一组Java接口来概括替代(通过调用Java interface来替代调用这些具体Service);当然，更不会类似JMX或Jini，不能进行service的热装载( hot-loading)。&lt;/p&gt; &lt;p&gt;　　注意：当Ioc/AOP提供高度灵活的同时，已经有初学者开始抱怨Spring的过分灵活，那么比Spring在组件上更灵活的Jdon框架只能算是一种追求极端，它不一定构成你进行架构选择的主要依据!&lt;/p&gt; &lt;p&gt;　　上面这些讨论只是表明在灵活性(解耦性/透明性)这条需求道路上深究下去的选择，你自己的应用系统需求会产生各种不同的要求，有些要求甚至是极 致的，这种偏向程度就成为你架构选择的目标，如果你的这种极致要求在目前Java世界里还没有可选框架时，那么你就要动手自己做了，这也说明什么时候你开 始自己做框架(如Jdon框架)，虽然在大多数情况下我们是不必要自己发明轮子的。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;快速构建性&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　前面是从灵活性和定制性这个角度讨论架构选择目标，但是在一般情况下，我们还是从上手难易、开发效率这个角度来进行架构选择，从这个角度来说， 就是需要我们将选用的框架尽可能的多帮助我们实现一些功能，但这又是和使用难易是矛盾的，因此有个取舍问题，取舍有个准则：这个框架尽量能提供越多功能; 尽量需要我们少写代码，甚至不写代码(使用XML配置)，少动脑筋。&lt;/p&gt; &lt;p&gt;　　关于XML配置这里也涉及难易问题，XML配置语法不能太复杂，有太多小开关Switch也增加学习成本。&lt;/p&gt; &lt;p&gt;　　从这个角度看，EJB无论是EJB2或EJB3提供的功能是最齐全的，但是XML配置开关太多 ，Spring属于中等，组件XML配置不算简单，但是因为有不少Struts+Spring+Hibernate之类现成开源代码可供参考，因此学习起 来难度也不大，Spring越来越象一个J2EE API(注意，JDK是J2SE API) ，Spring除不能提供分布式计算外，也因为过分灵活降低了一些开发效率，例如它的组件依赖关系一般需要逐步指定，auotwiring功能还没有深入 骨髓成为核心功能。Ioc容器的革命性优点。&lt;/p&gt; &lt;p&gt;　　Spring除了提供组件层功能以外，还有表现层支持Spring MVC;也有持久层实现的JDBC模板，这样，整个J2EE/Java EE系统各个层次Spring都提供了缺省实现，在这方面无疑提高了开发效率，但是Spring提供丰富API目的好像不是为了快速开发，而是为了建立一 个完整的功能齐全的API功能库。正如它网页上开头文字所述：As the leading full-stack Java/J2EE application framework，注意full-stack(完整齐全)是它突出的名词。&lt;/p&gt; &lt;p&gt;　　那么，还有另外一个空白，就是以开发效率为主要考虑，这类框架除了必须考虑足够灵活性和丰富功能以外，宗旨是为了在一般缺省情况下快速完成一个J2EE/Java EE系统，这非常类似MDA工具了，但是一个完全丧失灵活性和定制性的MDA工具也不是我们欢迎的。&lt;/p&gt; &lt;p&gt;　　Jdon框架的发展目标是为了填补这个空白，相信也会越来越多框架向这个目标迈进，当然不可否认，Spring也可能调转枪头走入这个领域， EJB2/EJB3正依靠JBuilder等这样商业化开发工具向这个领域靠拢，这个发展方向实际是4GL RAD Tools。&lt;/p&gt; &lt;p&gt;　　很多人在快速构建方面也很早进行了探索，涌现出各种工具：如何构建一个快速业务构件平台? 但是如何把快速构建和构件(组件)灵活性有机结合在一起?它是考验一个业务构件(业务组件)平台好坏的准则。有些构件平台虽然开发迅速，但是对于特殊情 况，可供程序员定制透明操作部分不多，很死，典型的是两层结构以前的Delphi，开发很快速，但是无法象J2EE这样深入到系统各个层次进行定制/维护 /拓展!&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;业务组件框架对比&lt;/strong&gt;&lt;/p&gt; &lt;table align="center" border="0" cellpadding="1" cellspacing="1" width="450"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td bgcolor="#cccccc"&gt; &lt;table border="0" width="100%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width="16%"&gt; &lt;/td&gt; &lt;td width="28%"&gt;EJB2/EJB3&lt;/td&gt; &lt;td width="29%"&gt;Spring Framework 1.x &lt;/td&gt; &lt;td width="27%"&gt;Jdon Framework 1.x &lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;灵活性&lt;br /&gt;(松耦合)&lt;/td&gt; &lt;td&gt;EJB3比EJB2更具灵活性，EJB3支持应用系统POJO&lt;/td&gt; &lt;td&gt;支持应用系统POJO，框架基础功能不能替换&lt;/td&gt; &lt;td&gt;支持应用系统POJO，框架本身可分离配置，定制性更强&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;功能完整性&lt;/td&gt; &lt;td&gt;全面，支持异步JMS 分布式事务&lt;/td&gt; &lt;td&gt;较为全面。有自己的表现层和持久层模板,可支持异步&lt;/td&gt; &lt;td&gt;基本完整，表现层借助Struts实现。有自己简单的持久层模板&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;领域范围&lt;/td&gt; &lt;td&gt;支持业务逻辑Session&lt;/td&gt; &lt;td&gt;不支持，需要开发者额外基于ThreadLocal编制代码，耗费精力和时间。&lt;/td&gt; &lt;td&gt;支持业务逻辑Session&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;Ioc/AOP支持&lt;/td&gt; &lt;td&gt;EJB3支持Ioc, JBoss等EJB3服务器支持AOP；基于业务组件的较粗粒度&lt;/td&gt; &lt;td&gt;基于JavaBeans类的细粒度；一般小型应用过于灵活带来复杂。&lt;/td&gt; &lt;td&gt;基于业务组件的较粗粒度&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;Ioc是否支持autowiring&lt;/td&gt; &lt;td&gt;EJB3支持&lt;/td&gt; &lt;td&gt;缺省不支持，可设置支持&lt;/td&gt; &lt;td&gt;缺省支持&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;单台性能&lt;/td&gt; &lt;td&gt;一般，批量查询等大数据量业务处理须小心，存在本地不透明缺陷。&lt;/td&gt; &lt;td&gt;一般，框架本身组件无性能提升极致，应用程序可配置cache/Pool&lt;/td&gt; &lt;td&gt;好，框架本身组件使用缓存提升性能，应用程序可配置cache/Pool，批量查询专门优化，适合实时性并发性要求较高应用&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;可伸缩性&lt;/td&gt; &lt;td&gt; &lt;p&gt;可支持多台服务器分布式计算。 &lt;/p&gt;&lt;/td&gt; &lt;td&gt;不支持，可依靠EJB实现&lt;/td&gt; &lt;td&gt;不支持，可依靠EJB实现&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;开发效率&lt;/td&gt; &lt;td&gt;学习曲线长,导致熟练掌握难。借助商业开发工具可加快熟练者的开发速度。&lt;/td&gt; &lt;td&gt;较为复杂，可挑选只适合自己的功能实现。当组件很多时，需要照顾这些组件之间调用关系。&lt;/td&gt; &lt;td&gt;简单快速，表现层编码很少。当组件个数很多时，无需照顾它们之间的调用关系&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;系统规模&lt;/td&gt; &lt;td&gt;EJB2适合大型系统;EJB3适合中大型系统&lt;/td&gt; &lt;td&gt;适合中小型系统&lt;/td&gt; &lt;td&gt;适合小中型系统，建立一个简单的网站系统等，和EJB无缝结合，可借助EJB支持中大型系统&lt;/td&gt;&lt;/tr&gt; &lt;tr bgcolor="#ffffff"&gt; &lt;td align="center" bgcolor="#999999"&gt;重量级别&lt;/td&gt; &lt;td&gt;重量，正在减肥&lt;/td&gt; &lt;td&gt;轻量偏重，有可能继续增肥&lt;/td&gt; &lt;td&gt;最轻量，恪守简单快速原则&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　&lt;strong&gt;持久层框架&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　持久层框架目前有EJB2/EJB3的实体Bean、Hibernate和各种JDO产品，当然还有直接写SQL语句的JDBC，如iBatis等。&lt;/p&gt; &lt;p&gt;　　持久层框架质量好与坏区分就是是否是O/R Mapping，也就是对象和关系数据库映射，关系数据库需要实现定义好Schema结构;对象因为字段而变的也有一个自己的结构，如何将对象数据自动持 久化到数据库中，首先我们得定义两者结构的对应，这实际是数据的元数据定义。&lt;/p&gt; &lt;p&gt;　　因为Hiberante/Toplink/JDO这样O/R Mapping工具帮助你实现对象和数据库转换，克服了对象和数据库阻抗现象，O/R Mapping总结 ，所以才使得我们更多的可以对象方式(从模型Model对象)来考虑Java EE/J2EE系统，可以完全放弃以前那种以数据库为中心的思维方式：数据库时代的终结。&lt;/p&gt; &lt;p&gt;　　所以，是否选用好的持久层框架，取决于你整个团队思维是否彻底OO了，是否需要真正OO，当然，对于一些小型项目，有时我们觉得直接使用JDBC模板反而更加轻松快捷一点，这也是Spring的JDBC模板/iBatis/Jdon的Jdbc模板存在的理由了。&lt;/p&gt; &lt;p&gt;　　例如新增一个数据表，在Jdon框架只需要下面几行代码即可：&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;　　String sql = "INSERT INTO testuser (userId , name) VALUES (?, ?)";&lt;br /&gt;　　List queryParams = new ArrayList();&lt;br /&gt;　　queryParams.add(userTest.getUserId());&lt;br /&gt;　　queryParams.add(userTest.getName());&lt;br /&gt;　　jdbcTemp.operate(queryParams,sql);&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　这种方式和O/R Mapping兴师动众的多个XML配置和关系映射思考相比，对于习惯SQL语句的程序员反而更加迅速。&lt;/p&gt; &lt;p&gt;　　从以上可以看出，灵活性/快速性/简单性/可伸缩性是我们进行架构选择的主要几个依据，架构选择实际就是在这几个策略之间做一个平衡。当然，还有一个非常重要的因素，因为它不属于某个层次的技术，性能/缓存是必须和上面因素综合考虑的因素。&lt;/p&gt; &lt;p&gt;　　因为性能最初是我们使用计算机的基本原因，别忘记这个根本。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2009364114136097803?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2009364114136097803/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2009364114136097803' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2009364114136097803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2009364114136097803'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/java_4537.html' title='Java企业系统架构选择考量'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-4472181905852718714</id><published>2007-03-30T16:43:00.000+08:00</published><updated>2007-03-30T16:44:37.670+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>初学者如何开发出一个高质量J2EE系统</title><content type='html'>首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。 &lt;p&gt;　　J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S(Browser浏览器/Server服务器)结构，而J2EE主要是指B/S结构的实现。&lt;/p&gt; &lt;p&gt;　　J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从设计模式开始学习。&lt;/p&gt; &lt;p&gt;　　J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准：WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。&lt;/p&gt; &lt;p&gt;　　这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持(除了JDK/J2SE以外)。&lt;/p&gt; &lt;p&gt;　　Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。&lt;/p&gt; &lt;p&gt;　　谈到JavaBeans技术，就涉及到组件构件技术(component)，这是Java的核心基础部分，很多软件设计概念(设计模式)都是通过JavaBeans实现的。&lt;/p&gt; &lt;p&gt;　　JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术(也就是Jsp/Servlet)调用，那么JavaBeans就运行在J2EE的Web容器中;如果它被EJB调用，它就运行在EJB容器中。&lt;/p&gt; &lt;p&gt;　　EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。&lt;/p&gt; &lt;p&gt;　　至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技 术：EJB和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说：这个 JavaBeans是你为这个应用程序单独开发创建的。&lt;/p&gt; &lt;p&gt;　　J2EE应用系统开发工具有很多：如JBuilder、Eclipse等，这些IDE首先是Java开发工具，也就是说，它们首要基本功能是可 以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要 lomboz插件)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。&lt;/p&gt; &lt;p&gt;　　J2EE容器分为WEB容器和EJB容器，Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等，其中Web容器直接 使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品 Websphere/Weblogic等和JBoss属于同一种性质。&lt;/p&gt; &lt;p&gt;　　J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。&lt;/p&gt; &lt;p&gt;　　如果你的J2EE应用系统的数据库连接是通过JNDI获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的 J2EE应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体 数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。&lt;/p&gt; &lt;p&gt;　　衡量J2EE应用系统设计开发水平高低的标准就是：解耦性;你的应用系统各个功能是否能够彻底脱离?是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。&lt;/p&gt; &lt;p&gt;　　为了达到这个目的，诞生各种框架概念，J2EE框架标准将一个系统划分为WEB和EJB主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将J2EE分离开来，实现解耦目的。&lt;/p&gt;&lt;p&gt;　因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助J2EE具体技术来实现，这时，你可以使用EJB规范实现服务层和持久层，Web技术实现表现层; &lt;/p&gt;&lt;p&gt;　　EJB为什么能将服务层从Jsp/Servlet手中分离出来，因为它对JavaBeans编码有强制的约束，现在有一种对JavaBeans 弱约束，使用Ioc模式实现的(当然EJB 3.0也采取这种方式)，在Ioc模式诞生前，一般都是通过工厂模式来对JavaBeans约束，形成一个服务层，这也是是Jive这样开源论坛设计原理 之一。&lt;/p&gt; &lt;p&gt;　　由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通JavaBeans(POJO)框架(如Spring、 JdonFramework)以及管理EJB的EJB框架，因为EJB不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳 入同一个标准了。　但是，个人认为：标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。&lt;/p&gt; &lt;p&gt;　　这两种架构分歧也曾经诞生一个新名词：完全POJO的系统也称为轻量级系统(lightweight)，其实这个名词本身就没有一个严格定义， 更多是一个吸引人的招牌，轻量是指容易学习容易使用吗?按照这个定义，其实轻量Spring等系统并不容易学习;而且EJB 3.0(依然叫EJB)以后的系统是否可称为轻量级了呢?&lt;/p&gt; &lt;p&gt;　　前面谈了服务层框架，使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来，而使用表现层框架则可以将Jsp中剩余的 JavaBeans完全分离，这部分JavaBeans主要负责显示相关，一般是通过标签库(taglib)实现，不同框架有不同自己的标签库， Struts是应用比较广泛的一种表现层框架。&lt;/p&gt; &lt;p&gt;　　这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久 层框架有两种方向：直接自己编写JDBC等SQL语句(如iBatis);使用O/R Mapping技术实现的Hibernate和JDO技术;当然还有EJB中的实体Bean技术。&lt;/p&gt; &lt;p&gt;　　持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个JSF，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。&lt;/p&gt; &lt;p&gt;　　在所有这些J2EE技术中，虽然SUN公司发挥了很大的作用，不过总体来说：网络上有这样一个评价：SUN的理论天下无敌;SUN的产品用起来 撞墙;对于初学者，特别是那些试图通过或已经通过SUN认证的初学者，赶快摆脱SUN的阴影，立即开溜，使用开源领域的产品来实现自己的应用系统。&lt;/p&gt; &lt;p&gt;　　最后，你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。&lt;/p&gt; &lt;p&gt;　　还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从UML角度结合理解。&lt;/p&gt; &lt;p&gt;　　当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法，当 你学会了系统基本单元JavaBean或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向 了。&lt;/p&gt; &lt;p&gt;　　以上理念可以总结为一句话：&lt;/p&gt; &lt;p&gt;　　J2EE开发三件宝: Domain Model(域建模)、patterns(模式)和framework(框架)。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-4472181905852718714?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/4472181905852718714/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=4472181905852718714' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4472181905852718714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4472181905852718714'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/j2ee_30.html' title='初学者如何开发出一个高质量J2EE系统'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3943493932596282856</id><published>2007-03-30T16:42:00.000+08:00</published><updated>2007-03-30T16:43:07.090+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>IT人必备“IT心态”</title><content type='html'>计世网 IT业的特性决定了IT从业者必须抱有求变而不该是求稳的心态。  &lt;p class="newtext"&gt;前几天，一位在&lt;a href="http://topic.ccw.com.cn/corpCenter/427.html" target="_blank"&gt;&lt;span style="color:#0000cc;"&gt;&lt;b&gt;英特尔&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;工作的朋友约我一起吃饭聊天，我们已经有一年没见面了，见到他，是满脸疲惫，他说感觉“太累了&lt;!-- news 正文页网画中画广告  --&gt;  &lt;table style="margin: 10px 7px 3px 4px;" align="left" border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;    &lt;div id="ad_position_roller_39"&gt; &lt;script language="JavaScript1.1" src="http://ad.ccw.com.cn/adshow.asp?positionID=39&amp;js=1&amp;amp;innerJs=1"&gt;&lt;/script&gt;  &lt;/div&gt;  &lt;!--&lt;script language="JavaScript1.1" src="http://ad.ccw.com.cn/adshow.asp?positionID=39&amp;js=1&amp;innerJs=1"&gt;&lt;/script&gt;--&gt; &lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;”，干不完的工作，没完没了的内部沟通（公司业务扩张，部门很多）。  &lt;/p&gt;&lt;p class="newtext"&gt;其 实，累已经成为IT从业者的工作常态,从一般员工到企业高层。而且，IT的“累”也是全球化的常态。我以前采访过很多国际IT公司的CEO，在问到他们日 常安排时，发现他们基本上都是“工作狂”、“空中飞人”，属于自己和家庭的时间都非常之少。在两年前，英国就有一份调查报告显示，只有不到1/7的IT从 业者认为自己的工作是令人愉快的。而其他行业的工作者，却有1/3的员工认为自己的工作是非常愉快的。 &lt;/p&gt;&lt;p class="newtext"&gt;在其他比较成熟的传统产业里，常常是前3至5家企业长期保持均衡竞争状态，而在IT业，却是“王者生存”、“赢者通吃”，说得极端些，就是“只有第一、没有第二”，所以“王者”之争永远都在进行，无论是谁，“王位”能保持多久，都是充满变数的。  &lt;/p&gt;&lt;p class="newtext"&gt;IT产业技术更新换代快，“一招鲜、吃遍天”在IT行业并不适用，在新技术、新机会来临时，抓住机会者就可能一夜成名，而原来的行业老大如错失机会就可能“王位”难保。IT产业和企业的特性似乎就决定了IT人的生存状态。  &lt;/p&gt;&lt;p class="newtext"&gt;IT 业的高风险决定了IT从业者的“高风险”。——总是处于变化的状态中。技术在变、市场在变、公司策略也得随之而变，而具体到IT中人也必须要适应这种变 化，否则就可能被淘汰。当然，个人置身在变化的环境中和强大的压力下，收获的不仅是劳累，也有获得。上面那位英特尔朋友说，尽管很累，他也不会离开，他感 觉在英特尔这样的技术领先的公司里工作，可以学到很多新东西，当然，他的收入也是不菲的了。 &lt;/p&gt;&lt;p class="newtext"&gt;如果你恨他，就让他去做IT—因为IT会让他处于变化和压力之中; 如果你爱他，也让他做IT——因为IT行业有更多的机会和选择。这句话可以说是对IT从业状态比较恰当的描述。  &lt;/p&gt;&lt;p class="newtext"&gt;技 术带来IT市场的多变，从而直接关系到IT个人的选择，选择就有机会和风险，而这时求稳和保守常常都不是积极的选择。据说1998年中国电信剥离移动业务 成立中国移动时，很多中国电信的员工都不愿意去移动，他们认为中国电信家大业大，保险系数高。而中国移动是一个新兴的公司，到底能不能发展起来，还是个未 知数。而现在，中国移动无论是利润还是收入都早已超过了中国电信。当然，中国移动的员工也要比中国电信的员工风光得多。我想，当初没有选择去中国移动的人 肯定会很后悔。 &lt;/p&gt;&lt;p class="newtext"&gt;人都是有思维和行为惯性的，一般都不愿意去主动地面对变化，但很多时候，变化才有机会。如果当初陈天桥（盛大网络游戏创始人）不离开安稳的政府机关，就没有他日后的“一夜暴富”；如果当初丁磊不离开令人羡慕的工作单位电信局，也没有现在的他一手创办的网易。  &lt;/p&gt;&lt;p class="newtext"&gt;IT业中接连出现的“一夜暴富”传奇，不知让多少传统行业里的商界名流所眼红。多变的IT业的确存在传统行业无法比拟的机会，但IT业的机会不是平均主义，机会总是给予那些勇于求变和掌握机会的人。  &lt;/p&gt;&lt;p class="newtext"&gt;不少IT人都对目前工作状态不满，可要是真的离开这个圈子，还得慎重思量。我有两位熟人都曾因为感觉累而离开IT圈，没多久他们又重返IT圈，因为他们已不能适应传统产业中的规则和安稳、平淡的工作。  &lt;/p&gt;&lt;p class="newtext"&gt;做个IT人，“累”是难以避免的，那就调整心态 ，“累”并快乐地工作着吧。                                          &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3943493932596282856?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3943493932596282856/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3943493932596282856' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3943493932596282856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3943493932596282856'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/itit_30.html' title='IT人必备“IT心态”'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3425200950112537499</id><published>2007-03-30T16:29:00.001+08:00</published><updated>2007-03-30T16:29:51.266+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Adobe：现有产品不会兼容Vista</title><content type='html'>&lt;p&gt;Adobe近日表示，用户如果想要在Vista上毫无问题地运行Adobe软件——例如Photoshop、InDesign以及Dreamweaver，必须等待这些软件的新版本发布，Adobe不会为现有产品提供任何升级以解决Windows  Vista兼容性问题。&lt;/p&gt; &lt;p&gt;也就是说，如果你想在微软的新一代操作系统上稳定运行Photoshop等Adobe产品，必须付出数百甚至上千美元购买Adobe即将推出的新版软件们——当然，如果你可以忍受作图一半的时候Photoshop突然崩溃，丢失一个小时的辛苦劳动，你可以继续当一名义务测试员，发现更多现有Adobe软件与Vista的Bug。&lt;/p&gt; &lt;p&gt;在Windows Vista PC上运行Photoshop CS2，每次启动都需要用户重新注册软件——即便你已经注册过N次。Dreamweaver  8会在用户浏览文件时崩溃；InDesign则经常需要面对“磁盘空间不足”的错误提示。&lt;/p&gt; &lt;p&gt;Adobe自己也列出了自家产品中已知Vista兼容性Bug——甚至Acrobat  8都在Vista下频频出错——还好，Adobe保证在今年上半年提供一个免费升级，让你不必在看PDF时卡壳。&lt;/p&gt; &lt;p&gt;对于Adobe来说，Vista升级不啻千载难逢的强迫用户升级的好机会——现有用户已经对目前的软件版本功能十分满足，很多Photoshop用户都没有升级到CS2——Adobe自然要借着Vista的东风，宣布：新版Photoshop、Dreamweaver、InDesign等产品今年春天上市，且，完全兼容Windows  Vista。&lt;/p&gt; &lt;p&gt;也就是说，对于不少用户来说，升级新版Adobe软件不是为了新添加的功能，而是——拥抱Vista，从这个角度考虑，也许我们可以为Vista正版升级再添上一笔不小的成本。&lt;/p&gt; &lt;p&gt;Adobe和微软近日也矛盾不断，Adobe不久前还控诉微软违反欧盟贸易法案，将Vista与XML捆绑——威胁Acrobat的统治地位。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3425200950112537499?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3425200950112537499/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3425200950112537499' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3425200950112537499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3425200950112537499'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/adobevista.html' title='Adobe：现有产品不会兼容Vista'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-5646263633035420084</id><published>2007-03-30T16:16:00.000+08:00</published><updated>2007-03-30T16:18:52.854+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>专家释疑：轻松提高Java代码的性能</title><content type='html'>&lt;p style="line-height: 140%; text-align: justify;"&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;尾递归转换能加快应用程序的速度，但不是所有的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; JVM &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;都会做这种转换，&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;很多算法用尾递归方法表示会显得格外简明。编译器会自动把这种方法转换成循环，以提高程序的性能。但在&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Java &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;语言规范中，并没有要求一定要作这种转换，因此，并不是所有的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Java &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;虚拟机（&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;JVM&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;）都会做这种转换。这就意味着在&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Java &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;语言中采用尾递归表示可能导致巨大的内存占用，而这并不是我们期望的结果。&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;Eric Allen &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;在本文中阐述了动态编译将会保持语言的语义，而静态编译则通常不会。他说明了为什么这是一个重要问题，并提供了一段代码来帮助判断您的即时（&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;JIT&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;）编译器是否会在保持语言语义的同时做尾递归代码转换。&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 140%; text-align: justify;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;&lt;span style="font-family:宋体;"&gt;　　&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;尾递归及其转换&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 140%; text-align: justify;"&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　相当多的程序包含有循环，这些循环运行的时间占了程序总运行时间的很大一部分。这些循环经常要反复更新不止一个变量，而每个变量的更新又经常依赖于其它变量的值。&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 140%; text-align: justify;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;&lt;span style="font-family:宋体;"&gt;　　如果把迭代看成是尾递归函数，那么，就可以把这些变量看成是函数的参数。简单提醒一下：如果一个调用的返回值被作为调用函数的值立即返回，那么，这个递归调用就是尾递归；尾递归不必记住调用时调用函数的上下文。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　由于这一特点，在尾递归函数和循环之间有一个很好的对应关系：可以简单地把每个递归调用看作是一个循环的多次迭代。但因为所有可变的参数值都一次传给了递归调用，所以比起循环来，在尾递归中可以更容易地得到更新值。而且，难以使用的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; break &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;语句也常常为函数的简单返回所替代。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　但在&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Java &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;编程中，用这种方式表示迭代将导致效率低下，因为大量的递归调用有导致堆栈溢出的危险。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　解决方案比较简单：因为尾递归函数实际上只是编写循环的一种更简单的方式，所以就让编译器把它们自动转换成循环形式。这样您就同时利用了这两种形式的优点。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　但是，尽管大家都熟知如何把一个尾递归函数自动转换成一个简单循环，&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;Java &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;规范却不要求做这种转换。不作这种要求的原因大概是：通常在面向对象的语言中，这种转换不能静态地进行。相反地，这种从尾递归函数到简单循环的转换必须由&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; JIT &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;编译器动态地进行。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　要理解为什么会是这样，考虑下面一个失败的尝试：在&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Integers &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;集上，把&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Iterator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;中的元素相乘。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　因为下面的程序中有一个错误，所以在运行时会抛出一个异常。但是，就象在本专栏以前的许多文章中已经论证的那样，一个程序抛出的精确异常（跟很棒的错误类型标识符一样）对于找到错误藏在程序的什么地方并没有什么帮助，我们也不想编译器以这种方式改变程序，以使编译的结果代码抛出一个不同的异常。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;清单&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 1. &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;一个把&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Integer &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;集的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Iterator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;中的元素相乘的失败尝试&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="margin: auto 0cm; line-height: 140%; text-align: justify;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;span style="font-family:宋体;"&gt;import java.util.Iterator;&lt;br /&gt;&lt;br /&gt;public class Example {&lt;br /&gt;&lt;br /&gt;  public int product(Iterator i) {&lt;br /&gt;    return productHelp(i, 0);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  int productHelp(Iterator i, int accumulator) {&lt;br /&gt;    if (i.hasNext()) {&lt;br /&gt;      return productHelp(i, accumulator * ((Integer)i.next()).intValue());&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;      return accumulator;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;} &lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 140%; text-align: justify;"&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　注意&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; product &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;方法中的错误。&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;product &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;方法通过把&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; accumulator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;赋值为&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 0 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;调用&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; productHelp&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;。它的值应为&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 1&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;。否则，在类&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Example &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;的任何实例上调用&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; product &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;都将产生&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 0 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;值，不管&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Iterator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;是什么值。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　假设这个错误终于被改正了，但同时，类&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Example &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;的一个子类也被创建了，如清单&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 2 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;所示：&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;清单&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 2.&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;试图捕捉象清单&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 1 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;这样的不正确的调用&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="margin: auto 0cm; line-height: 140%; text-align: justify;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;span style="font-family:宋体;"&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;class Example {&lt;br /&gt;&lt;br /&gt;  public int product(Iterator i) {&lt;br /&gt;    return productHelp(i, 1);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  int productHelp(Iterator i, int accumulator) {&lt;br /&gt;    if (i.hasNext()) {&lt;br /&gt;      return productHelp(i, accumulator * ((Integer)i.next()).intValue());&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;      return accumulator;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// And, in a separate file:&lt;br /&gt;&lt;br /&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;public class Example2 extends Example {&lt;br /&gt;  int productHelp(Iterator i, int accumulator) {&lt;br /&gt;    if (accumulator &lt; 1) {&lt;br /&gt;      throw new RuntimeException("accumulator to productHelp must be &gt;= 1");&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;      return super.productHelp(i, accumulator);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    LinkedList l = new LinkedList();&lt;br /&gt;    l.add(new Integer(0));&lt;br /&gt;    new Example2().product(l.listIterator());&lt;br /&gt;  }&lt;br /&gt;} &lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 140%; text-align: justify;"&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　类&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Example2 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;中的被覆盖的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; productHelp &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;方法试图通过当&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; accumulator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;小于&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;“1”&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;时抛出运行时异常来捕捉对&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; productHelp &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;的不正确调用。不幸的是，这样做将引入一个新的错误。如果&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Iterator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;含有任何&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 0 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;值的实例，都将使&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; productHelp &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;在自身的递归调用上崩溃。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　现在请注意，在类&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Example2 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; main &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;方法中，创建了&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Example2 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;的一个实例并调用了它的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; product &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;方法。由于传给这个方法的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Iterator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;包含一个&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 0&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;，因此程序将崩溃。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　然而，您可以看到类&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; Example &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;的&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; productHelp &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;是严格尾递归的。假设一个静态编译器想把这个方法的正文转换成一个循环，如清单&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 3 &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;所示：&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;清单&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; 3.&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;静态编译不会优化尾调用的一个示例&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="margin: auto 0cm; line-height: 140%; text-align: justify;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;span style="font-family:宋体;"&gt;int productHelp(Iterator i, int accumulator) {&lt;br /&gt;    while (i.hasNext()) {&lt;br /&gt;      accumulator *= ((Integer)i.next()).intValue();&lt;br /&gt;    }&lt;br /&gt;    return accumulator;&lt;br /&gt;  } &lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 140%; text-align: justify;"&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　于是，最初对&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; productHelp &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;的调用，结果成了对超类的方法的调用。超方法将通过简单地在&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; iterator &lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;上循环来计算其结果。不会抛出任何异常。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%;"&gt;　　用两个不同的静态编译器来编译这段代码，结果是一个会抛出异常，而另一个则不会，想想这是多么让人感到困惑。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: rgb(51, 51, 51); line-height: 140%; font-family: ˎ̥;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/O:P&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-5646263633035420084?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/5646263633035420084/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=5646263633035420084' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5646263633035420084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5646263633035420084'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/java_30.html' title='专家释疑：轻松提高Java代码的性能'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-1945437135274662969</id><published>2007-03-30T16:14:00.000+08:00</published><updated>2007-03-30T16:16:28.345+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>JAVA基础应用: 处理Java中的日期问题</title><content type='html'>&lt;p style="text-indent: 2em;"&gt;Java统计从1970年1月1日起的毫秒的数量表示日期。也就是说，例如，1970年1月2日，是在1月1日后的86，400，000毫秒。同样的，1969年12月31日是在1970年1月1日前86，400，000毫秒。Java的Date类使用long类型纪录这些毫秒值.因为long是有符号整数，所以日期可以在1970年1月1日之前，也可以在这之后。Long类型表示的最大正值和最大负值可以轻松的表示290，000，000年的时间，这适合大多数人的时间要求。   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;b&gt;Date 类&lt;/b&gt;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date类可以在java.util包中找到，用一个long类型的值表示一个指定的时刻。它的一个有用的构造函数是Date(),它创建一个表示创建时刻的对象。getTime()方法返回Date对象的long值。在下面的程序中，我使用Date()构造函数创建一个表示程序运行时刻的对象，并且利用getTime()方法找到这个日期代表的毫秒数量：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class Now {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date now = new Date();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;long nowLong = now.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("Value is " + nowLong);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;当我运行这个程序后，我得到972,568,255,150.快速确认一下这个数字，起码在一个合理的范围：它不到31年，这个数值相对1970年1月1日到我写这篇文章的时间来说，是合理的。计算机是这个毫秒值表示时间，人们可不愿意说"  我将在996,321,998,34见到你。"幸运的是，Java提供了一个转换Date对象到字符串的途径，表示成传统的形式。我们在下一节讨论DateFormat类，它直观的建立日期字符串。   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat类  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat类的一个目标是建立一个人们能够识别的字符串。然而，因为语言的差别，不是所有的人希望看到严格的相同格式的日期。法国人更喜欢看到"25  decembre 2000,",但是美国人习惯看到"December  25,2000."所以一个DateFormat的实例创建以后，这个对象包含了日期的显示格式的信息。如果使用用户电脑区域设置缺省的格式，你可以象下面那样，创建DateFormat对象，使用getDateInstance()方法：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat类在java.text包中可以找到。  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;b&gt;转换成字符串&lt;/b&gt;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;你可以使用format()方法转换Date对象为一个字符串。下面的示例程序说明了这个问题：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class NowString {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date now = new Date();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s = df.format(now);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("Today is " + s);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;在上面的代码中，展示了没有参数，使用缺省格式的getDateInstance()方法。Java还提供了几个选择日期格式，你可以通过使用重载的getDateInstance(int  style)获得。出于方便的原因，DateFormat提供了几种预置的常量，你可以使用这些常量参数。下面是几个SHORT, MEDIUM, LONG,  和FULL类型的示例：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class StyleDemo {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date now = new Date();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df1 =  DateFormat.getDateInstance(DateFormat.SHORT);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df2 =  DateFormat.getDateInstance(DateFormat.MEDIUM);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df3 =  DateFormat.getDateInstance(DateFormat.LONG);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df4 =  DateFormat.getDateInstance(DateFormat.FULL);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s = df.format(now);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s1 = df1.format(now);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s2 = df2.format(now);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s3 = df3.format(now);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s4 = df4.format(now);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("(Default) Today is " + s);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("(SHORT) Today is " + s1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("(MEDIUM) Today is " + s2);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("(LONG) Today is " + s3);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("(FULL) Today is " + s4);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;程序输出如下：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(Default) Today is Nov 8, 2000  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(SHORT) Today is 11/8/00  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(MEDIUM) Today is Nov 8, 2000  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(LONG) Today is November 8, 2000  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(FULL) Today is Wednesday, November 8, 2000  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;同样的程序，在我的电脑上使用缺省设置运行后，改变区域设置为瑞典，输出如下：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(Default) Today is 2000-nov-08  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(SHORT) Today is 2000-11-08  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(MEDIUM) Today is 2000-nov-08  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(LONG) Today is den 8 november 2000  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;(FULL) Today is den 8 november 2000  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;从这里，你能看到，瑞典的月份不是大写的（虽然November还是november）.还有，LONG和FULL版本在瑞典语中是一样的，但是美国英语却不同。另外，有趣的是，瑞典语单词的星期三,onsdag，没有包含在FULL日期里，英语却包括。   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;注意你能够使用getDateInstance()方法改变DateFormat实例的语种；但是，在上面的例子中，是通过改变Windows98的控制面板的区域设置做到的。不同的地方的区域设置不同，结果就不同，这样有好处，也有不足，Java程序员应该了解这些。一个好处是Java程序员可以只写一行代码就可以显示日期，而且世界不同地区的电脑运行同样的程序会有不用的日期格式。但是这也是一个缺点，当程序员希望显示同一种格式的时--这也有可取之处，举例来说，在程序中混合输出文本和日期，如果文本是英文，我们就不希望日期格式是其他的格式，象德文或是西班牙文。如果程序员依靠日期格式编程，日期格式将根据运行程序所在电脑的区域设置不用而不同。&lt;/p&gt;&lt;br /&gt;&lt;p style="text-indent: 2em;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="text-indent: 2em;"&gt;&lt;b&gt;解析字符串&lt;/b&gt;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;通过parse()方法，DateFormat能够以一个字符串创立一个Date对象。这个方法能抛出ParseException异常，所以你必须使用适当的异常处理技术。下面的例子程序通过字符串创建Date对象：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class ParseExample {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String ds = "November 1, 2000";  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;try {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d = df.parse(ds);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;catch(ParseException e) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("Unable to parse " + ds);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;在创建一个任意的日期时parse()方法很有用。我将通过另一种方法创建一个任意得日期。同时，你将看到怎样进行基本日期计算，例如计算90天后的另一天。你可以使用GregorianCalendar类来完成这个任务。   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;b&gt;GregorianCalendar类&lt;/b&gt;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;创建一个代表任意日期的一个途径使用GregorianCalendar类的构造函数，它包含在java.util包中：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar(int year, int month, int date)  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;注意月份的表示，一月是0，二月是1，以此类推，是12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份，这样程序也许更易读，父类Calendar使用常量来表示月份：JANUARY,  FEBRUARY,等等。所以，创建Wilbur 和 Orville制造第一架动力飞机的日期（December 17, 1903），你可以使用：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar firstFlight = new  GregorianCalendar(1903, Calendar.DECEMBER, 17);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;出于清楚的考虑，你应该使用前面的形式。但是，你也应该学习怎样阅读下面的短格式。下面的例子同样表示December  17,1903（记住，在短格式中，11表示December）  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar firstFlight = new  GregorianCalendar(1903, 11, 17);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;在前面，你学习了转换Date对象到字符串。这里，你可以做同样的事情；但是首先，你需要将GregorianCalendar对象转换到Date。要做到这一点，你可以使用getTime()方法，从它得父类Calendar继承而来。GetTime()方法返回GregorianCalendar相应的Date对象。你能够创建GregorianCalendar对象，转换到Date对象，得到和输出相应的字符串这样一个过程。下面是例子：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class Flight {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar firstFlight = new  GregorianCalendar(1903, Calendar.DECEMBER, 17);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d = firstFlight.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s = df.format(d);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("First flight was " + s);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;有时候创建一个代表当前时刻的GregorianCalendar类的实例是很有用的。你可以简单的使用没有参数的GregorianCalendar构造函数，象这样：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar thisday = new GregorianCalendar();   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;一个输出今天日期的例子程序，使用GregorianCalendar对象：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;class Today {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar thisday = new GregorianCalendar();   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d = thisday.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s = df.format(d);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("Today is " + s);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;注意到，Date()构造函数和GregorianCalendar()构造函数很类似：都创建一个对象，条件简单，代表今天。  &lt;/p&gt;&lt;br /&gt;&lt;p style="text-indent: 2em;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="text-indent: 2em;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;b&gt;日期处理&lt;/b&gt;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar类提供处理日期的方法。一个有用的方法是add().使用add()方法，你能够增加象年，月数，天数到日期对象中。要使用add()方法，你必须提供要增加的字段，要增加的数量。一些有用的字段是DATE,  MONTH, YEAR, 和  WEEK_OF_YEAR。下面的程序使用add()方法计算未来80天的一个日期。在Jules的&lt;环球80天&gt;是一个重要的数字，使用这个程序可以计算Phileas  Fogg从出发的那一天1872年10月2日后80天的日期：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class World {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar worldTour = new  GregorianCalendar(1872, Calendar.OCTOBER, 2);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;worldTour.add(GregorianCalendar.DATE, 80);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d = worldTour.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s = df.format(d);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("80 day trip will end " + s);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;这个例子是想象的，但在一个日期上增加天数是一个普遍的操作：影碟可以租3天，图书馆可以借书21天，商店经常需要将购买的物品在30天内卖出。下面的程序演示了使用年计算：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class Mortgage {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar mortgage = new  GregorianCalendar(1997, Calendar.MAY, 18);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;mortgage.add(Calendar.YEAR, 15);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d = mortgage.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s = df.format(d);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("15 year mortgage amortized on "  + s); }  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;add()一个重要的副作用是它改变的原来的日期。有时候，拥有原始日期和修改后的日期很重要。不幸的是，你不能简单的创建一个GregorianCalendar对象，设置它和原来的相等（equal）。原因是两个变量指向同一个Date()对象地址。如果Date对象改变，两个变量就指向改变后的日期对象。代替这种做法，应该创建一个新对象。下面的程序示范了这种做法：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class ThreeDates {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar gc1 = new GregorianCalendar(2000,  Calendar.JANUARY, 1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar gc2 = gc1;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar gc3 = new GregorianCalendar(2000,  Calendar.JANUARY, 1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;//Three dates all equal to January 1, 2000  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;gc1.add(Calendar.YEAR, 1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;file://gc1 and gc2 are changed  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df = DateFormat.getDateInstance();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d1 = gc1.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d2 = gc2.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date d3 = gc3.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s1 = df.format(d1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s2 = df.format(d2);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String s3 = df.format(d3);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("gc1 is " + s1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("gc2 is " + s2);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("gc3 is " + s3);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;程序运行后，gc1和gc2被变成2001年（因为两个对象指向同一个Date，而Date已经被改变了）。对象gc3指向一个单独的Date，它没有被改变。   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;计算复习日期  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;在这节，你将看到一个依据现实世界的例子。这个详细的程序计算过去一个具体的日期。例如，你阅读这篇文章，你想要记住一个印象深刻的知识点。如果你没有照片一样的记忆力，你就要定期的复习这些新资料，这将帮助你记住它。关于复习系统，Kurt  Hanks 和 Gerreld L. Pulsipher在他们的&lt;&gt;中有讨论，建议看过第一眼后马上回顾一下，然后是1天后，1个星期后，1个月后，3个月后，1年后。我的这篇文章，你要马上回顾一下，从现在算起，再就是明天，然后是1个星期，1个月，3个月，1年后。我们的程序将计算这些日期。   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;这个程序非常有用的，它将是PIM(Personal Information  Manager个人信息管理器)的一个组成部分，并将确定复习时间。在下面的程序中，getDates()方法对一个返回日期数组（复习日期）的电子软件很有用。另外，你可以返回单独的一个日期，使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().当时间范围超出这个PIM的ReviewDates的计算范围时ReviewDates类演示了怎样计算时间段。现在，你可以容易的修改它用来处理你需要的时间段，象图书馆借书，录影带租赁和抵押计算。首先，ReviewDates类显示在下面：   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.text.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class ReviewDates {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;private GregorianCalendar firstDay, oneDay, oneWeek,  oneMonth, oneQuarter, oneYear;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;final int dateArraySize = 6;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;ReviewDates(GregorianCalendar gcDate) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;int year = gcDate.get(GregorianCalendar.YEAR);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;int month = gcDate.get(GregorianCalendar.MONTH);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;int date = gcDate.get(GregorianCalendar.DATE);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;firstDay = new GregorianCalendar(year, month, date);   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneDay = new GregorianCalendar(year, month, date);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneWeek = new GregorianCalendar(year, month, date);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneMonth = new GregorianCalendar(year, month, date);   &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneQuarter = new GregorianCalendar(year, month,  date);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneYear = new GregorianCalendar(year, month, date);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneDay.add(GregorianCalendar.DATE, 1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneWeek.add(GregorianCalendar.DATE, 7);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneMonth.add(GregorianCalendar.MONTH, 1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneQuarter.add(GregorianCalendar.MONTH, 3);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;oneYear.add(GregorianCalendar.YEAR, 1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;ReviewDates() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;this(new GregorianCalendar());  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public void listDates() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;DateFormat df =  DateFormat.getDateInstance(DateFormat.LONG);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date startDate = firstDay.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date date1 = oneDay.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date date2 = oneWeek.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date date3 = oneMonth.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date date4 = oneQuarter.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;Date date5 = oneYear.getTime();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String ss = df.format(startDate);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String ss1 = df.format(date1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String ss2 = df.format(date2);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String ss3 = df.format(date3);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String ss4 = df.format(date4);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;String ss5 = df.format(date5);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("Start date is " + ss);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println("Following review dates are:");  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println(ss1);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println(ss2);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println(ss3);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println(ss4);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println(ss5);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;System.out.println();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public GregorianCalendar[] getDates() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar[] memoryDates = new  GregorianCalendar[dateArraySize];  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;memoryDates[0] = firstDay;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;memoryDates[1] = oneDay;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;memoryDates[2] = oneWeek;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;memoryDates[3] = oneMonth;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;memoryDates[4] = oneQuarter;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;memoryDates[5] = oneYear;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;return memoryDates;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public GregorianCalendar getFirstDay() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;return this.firstDay;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public GregorianCalendar getOneDay() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;return this.oneDay;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public GregorianCalendar getOneWeek() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;return this.oneWeek;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public GregorianCalendar getOneMonth() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;return this.oneMonth;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public GregorianCalendar getOneQuarter() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;return this.oneQuarter;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public GregorianCalendar getOneYear() {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;return this.oneYear;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;下面是使用ReviewDates类列出复习日期的例子程序：  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;import java.util.*;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public class ShowDates {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;public static void main(String[] args) {  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;ReviewDates rd = new ReviewDates();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;rd.listDates();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;GregorianCalendar gc = new GregorianCalendar(2001,  Calendar.JANUARY, 15);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;ReviewDates jan15 = new ReviewDates(gc);  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;jan15.listDates();  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;}  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;b&gt;总结&lt;/b&gt;  &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;这篇文章介绍了关于日期处理的3个重要的类：Date,DateFormat,GregorianCalendar.这些类让你创建日期，转换成字符串，和计算日期基本元素。处理Java中的日期问题，这篇文章只是冰山一角。可是，我在这里介绍的类和方法不仅仅是你学习高级技术的跳板，这些类和方法本身就可以处理很多通常的日期相关的任务  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-1945437135274662969?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/1945437135274662969/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=1945437135274662969' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1945437135274662969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1945437135274662969'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/java-java.html' title='JAVA基础应用: 处理Java中的日期问题'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-8946620745200964275</id><published>2007-03-30T16:12:00.000+08:00</published><updated>2007-03-30T16:14:09.289+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>如何将JAVA生成可执行文件 .exe</title><content type='html'>&lt;p&gt;倘若说看到标题后，以为jb真的提供了一种把&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;应用程序打包成exe文件的主流方法的话，你会失望的，下面的一个小技巧只是一个技巧而 &lt;br /&gt;已。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   这个是borland不公开的使用技巧，能够通过jbuilder来制作exe文件来启动&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;文件。jbuilder并不支持本地编译机制。 &lt;br /&gt;但是有一个隐藏的技巧可以让你从可执行文件来启动&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;程序，可以出现或者不出现console窗口。想做到这些，需要jbuilder的bin目录 &lt;br /&gt;下的这些文件:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   jbuilder.exe&lt;br /&gt;  jbuilderw.exe (可选)&lt;br /&gt;  jbuilder.config&lt;br /&gt;   jdk.config&lt;br /&gt;  javalauncher.dll&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   "jbuilder.exe"是一个通用的可执行外壳文件，用以启动&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;程序，"jbuilderw.exe"好像是javaw.exe一 &lt;br /&gt;样，它把"jbuilder.exe"包装起来，但是运行时候不显示那个console的窗口。使用这些文件的关键是文件 &lt;br /&gt;名。"jbuilder.exe"查找一个文件叫"jbuilder.config"的配置文件，里面包含了运行&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;程序的必须信息。同样 &lt;br /&gt;的"jbuilderw.exe"查找"jbuilder.exe"来启动不带console窗口的&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;程序。如果把jbuilder.exe重命 &lt;br /&gt;名为"foo.exe"，那"foo.exe"将去寻找"foo.config"配置文件，同样"jbuilderw.exe"被重命名 &lt;br /&gt;为"foow.exe"，它会去寻找"foo.exe"文件。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   说到这里，聪明的读者应该猜到怎样利用jbuilder.exe来启动应用程序了。只要把 &lt;br /&gt;jbuilder.exe,jbuilerw.exe,jbuilder.config改名成相应的文件名，在jbuilder.config里面指定 &lt;br /&gt;主类和类路径，就能够通过执行jbuilder.exe(或者被改名后的exe文件)来启动&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;应用程序了。下面是用本机为例。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   borland jbuilder 5被安装在e:\jbuilder5\目录下，在e:\jbuilder5\bin\下建立一个temp目 &lt;br /&gt;录，然后把jbuilder.exe,jbuilder.config,javalauncher.dll,jdk.config四个文件拷贝到: &lt;br /&gt;\jbuilder5\bin\temp\目录下，然后在这个目录下建立一个hello目录，在这个目录下生成一个hello.&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;文件，即e: &lt;br /&gt;\jbuilder5\bin\temp\hello\hello.&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;文件，file://hello.&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;/package&lt;br /&gt;hello;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   public class hello{&lt;br /&gt;  public static void main(string s[]){&lt;br /&gt;   system.out.println("hello, exe file!");&lt;br /&gt;  }&lt;br /&gt;  }&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   然后打开jbuilder.config文件，作相应的修改：&lt;br /&gt;  在jbuilder.config里面找到下面两行&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   # start jbuilder using the its main class&lt;br /&gt;  mainclass  com.borland.jbuilder.jbuilder&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   修改为&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   # start jbuilder using the its main class&lt;br /&gt;  mainclass hello.hello &lt;br /&gt;  addpath e:/jbuilder5/bin/temp/&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   addpath命令是把目录加入类路径中，这个命令和其它config里面可以识别的命令可以在jbuilder/bin目录下的 &lt;br /&gt;config_readme.txt里面找到详细说明。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   然后将jdk.config里面的javapath修改成相对的路径，例如原来是&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   javapath ../jdk1.3/bin/&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   修改成&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   javapath ../../jdk1.3/bin/&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   最后&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   将jbuilder.exe,jbuilder.config修改成所需要的文件名，例如foo.exe和foo.config文件 。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   现在执行foo.exe文件&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   至此，通过修改jbuilder来使用exe文件启动自己的&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;java&lt;/b&gt;应用程序已经完成了。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   但是好玩的地方并不在这个地方，下面的小技巧可能更有趣，将jar文件打包进入exe文件！&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   假设利用上面的文件，生成hello.jar包，执行过程.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   jar cvf hello.jar hello\*.class&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   将类文件打包成exe文件&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   然后将jar包附加到jbuilder.exe后面去.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   copy /b ..\jbuilder.exe+hello.jar foo.exe&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  将jar文件转化成exe文件&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   在foo.config(jbuilder.config)文件里面把前面加入的类路径去掉，并加入下面的路径：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   addpath e:/jbuilder5/bin/temp/foo.exe&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   然后执行.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   看到了么？一个含jar包的exe文件被执行了！&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   这个过程的大致原理是：exe文件的重要信息都在文件头部，所以把乱七八糟的东西放exe文件尾部是不要紧的；而jar/zip文件的重要信息是 &lt;br /&gt;在文件尾部的，这样它们两不相干，能够容 易的被执行。&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-8946620745200964275?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/8946620745200964275/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=8946620745200964275' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/8946620745200964275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/8946620745200964275'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/java-exe.html' title='如何将JAVA生成可执行文件 .exe'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-731975343605929154</id><published>2007-03-30T16:11:00.000+08:00</published><updated>2007-03-30T16:12:51.843+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>C++之父看Java 更多选项</title><content type='html'>C++之父──Bjarne Stroustrup，在接受采访时被问道下面这个问题：&lt;br /&gt;&lt;p&gt;作为一门语言的&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;以及作为一个软件执行平台的虚拟机，您对它们有何看法？&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Stroustrup这样回答：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;匪夷所思的过度吹嘘。我对围绕在它的广告周围的高智商欺骗程度感到不快。它可能是适合运行小型自包含系统的一个不错的平台，但它却被颂扬为针对所有问题、所有程­序员的解决方案&lt;br /&gt;— 它不是 — 没有任何语言和系统是。甚至连平台中立问题也并非像看上去的那样了无瑕疵。随着&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;库被扩展以支持更多的应用领域，这些库本身就成为一个平台。随着供应商们­添加新的便利设施，在使用来自相互竞争厂商的不同设施的机器之间的移植性，需要妥协折衷。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;人们常常声称&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;类似于C++。这种相似性不过是表面现象而已。语法类似，但计算模型、基本效率、表达力以及很多关键编程技术大不相同。当你考虑各种库需要­高效运作时，这两门语言看上去区别甚至更大。&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;并未很好地符合C++的设计准则，甚至&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;都不接近C++的设计准则。鉴于它有自己的与C++差异很大­的设计准则，我想它不可能接近C++的设计准则。同样，C++也不符合&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;的设计准则。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;我确信&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;会有一个合适的生存环境，就如同别的语言一样。我只是觉得大张旗鼓的广告宣传很犯嫌。我发现Sun的广告词"纯粹百分百，没有非&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;代码"尤­其讨厌&lt;br /&gt;— 也有点可怜。&lt;b style="color: black; background-color: rgb(255, 255, 102);"&gt;Java&lt;/b&gt;不可能为它的供应商（们）"同时"提供平台中立性和主要的利润来源。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-731975343605929154?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/731975343605929154/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=731975343605929154' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/731975343605929154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/731975343605929154'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/cjava.html' title='C++之父看Java 更多选项'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-4017547418716214623</id><published>2007-03-30T16:06:00.000+08:00</published><updated>2007-03-30T16:11:10.148+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>JDK早期版本中使用Java 5语言特性</title><content type='html'>&lt;p&gt;Java 5 添加了许多强大的语言特性：泛型、枚举、注释、自动装箱和增强的 for 循环。但是，许多工作组仍然被绑定在 JDK 1.4  或以前的版本上，可能需要花些时间才能使用新版本。但是，这些开发人员仍然可以使用这些功能强大的语言特性，同时在 JVM 早期版本上部署。&lt;/p&gt; &lt;p&gt;　　随着最新的 Java 6.0 的发布，您可能认为 Java 5 的语言特性是 “旧的新特性”。但是即使在现在，当我询问开发人员在开发时使用的 Java  平台的版本时，通常只有一半人在使用 Java 5 —— 另一半则只能表示羡慕。他们非常希望使用 Java 5  中添加的语言特性，例如泛型和注释，但仍有许多因素妨碍他们这样做。&lt;/p&gt; &lt;p&gt;　　不能利用 Java 5 特性的开发人员包括那些开发组件、库或应用程序框架的开发人员。因为他们的客户可能仍然在使用 JDK 1.4 或以前的版本，并且  JDK 1.4 或以前的 JVM 不能装载用 Java 5 编译的类，所以使用 Java 5 语言特性会把他们的客户基数限制在已经迁移到 Java 5  的公司。&lt;/p&gt; &lt;p&gt;　　另一类经常避免使用 Java 5 的开发人员是使用 Java EE 的开发人员。许多开发团队不愿在 Java EE 1.4 及以前的版本上使用  Java 5，因为担心其应用服务器的厂商不支持 Java 5。这些开发人员要迁移到 Java EE 5 可能还有待时日。除了 Java EE 5 和 Java  SE 5 规范之间的滞后，商业 Java EE 5  容器没有必要在规范刚刚制定好就能使用，企业也没有必要在应用服务器出现下一个版本时就立即升级，而且在升级应用服务器之后，可能还需要花些时间在新平台上验证其应用程序。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;Java 5 语言特性的实现&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　Java 5 中添加的语言特性 —— 泛型、枚举、注释、自动装箱和增强的 for 循环 —— 不需要修改 JVM  的指令集，几乎全部是在静态编译器(javac)和类库中实现的。当编译器遇到使用泛型的情况时，会试图检查是否保证了类型安全(如果不能检查，会发出  “unchecked cast”)，然后发出字节码，生成的字节码与等价的非泛型代码、类型强制转换所生成的字节码相同。类似的，自动装箱和增强的 for  循环仅仅是等价的 “语法糖”，只是更复杂的语法和枚举被编译到普通的类中。&lt;/p&gt; &lt;p&gt;　　在理论上，可以采用 javac 生成的类文件，在早期的 JVM 中装入它们，这实际上正是 JSR 14(负责泛型的 Java Community  Process 工作组)的成立目的。但是，其他问题(例如注释的保持)迫使类文件的版本在 Java 1.4 和 Java 5 之间变化，因此妨碍了早期 JVM  中装入用 Java 5 编译的代码。而且，在 Java 5 中添加的有些语言特性依赖于 Java 5 库。如果用 javac -target 1.5  编译类，并试图将它装入早期 JVM 中，就会得到 UnsupportedClassVersionError，因为 -target 1.5  选项生成的类的类文件版本是 49，而 JDK 1.4 只支持版最大为 48 的类文件版本。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;for-each 循环&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　增强的 for 循环有时叫做 for-each 循环，编译器编译它的时候，情形与程序员提供旧式 for 循环一样。for-each  循环能够迭代数组或集合中的元素。清单 1 显示了用 for-each 在集合上迭代的语法：&lt;/p&gt; &lt;p&gt;　　清单 1. for-each 循环&lt;/p&gt; &lt;p&gt; &lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;　　Collection fooCollection = ... &lt;br /&gt;　　for (Foo f : fooCollection) {&lt;br /&gt;　　doSomething(f); &lt;br /&gt;　　}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;　　编译器把这个代码转换成等价的基于迭代器的循环，如清单 2 所示：&lt;/p&gt; &lt;p&gt;　　清单 2. 清单 1 基于迭代器的等价循环&lt;/p&gt; &lt;p&gt; &lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;　　for (Iterator iter=f.iterator(); f.hasNext();) { &lt;br /&gt;　　Foo f = iter.next();&lt;br /&gt;　　doSomething(f); &lt;br /&gt;　　}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;　　编译器如何知道提供的参数有一个 iterator() 方法呢? javac  编译器的设计者可能已经内置了对集合框架的理解，但是这种方法有些不必要的限制。所以，创建了一个新的接口 java.lang.Iterable(请参阅清单 3  )，并翻新集合类使其实现 Iterable 接口。这样，不是在核心集合框架上构建的容器类也能利用新的 for-each 循环。但是这样做会形成对 Java 5  类库的依赖，因为在 JDK 1.4 中没有 Iterable。&lt;/p&gt; &lt;p&gt;　　清单 3. Iterable 接口&lt;/p&gt;&lt;br /&gt;&lt;p&gt; &lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="" bgcolor="#f3f3f3"&gt;　　public interface Iterable { &lt;br /&gt;　　Iterator iterator();&lt;br /&gt;　　}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;枚举和自动装箱&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　正像 for-each 循环一样，枚举也要求来自类库的支持。当编译器遇到枚举类型时，生成的类将扩展库类 java.lang.Enum。但是，同  Iterable 一样，在 JDK 1.4 类库中也没有 Enum 类。&lt;/p&gt; &lt;p&gt;　　类似的，自动装箱依赖于添加到原始包装器类(例如 Integer)的 valueOf() 方法。当装箱需要从 int 转换到 Integer  时，编译器并不调用 new Integer(int)，而是生成对 Integer.valueOf(int) 的调用。valueOf() 方法的实现利用  享元(flyweight)模式 为常用的整数值缓存 Integer 对象(Java 6 的实现缓存从 -128 到 127  的整数)，由于消除了冗余的实例化，可能会提高性能。而且，就像 Iterable 和 Enum 一样，valueOf() 方法在 JDK 1.4  类库中也不存在。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;变长参数&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　当编译器遇到用变长参数列表定义的方法时，会把其转换成包含正确组件类型数组的方法;当编译器遇到带有变长参数列表方法的调用时，就把参数装进数组。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;注释&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　定义了注释的之后，可以用 @Retention 对它进行注释，它可以决定编译器对使用这个注释的类、方法或字段执行什么处理。已经定义的保持策略有  SOURCE (在编译时舍弃注释数据)、CLASS (在类文件中记录注释)或 RUNTIME  (在类文件中记录注释，并在运行时保留注释，这样就可以反射地访问它们了)。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;其他的库依赖关系&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在 Java 5 之前，当编译器遇到尝试连接两个字符串的情况时，会使用帮助器类 StringBuffer 执行连接。在 Java 5  及以后的版本中，转而调用新的 StringBuilder 类，JDK 1.4 及以前的类库中不存在该类。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;访问 Java 5 特性&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　因为语言特性对库支持的依赖，即使使用 Java 5 编译器生成的类文件能够装入早期 JVM  版本，执行也会因为类装入错误而失败。但是，通过对字节码进行适当转换，仍有可能解决这些问题，因为这些遗漏的类并不包含实际的新功能。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;JSR 14&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在 Java 泛型规范(以及其他 Java 5 新添加的语言特性)的开发期间，在 javac 编译器中添加了试验性的支持，以便让它能使用 Java 5  的语言特性，并生成能在 Java 1.4 JVM 上运行的字节码。虽然这些特性不受支持(甚至是文档)，但许多开源项目都使用了它们，使得开发人员能使用 Java  5 语言特性编码，并生成能在早期 JVM 上使用的 JAR 文件。而且，既然 javac 是开源的，那么这个特性有可能得到第三方的支持。要激活这些特性，可以用  -source 1.5 和 -target jsr14 选项调用 javac。&lt;/p&gt; &lt;p&gt;　　javac 的 JSR 14 目标模式使编译器生成与 Java 5 语言特性对应的 JDK 1.4 兼容字节码：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;　　&lt;strong&gt;泛型和变长参数：&lt;/strong&gt;编译器在泛型出现的地方插入的强制转换不依赖类库，所以能够在 Java 5 之前的 JVM  上很好地执行。类似的，编译器在出现变长参数列表的地方生成的代码也不依赖类库。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;for-each 循环：&lt;/strong&gt;当迭代数组时，编译器生成归纳变量和标准的数组迭代语法。当在 Collection  上迭代时，编译器生成标准的基于迭代器的语法。当在非集合的 Iterable 上迭代时，编译器生成错误。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;自动装箱：&lt;/strong&gt;编译器不生成对包装器类的 valueOf() 方法的调用，而是生成对构造函数的调用。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;字符串连接：&lt;/strong&gt;javac 的 JSR 14 目标模式使编译器生成对 StringBuffer 的调用而不是对  StringBuilder 的调用。  &lt;/li&gt;&lt;li&gt;　　&lt;strong&gt;枚举：&lt;/strong&gt;javac JSR 14 目标模式对枚举没有特殊支持。尝试使用枚举的代码会失败，在寻找  java.lang.Enum 基类时出现 NoClassDefFoundError。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　　使用 JSR 14 目标模式允许在 “简易” 情况下编写使用泛型、自动装箱和 for-each  循环的代码，这对多数项目来说可能足够了。这很方便，如果不支持的话，编译器会一次生成基本兼容的字节码。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-4017547418716214623?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/4017547418716214623/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=4017547418716214623' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4017547418716214623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4017547418716214623'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/jdkjava-5.html' title='JDK早期版本中使用Java 5语言特性'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7728268469706284914</id><published>2007-03-30T15:07:00.000+08:00</published><updated>2007-03-30T15:08:33.230+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>EJB 3 术语汇编</title><content type='html'>&lt;h1&gt;EJB 3 术语汇编&lt;/h1&gt;     &lt;p class="info"&gt;    作者    &lt;strong&gt;Oliver Ihns, Stefan M. Heldt&lt;/strong&gt;译者    &lt;strong&gt;Jason Lai&lt;/strong&gt;    发布于    2007年3月26日 上午5时38分   &lt;/p&gt;         &lt;dl class="tags2"&gt;&lt;dt class="community"&gt;社区&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://www.infoq.com/cn/java/" name="java" id="739" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;"&gt;Java&lt;/a&gt;&lt;/dd&gt;&lt;dt class="topics"&gt;主题&lt;/dt&gt;&lt;/dl&gt;                  &lt;a name="Title"&gt;&lt;/a&gt; &lt;p&gt;&lt;strong&gt;中文翻译：&lt;/strong&gt;Jason Lai。如果您在阅读过程中发现任何翻译问题或者存在任何疑问，欢迎您邮件联系 &lt;a href="mailto://Jason@infoq.com/"&gt;Jason[at]infoq.com&lt;/a&gt;，期待您的宝贵建议与意见 :)&lt;/p&gt;                       &lt;p&gt;&lt;strong&gt;版本 1.1.2，最新更新于2006年7月17日。&lt;/strong&gt;这是一份关于 EJB 3 引入的新术语、新概念的核心术语表。本术语表旨在为一些流行术语（buzzwords）揭开神秘面纱，如 IoC、按异常配置（Configuration by Exception）、POJO、POJI、依赖注射（Dependency Injection）、可嵌入对象（Embeddable Object）、拦截器（Interceptors），还有许多。本术语表是一项不断完善的工作，我们将定期对其进行更新。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;术语链接：&lt;/strong&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#A"&gt;A&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#B"&gt;B&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#C"&gt;C&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#D"&gt;D&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#E"&gt;E&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#F"&gt;F&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#H"&gt;H&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#I"&gt;I&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#J"&gt;J&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#L"&gt;L&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#M"&gt;M&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#P"&gt;P&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#R"&gt;R&lt;/a&gt; - &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#S"&gt;S&lt;/a&gt; &lt;/p&gt; &lt;a name="A"&gt;&lt;/a&gt; &lt;h2&gt;A&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Attached Object（附属对象）- EJB 3.0&lt;/strong&gt; - 表示实体 Bean 的一个实例，该实例及其所持的来自数据库的数据目前被实体管理器（Entity Manager）所管理。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="B"&gt;&lt;/a&gt; &lt;h2&gt;B&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Bean Class（Bean 类）- EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - Bean 类是 EJB 组件的产物，这个 EJB 组件持有业务逻辑的实现。在面向对象表示法中，我们会把这个类视为实现类（例如 CustomerImpl）。对于 EJB 我们则使用“Bean 类”这个术语（例如 CustomerBean）。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Bean-managed Persistence（Bean 管理的持久化）- EJB 2.x，EJB 3.0&lt;/strong&gt; - 实体 Bean 的两种持久化机制之一。当实体 Bean 采取 Bean 管理的持久化（BMP）时，开发人员须负责实现持久化逻辑。总的来说，这意味着你必须将实体 Bean 的持久化属性恰如其分地与持久层进行匹配。要达到这个目的，你必须在 Bean 类中为持久层实现访问逻辑（例如，使用 JDBC 访问数据库，或使用 JCA 访问既有系统）。 &lt;/p&gt; &lt;ul&gt;&lt;li&gt;EJB 容器决定操作产生的时间。 &lt;/li&gt;&lt;li&gt;开发人员决定完成一些什么操作。 &lt;/li&gt;&lt;/ul&gt; 注意：在 EJB 3.0 中，Bean 管理的持久化已经不复存在。 &lt;p&gt; &lt;strong&gt;BMP - EJB 2.x，EJB 3.0&lt;/strong&gt; - Bean-managed Persistence（Bean 管理的持久化）的缩写。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Business Interface（业务接口）- EJB 3.0&lt;/strong&gt; - 业务接口包含一个 EJB 组件中业务方法的声明。此外，它是 EJB 3.0 里描述 POJI 类型接口的术语。与 EJB 2.x 组件接口不同，这些业务接口不能扩展 javax.ejb.EJB[Local]Object。同一个业务接口不允许同时作为一个 EJB 组件的本地和远程业务接口。&lt;/p&gt; &lt;p&gt;会话 Bean（Session Beans）必须有业务接口。消息驱动Bean（Message-Driven Beans）必须拥有一个符合其使用的消息类型（例如 javax.jms）的（业务）接口。在 EJB 3.0，消息驱动 Bean 的这个接口也可以被称作业务接口，不过该接口要比功能性接口更技术化一些。EJB 3 实体不一定需要用业务接口来表现。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="C"&gt;&lt;/a&gt; &lt;h2&gt;C&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Callback Methods（回调方法）- EJB 2.x，EJB 3.x&lt;/strong&gt; - 在 EJB 2.x 里，Bean 类必须按照 Bean 的类型（javax.ejb.SessionBean、javax.ejb.MessageDrivenBean 或 javax.ejb.EntityBean）实现其回调接口。首先，这些接口指明你拥有的 EJB 类型。其次，这些接口声明了回调方法，EJB 容器调用这些方法，管理EJB 组件的生命周期。开发人员必须在 Bean 类中实现接口声明的回调方法。&lt;/p&gt; &lt;p&gt;在 EJB 3.0 中，上述回调接口不再需要由 Bean 类来实现了。由于开发人员不再被强制去实现这些回调方法，开发时间及工作量均得以缩减。但是，仍然可以使用一系列已定义的标注（annotations） 来接手 EJB 组件的生命周期管理，标注可以标记在任意的方法上，这样可以根据使用的标注在定义的时间执行这些方法。你可以把这些标注用在所有的 EJB 类型上。标注 @PostConstruct、@PreDestroy、@PostActivate 和 @PrePassivate 可被应用于会话 Bean 和消息驱动 Bean 上；而对于 EJB 3 实体来说，下列标注可用：@PrePersist、@PostPersist、@PreRemove、@PostRemove、@PreUpdate、 @PostUpdate 和 @PostLoad。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;CMP - EJB 2.x，EJB 3.0&lt;/strong&gt; - Container-managed Persistence（容器管理的持久化）的缩写。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Component Interface（组件接口）- EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - 组件接口是 EJB 组件的业务接口。它有两种形式：作为本地接口（仅能在同一进程内访问→参见 Local Interface）和/或作为远程接口（可以跨机器和进程进行访问→参见 Remote Interface）。组件接口必须扩展自 javax.ejb.EJB[Local]Object。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Configuration by Exception（按异常配置）- EJB 3.0&lt;/strong&gt; - 按异常配置的方法随着 EJB 3.0 一起被引入。这个方法的目标之一就是减少对于 EJB 组件的配置和/或者开发的开发次数和工作量。&lt;/p&gt; &lt;p&gt;开发人员只须在异常情况下（正因如此称为“按异常配置”）为 EJB 组件提供配置或者运行期控制信息，也就是说，仅须在所期望的行为与已定义且给定的某个类型 EJB 组件的标准行为相悖的情况下提供。其目标是为了减少对配置参数的显式说明的必要性，这些配置参数用于通常预期的EJB组件行为以及对EJB容器的需求。&lt;/p&gt; &lt;p&gt;具体言之，这就是说在 EJB 3.0 中，许多功能和/或行为默认情况下已经为 EJB 组件设置好了。这些缺省行为应涵盖绝大多数 EJB 组件（和/或相应 EJB类型）的典型用例。假如标准行为不适合需求的情况，那么开发人员可以很容易地重载这些默认数值和/或标准行为。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Container-Managed Persistence（容器管理的持久化）- EJB 2.x，EJB 3.0&lt;/strong&gt; - 实体 Bean 的两种持久化机制之一。如果你正在使用容器管理的持久化（CMP），你可以不必编写代码处理实体 Bean 与持久层间的同步。代码是由应用服务器的工具生成的。开发人员的任务只需要集中在持久化属性的声明及不同实体 Bean 之间的关系。运行时期的同步由 EJB 容器的一个特殊部件来完成——即所谓的“持久化管理器”。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="D"&gt;&lt;/a&gt; &lt;h2&gt;D&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;DD - EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - Deployment Descriptor（部署描述符）的缩写。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Detached Entity（游离实体，也译作“脱管实体”）- EJB 3.0&lt;/strong&gt; - 参见 Detached Object（游离对象）。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Detached Object（游离对象，也译作“脱管对象”）- EJB 3.0&lt;/strong&gt; - 表示一个 EJB 3 实体的实例，该实例脱离了将它持久化或者取得它的持久化上下文环境。因此，这样的对象不再受实体管理器所管理，其数据与数据库之间的同步不再可能进行。但 应用程序仍旧可以使用游离对象，可以访问其可用的状态，并进行更改，但（实体管理器）不会对这些操作进行跟踪。&lt;/p&gt; &lt;p&gt;游离对象的产生可以分为很多种情况。例如，对一个 EJB 3 实体进行序列化就是其中之一。经过序列化，EJB 3 实体将转化成一个游离对象。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Dependency Injection（依赖注射）- EJB 3.0&lt;/strong&gt; - 依赖注射（DI）这个名词是反转控制（Inversion of Control）模式的一个特殊形式。Martin Fowler 发明了这个术语（参看 &lt;a target="_blank" href="http://martinfowler.com/articles/injection.html"&gt;http://martinfowler.com/articles/injection.html&lt;/a&gt;）——这是因为目前的一些轻量级容器/框架中反转控制的使用形式，其性质更像是类/对象的引用的注射。&lt;/p&gt; &lt;p&gt;将 DI 引入EJB 3 的动机是为了简化对 EJB 组件资源的查找。我们不再需要在 EJB 组件中编写任何基于 JNDI API 的代码了——即便你还是可以随意使用它。&lt;/p&gt; &lt;p&gt;EJB 的 DI 技术意味着开发人员可以从编写基于 JNDI API 代码实现资源查找的桎梏中解脱出来。相反他只须在 EJB 组件中标注实例变量或者 setter 方法，或者在相应 XML 中声明这样的依赖说明，就可以从容器中请求到资源的引用。接着，容器在运行期，执行 EJB 组件某个方法之前，把必要或者请求的资源引用注射到 EJB 组件中，也就是说，EJB 组件不再需要主动从它的容器中一个接一个地请求资源，取而代之的是通过容器的注射来取得它们。&lt;/p&gt; &lt;p&gt;使用标注（annotations）比使用 XML 要方便许多，它将是 EJB 3 的首选方案。在这里 DI 只是访问 JNDI context 及获取引用的一个简化机制。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Deployment Descriptor（部署描述符）- EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - 部署描述符是一个 XML 文件，它包含生成、执行 EJB 组件的编译期和运行期信息。开发人员通过简单地在部署描述符中声明某些关键字的方式实现功能和/或行为，而不需要编写一行代码，因此这种方式又称作声明式 编程（declarative programming）。例如 EJB 组件的事务处理行为就是通过这种方式控制的。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="E"&gt;&lt;/a&gt; &lt;h2&gt;E&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Eager Load（贪婪加载，亦作“提前加载”）- EJB 3.0&lt;/strong&gt; - 贪婪加载是 Java Persistence API 中定义的两种数据抓取策略（fetching strategies）之一。简而言之，贪婪加载表示 EJB 3.0 实体的持久化数据是从数据库中直接且完整地读取，并且被写入该 EJB 3.0 实体的相应实例属性中的。此 EJB 3.0 实体中所有被引用到的持久化实体（EJB 3.0 实体或者可嵌入对象）也将以类似的方式加载。事实上，贪婪加载实现的实际特点和厂商的各自实现有关。&lt;/p&gt; &lt;p&gt;贪婪加载的优点是，数据在一个回合中一次性抓取完毕。当应用程序访问这些属性时，它们的数据已经被取好，摆在那里了。而对较大的持久化对象网络或者对象树使用贪婪加载的缺点是会导致漫长的加载时间以及大量的内存消耗。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;EJB - EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - Enterprise JavaBeans 的缩写，Java EE 平台下服务器端组件模型的名称。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;EJB 3.0 Entity（EJB 3.0 实体）- EJB 3.0&lt;/strong&gt; - EJB 3.0 实体是一个轻量级的持久化业务域对象。在 Java Persistence API 中，它被称为持久化实体。其原因是，Java Persistence API 不再应该仅在 Java EE 下专用，而应该也能在 Java SE 环境下使用。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;EJB Component（EJB 组件）- EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - EJB 组件是所有 EJB 类型（→参见 EJB Types）的通用名词。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;EJB Types（EJB 类型）- EJB 1.x，EJB2.x，EJB 3.0&lt;/strong&gt; - EJB 规范在 EJB 2.x 中定义了三种 EJB 类型： &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Session Bean（会话 Bean，具有有状态和无状态两种性质） &lt;/li&gt;&lt;li&gt;Message-Driven Bean（消息驱动 Bean） &lt;/li&gt;&lt;li&gt;Entity Bean（实体 Bean） &lt;/li&gt;&lt;/ul&gt; &lt;p&gt; 在 EJB 3 中定义了下列的 EJB 类型： &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Session Bean（会话 Bean，具有有状态和无状态两种性质） &lt;/li&gt;&lt;li&gt;Message-Driven Bean（消息驱动 Bean） &lt;/li&gt;&lt;li&gt;EJB 3 实体 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt; 注意：在 EJB 3 中，会话 Bean 和消息驱动 Bean 将被通称为 Enterprise Beans。轻量级持久化业务域对象将被明确地命名为 EJB 3 实体或者持久化实体。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;EJB QL - EJB 1.x，EJB 2.x&lt;/strong&gt; - EJB Query Language（EJB 查询语言）的缩写。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;EJB Query Language（EJB 查询语言）- EJB 1.x，EJB 2.x&lt;/strong&gt; - EJB QL 是 Enterprise JavaBeans 组件架构的查询语言。它与 SQL 相似，但专注于对象。它随着 EJB 3.0 一起被升级，但在 EJB 3.0 中被称为 Java 持久化查询语言（Java Persistence Query Language，Java Persistence QL）。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Embeddable Object（可嵌入对象）- EJB 3.0&lt;/strong&gt; - 如果有这样的 POJO，它们不是 EJB 3 实体，因而不具备持久化性质，可以被嵌入 EJB 3 实体中作为属性，那么这样的对象就称为可嵌入对象。这些可嵌入对象的属性装载的是对象的外围 EJB 3 实体所关联的数据表的数据。&lt;/p&gt; &lt;p&gt;例如，你可以将一个数据表映射到一个 EJB 3 实体及嵌入它的另外一些 POJO 上，将一个非常规的数据表映射到一个对象网络上。&lt;/p&gt; &lt;pre&gt;@Entity&lt;br /&gt;@Table(name="CUSTOMER")&lt;br /&gt;public class Customer implements java.io.Serializable {&lt;br /&gt;   private int id;&lt;br /&gt;   &lt;span style="color:#ff0000;"&gt;private Address address;&lt;/span&gt;&lt;br /&gt;   private String lastName;&lt;br /&gt;   private String firstName;&lt;br /&gt;&lt;br /&gt;   public Customer(String lastName, String firstName,String street, String city) {&lt;br /&gt;     this.address = new Address(street, city);&lt;br /&gt;     this.lastName= lastName;&lt;br /&gt;     this.firstName = firstName;&lt;br /&gt;   }&lt;br /&gt;   ...&lt;br /&gt;&lt;br /&gt;   &lt;span style="color:#ff0000;"&gt;@Embedded&lt;br /&gt;   @AttributeOverrides(&lt;br /&gt;     @AttributeOverride(name="street", column=@Column(name="STREET")),&lt;br /&gt;     @AttributeOverride(name="city",column=@Column(name="CITY")) })&lt;br /&gt;   public Address getAddress() {&lt;/span&gt;&lt;br /&gt;      return address;&lt;br /&gt;   }&lt;br /&gt;   public void setAddress(Address address) {&lt;br /&gt;      this.address = address;&lt;br /&gt;   }&lt;br /&gt;   @Column(name="LASTNAME")&lt;br /&gt;   public String getLastName() {&lt;br /&gt;      return lastName;&lt;br /&gt;   }&lt;br /&gt;   public void setLastName(String lastName) {&lt;br /&gt;      this.lastName = lastName;&lt;br /&gt;   }&lt;br /&gt;   ...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Embeddable Object&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;@Embeddable&lt;/span&gt;&lt;br /&gt;public class Address implements java.io.Serializable {&lt;br /&gt;    private String street;&lt;br /&gt;    private String city;&lt;br /&gt;    ...&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;Enterprise Bean - EJB 3&lt;/strong&gt; - 会话 Bean 和消息驱动 Bean 可以被更概括地称为 Enterprise Beans。请注意 EJB 3 实体不能被称作 Enterprise Beans。但对于 EJB 3 实体则不能使用这个通称，因为它们可以也能被用于 Java SE 环境。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Entity Bean（实体 Bean）- EJB 2.x&lt;/strong&gt; - 在EJB 2.x，用于持久化实体的 EJB 类型称为实体 Bean。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Entity Manager（实体管理器）- EJB 3.0&lt;/strong&gt; - Java EE 和 Java SE 的新成员，随 EJB 3.0 一同引入。（正像在JDO和Hibernate一样）它是一个核心的持久化管理器。实体管理器负责实体（POJOs）的持久化映射，它在数据库中创建持久 化实体，对它们加载、存储、删除和搜索操作，同时也关注实体在并发访问时的一致性（并发处理）。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="F"&gt;&lt;/a&gt; &lt;h2&gt;F&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Fetching-Strategy（抓取策略）- EJB 3.0&lt;/strong&gt; - 在 EJB 3.0 规范的 Java Persistence API 中，定义了两种抓取策略：延迟加载（Lazy Load）和贪婪加载（Eager Load，亦作“提前加载”）。和 Hibernate 以及其它持久方案提供工具（如 TopLink）相比，这两种策略以及其性质只有少数可选方案。对这两种抓取策略的进一步细化及改进的工作，大致计划在规范的后续版本中开展。&lt;/p&gt; &lt;p&gt;绝大多数情况下，贪婪加载策略被预设为 Java Persistence API 的缺省方案。延迟加载仅在开发人员显式声明时才被使用。持久方案提供者运行时（Persistence Provider Runtimes，例如 Hibernate）被要求实现并提供贪婪加载机制。延迟加载则仅被持久方案提供者进行时实现者视为需注意事项而已。EJB 3.0 规范没有提供更多的关于延迟加载机制应当如何实现的细节，这样将带来许多风险，譬如，因为不同厂商架构和技术实现的分歧所带来的互操作性弱的问题。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="H"&gt;&lt;/a&gt; &lt;h2&gt;H&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Home Interface（Home 接口）- EJB 1.x，EJB 2.x&lt;/strong&gt; - EJB 组件的 Home 接口包含创建、删除或加载 EJB 组件实例的方法。由于客户端无法跨越机器和进程界限，直接创建、删除或者加载 EJB 组件的实例，它们必须强制使用相应 EJB 组件的 Home 接口。Home 接口提供多种功能。通过使用 Home 接口，我们得以实现 EJB 组件和客户端的解耦。Home 接口实现了“工厂方法（Factory Method）”设计模式，它以两种形式存在： &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Remote Home Interface（远程 Home 接口）——用于跨机器和进程的远程访问 &lt;/li&gt;&lt;li&gt;Local Home Interface（本地 Home 接口）——用于进程内调用的本地访问 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;img alt="" _href="img://image2.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/image2.jpg" /&gt; &lt;/p&gt; &lt;p&gt;在 EJB 3.0 中，会话 Bean 不再强制使用 Home 接口，就是说，它们可以不必实现 Home 接口。而 EJB 3 实体也不再需要 Home 接口了。但是，规范中并没有规定 Home 接口应当消失。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="I"&gt;&lt;/a&gt; &lt;h2&gt;I&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Interceptor（拦截器）- EJB 3.0&lt;/strong&gt; - 在 EJB 3.0 中，对业务方法的调用进行拦截成为可能——与基于 CORBA 系统相似，在这些系统中拦截器的广泛使用已经有一段历史了。你可以在需要时分析及操作参数，并且允许或者禁止业务方法的执行。由于拦截器机制的出现，面向 方面编程（aspect oriented programming）走入了基于 EJB 开发——起码是起始阶段。拦截器允许将技术性功能（比如日志、跟踪、安全）透明地织入业务方法中。拦截器的开发人员可以实现任何代码，这些代码将在拦截器 被激活，对EJB对象的某个方法调用进行拦截时被执行。&lt;/p&gt; &lt;img alt="" _href="img://image3.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/image3.jpg" /&gt; &lt;p&gt;&lt;strong&gt;Inversion of Control（反转控制）- EJB 3.0&lt;/strong&gt; - 反转控制（IoC）是框架的一个常见性质，一般常用好莱坞原则“don't call us, we'll call you”一语来作诠释（译注：这里的 call 一语双关，既包含通俗意义上“打电话”之意，更主要地，在编程上也做“函数/方法调用”解），意即程序执行过程中的责任是落在框架上，而不在组件上。就是 说，组件所赖以构建的框架，要求相应的组件实现框架的某些回调方法（callback methods）。接着，框架在运行期调用这些回调方法，将信息注入，触发预定行为。&lt;/p&gt; &lt;p&gt;在 EJB 3.0 环境下，IoC 和依赖注射两个词常作为同义词互相代用，即便细节上它们有一些语义的区别（→参见 Dependency Injection）。在 EJB 3.0 中使用的是反转控制的一个特殊形式，叫做依赖注射。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="J"&gt;&lt;/a&gt; &lt;h2&gt;J&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Java Persistence API（Java 持久化 API）- EJB 3.0&lt;/strong&gt; - EJB 3.0（Java Community Process 中的 JSR 220）中开发出了 Java Persistence API。Java Persistence API 将成为 Java EE 和 SE 的标准持久化方案，其中一项重要性质就是可以被用于任意 POJO，并不仅限于 EJB 组件。因此 Java Persistence API 对于不需要在应用程序中使用 EJB 组件的开发人员同样是可用的。领导 Hibernate、TopLink、JDO 和 EJB 持久化解决方案的专家参与了 Java Persistence API 的开发。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Java Persistence QL - EJB 3.0&lt;/strong&gt; - Java Persistence Query Language（Java 持久化查询语言）的缩写。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Java Persistence Query Language（Java 持久化查询语言）- EJB 3.0&lt;/strong&gt; - Java 持久化查询语言是 Enterprise JavaBeans 组件架构的查询语言，与 SQL 相似，但是更专注于对象。与 EJB SQL 相比，Java 持久化查询语言进行了大幅度的改进。EJB QL 的许多遗缺功能都在 Java 持久化查询语言中被实现。Java 持久化查询语言比 EJB QL 拥有更加丰富的功能集合，且看起来有点像 Hibernate HQL。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="L"&gt;&lt;/a&gt; &lt;h2&gt;L&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Lazy Load（延迟加载）- EJB 3.0&lt;/strong&gt; - 正像其它持久化解决方案一样，延迟加载在此也代表这样一种策略：持久化实体（EJB 3.0 实体）的持久化数据仅在对持久对象和/或其属性的实际访问发生时，才从数据库中读入。用延迟加载标记过的所有的属性或与其它持久化实体连接的关系，仅在对 它们的相应访问发生的时候，才实时（just in time）地从数据库加载。&lt;/p&gt; &lt;p&gt;延迟加载实现的实际性质取决于厂商各自的实现。&lt;/p&gt; &lt;p&gt;延迟加载的优点在于，数据仅在出现对某个属性或者关系的存取时才被取用，这样做可以减少对内存的消耗；其缺点则是，应用程序可能会因为对持久化数据进行即时抓取而减慢运行速度。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Local Home Interface（本地 Home 接口）- EJB 2.x&lt;/strong&gt; - 本地类型的 Home 接口称为本地 Home 接口。它就是所谓的高速 Home 接口，因为它仅在 EJB 组件客户端处于同一个容器（进程）的情况下才被使用。本地 Home 接口和远程 Home 接口一样用于创建、删除和加载 EJB 组件。本地 Home 接口比起远程 Home 接口结构要轻便一些，因为前者无法通过 RMI 调用，并且不具备在网络上进行列集（marshalling），散集（unmarshalling）以及传送（transmitting）的功能。客户端 与 EJB 组件间的通信是进程内的，因此比远程 Home 接口更快。本地 Home 接口不能接受远程方法调用。&lt;/p&gt; &lt;p&gt;在 EJB 3.0 中，会话 Bean 不再强制使用 Home 接口，就是说，它们可以不必实现 Home 接口。而 EJB 3 实体也不再需要 Home 接口了。但是，规范中并没有规定 Home 接口应当消失。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Local Interface（本地接口）- EJB 2.x，EJB 3.0&lt;/strong&gt; - 仅允许本地通信的业务接口（EJB 3）技术上的变体或者 EJB 组件的组件接口（EJB 2.x）称为本地接口。它仅允许客户端和组件之间的进程内通信。当一个 EJB 组件只包含本地接口而没有远程接口时，将无法对组件进行远程访问。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="M"&gt;&lt;/a&gt; &lt;h2&gt;M&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Managed Entity/Managed Object（受管实体/受管对象）- EJB 3.0&lt;/strong&gt; - 受管实体是一个带有持久化性质的 EJB 3.0 实体的实例。该实体目前与一个持久化上下文环境（persistent context）相关联，因此它受实体管理器（Entity Manager）的管理。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Message-Driven Bean（消息驱动 Bean）- EJB 2.x，EJB 3.0&lt;/strong&gt; - 消息驱动 Bean（MDB）被用于在 J2EE 和 Java EE 应用程序中实现异步工作流，是消息代理的消息消费者。MDB 可以从消息代理取得异步消息，并进行处理。因而在消息系统的环境中，消息驱动 Bean 作为消息的终点。&lt;/p&gt; &lt;p&gt;消息驱动 Bean 既不包含 Home 接口也不包含组件接口（EJB 1.x，EJB 2.x）或业务接口（EJB 3.0）。注意：EJB 3 规范规定，消息驱动 Bean必须有一个业务接口。具体来说，该业务接口是一个根据使用的具体消息类型的接口。在 EJB 3 中，消息驱动 Bean 的这个接口又叫做业务接口，尽管它比功能性接口更为技术性。由于 MDB 没有一个实际的业务接口，消息驱动 Bean 对客户端是不可见的，即 MDB 不能被直接使用。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Meta-Annotations（元标注）- EJB 3.0&lt;/strong&gt; - 元标注是 Java 编程语言的动态语言扩充，它们在 JSR 175 中被引入 JDK 5.0（也叫 Java 1.5）。标注允许在 Java 代码中放置元信息（meta information），这些元信息可以在编译期和运行期被取值。它们可以用来进行代码生成或者控制对象或者 EJB 组件的运行期行为。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Multi-table Mapping（多表映射）- EJB 3.0&lt;/strong&gt; - 多表映射表示 EJB 3.0 实体可以被映射到多个物理数据库表格上。除非你显式地在 Bean 管理的持久化中写代码实现，否则 EJB 2.x 不具备这项功能。在 EJB 3.0 里，一个 EJB 3.0 实体不再只有和数据表以 1:1 对应的单一形式了。相反地，它是逻辑业务对象的技术层面的包装器，这个逻辑业务对象的数据可以分布在若干个表格中。在 EJB 3.0 实体中，使用标注（annotations）方便地指明哪些表格/字段是相应数据的来源，也可以在 XML 中指定 O/R 映射。实体管理器则负责在运行期解析关系模型，为 EJB 3.0 实体装载数据（参考图示）。&lt;/p&gt; &lt;img alt="" _href="img://image5.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/image5.jpg" /&gt; &lt;p&gt;&lt;strong&gt;被映射到三个数据表的 EJB 3.0 实体&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;@Entity&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;@Table(name="CUSTOMER")&lt;br /&gt;@SecondaryTables({&lt;br /&gt; @SecondaryTable(name="ADDRESS")&lt;br /&gt; @SecondaryTable(name="TYPE") })&lt;/span&gt;&lt;br /&gt;public class Customer implements java.io.Serializable {&lt;br /&gt;   private int id;&lt;br /&gt;   private String firstName; // from table "CUSTOMER"&lt;br /&gt;   private String lastName;  // from table "CUSTOMER"&lt;br /&gt;   private String street;    // from secondary table "ADDRESS"&lt;br /&gt;   ...&lt;br /&gt;   &lt;span style="color:#ff0000;"&gt;// Attribute from main table ?CUSTOMER“&lt;br /&gt;   @Column(name="LASTNAME") &lt;br /&gt;   public String getLastName() {&lt;/span&gt;&lt;br /&gt;     return lastName;&lt;br /&gt;   }&lt;br /&gt;   ...&lt;br /&gt;   &lt;span style="color:#ff0000;"&gt;// Attribute from secondary table "ADDRESS"&lt;br /&gt;   @Column(name="STREET", table="ADDRESS")&lt;br /&gt;   public String getStreet() {&lt;/span&gt;&lt;br /&gt;     return street;&lt;br /&gt;   }&lt;br /&gt;   ...&lt;br /&gt;   // if no @Column annotation is specified,&lt;br /&gt;   // it is assumed that column name equals attribute name&lt;br /&gt;   public String getFirstName() {&lt;br /&gt;     return firstName ;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="P"&gt;&lt;/a&gt; &lt;h2&gt;P&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Persistence Provider Runtime（持久方案提供者运行时）- EJB 3.0&lt;/strong&gt; - “持久方案提供者运行时”这个术语指代 Java Persistence API 的持久化实现的运行期环境。在 Java EE 中，它可能是一个带有集成持久化方案实现的 Java EE 容器，或者一个与第三方持久化方案提供工具实现集成的 Java EE 容器。在 Java SE 中，它是一个单独的持久化方案提供工具的实现（就像 Hibernate）。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Plain Old Java Interface（简单传统 Java 接口，也译作无格式普通 Java 接口）- EJB 3.0&lt;/strong&gt; - 这个术语与 2004 年在各种刊物和电子杂志突然出现。“简单传统Java接口/无格式普通Java接口（Plain Old Java Interface，POJI）”这个术语代表一个简单的 Java 接口，这个接口没有被某个基础架构或其他技术层面的关联代码所“污染”。EJB 3.0 的环境中也引入了这个术语。EJB 3.0 的核心思想是，从开发人员的角度看，EJB 组件在使用上以及它们的微架构方面变得不那么复杂。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Plain Old Java Object（简单传统 Java 对象，也译作无格式普通 Java 对象）- EJB 3.0&lt;/strong&gt; - 这个术语于 2004 年在各种刊物和电子杂志突然出现。“简单传统 Java 对象/无格式普通 Java 对象（Plain Old Java Object，POJO）”这个术语代表一个简单的 Java 类（或者应该叫做 POJC ;-)），这个类并没有被某个基础架构或其他技术层面的关联代码所“污染”，在更复杂的系统中这种“污染”的情况很典型。EJB 3.0 的环境中也引入了这个术语。EJB 3.0 的核心思想是，从开发人员的角度看，EJB 组件在使用上以及它们的微架构方面变得不那么复杂。目标就是使它们变得简单到可以被视为 POJO。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;POJI - EJB 3.0&lt;/strong&gt; - Plain Old Java Interface的缩写。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;POJO - EJB 3.0&lt;/strong&gt; - Plain Old Java Object的缩写。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="R"&gt;&lt;/a&gt; &lt;h2&gt;R&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Remote Home Interface（远程 Home 接口）- EJB 1.x，EJB 2.x&lt;/strong&gt; - 远程Home接口使远程客户能够通过网络创建、加载或者删除 EJB 的实例。客户端使用 RMI/IIOP 协议进行远程方法调用，与远程 Home 接口通讯。在分布式系统中，当网络中任意指定机器上的客户端需要 EJB 时，必须使用远程 Home 接口。&lt;/p&gt; &lt;p&gt;在 EJB 3.0 中，会话 Bean 不再强制使用 Home 接口，就是说，它们可以不必实现 Home 接口。而 EJB 3 实体也不再需要 Home 接口了。但是，规范中并没有规定 Home 接口应当消失。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Remote Interface（远程接口）- EJB 1.x，EJB 2.x&lt;/strong&gt; - 允许远程通信的业务接口（EJB 3）技术上的变体或者 EJB 组件的组件接口（EJB 1.x，2.x），成为远程接口。当一个 EJB 组件包含远程接口时，其他进程的客户端可以跨越进程和机器的阻隔调用该组件。这个通信方式采用 RMI/IIOP。即便客户端和 EJB 组件在同一个进程中（例如客户端本身就是一个 EJB 组件的情况），并且客户端使用远程接口，通讯方式还是采用 RMI/IIOP。在这种情况下这会导致通讯效率不必要的损耗。改进的方法是使用组件的本地接口，可以使性能得以提升。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;a name="S"&gt;&lt;/a&gt; &lt;h2&gt;S&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;SFSB - EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - Stateful Session Bean（有状态会话 Bean）的缩写。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;SLSB - EJB 1.x，EJB 2.x，EJB 3.0&lt;/strong&gt; - Stateless Session Bean（无状态会话 Bean）的缩写。&lt;/p&gt; &lt;a href="http://www.infoq.com/cn/articles/EJB-Glossary#Title"&gt;&lt;img alt="" _href="img://arrow.jpg" src="http://www.infoq.com/resource/articles/EJB-Glossary/zh/resources/arrow.jpg" align="left" /&gt;&lt;/a&gt; &lt;p&gt;版权所有© 2005-2006，由[objects-at-work] Oliver Ihns 和 Stefan M. Heldt 提供。本术语汇编的所有图示均取自我们撰写的文章/书籍《&lt;a target="_blank" href="http://www.objects-at-work.de/pmwiki/Publikationen/B%FCcher"&gt;Enterprise JavaBeans komplett&lt;/a&gt;》，而非来源于第三方组织。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7728268469706284914?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7728268469706284914/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7728268469706284914' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7728268469706284914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7728268469706284914'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/ejb-3.html' title='EJB 3 术语汇编'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3530441298100500788</id><published>2007-03-30T14:52:00.001+08:00</published><updated>2007-03-30T14:52:40.033+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>互联网协会：个人网站收入源头严重萎缩</title><content type='html'>新浪科技讯 3月27日消息，互联网协会交流与发展中心主任胡延平近日透露，个人网站普遍面临着资金短缺和市场拓展的难题。他说，2006年个人网站的收入源头出现了严重萎缩，但让每个网站都去寻找风险投资也不现实，因此今年会从规模扩张转向追求实际的盈利。 &lt;p&gt;　　&lt;strong&gt;收入源头萎缩&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　胡延平认为，虽然个人网站的数量越来越多，但是绝大多数站长年龄都是在18-25岁之间，网站的规模一般是2至4个人之间。个人网站不仅面临资金的困难，市场拓展的难度也很大，同时在技术上也面临很多的门槛。因此，个人网站必须通过与别人合作，来解决自己现存的问题。&lt;/p&gt; &lt;p&gt;　　从营收角度来讲，个人网站的收入主要来自于三方面。第一个是&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;无线&lt;/b&gt;联盟，帮助SP推一些定制广告；第二是流量，通过出售流量给其它网站带去一些用户；第三是广告联盟，通过中介带来的广告，按照点击或者展示的次数收费。&lt;/p&gt; &lt;p&gt;　　这几个收入来源在2006年出现了很大的变化。去年，由于移动运营商加强监管，无线联盟的整体收入萎缩得很厉害。经过去年流氓软件的闹腾，整个互联网的流量价格都出现了下跌，“流量不值钱”基本上已经成了广告主一致的说辞。&lt;/p&gt; &lt;p&gt;　　来自互联网数据中心资料显示，网络联盟在整个互联网广告中的比例很小，没有进入企业考虑的主流形态。虽然互联网广告的成长性不错，增长率在50%左右，但是针对个人网站的大广告客户淘宝和eBay易趣，在去年都渐渐砍掉了这部分广告投放。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;寻找风险投资不现实&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　以前个人站长都是凭着兴趣、爱好，积累好几年才能做成一个网站，但现在很多个人站长也在不断寻找风险投资。胡延平认为，在资金困难的情况下寻找资金的合作，这是一种必然的市场现象，但对绝大多数个人网站来说，寻找风险投资是不现实的。&lt;/p&gt; &lt;p&gt;　　“绝大多数个人网站的起点是比较低，规模还比较小，因此只能脚踏实地的来做，或者找一些小额的天使投资。”&lt;/p&gt; &lt;p&gt;　　胡延平认为，2007年个人网站将从规模扩张转向实际的盈利。他建议个人站长，第一，一定要创新，不要再去做什么网址站、综合娱乐站之类竞争已 经很激烈的网站类型；第二，一定要做小不要做大，做精做出自己的特点；第三，关注核心发展，包括注重产业横向商业价值；第四，做出自己的特色。(刘阳) &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3530441298100500788?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3530441298100500788/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3530441298100500788' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3530441298100500788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3530441298100500788'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_8880.html' title='互联网协会：个人网站收入源头严重萎缩'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-8701054527850329791</id><published>2007-03-30T14:48:00.001+08:00</published><updated>2007-03-30T14:48:32.666+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>MySQL在数据库市场获得25%的市场份额</title><content type='html'>&lt;span style="font-family:Arial;"&gt;第三方市场调查机构Evans数据公司最近公布的一系列客户调查数据显示，在过去两年里，MySQL在所有开发者使用的&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;数据库&lt;/b&gt;中获得了25%的市场份额。&lt;br /&gt;　　Evans数据公司是专业的&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;软件&lt;/b&gt;市 场调查机构，它定期提供最新的面向全球开发者的深度调查和IT产业市场情报。Evans公司的本次调查显示，数据库的使用者中有40%是开发人员，而两年 前这一数据是32%。Evans数据公司指出，随着越来越多的开发者使用开源软件(2006年秋在北美的比率是65%)，MySQL的使用在未来会持续增 长。&lt;br /&gt;　　“我们一直看到开源数据库的不断成长，因为采用开源数据库的用户在持续攀升。”Evans数据公司的总裁John Andrews说。“从我们的排名分类中上升的名次来看，我们看到开源数据库已经赶上或者超过专有数据库。”&lt;br /&gt;　　Evans数据公司的其他发现还有：&lt;br /&gt;　　MySQL的广泛使用归功于采纳整个LAMP架构的用户增长。&lt;br /&gt;　　四成企业级开发者表示他们在操作中使用了一种开源数据库。&lt;br /&gt;　　超过2/3的开源开发者(69%)对目前市场上的开源数据库常满意&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-8701054527850329791?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/8701054527850329791/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=8701054527850329791' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/8701054527850329791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/8701054527850329791'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/mysql25.html' title='MySQL在数据库市场获得25%的市场份额'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3493915704874882825</id><published>2007-03-30T14:46:00.001+08:00</published><updated>2007-03-30T14:46:51.716+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>InfoQ中文站“预启动测试版”正式对外发布</title><content type='html'>&lt;span lang="EN-US"&gt;&lt;span&gt;nfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;中文站（&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;www.infoq.com/cn&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;）于&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;2007&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;年&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;月&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;28&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;日正式对外发布。作为全球著名的软件技术门户网站&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;的子站点，&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;中文站将保持与&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;相一致的风格，专注于企业应用开发者社区，时刻关注该领域的变化与创新，为读者提供高品质的中文内容，尤其是&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;Java&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;.NET&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;SOA&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;和敏捷等五大社区。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span&gt;今天发布的版本之所以称为“预启动测试版”，是因为虽然目前&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;中文站已经提供了专业的内容，但网站的许多功能仍在测试过程中。所以如果使用过程中遇到不便，请通过邮件&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;china-bugs@infoq.com&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;提交给&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;中文站相关人员。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;是由一些热爱社区的人联合创建的，他们包括&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;TheServerSide.com&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;的创始人、主编、《&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;EJB Design  Patterns&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;》一书的作者&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;Floyd  Marinescu&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;WebWork&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;、&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;AspectWorkz&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;等开源项目的主力开发人员&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;Alexandru  Popescu&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;等，于&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;2006&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;年&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;月&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;日正式上线。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;中文站除了及时翻译英文内容外，还着眼于中国技术社区，用专业的视角报道中国软件开发者在企业应用领域取得的最新成就，凝聚顶尖技术专家为社区提供高质量的中文内容。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;中文站的任务是为中国软件开发人员提供来自领域专家的最新技术资讯和评论报道。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;中文站鲜明的特点是：&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span&gt;内容：&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;是由编辑团队驱动的，而不是计算机。我们的内容包括技术文章、案例研究、视频采访、会议演讲和迷您书等。在每个社区里，&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;都有专职的编辑人员负责，以保证每周都会有最新的内容发布。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;不仅仅是一家内容提供商，它还是一个跟踪和培育企业社区变化和创新的社区。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span&gt;技术：&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;InfoQ&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;在设计时深切考虑到了用户的需求，通过大量应用&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;AJAX  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span&gt;技术，比如用户注册、评论、定制等，用户可以在最短的时间内得到最丰富的体验。&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;span&gt; &lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3493915704874882825?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3493915704874882825/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3493915704874882825' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3493915704874882825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3493915704874882825'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/infoq.html' title='InfoQ中文站“预启动测试版”正式对外发布'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2098603380076153773</id><published>2007-03-30T14:45:00.001+08:00</published><updated>2007-03-30T14:45:48.736+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>淘宝回应：收费不针对个人</title><content type='html'>&lt;p&gt;日前，有卖家在网上透露收到淘宝网要求付费的新协议。对此，淘宝方面回应说，即将新增加的服务没有强制性，而且也不针对个人卖家，“个人之间交易将继续&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;免费&lt;/b&gt;”。 &lt;/p&gt;&lt;p&gt;　　淘宝将在4月推出的收费项目主要是增加每个&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;店铺&lt;/b&gt;在网页上的推荐位置，所需费用从每月数百元到上千元不等。淘宝也可能要求商铺们缴纳3000至5000元的保证金，用于“先行赔付”。淘宝方面强调，所有的付费项目都属于可选择的服务。但卖家们认为，如果有一家商铺购买付费项目，很容易带动其他人购买。&lt;/p&gt; &lt;p&gt;　　淘宝上的交易主要分为商城、个人集市和二手集市，在商城中交易的卖家大都拥有线下的实体店门，是有“品牌”和营业执照的大经销商。 &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2098603380076153773?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2098603380076153773/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2098603380076153773' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2098603380076153773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2098603380076153773'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_3325.html' title='淘宝回应：收费不针对个人'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7055591332931505152</id><published>2007-03-30T14:44:00.002+08:00</published><updated>2007-03-30T14:45:14.406+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>微软不是教堂，开源也未必真是集市</title><content type='html'>我们很少有机会看到微软成员证明微软的&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;软件&lt;/b&gt;可以轻松的运行在Linux上。在AJAXWorld大会上，Brad Abrams，开发ASP.NET AJAX (代号：Atlas)的程序主管、微软副总裁，宣称&lt;a href="http://www.internetnews.com/dev-news/article.php/3667066"&gt;微软不是教堂，而开源也未必真是集市&lt;/a&gt;。1999 年ESR（Eric S. Raymond）出版了《教堂和集市》（The Cathedral &amp; the Bazaar），为开源运功定下了一个基调，微软这个封闭的结构严密的公司——是教堂，开源运动就是集市，自由开放。Abrams声称大多数成功的开源项 目背后都有巨大的财力支持，集市上的店并没有原先预计到的多：而ASP.NET AJAX的所有源代码将遵循&lt;a href="http://www.opensourcelegal.org/licensedb/detail.php?lid=113&amp;amp;SEARCH=Microsoft%20Permissive%20License%20%28Ms-PL%29"&gt;Microsoft Permissive License(Ms-PL)&lt;/a&gt;许可使用。无论是商业应用还是开放使用微软都会提供支持，使用ASP.NET AJAX无需微软的&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;操作系统&lt;/b&gt;，&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;服务器&lt;/b&gt;上不需要安装ASP.NET, &lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;IIS&lt;/b&gt;或者Windows，为了证明这一点，Abrams在Ubuntu Linux上展示了ASP.NET AJAX是如何运行的。Abrams说“Web是一个开放结构，我们微软认为ASP.NET AJAX也必须成为一个开放的框架。”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7055591332931505152?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7055591332931505152/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7055591332931505152' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7055591332931505152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7055591332931505152'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_2993.html' title='微软不是教堂，开源也未必真是集市'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-844175358789414729</id><published>2007-03-30T14:44:00.001+08:00</published><updated>2007-03-30T14:44:36.855+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>灰鸽子很难被定义为电脑病毒 八成杀毒软件无效</title><content type='html'>&lt;span style="font-family:Arial;"&gt;自“‘灰鸽子’比‘&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;熊猫&lt;/b&gt;烧香’厉害十倍”的说法出现以来，由于网银失窃事件频发，社会各界对“灰鸽子”&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;病毒&lt;/b&gt;的关注日渐升温。昨日，知名反病毒BBS“霏凡论坛”成员Agiha接受晨报记者专访，透露新版“灰鸽子”已现身网络的消息。&lt;/span&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    Agiha表示，目前“霏凡论坛”的“反&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;黑客&lt;/b&gt;”组织正试图截取新版“灰鸽子”的样本，他们怀疑“灰鸽子之父”葛军已转入地下继续牟利。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    “灰鸽子”竭力保持低调&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;     “‘熊猫烧香’病毒暴发后，‘霏凡论坛’收到了大量用户提交的中毒资料，‘霏凡论坛’和其他反病毒论坛一起联手，一边帮忙分析、&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;杀毒&lt;/b&gt;，一边向杀毒&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;软件&lt;/b&gt;厂 商提交病毒样本，使各种杀毒软件提升更新速度。最近‘灰鸽子工作室’宣布停止开发相关软件，但我们怀疑它已经转入地下，继续出售软件牟利。近日一个高手聊 天时告诉我，网上出现了更新版本的‘灰鸽子’，目前我们正设法提取样本，以确定‘灰鸽子工作室’是否还在地下运行。”Agiha说。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;     “虽然‘灰鸽子’的首创者葛军反复宣称制作的软件不是病毒，但100元买到的‘灰鸽子’&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;功能&lt;/b&gt;并 不强大，用户可以要求工作室提供系列‘售后’服务，这些都需要再支付金钱。葛军利用我国法律关于病毒定义的漏洞，‘灰鸽子’不具备自我复制能力，因此很难 被定义为法律意义上的病毒。‘灰鸽子工作室’想方设法地低调运作，并悄无声息地潜入用户电脑。感染了‘灰鸽子’的电脑既可以被黑客用来群体自动点击网站赚 取点击率，也可用来传送网银、QQ、&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;网游&lt;/b&gt;账号等&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;信息&lt;/b&gt;到黑客处。”Agiha如此解释说。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    八成杀毒软件暂无效&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    为了展示“灰鸽子”的威力，Agiha首先通过双击打开了“灰鸽子”，此时屏幕右下方出现了一个应用软件图标，其实此时已无声无息潜入用户电脑并打开“后门”，黑客在某个角落监视中毒者的一举一动，随时可以偷走想要的任何东西。随后，Agiha用&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;卡巴斯基&lt;/b&gt;、诺顿等20多款知名杀毒软件对“灰鸽子”扫描，80%的杀毒软件没有发现“灰鸽子”。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    “灰鸽子工作室”拒绝回应&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    昨日，记者拨通了“灰鸽子工作室”关闭售卖软件网页前留下的服务&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;电话&lt;/b&gt;，接电话的青年男子拒绝透露自己是否是葛军本人。“我们已在网站上发布了声明，那就是我们的态度。”&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    对于“反黑客”指责葛军潜入地下继续出售“灰鸽子”牟利的怀疑，该男子表示：“别人怎么说我们不管。”&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    Agiha 称，据知情人掌握的情况，“灰鸽子工作室”只有两名工作人员，其中之一是最早制作“灰鸽子”的葛军。1982年，葛军出身于安徽安庆市的普通农民家庭，高 中毕业后参加一个电脑学习班开始刻苦钻研软件技术。2000年，葛军开发出了第一个病毒程序———“哎灵”病毒。2001年，葛军在自学完Delphi语 言之后，逐渐在新生的国产后门软件“灰鸽子”上添加各种功能。最后，“灰鸽子”开始向用户收费，并大受黑客欢迎。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    [律师观点]&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;    罪刑法定是刑法基本原则&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Arial;"&gt;     上海市律师协会电子商务与信息网络法律研究委员会委员、上海得勤律师事务所合伙人商建刚律师认为，“灰鸽子”是不是病毒需要从法律和技术两个层面进行界 定。“我国刑法的基本原则之一便是罪刑法定。这一原则要求执法机关、执法人员在确认犯罪时要依客观存在的事实，认真把握犯罪的特征、构成犯罪的具体要件， 真正做到定罪准确。单从法律上来看，‘灰鸽子’必须要符合病毒的各种特征才能被界定性质，这是一个客观存在事实的问题。”商建刚表示，如果无法认定“灰鸽 子”是病毒，那也就不能认为这种行为是非法的。&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-844175358789414729?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/844175358789414729/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=844175358789414729' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/844175358789414729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/844175358789414729'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_8831.html' title='灰鸽子很难被定义为电脑病毒 八成杀毒软件无效'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-81967674118882842</id><published>2007-03-30T14:42:00.000+08:00</published><updated>2007-03-30T14:43:58.355+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>中国软件职业结构严重失衡，谁之过？</title><content type='html'>&lt;strong&gt;1. 独特的视角：职业结构&lt;/strong&gt; &lt;p&gt;　　近日IT168发布了《中国IT应用&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;技术&lt;/b&gt;蓝皮书2006-2007》(以下简称蓝皮书)，全书凡二十多万字，计两百六十余页，论及人才、应用以及过程等&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;软件&lt;/b&gt;开发行业的方方面面，又囊括了Java、.net、&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;数据库&lt;/b&gt;、企业应用和中间件等主流软件开发技术，更兼附录了十几篇优秀论文，内容不可谓不详实。热心的编辑给我发来文档链接，赶紧下载，拜读之后，获益匪浅，感慨良多。不敢藏拙，试与读者分享之。&lt;/p&gt; &lt;p&gt;　　蓝皮书的第二章《中国IT技术开发人才现状分析》是关于软件人才的，其中第3节《职业结构》中，将接受调查的开发人员按职责进行了分类，并给出 了各个职业类型所占的比例。鉴于统计数据来自近万份样本，而且接受调查的都是真正的软件从业人员，因此，可信度颇高。说实话，笔者在IT行业滥竽充数十多 年，虽然时时关注中国软件行业的发展，却未尝留意过开发人员的职业分类，蓝皮书的这一章另辟蹊径，不落俗套，读来颇有新意，给了关心中国软件行业的人们， 一个不同于官样文章的视角。&lt;/p&gt; &lt;p&gt;　　中国软件行业风风雨雨二十年，笔者有幸经历了这二十年中的大部分时光，目睹了软件行业的几番起落兴衰，其中酸甜苦辣，不能尽言。那些人，那些 事，有如过眼云烟，业已随风飘去，唯有存诸于中国软件行业的种种弊端，始终耿耿于心，无法释怀。从后面的分析可以看出，蓝皮书给出的这个独特视角，将中国 软件行业的某些弊端暴露无遗。&lt;/p&gt; &lt;p&gt;　　开发人员职责的划分，随着软件应用范围的扩大，越来越呈现多样化，体现了分工朝着精细化方向发展的趋势。例如，网页设计人员，在传统的软件工程 理论中，并不存在这样一个角色，不过，由于互联网的普及和互联网应用的大量涌现，网页设计人员已经成为软件项目中不可或缺的角色。&lt;/p&gt; &lt;p&gt;　　角色的增加，给开发人员职业结构的分类带来了一定的困难，不同的软件工程理论，其分类标准也不尽相同。虽然现在是软件工程理论百花齐放的年代， 不过，上个世纪60年代由IBM公司倡导的传统软件工程理论，依然根深蒂固，不管软件开发的生命周期如何突发变异，经典的瀑布模型还是不可动摇的基础。因 此，我们不妨按照传统的软件开发过程理论，将开发人员的职责范围划分为四种，即&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;项目经理&lt;/b&gt;、系统分析员、高级程序员和程序员。结合技术蓝皮书的统计数据，按照上述职责分类方法，可以对开发人员职业结构的统计数据进行归类合并。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;2. 项目经理和系统分析员&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　先从项目经理开始。也许项目经理这个角色，是软件工程理论中争议最少的，关于项目经理的职责，各种理论惊人地一致，那就是想方设法在规定的工期和成本预算内，以可接受的质量完成项目的任务，具体到软件项目，那就是实现软件的功能。在&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;项目管理&lt;/b&gt;理论中，项目经理一方面有着极大的权力，可以决定项目开发人员的升降去留。&lt;/p&gt; &lt;p&gt;　　另一方面，项目经理又是各种矛盾的焦点，被称为项目的“受气包”，老板的压力、客户的刁难、开发人员的抵触以及来自同级的掣肘，项目经理都必须 无条件地承担、接受、适应和化解，在错综复杂的项目环境中，心惊胆颤，如履薄冰，不断寻找最佳的平衡点，谁也不敢得罪，和公公婆婆眼皮子底下逆来顺受的小 媳妇，很有一比。&lt;/p&gt; &lt;p&gt;　　项目经理这个职业，在调查中所占比例为11.7%。&lt;/p&gt; &lt;p&gt;　　接着是系统分析员。系统分析员是客户和程序员之间的一座桥梁，起着沟通双方的作用。系统分析员必须具有两方面的知识，一是业务方面的，二是计算 机方面的。客户不懂计算机，不知道如何用计算机术语表达自己的业务需求;程序员不懂业务，不知道代码和业务需求之间有什么联系;只有系统分析员，既明白客 户的业务需求，也理解程序员的计算机术语，因此，他通过需求调研获取用户需求，然后编写需求规格说明书，告诉程序员做什么。&lt;/p&gt; &lt;p&gt;　　很显然，系统分析员的职责决定了他不能脱离业务，不懂业务，或者不能通过需求调研建立业务模型，哪怕软件技术水平再高，也不能成为合格的系统分 析员。蓝皮书中，“业务分析师”和“咨询师”显然归属系统分析员之列，毫无疑问;“SA/SD(系统分析/设计师)”恐怕只有“SA(系统分析师)”属于 系统分析员，而“SD(设计师)”归到高级程序员更合理，因此，我们只取一半的数据;“高级顾问”的情形类同，有些高级顾问是从事业务建模工作的，属系统 分析员，另一些高级顾问则是负责系统架构的，属高级程序员，我们也只取一半的数据。这样，经过简单的计算，系统分析员所占的比例是7.8%。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;3. 高级程序员和程序员&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　第三类职业是高级程序员。高级程序员和程序员的区别，在“高级”二字。那么，所谓“高级”，体现在什么地方?体现在软件技术的广度和深度上。软 件技术发展到今天，任何一种功能需求，都不太可能只有一种技术可以实现，必定有着为数不少的技术可供选择，几乎任何一项技术，都声称可以如何如何，而实际 上也确实如此，只不过各有侧重而已。比如一个网站，.net可以，java可以，php可以，ruby又何尝不行呢?甚至同一项技术，也有多种方案可以实 现，比如用java建网站，jsp、jsf、struts、spring等等，候选的方案令人眼花缭乱。如果你面对这么多选择时手足无措、迷失方向，你就 是程序员;如果你对此了如指掌，方案堆于前而色不变，你才称得上高级程序员。&lt;/p&gt; &lt;p&gt;　　高级程序员的另一个称谓是“软件架构师”，或者“系统设计师”，当然，也有以“高级顾问”称呼的，因此，我们把技术蓝皮书中“高级程序员”的全 部、“软件架构师”的全部、“SA/SD(系统分析/设计师)”的一半和“高级顾问”的一半，通通归类到传统理论的“高级程序员”角色中，则“高级程序 员”所占比例为15.1%。&lt;/p&gt; &lt;p&gt;　　最后我们看看程序员。程序员的角色是所有角色中变化最大的，因为他们工作在第一线，和具体技术的接触最为直接，而软件技术在过去的十年中，发生 了天翻地覆的变化，新技术层出不穷，因此也派生出了很多新的程序员职业。例如“文档工程师”，在传统的软件工程理论中，每个角色负责编写自己的文档，并没 有独立的“文档工程师”，只是随着人类面对面交往功能的退化，“秉烛夜谈”固然不复存在，“促膝谈心”也比过年还希罕，一个个躲在电脑屏幕后面的“人 类”，越来越依赖所谓的文档来交流思想，因此，文档的工作量也随之加大，以致于需要额外的“文档工程师”。当然，文档的作用远不止此，这是题外话了。&lt;/p&gt; &lt;p&gt;　　技术蓝皮书中，“程序员”、“文档工程师”和“测试工程师”可归类于传统软件工程理论的程序员角色，这样，程序员所占比例为17.3%。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;4. 数据告诉我们：职业结构失衡&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　现在，我们已经从蓝皮书的统计数据中，分拆合并出了传统软件工程理论中四类角色所占比例，为清楚起见，让我们来总结一下，结果如表一所示。&lt;/p&gt; &lt;p&gt;　　角色名称 所占比例 &lt;/p&gt; &lt;p&gt;　　项目经理 11.7% &lt;/p&gt; &lt;p&gt;　　系统分析员 7.8% &lt;/p&gt; &lt;p&gt;　　高级程序员 15.1% &lt;/p&gt; &lt;p&gt;　　程序员 17.3% &lt;/p&gt; &lt;p&gt;　　表一：蓝皮书中各职业归属到传统软件工程理论四大角色后所占比例&lt;/p&gt; &lt;p&gt;　　数据有了，它能告诉我们什么呢?这是一个以数据说话的年代，口若悬河的辩解也好，信誓旦旦的保证也好，都不如寥寥几个数字来得有说服力。当然， 中国人讲究一分为二，凡事不肯轻易结论，同一件事物，不同的人有不同的阐释，有时候甚至结论大相径庭，也并不希奇。曾有一笑话，说某阔少行善积德，每日施 舍乞丐两文钱，突一日乞丐只收到一文钱，遂问其故，阔少解释说因娶妻生子，开销加大，乃减去一文，乞丐闻言怒道：“你怎么能拿我的钱去娶妻生子!”，可 见，即便是一文钱这么小的事情，尚且仁者见仁，智者见智，何况关乎国计民生的统计数据呢。因此，以下分析，仅是笔者个人的一家之言，相信聪明的读者自有独 到的见解。&lt;/p&gt; &lt;p&gt;　　细心的读者一定发现，表一中的统计数据，并没有包括蓝皮书中的所有职业。比如“CIT/CTO”、“配置管理人员”、“DBA数据库管理员”、 “网络管理员”和“技术支持工程师”，就未纳入计算。这里需要说明一下，笔者在本文中的分析，是以项目为单位的，而未纳入计算的这些职业，都是跨项目的， 理论上并不完全从属某个项目组，因此，我们将其排除在外。&lt;/p&gt; &lt;p&gt;　　按照传统软件工程理论，一个项目组由项目经理、系统分析员、高级程序员和程序员组成。从这四种角色的职责不难理解，他们在项目组中的数量是呈金 字塔形状的，其比例大致从1:2:4:8到1:5:25:125。这个比例是这样得来的，在传统软件工程理论中，金字塔的上一级对下一级负有管理责任，而 通常的管理理论认为，在工业社会，个人能直接管理的人数，在7到13人之间，而软件是智力密集型产业，因此，直接管理人数在2到5之间比较合理。&lt;/p&gt; &lt;p&gt;　　如果按照这样的比例，对照表一中的数据，我们不难发现，在平均意义上，中国的软件项目组的职业结构是严重失衡的。具体表现是，项目经理数量太 多，而程序员数量太少，本应呈现金字塔形状，实际上却成了几乎一个直桶。是什么原因导致职业结构的严重失衡?这个问题，值得我们深思。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-81967674118882842?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/81967674118882842/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=81967674118882842' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/81967674118882842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/81967674118882842'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_30.html' title='中国软件职业结构严重失衡，谁之过？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-140466374293957266</id><published>2007-03-30T14:41:00.000+08:00</published><updated>2007-03-30T14:42:25.355+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>微软称2月份Vista卖得不好</title><content type='html'>北京时间3月27日消息，据国外媒体报道，微软周一表示，今年2月份，&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;Vista&lt;/b&gt;&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;操作系统&lt;/b&gt;在全球的销量为2000万套。分析人士认为，上述数据表明Vista的市场欢迎程度还有待提高。 &lt;p&gt;　　微软Windows&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;产品&lt;/b&gt;市 场营销经理比尔·曼恩(Bill Mannion)称，在2001年Windows XP发布后的头两个月中，其销量为1700万套，而Vista初期销量好于预期。但市场研究公司Gartner副总裁迈克尔·西尔弗(Michael Silver)则表示，与XP发布时相比，目前全球PC总量已增加了近一倍，以此类推，Vista初期销量应远高于2000万套。&lt;/p&gt; &lt;p&gt;　　西尔弗接着表示，2002年全球消费者市场PC销量为5100万台，预计今年销量将达到9600万台。从去年10月底开始，微软联合各PC厂商出台了Vista&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;优惠&lt;/b&gt;升级计划。市场研究公司NPD称，2月份Vista在美国零售市场的销量增长了56%。微软拒绝透露Vista在零售市场的具体销量，但此前表示80%的Windows收入来自PC制造商。&lt;/p&gt; &lt;p&gt;　　NPD分析师克里斯·斯文森(Chris Swenson)认为，Vista初期销量不尽如人意的事实表明，微软此前已向消费者发出&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;信息&lt;/b&gt;，即Vista对硬件配置要求较高，因而导致Vista零售市场销量并不高。他还认为，微软就Vista投放的电视广告总量还有待增加，以应对&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;苹果&lt;/b&gt;系列广告对Vista的批评。苹果广告暗示，Vista升级如同实施大型外科手术。(明月) &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-140466374293957266?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/140466374293957266/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=140466374293957266' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/140466374293957266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/140466374293957266'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/2vista.html' title='微软称2月份Vista卖得不好'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-9110803566646995129</id><published>2007-03-30T14:39:00.000+08:00</published><updated>2007-03-30T14:40:03.268+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>开发平台相争 IBM微软叫板再升级</title><content type='html'>&lt;p&gt;&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;软件&lt;/b&gt;开发正在从作坊进入工业化的时代，而这个即将到来的软件工业化时代意味着将有大量的软件企业要采用新的“工业化”流程和“工业化”的开发平台，“工业化”软件开发平台采购的黄金时期即将到来，引爆了“工业化”软件开发平台厂商新一轮争霸战。 &lt;/p&gt;&lt;p&gt;　　3月，IBM在北京称其“企业级软件开发平台Rational软件升级版本7.0问世，而目前Rational没有竞争对手”。在 IBM放出话不到一个星期，微软也在北京宣布，其2005年12月发布的Visual Studio Team System(简称VSTS)问世一年，其销量已经赶上IBM Rational。IBM与微软之间的竞争，再度因为软件开发平台而升级。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;微软介入挑战IBM&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　在2005年以前，提供企业级规模化开发流程、开发交付平台&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;解决方案&lt;/b&gt;的 主要厂商是Rational，这个厂商已经存在了20多年，3年前Rational被IBM收购，成为IBM的大家庭中一员，他在这个领域拥有绝对的优 势。但是2005年12月以后，这个格局悄然地发生了变化，微软发布了他的Visual Studio 2005，微软把原来只关注开发者的视线拉到了提供软件设计、开发和部署所涉及的全生命周期过程，Visual Studio 2005 Team System问世，用微软(中国)平台及开发技术部产品市场经理王的话说：“如果把软件开发看成盖大楼，需要设计师、施工队、有验收以及交房子这样一个 大工程的话，那么Visual Studio2005不再只是针对前端开发者的开发环境，而是对设计师、开发人员、测试整个软件全开发过程的一个很好的控制方法论和企业级开发平台。”&lt;/p&gt; &lt;p&gt;　　而对于Visual Studio2005与IBM Rational平台相比较，微软(中国)平台及开发技术部市场推广经理楚国华对《中国电子报》记者说：“首先这个工具里面有微软的方法论，微软是开发软 件企业最成功的一个，我相信我们方法论是最好的，把过去30年的创造浓缩于VSTS里。第二，VSTS的开放性非常好，微软把自己的平台和其他工具整合起 来，整个结构都很好，而且很多业内合作伙伴都支持。第三就是安全性，打个比方钱放在自己手上安全还是银行里安全，当然是银行里，我们所有源代码都是在数据 库里，所以我们安全保护更好。”&lt;/p&gt; &lt;p&gt;　　但对此，IBM软件大中国区市场部总经理左洪接受《中国电子报》记者电话采访时却颇不以为然：“不能因为有了榔头和锹子，就说自己拥有了整个机 床，微软做软件有30年的时间，而IBM做软件有了50年的时间。”IBM称在收购Rational之后对他进行了非常多的投资，本来Rational就 有很好的流程、方法论和平台，吸取IBM精华的之后，更具有前所未有的优势，3月份发布的Rational软件7.0版本，最大的特点是针对SOA做了很 多增强。使得Rational整个的开发平台能够非常好地支持SOA应用开发，Rational在SOA应用开发中，所承担的角色就是架构设计师的角色。 而且新版本尤其强调对大型跨地域开发团队的支持，以及对合作伙伴的集成等等。&lt;/p&gt; &lt;p&gt;　　IBM与微软都同时加快了竞争的脚步。微软宣布明年1～2月份将发布Visual Studio下一个版本的ORCAS，微软(中国)大中华区平台开发技术部总经理Nigel Burton认为，下一个版本对软件开发生命周期的方法论不会改变，而且将进一步提高针对用户体验的部分，比如开发网络中非常绚的东西，另外在 Visual Studio 2005里面的一些插件，在2007会把它变得更加完善。IBM软件集团Rational软件大中华区总经理桂荣青也同样宣布将要加大Rational在 中国的投入力度。而IBM在Rational7.0版本中增加了很多特殊的产品插件，也做了很多针对包括SAP、Siebel等插件支持的测试工作，并且 其合作伙伴BSD group也做了一些针对Oracle插件的测试。IBM在全球有100多家合作伙伴基于Rational平台的插件来扩展SDP的功能。合作伙伴只要通 过Ready for IBM Rational software offering，对其产品进行验证，保证其产品满足IBM在互操作性和用户体验方面的要求，就能加速SOA应用，充分利用良好的架构设计更为优质高效的 交付软件与服务。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;中国策略成焦点&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　对于继印度之后第三个世界软件制造中心的中国，毫无疑问是微软与IBM的兵家必争之地。目前中国的软件企业中还没有一家超过50亿元收入的企 业，急需做大做强的中国软件企业，采用最新的软件制造方法、最新的软件开发平台无疑是做大做强的必然选择，所以微软的Visual Studio2005与IBM Rational因为竞争而将在中国市场大打出手也将是常理。但是无论是Visual Studio2005还是IBM Rational都面临一个关键问题，这个全新的软件开发流程和全新的平台的采用，某种意义上是对原来流程思路的彻底改变，所以他不仅仅是开发人员的事， 而换思路、换流程、换平台需要中国软件的一把手来决定，和当年ERP在中国的推广一样，所以这些平台要想进入软件企业必须全面影响CEO。&lt;/p&gt; &lt;p&gt;　　先且不去探讨IBM与微软在企业级软件开发平台上的差异，但是两家公司在中国的策略已经显现出了明显不同的思路，微软因为与国家发改委的合作， 微软在中国软件企业的这几年的投资，已经让他获得了中软、浪潮、神州数码、华信、浙大网新等等中国几家最主要的实力软件企业的认可，而且微软还在按此套路 加大投资企业的数量，微软用投资和外包订单等等方式已经牢牢地把这些企业与微软捆在了一辆战车上。有了这样的战略打包，微软的企业级技术、开发平台进入中 国这些主流的软件企业将顺理成章。即便微软是企业级开发平台和企业级软件的后来者，这样在中国的宏观战略让他在中国市场后来居上，长驱直入。&lt;/p&gt; &lt;p&gt;　　相对而言，IBM在这一点上明显没有给中国特别的政策，虽然IBM也和微软打着一样与中国软件产业共同成长的旗号，但是目前没有像微软一样让企 业觉得实惠的资金投入，在这一点上，使得IBM的声音似乎没有微软在市场上响亮。但是IBM的左洪认为，微软有大量的现金，这点钱对微软来说仅仅是投向中 国软件企业的诱饵，根本不能就说明已经把微软与中国的软件企业绑在了一辆战车上，而IBM才是实实在在从经验分享技术扶持，对中国软件企业扶上马、送一 程。&lt;/p&gt; &lt;p&gt;　　中软是获得微软投资并成为其全球战略合作伙伴的企业，其微软技术合作部技术总兼王磊认为，成为微软的伙伴采用微软的Visual Studio2005让他所领导的开发团队降低了开发的成本，人员得到了很好的经验与培训，结合自己的特点获得了很好的方法论，少走了很多弯路。王磊透露 中软每年都会对各个部门、各个项目有一个排列，2006年公司前五名业务好的部门都是使用.NET的，而中软不仅仅是有.NET还有采用其他公司平台的团 队。而IBM Rational同样在中国也拥有了中创软件、爱立信、华为等等这样的客户，中创软件的总裁景新海认为与IBM合作以后，他们不仅获得的是高效、高质量、 高成功的平台而且也同样获得了IBM的很好的方法论。华为是IBM很成功的用户，目前也是软件收入排名第一的中国软件企业，他的软件进入今天的规模同样也 与经历了采用IBM平台而获得的脱胎换骨有关。&lt;/p&gt; &lt;p&gt;　　不管这两家厂商如何暗自较劲，但是对于中国软件企业来说应该是好事。因为竞争而获得了更多的“软件巨人的肩膀”，结合自己的特点选择好“肩膀”，尽快利用全球软件产业架构改朝换代的机会来壮大自己，是中国软件企业最终目的。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-9110803566646995129?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/9110803566646995129/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=9110803566646995129' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/9110803566646995129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/9110803566646995129'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/ibm_30.html' title='开发平台相争 IBM微软叫板再升级'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7105032959919275140</id><published>2007-03-30T14:36:00.000+08:00</published><updated>2007-03-30T14:37:47.798+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>JRuby 1.0 五月发布 欲做Struts框架的替代者</title><content type='html'>　&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;Sun&lt;/b&gt;的开发工程师们正在放眼五月份JRuby 1.0的发布，从而带来Ruby语言的Java实现。  &lt;p&gt;　　在拉斯维加斯的TheServerSide Java座谈会的一次谈话中，JRuby项目开发者Charles Oliver Nutter和Sun的工程师Thomas Enebo，两个人提到了Sun的Ruby计划。他们还提到了Sun将努力让Java平台自然支持Rails框架和PHP语言。 &lt;/p&gt; &lt;p&gt;　　Ruby是当今非常受欢迎的动态脚本语言之一。JRuby项目在2002年有德国的开发者发起，Nutter表示。Nutter和Enebo都表示，JRuby易学而强大，目前以预览版的形式提供，Sun计划在三月份再推出另一个预览版。 &lt;/p&gt; &lt;p&gt;　　Nutter表示，“主要的是我们希望能把Ruby变成可以运行在JVM虚拟机上的一流的编程语言。” &lt;/p&gt; &lt;p&gt;　　另外，JRuby开发者计划本周完成JRuby的&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;功能&lt;/b&gt;，诸如支持自然Unicode码，支持Java整合。本月JIT（即时）编译器将被默认启用。四月计划需要决定1.0版最终的功能，同时还包括一次主要的漏洞修补工作。 &lt;/p&gt; &lt;p&gt;　　JRuby未来的发展方向包含对Ruby 2.0字节码的支持和利用HotSportJVM来加速执行速度。 &lt;/p&gt; &lt;p&gt;　　现就职于Intuit公司的架构师Martin Franklin是参与座谈会的代表之一，他曾在Sun参与Java项目，他表示，尽管他不反对JRuby，但是他不认为JRuby已经做好了在企业中应 用的准备。该代表表示，JRuby现在所处的阶段就如同1995年或1996年的Java所处的阶段。 &lt;/p&gt; &lt;p&gt;　　Franklin表示，“我认为，在我们在企业中使用它之前，还不能说它会发展的如何。”它还需要更好的综合能力。他还补充到，他还需要类似使用JRuby调试等问题的一些&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;信息&lt;/b&gt;。 &lt;/p&gt; &lt;p&gt;　　在一个幻灯片中，Nutter和Enebo指出，他们相信对企业来说Ruby on Rails是一个比PHP更好的选择。他们列举了安全性和可维护性方面的考虑。 &lt;/p&gt; &lt;p&gt;　　Nutter表示，JRuby on Rails项目推动了JRuby在Ruby on Rails Web框架中的使用。 &lt;/p&gt; &lt;p&gt;　　“Ruby on Rails所主要使用的是JRuby，而不是C语言执行，”Nutter表示。类似Rail的综合化也是为企业JavaBeans和SOA而计划的。 &lt;/p&gt; &lt;p&gt;　　JRuby也被人们认为是Struts框架的一个替代者。Nutter表示，“一般情况下，我不认为会有人真正喜欢还在Struts中编程。” &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7105032959919275140?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7105032959919275140/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7105032959919275140' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7105032959919275140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7105032959919275140'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/jruby-10-struts.html' title='JRuby 1.0 五月发布 欲做Struts框架的替代者'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7744892946910218496</id><published>2007-03-29T09:11:00.000+08:00</published><updated>2007-03-29T09:13:10.197+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google移动搜索升级 酣斗雅虎OneSearch</title><content type='html'>据techwhack网站报道，Google新版移动搜索服务即可在移动设备上使用，也可以普通的网络浏览器上使用（网址为http: //www.google.cn/m/search?hl=en&amp;mrestrict=xhtml&amp;amp;q=&amp;btnG=Search&amp;amp; site=mobile）。　　该服务现在进行定制化设置，按用户要求显示天气、新闻、股票和电影信息。Google在一份声明中表示，与前代版本相比，升级版搜索结果具有更好的关联性。&lt;p&gt;&lt;/p&gt;  &lt;p&gt;　　当用户点击一个搜索结果时，Google可以自动对原网页内容进行重新安排，以迎合移动设备较小的显示屏。（云雀）&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7744892946910218496?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7744892946910218496/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7744892946910218496' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7744892946910218496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7744892946910218496'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google-onesearch.html' title='Google移动搜索升级 酣斗雅虎OneSearch'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-5827155845514896630</id><published>2007-03-29T09:10:00.000+08:00</published><updated>2007-03-29T09:11:35.580+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google尝试即时翻译新技术 同时翻译100种语言</title><content type='html'>Google认为，人们未来将能够依靠机器逻辑而非语言学家把文件立即翻译成世界主要语言。 &lt;p&gt;　　Google的方案名为“统计机器翻译”（statistical machine  translation），这与以往的努力不同。&lt;/p&gt;\以往人们都是把语言学家设置的语法规则和词典输入电脑。 &lt;p&gt;　　Google将把人们已经翻译的文件输入电脑，然后依靠电脑来识别未来如何翻译。负责该项目的Franz  Och表示，尽管质量还不完美，比以往的机器翻译已经有所进步。他说：“一些长期从事机器翻译的人看到我们将阿拉伯语翻译成英语的文字后表示，这是一大突破。没有用过机器翻译的人读译文后说，第一个错误在第五行。”&lt;/p&gt; &lt;p&gt;　　对于绝大多数任务而言，基本正确的翻译已经足够好了。将阿拉伯语新闻网站翻译为英语已经做得不错，但是两名Google员工表示，将英语网站翻 译为俄罗斯语还有些蹩脚。Och输入的文字主要是联合国文件和欧盟文件。没有大量翻译文字的语言将面临较大的问题，如非洲语言。Och说：“输入得越多， 翻译得越好。”&lt;/p&gt; &lt;p&gt;　　到目前为止，Google在http://www.google.com/language_tools提供阿拉伯语、中文和俄罗斯语的统计机 器翻译功能，利用第三方软件能获得德语等文字的翻译。Och表示：“到目前为止，重点一直是做出很好的译文。根据Google的哲学理念，一旦有用就会有 影响，到时候就能找出来赚钱的方法。”&lt;/p&gt; &lt;p&gt;　　爱丁堡大学教授迈尔斯-奥斯布恩与Google在该项目上进行合作，他说，对于阿拉伯语英语这样的组合，该项目可能有很好的表现，但是，软件在专家级别的翻译上不会超过人。&lt;/p&gt; &lt;p&gt;　　Google董事会主席施米特表示：“如果我们能同时翻译100种语言会是什么样子？Google等一些公司正在研究统计机器翻译，这样，我们就能随时翻译一切。”（编译：搜狐IT  Unifytruth）&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-5827155845514896630?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/5827155845514896630/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=5827155845514896630' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5827155845514896630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5827155845514896630'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google-100.html' title='Google尝试即时翻译新技术 同时翻译100种语言'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-145526208392814003</id><published>2007-03-29T09:08:00.000+08:00</published><updated>2007-03-29T09:10:17.645+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>如何利用网络赚钱 google adsense</title><content type='html'>&lt;p&gt;&lt;span class="font14"&gt;&lt;p&gt;现在很多人都在研究google adsense ,google  adsense所带来的收入远远超过国内其他的广告&lt;/p&gt; &lt;p&gt;首先介绍一下&lt;/p&gt; &lt;p&gt;Google AdSense是一个快速简便的网上赚钱方法，可以让具有一定访问量规模的网站发布商为他们的网站展示与网站内容相关的 Google广告并将流量转化为收入。 &lt;/p&gt; &lt;p&gt;Google AdSense是网络会员联盟的一种形式，如果一个网站加入Google AdSense，即成为google的内容发布商，作为内容发布商可以在自己网站上显示google关键词广告，google根据会员网站上显示的广告被 点击的次数支付佣金，当某个月底佣金累计达到100美元时即可向用户支付广告佣金。&lt;/p&gt; &lt;p&gt;如果你拥有自己的网站并有一定的访问量，均可申请加入Google AdSense，无论网站是个人的还是商业的。如果你想尝试一下利用自己的网站把流量转化为收益，通过自己的网站实现赚钱的目的，可以访问google官 方网站对Google AdSense的详细介绍，以及如何加盟AdSense 透过 Google AdSense 使您的网站产生收益 透过 Google AdSense 使您的网站产生收益 &lt;/p&gt; &lt;p&gt;其次,google广告形式如下&lt;/p&gt; &lt;p&gt;点击上面的内容(有的时候是图片/文字) 随着广告商们出的价格不同,给予我们一定的收入,有的时候甚至一次点击就高达几美金的!!&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-145526208392814003?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/145526208392814003/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=145526208392814003' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/145526208392814003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/145526208392814003'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google-adsense.html' title='如何利用网络赚钱 google adsense'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-5863765401690135878</id><published>2007-03-29T09:07:00.000+08:00</published><updated>2007-03-29T09:08:29.736+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>揭开Google的成功之谜</title><content type='html'>&lt;span class="style4"&gt;&lt;div style="" onload="this.style.overflowX=’’auto’’；"&gt; &lt;p&gt;众所周知，搜索技术上的卓越创新使Google成为了搜索引擎的No.1。但是直到拍卖那些摆在搜索结果边上的广告之后，Google才开始赚钱。Google的市场总资本额曾一度高达1000亿美元，而广告收入占了公司总收入的99％。&lt;br /&gt;研 究显示，Google所创立的一套拍卖方法，对于其成功的重要性，已经远远超出了拍卖专家们开始的想像。尽管表面上看和早前的拍卖无本质区别，但是，由哈 佛大学的Benjamin Edelman，斯坦福大学的Michael Ostrovsky以及加州伯克利大学的Michael Schwarz联合进行的研究后得出的报告《互联网关键字拍卖的高昂价格》中就写到，这种方法是“在荒野生成的新奇的机制。”Google的AdWord 是如此的成功以至于在其四年前刚刚诞生不久，其一些关键的特性就被当时处在搜索广告领导地位的Yahoo所采用了。 &lt;/p&gt; &lt;p&gt;精密的数学计算 &lt;/p&gt; &lt;p&gt;去年11月，三位经济学家对外界透露了AdWord的秘密，至此，对于AdWord一直保持缄默的Google终于开口了。它让一直担任公司顾问的 伯克利大学的经济学家Hal R. Varian自由的对外界发表其对Google拍卖方式的研究结论。在2月22号，在任命新的该项目技术负责人Eric Veach之后，公司首次接受商业周刊的采访。Eric Veach曾在皮克斯动画制作室工作过，资历丰富，曾获斯坦福大学博士学位，不过是计算机动画，不是经济学。“如果没有他的精密的数学计算，我们不可能做 到现在这样。”产品管理的副总裁Salar Kamangar说。Salar在大学期间主修的是生物，曾获Google十佳员工第九名，他负责领导该项目非技术方面的工作。&lt;br /&gt;Google 的一些创新让人望其项背。举个例子，Yahoo将其搜索结果页面的顶部位置给每次点击支付最多费用的广告商。而Google根据每次点击广告的价格乘以其 估算出来的某广告商实际点击的概率，将最佳的位置给总支付费用最多的广告商，以此最大化公司的利润。位于加州山景城的搜索引擎市场公司Efficient Frontier的首席技术管Anil Kamath估计Google在每个广告上比Yahoo多赚取大约30％的利润。他认为Yahoo不久将很可能跟随Google的步伐。而当被问起这个问 题的时候，Yahoo的一位发言人表示，公司“正在评估在放置广告时更多的考虑‘点进率’（译者注：点进率为网上广告被点进的次数与被下载次数之比）”。 去年秋天，微软的MSN采用了Google的方式，在拍卖搜索广告位置的时候，通过调节来增加广告的相关性。 &lt;/p&gt; &lt;p&gt;是什么让Google的拍卖如此的与众不同呢？拍卖有两种，在传统的第一价格拍卖中，所有的竞拍者的价位都是不公开的，而最终出价最多的胜出。但是 这样的风险就在于出价最高的人可能会后悔自己的出价，一种被成为赢家诅咒的效应。一种称为第二价格拍卖的形式则吸取了赢家诅咒的教训，因为这种模式中，出 价最高的竞拍者胜出，但是只要支付最低的胜出需要的价格加上额外的一些费用。 &lt;/p&gt; &lt;p&gt;Google的Kamangar，Veach以及他们的同事们选择了第二价格拍卖方式。尽管并不了解这些理论，但他们设计了一种在关键方面与经济学 家们研究的所不同的模式。在经济学家的版本里，出价者总是有说真话的动机。而Edelman，Ostrosky和Schwarz则认为，在Google的 拍卖里，并不是这样。这是因为在有的时候，广告商们在了解到他们愿意支付的最高价格之后，可以通过支付少的多的价格来获得在搜索页面中稍稍靠后的位置。他 们得出结论，缺少经验那些“说真话”的广告商可能会出价过高。Varian认为Google的系统对于广告商来说获益也更多，相比于学术上的概念，更容易 理解，同时也证明能在更大的范围内适用。 &lt;/p&gt; &lt;p&gt;Google的关键词广告（AdWords Select）是在2002年2月首次推出的，实际上是Google在广告拍卖上的第三个尝试。之前的两个都存在缺陷，但Google创始人Larry Page和Sergey Brin不断进取。即使现在的系统仍然不是完美的。广告商们抱怨它太像一个“黑箱”了。不过，如果衡量创新的尺度是商业上是否成功的话，那么Google 的AdWords已经是宏大的胜利了。Kamangar这么说：“第三次施法让人陶醉了。”&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-5863765401690135878?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/5863765401690135878/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=5863765401690135878' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5863765401690135878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5863765401690135878'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_29.html' title='揭开Google的成功之谜'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-4514283018924874715</id><published>2007-03-29T09:06:00.001+08:00</published><updated>2007-03-29T09:06:37.857+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>十大“垃圾食品”排行榜</title><content type='html'>&lt;p&gt;&lt;span&gt;近日，有关健康专家对人们生活提出忠告，要当心某些食品对人类健康的负面影响，并提醒大家警惕下面这些食品。  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    油炸食品&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    油炸食品能量密度高，经常进食易导致肥胖；含有较高的油脂和氧化物质，是导致高脂血症和冠心病的最危险的食品；在油炸过程中，往往产生大量的致癌物质。已经有研究表明，常吃油炸食物的人群，其癌症的发病率远远高于不吃或极少进食油炸食物的人群。   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    罐头类食品&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    不论是水果类罐头，还是肉类罐头，其中的营养素都遭到大量的破坏，特别是各类维生素几乎被破坏殆尽。另外，罐头制品中的蛋白质常常出现变性，使其消化吸收率大为降低，营养价值大幅度“缩水”。还有很多水果类罐头含有较高的糖分，并以液体为载体被摄入人体，使糖分的吸收率大为增高，可在进食后短时间内导致血糖大幅攀升，胰腺负荷大为加重。同时，由于能量较高，有导致肥胖之嫌。   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    腌制食品&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    在腌制食品的过程中需要大量放盐，这导致此类食物钠盐含量超标，造成常常进食腌制食品者肾脏的负担加重，发生高血压的风险增高。还有，食品在腌制过程中可产生大量的致癌物质亚硝酸胺，导致鼻咽癌等恶性肿瘤的发病风险大为增高。此外，由于高浓度的盐分可严重损害胃肠道黏膜，故常进食腌制食品者，胃肠炎症和溃疡的发病率较高。   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    加工的肉类食品&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    这类食物含有一定量的亚硝酸盐，故有导致癌症的潜在风险。此外，由于添加防腐剂、增色剂和保色剂等，造成人体肝脏负担加重。还有，火腿等制品大多为高钠食品，大量进食可导致盐分摄入过多，造成血压波动及肾功能损害。   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    肥肉和动物内脏类食物&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    肥肉和动物内脏类食物虽然含有一定量的优质蛋白质、维生素和矿物质，但其中所含的大量的饱和脂肪酸和胆固醇，已经被确定为导致心脏病的最重要的两类膳食因素。长期大量进食动物内脏类食物可肯定性地、大幅度地增高患心血管疾病和恶性肿瘤（如结肠癌、乳腺癌）的发生风险。   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;    奶油制品&lt;/strong&gt;&lt;/span&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    奶油制品的能量密度很高，但营养素含量并不丰富，主要为脂肪和糖。常吃奶油类制品可导致体重增加，甚至出现血糖和血脂升高。饭前食用奶油蛋糕等，还会引起食欲降低。高脂肪和高糖分常常影响胃肠排空，甚至导致胃食管反流。很多人在空腹进食奶油制品后出现返酸、烧心等症状。   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    方便面&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    方便面属于高盐、高脂、低维生素、低矿物质的一类食物。一方面，因盐分含量高增加了肾负荷，升高血压；另一方面，含有一定量的人造脂肪（反式脂肪酸），对心血管有相当大的负面影响。加之含有防腐剂和香精，可能对肝脏等都有潜在的不利影响。   &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    烧烤类食品&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    烧烤类食品含有强致癌物质苯并芘。仅此一条，就足以警示人们对烧烤类食品“退避三舍”。  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    冷冻甜点&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    冷冻甜点包括冰激凌、雪糕等。这类食品有三大问题：因奶油含量较高，易导致肥胖；因糖分含量高，可降低食欲；还可能因为温度低而刺激胃肠道。  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;    果脯、话梅和蜜饯类食物&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    这类食物含有亚硝酸盐，在人体内可结合胺形成潜在的致癌物质亚硝酸胺；含有香精等添加剂可能损害肝脏等脏器；含有较高盐分可能导致血压升高和肾脏负担加重。（宗文）&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-4514283018924874715?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/4514283018924874715/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=4514283018924874715' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4514283018924874715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4514283018924874715'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_29.html' title='十大“垃圾食品”排行榜'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2783708822454802302</id><published>2007-03-28T20:52:00.000+08:00</published><updated>2007-03-28T20:53:56.759+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google Pack免费软件下载礼包 又添3成员</title><content type='html'>Google Pack是Google公司推出的一项服务，将一些他们认为必备的软件打成包提供免费下载，这些软件由统一的Google updater提供自动更新，省去用户逐一下载安装的麻烦。 &lt;br /&gt;&lt;br /&gt;　　今天，Google pack又增加了3位成员，其中一位为Google出品，另外两位为第三方的免费安全软件。首先是Google相片屏保，可以将您无论本地存储，还是Picasa网络相册或其他网络相册连接的照片以幻灯片的形式作为屏保。&lt;br /&gt;&lt;br /&gt;　　第二位来自大名鼎鼎的赛门铁克，诺顿安全扫描（Norton Security Scan）提供基本的PC安全防护功能，可以自动监测和清除病毒或蠕虫，并提供自动更新和计划扫描。这一赛门铁克专为Google特供的版本完全免费。&lt;br /&gt;&lt;br /&gt;　　另一位新成员来自PC Tools，名为Spyware Doctor Starter Edition。顾名思义，它也是一款较少功能的基础版安全软件，专门应对恶意软件和间谍软件，提供计划扫描，威胁移除，有限制的动态保护功能，并提供免费自动更新。&lt;br /&gt;&lt;br /&gt;　　加入这三位新成员后，Google Pack进一步扩大，目前软件包括：&lt;br /&gt;&lt;br /&gt;　　    Google软件：&lt;br /&gt;&lt;br /&gt;　　    Google Earth&lt;br /&gt;&lt;br /&gt;　　    Google Desktop&lt;br /&gt;&lt;br /&gt;　　    Picasa&lt;br /&gt;&lt;br /&gt;　　    Google IE工具栏&lt;br /&gt;&lt;br /&gt;　　    Google相片屏保&lt;br /&gt;&lt;br /&gt;　　    第三方软件：&lt;br /&gt;&lt;br /&gt;　　    Firefox&lt;br /&gt;&lt;br /&gt;　　    Adobe Reader&lt;br /&gt;&lt;br /&gt;　　    Norton Security Scan&lt;br /&gt;&lt;br /&gt;　　    Spyware Doctor Starter Edition&lt;br /&gt;&lt;br /&gt;　　    可选软件：&lt;br /&gt;&lt;br /&gt;　　    Google Talk&lt;br /&gt;&lt;br /&gt;　　    Google Video Player&lt;br /&gt;&lt;br /&gt;　　    RealPlayer&lt;br /&gt;&lt;br /&gt;　　    GalleryPlayer HD Images&lt;br /&gt;&lt;br /&gt;　　    Skype&lt;br /&gt;&lt;br /&gt;　　任意一款软件都可以随意添加或移除，Google Pack目前还处在beta阶段，并且还没有推出简体中文版。&lt;a href="http://www.enet.com.cn/"&gt;&lt;img src="http://images.enet.com.cn/end.gif" target="_blank" align="absmiddle" border="0" height="11" width="11" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2783708822454802302?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2783708822454802302/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2783708822454802302' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2783708822454802302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2783708822454802302'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google-pack-3.html' title='Google Pack免费软件下载礼包 又添3成员'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-838147344669246102</id><published>2007-03-28T20:50:00.000+08:00</published><updated>2007-03-28T20:52:04.316+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google办公软件产品月内第三次出现故障</title><content type='html'>本月内，Gmail电邮的Google Apps服务第三次出现了使用故障。业内一致认为，Google Apps将是微软办公软件产品的主要对手。&lt;br /&gt;&lt;br /&gt;　　本周二，Google Apps服务出现故障并影响用户。同时，出现的问题还影响了没有安装Google Apps的Gmail用户。Google公司的发言人称："大量的Gmail用户收发邮件出现问题，我们正在努力解决这一问题。同时，故障也影响到了一些 Google Apps帐号。"&lt;br /&gt;&lt;br /&gt;　　现在，SaaS（软件即服务）模式日益流行，并有可能取代传统的模式，即用户在PC和服务器上下载并安装软件模式。以Google为首的企业开创SaaS模式，向微软发起挑战，但也存在一个致命的问题：可用性问题。&lt;br /&gt;&lt;br /&gt;　　目前，Gmail用户出现的问题就集中反映了这一现象。此前， Google Apps问题就出现过两次。业内分析，三起事件对 Google Apps用户影响很大。&lt;a href="http://www.enet.com.cn/"&gt;&lt;img src="http://images.enet.com.cn/end.gif" target="_blank" align="absmiddle" border="0" height="11" width="11" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-838147344669246102?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/838147344669246102/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=838147344669246102' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/838147344669246102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/838147344669246102'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_434.html' title='Google办公软件产品月内第三次出现故障'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3492471043965059284</id><published>2007-03-28T20:48:00.001+08:00</published><updated>2007-03-28T20:48:52.451+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>我们为什么需要Google手机？</title><content type='html'>赛迪网讯3月28日消息，考虑到与公司已有产业的兼容性，Google公司开始经营手机就像克莱斯勒汽车开始经营互联网业务一样。  &lt;p&gt;　　据福克斯新闻网报道，Google公司将开始生产手机的谣言揭示了美国高新科技界所面临的困扰和未来发展的期望。&lt;/p&gt;  &lt;p&gt;　　就像之前有关iPhone的各种猜测一样，现在讨论传说中的Google手机外形如何、有什么功能是毫无意义的，这些猜测只不过是一些人把自己的臆想强加到Google手机上。&lt;/p&gt;  &lt;p&gt;　　让我们抛开Google手机传言本身，回到传言最初始的状态来解释这个传言真正的含义。&lt;/p&gt;  &lt;p&gt;　　—手机上使用互联网的技术很不成熟&lt;/p&gt;  &lt;p&gt;　　—手机的媒体播放器不尽人意&lt;/p&gt;  &lt;p&gt;　　—手机可以拥有便携电脑的功能，但现有的手机生产商却没有真正认识手机的发展潜力&lt;/p&gt;  &lt;p&gt;　　Google公司目前的业务都是和软件相关的，在硬件方面没有任何积累，而纵观现今手机市场，进入这一领域的新军大部分也都是传统的硬件厂商。 虽然Google公司在互联网技术方面很出色，但是要介入硬件行业，他们能与其他手机生产商抗衡的“杀手锏”就是把手机发展为移动的软件和网络服务平台。&lt;/p&gt;  &lt;p&gt;　　我们可以想象到Google生产手机将面临的困难：Google拥有绝妙的软件开发技术，但他们的操作系统很零散。另一方面由于无线传送的严格限制，Google也很难实现将他们的手机发展为软件和网络平台的设计理念。&lt;/p&gt;  &lt;p&gt;　　雅虎公司也遇到同样的问题。Heck公司和其他任何一家互联网公司想要进军手机市场都会碰到这样的问题。&lt;/p&gt;  &lt;p&gt;　　苹果公司在开发把媒体播放器加入到iPhone手机中的技术时也碰到了同样的问题。&lt;/p&gt;  &lt;p&gt;　　苹果公司强大的品牌效应和广阔的市场让他们最终突破了无线传送的限制。&lt;/p&gt;  &lt;p&gt;　　但即使是苹果公司也仍然受制于无线传送的经营商，目前为止只有Cingula用户可以使用拥有该装置。&lt;/p&gt;  &lt;p&gt;　　Google公司的强大品牌效应也可以起到同样的作用，但是Google公司与无线传送经营商的关系更为复杂。&lt;/p&gt;  &lt;p&gt;　　无线传送经营商反对开发手机无线上网业务，他们把网络服务看作为一种安全威胁。&lt;/p&gt;  &lt;p&gt;　　即使Google公司真的开发出Google手机，他们也会发现由于无线传送业务的影响Google手机并不能想他们设计的那样运转。&lt;/p&gt;  &lt;p&gt;　　对于互联网公司来说与已有的手机生产商合作比在完全没有经验的的情况下一头扎进一个毫不相关的领域来说似乎要明智得多。Google公司和苹果公司都曾经尝试过与手机生产商合作，但结果却不尽如人意。&lt;/p&gt;  &lt;p&gt;　　苹果公司与摩托罗拉公司合作生产了ROKR和RAZRV3i，运行速度慢，操作也不便捷。2006年Google公司也宣布与摩托罗拉公司合作生产手机，但到目前为止并没有看见两家合作生产的手机上市。&lt;/p&gt;  &lt;p&gt;　　手机的生产厂商需要改变思维，突破现有规定的束缚，进行一场手机大变革，开创便携电脑式手机的新时代。&lt;/p&gt;  &lt;p&gt;　　虽然苹果公司已经在这场变革中伤痕累累，但我们很欣喜地看到苹果公司已经开始打破传统了。苹果公司承诺要开启一个多媒体手机的新时代，但这仅仅是这场变革的第一步。我们需要进一步创新，取消第三方软件政策，将互联网技术真正地应用在手机上。&lt;/p&gt;  &lt;p&gt;　　Google公司可以完成这一使命吗？结果难以预料。这场革命需要有“英雄”，锲而不舍，开创手机新时代。(n104)&lt;/p&gt;                                       &lt;sohuadcode&gt;&lt;/sohuadcode&gt; &lt;div class="editUsr" align="right"&gt;(责任编辑：Ann)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3492471043965059284?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3492471043965059284/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3492471043965059284' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3492471043965059284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3492471043965059284'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_6923.html' title='我们为什么需要Google手机？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-928795572138025312</id><published>2007-03-28T20:40:00.000+08:00</published><updated>2007-03-28T20:41:25.180+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google地图上传图片功能应用攻略</title><content type='html'>&lt;a href="http://www.pconline.com.cn/pcedu/softnews/yejie/0703/982995.html" target="_blank"&gt;Google&lt;/a&gt;的产品改变了许多人的网络习惯，其为用户提供了越来越多、越来越人性化的工具，其的一个个创新都在改变这用户的生活，Google已经成为了创新、自由的代名词。因此，有理由相信&lt;a href="http://www.pconline.com.cn/pcedu/softnews/yejie/0703/982995.html" target="_blank"&gt;Google&lt;/a&gt; Fans的存在是有其足够的理由的！&lt;p&gt;　 　搜索地图时只看到地址电话显得有些单调？朋友聚会找餐厅想顺便知道环境是否优美、菜色是否诱人？与女朋友去约会之前做足功课要找个地方有情调、够浪漫？ 度假或商务旅行之前想知道酒店是否可心舒适？更或者，本地商户中心的业主们想让自己注册的公司一目了然、更具吸引力？喜欢 &lt;a href="http://ditu.google.cn/" target="_blank"&gt;Google 地图&lt;/a&gt;的朋友们，新增的“上传图片功能”让你梦想成真！&lt;br /&gt;&lt;br /&gt;　　一张图片胜过千言万语！&lt;a href="http://www.pconline.com.cn/pcedu/softnews/yejie/0703/982995.html" target="_blank"&gt;Google&lt;/a&gt; 地图不仅将网上图片搜索结果添加到地图服务中，使用户的感受更为直观；而且，商户中心的业主们还可以免费的为商家列表自行添加图片为企业针对的客户提供更大说服力。下面就以步骤详解让你轻轻松松把图贴。&lt;br /&gt;&lt;br /&gt;　　- 首先，访问&lt;a href="https://www.google.com/accounts/ServiceLogin?continue=http%3A%2F%2Fwww.google.com%2Flocal%2Fadd%2FbusinessCenter%3Fhl%3Dzh-CN%26gl%3DCN&amp;service=lbc&amp;amp;hl=zh-CN&amp;gl=CN" target="_blank"&gt;本地商户中心&lt;/a&gt;，如图1，并确认页面左上角“更改语言”设置为中文。&lt;/p&gt;&lt;p align="center"&gt;&lt;img title="更改google界面语言设置" alt="更改google界面语言设置" src="http://img2.pconline.com.cn/pconline/0703/28/988097_070328_gg1.jpg" border="0" /&gt;&lt;/p&gt;&lt;p align="center"&gt;图1 更改Google的语言设置&lt;/p&gt;&lt;p align="left"&gt;　　- 然后，输入与 Google 帐户相关联的电子邮件及密码，并单击“登录”按钮。&lt;/p&gt;&lt;p&gt;　　- 在你的列表左侧单击“向此列表添加图片”的选项。&lt;/p&gt;&lt;p&gt;- 你有两个选择，“从我的计算机上获得文件……”，或是“从网络获得文件……”，然后单击“上传”按钮。顺便提醒一句，目前最多可以上传 10 幅公司图片，而且图片需小于 1MB。&lt;/p&gt;&lt;p&gt;　　- 最后，单击“完成”按钮。如图2，所有上传后的图片将显示在页面右侧。&lt;/p&gt;&lt;p align="center"&gt;&lt;img title="公司图片上传完成后，大功告成" alt="公司图片上传完成后，大功告成" src="http://img2.pconline.com.cn/pconline/0703/28/988097_070328_gg2.jpg" border="0" /&gt;&lt;/p&gt;&lt;p align="center"&gt;图2 公司图片上传完成后，大功告成&lt;/p&gt;&lt;p&gt;　　这样就大功告成啦！如果你不太确定什么样的图片可以上传，请点击该页的&lt;a href="http://bendi.google.com/help/photospolicy_maps.html" target="_blank"&gt;“编辑指南”&lt;/a&gt;一窥究竟。&lt;br /&gt;&lt;br /&gt;　　如果你目前还不是本地商户中心的业主，希望加入却不知从何下手，可以登录到 &lt;a href="http://maps.google.com/support/?hl=zh_CN" target="_blank"&gt;Google 地图的帮助中心&lt;/a&gt;，了解“&lt;a href="http://maps.google.com/support/bin/answer.py?answer=7039&amp;amp;topic=1481" target="_blank"&gt;如何把我的公司添加到 Google 地图？&lt;/a&gt;”是第一步，接下来你就可以根据需要按以上步骤添加图片了。&lt;br /&gt;&lt;br /&gt;　　与上传图片同时推出的新功能还有“添加自定义属性”与 “统计信息”。在添加自定义属性时，不妨发挥一下你的创造力，凡是对商户列表有更好推广作用的选项统统用上。比如，开业时间、公共交通、行业排名等等。“统计信息”功能则可以让你详细了解自己商家列表的浏览次数。&lt;br /&gt;&lt;br /&gt;　　对于Google 地图还不甚了解的朋友们，可以到Google的&lt;a href="http://maps.google.com/support/?hl=zh_CN" target="_blank"&gt;帮助中心&lt;/a&gt;走一走、看一看。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-928795572138025312?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/928795572138025312/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=928795572138025312' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/928795572138025312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/928795572138025312'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_28.html' title='Google地图上传图片功能应用攻略'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7835450019566290464</id><published>2007-03-28T20:38:00.000+08:00</published><updated>2007-03-28T20:39:15.788+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>LG电子4月推Google手机 装有搜索地图等功能</title><content type='html'>&lt;p style="text-indent: 2em;"&gt;据外电报道&lt;strong&gt;，&lt;/strong&gt;继三星电子以后，韩国&lt;a href="http://search.tom.com/search.php?f=8&amp;cl=3&amp;amp;edt=0&amp;word=LG+site%3Atech.tom.com&amp;amp;tomsearch=webpage&amp;submit=TOM%CB%D1%CB%F7&amp;amp;ad=&amp;pn=30&amp;amp;ad=" target="_blank" class="style1" _base_target="_self"&gt;LG&lt;/a&gt;电子也将面向世界市场推出装有世界上最大的搜索引擎——&lt;a href="http://tech.tom.com/shidian/Google_bendi.html" target="_blank" _base_target="_self"&gt;&lt;span style="color:blue;"&gt;&lt;b&gt;Google&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;的手机。 &lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;据透露LG电子同Google已经签署关于研发支持Google多项移动服务的手机合同。 &lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;LG电子决定推出装有Google搜索、Google地图、Google电子邮件(Gmail)等Google基本服务以及可以在世界最大的博客网站——Blogger.com上上传和&lt;a href="http://software.tech.tom.com/soft/index.php" target="_blank" class="style1" _base_target="_self"&gt;下载&lt;/a&gt;照片的Google手机。 &lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;LG电子计划下月从北美、欧洲、亚洲等地区逐步推出装有Google服务的手机，并计划到年底在10多款产品上预装Google服务。 &lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;三星电子曾在年初同Google合作向欧洲市场推出Google手机。 &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7835450019566290464?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7835450019566290464/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7835450019566290464' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7835450019566290464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7835450019566290464'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/lg4google.html' title='LG电子4月推Google手机 装有搜索地图等功能'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-4649307150840968029</id><published>2007-03-26T14:28:00.000+08:00</published><updated>2007-03-26T14:31:10.884+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google地球开发弃用Flash</title><content type='html'>【搜狐IT消息】据国外媒体报道，在最近举行的Ajax世界大会上，Google公司因为其Ajax“准先驱”的地位而成为大会主角。在一次会议 上，有Ajax技术人员询问Google专家，Google地球为什么没有使用Flash技术，这位高层回答说，这和Flash右键菜单有关。 &lt;p&gt;　　Google地球的产品经理和开发人员布雷特·泰勒对于与会者作出了上述回答。他说，Google地球在开发之前考虑了多种技术，如果采用 Flash，用户在右键点击Flash动画是，将会看到一个Flash专用的菜单。但是如果采用Ajax技术，用户看到的菜单和浏览器页面中的其它元素没 有什么区别，这将提高用户体验，并让用户感觉到更加简单。出于用户体验的考虑，Google放弃了Flash技术的选择。&lt;/p&gt; &lt;p&gt;　　据技术专家说，从Google地球来看，采用Flash不仅完全可以完成Ajax所实现的功能，而且更加易于实现，开发时间也将会更短。&lt;/p&gt; &lt;p&gt;　　但众所周知的是，Flash动画的右键快捷菜单上包括了一些Flash的特定功能，比如放大、缩小、重新开始播放等等，此外，这一菜单也没有提供将动画文件保存到本地硬盘的功能。&lt;/p&gt; &lt;p&gt;　　日前，布雷特·泰勒在这次大会上说出惊人之语，他称Ajax技术源自对现有标准的“滥用”和“误用”，在最近几天的会议中，这番言论被多次引用。（沈维霓）&lt;/p&gt;                                      &lt;sohuadcode&gt;&lt;/sohuadcode&gt; &lt;div class="editUsr" align="right"&gt;(责任编辑：龚伦常)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-4649307150840968029?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/4649307150840968029/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=4649307150840968029' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4649307150840968029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/4649307150840968029'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/googleflash.html' title='Google地球开发弃用Flash'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-5116601444360481259</id><published>2007-03-23T19:56:00.000+08:00</published><updated>2007-03-23T20:09:15.137+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google桌面的十大妙用</title><content type='html'>1.启动程序&lt;br /&gt;&lt;br /&gt;　　开了N个窗口，如何能够隔“窗”取物，打开桌面程序？ 很简单，双击Ctrl，在Google Desktop里输入程序首几个字符－－例如，启动ACDSee，只需要输入AC就直接跳到桌面快捷。&lt;br /&gt;　　  &lt;center&gt; &lt;center&gt;&lt;img src="http://it.com.cn/f/news/073/23/it_google01.jpg" /&gt;&lt;/center&gt;&lt;/center&gt;&lt;br /&gt;　　2.控制面板替代工具&lt;br /&gt;&lt;br /&gt;　　想要改变网络连接设置？不必进入控制面板，只需要在Google桌面搜索框中输入：网络连接。&lt;br /&gt;　　  &lt;center&gt;&lt;img src="http://it.com.cn/f/news/073/23/it_google02.jpg" /&gt;&lt;/center&gt;&lt;br /&gt;　　3.地址栏}&lt;br /&gt;&lt;br /&gt;　　一个非常实用，但是又很少有人知道的实用特性。想要打开文件夹或者网址，其实可以直接从Google桌面搜索框中进行。例如，输入“www.theinquirer.com.cn”，将直接进入该网站；输入“F:/”，将直接打开F盘"&lt;br /&gt;&lt;br /&gt;　　4.查看浏览器历史&lt;br /&gt;&lt;br /&gt;　　Google Desktop会保存你近期的浏览器记录，你可以很容易找到某个浏览历史页面&lt;br /&gt;&lt;br /&gt;　　5.查看浏览器缓存&lt;br /&gt;&lt;br /&gt;　　在Google Desktop中输入网址，你就能看到该页面近期的浏览器缓存缩略图，方便你查询页面历史&lt;br /&gt;　　  &lt;center&gt;&lt;img src="http://it.com.cn/f/news/073/23/it_google03.jpg" /&gt;&lt;/center&gt;&lt;br /&gt;　　6.文件恢复&lt;br /&gt;&lt;br /&gt;　　当你删除一个文档后，Google Desktop将在短期内保存该文档缓存，你可以在桌面搜索中找回被删除文件的缓存，并进行恢复。&lt;br /&gt;&lt;br /&gt;　　7.文件版本恢复&lt;br /&gt;&lt;br /&gt;　　Google Desktop会记录你单个文件的多个版本，如果你没有为每个版本独立备份的习惯，Google桌面不仅会保存各个存储版本缓存，还会为你列出每个版本保存的时间线列表。&lt;br /&gt;　　  &lt;center&gt;&lt;img src="http://it.com.cn/f/news/073/23/it_google04.jpg" /&gt;&lt;/center&gt; &lt;center&gt;&lt;img src="http://it.com.cn/f/news/073/23/it_google05.jpg" /&gt;&lt;/center&gt;&lt;br /&gt;　　8.查询近期文档&lt;br /&gt;&lt;br /&gt;　　Google Desktop的时间线功能能够为你列出近期修改、打开最频繁的文档信息&lt;br /&gt;　　&lt;br /&gt;　　9.Office / PDF阅读器&lt;br /&gt;&lt;br /&gt;　　如果你没有安装Office或Adobe Reader，GoogleDesktop可以充当临时的PDF/DOC/XLS/PPT文件文本版阅读器，当然，资源占用也比使用Office、Adobe Reader小的多。&lt;br /&gt;&lt;center&gt;&lt;img src="http://it.com.cn/f/news/073/23/it_google06.jpg" /&gt;&lt;/center&gt;&lt;br /&gt;　　10.Gmail替代工具&lt;br /&gt;&lt;br /&gt;　　在没有网络，或者Gmail遇到“Oops”问题无法使用时，Google Desktop能够帮助你查找已添加进检索的邮件内容（需要在使用偏好中选择检索邮件），Google桌面会保存所有邮件文本内容，附件不会进行保留。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-5116601444360481259?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/5116601444360481259/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=5116601444360481259' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5116601444360481259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5116601444360481259'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_9739.html' title='Google桌面的十大妙用'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2292973196382205734</id><published>2007-03-23T19:51:00.000+08:00</published><updated>2007-03-23T19:54:39.779+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google改进风格 主题皮肤功能上线</title><content type='html'>据报道，Google将会一改以往的“洁癖”作风，向用户提供选择，允许用户将Google首页实行主性化，包括能换上会随时间和天气的变化而改变的皮肤。这些个性化选项即于本周二（太平洋时间，比北京时间慢16小时）正式推出。 &lt;p&gt;　　Google第一美女同时也是Google搜索产品及用户体验副总裁Marissa Mayer说，Google之所以要推出这个功能，是想令Google主页看起来感觉更舒适自在。她说：“Google已经成为了很多用户进入互联网的门 口，因此我们想令Google更像一个在线式的私人房间。我觉得我们正在以一种非常有品味及极具可用性的方式来将东西个性化。”&lt;/p&gt; &lt;p&gt;　　Google一开始将会提供6款主题皮肤，以山水风景为主，其中4款分别以日式茶室、海滩、城市地平线、巴士站为景点。Google透露以后每个月将会定期推出一些新皮肤，并且最终可能会允许用户自行创作并提交皮肤，就像Google gadgets那样。&lt;/p&gt; &lt;p&gt;　　Google的皮肤并非静态皮肤，用户可以输入自己所在地的邮政编码，这些皮肤的背景可依据当地的时间和天气的变化而发生改变！并且这些皮肤当中还包含彩蛋，即当用户在某天某个时刻进行了某个点击，将会看到隐藏的惊喜。&lt;/p&gt; &lt;p&gt;　　这是令人激动的时刻。虽然单凭这则消息，我们并不清楚Google是否会同时对Google.com传统主页及个性化主页提供换肤功能，但无论最终是哪一个实现，意义都异常重大。因为这毕竟是Google首次允许用户更改主页的整体外观和风格。&lt;/p&gt; &lt;p&gt;　　以下是皮肤截图（目前仅支持英文，中国用户可以根据修改偏好设置抢先体验！）&lt;/p&gt; &lt;p align="center"&gt;&lt;img alt="" src="http://pic.iresearch.cn/news/0468/20070322/0034@3382.jpg" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2292973196382205734?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2292973196382205734/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2292973196382205734' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2292973196382205734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2292973196382205734'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_9591.html' title='Google改进风格 主题皮肤功能上线'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-6561980399276232343</id><published>2007-03-23T19:50:00.000+08:00</published><updated>2007-03-23T19:51:13.570+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google欲为网页添加主题 将随天气状况改变</title><content type='html'>&lt;p style="text-indent: 2em;"&gt;美国谷歌公司将于明日推出一种新服务，改变公司以往简朴的网页风格，将搜索引擎框置于一种主题模式下，该模式可以根据时间和户外的天气状况进行改变。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;据外电报道，谷歌此举的目的是为了取悦那些一切都想个性化的电脑用户和使其网页更具家的感觉。谷歌搜索产品和用户体验部门的副总裁马里萨·迈耶说：“谷歌已经成为很多人进入互联网的门户，所以我们希望(我们的网站)更像一个在线的客厅。”&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;目前，大部分谷歌用户仍对其持续近十年的简朴网页风格表示满意。但仍有数百万用户已经开始注册使用谷歌公司2年前推出的特色服务：每次登陆可以在谷歌的网页上加载时钟、口哨声、股票报价、当地天气和新闻标题。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;分析人士认为，谷歌此举表明谷歌正从单一的网络搜索引擎网站发展成提供电子邮件、新闻、照片共享、即时通讯、网络购物和地图服务的综合性网站。但也有部分分析人士担忧，谷歌在过去5年里采用的多元化战略可能使其不堪重负。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;迈耶表示，出于谨慎行事的目的，谷歌此次仅推出6个主题，并计划在以后的每个月里增加几个主题，最终可能接受外来用户提交的主题。&lt;/p&gt; &lt;p style="text-indent: 2em;"&gt;(新华社） &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-6561980399276232343?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/6561980399276232343/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=6561980399276232343' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6561980399276232343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6561980399276232343'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_5619.html' title='Google欲为网页添加主题 将随天气状况改变'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-1079375297951119153</id><published>2007-03-23T19:45:00.000+08:00</published><updated>2007-03-23T19:48:14.268+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>百度是否是下一个Google？</title><content type='html'>&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;&lt;li&gt;百度会成为下一个Google吗？或者Google、雅虎或者微软是否会收购百度并借此在中国坐大，以免从快速发展的中国市场上冒出一个强有力的竞争对手呢？&lt;/li&gt;&lt;/span&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;网易科技讯 北京时间3月21日消息，百度是中国国内最大的搜索引擎，它在中国的成功堪比Google在全球的成功，它也许是Google、雅虎和MSN等全球大型搜索引擎巨头们收购的对象。 &lt;/span&gt;&lt;/p&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;据Alexa统计的流量排名，它现在在全球搜索引擎市场排在第七位，排在它前面的是雅虎、MSN、Google、YouTube、MySpace和WindowsLive。&lt;/span&gt;&lt;/p&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;中国另外两个领袖级网站即新浪和搜狐均排在它的后面，但是那两个网站在点击率方面也在全球25强之列。下面的图表清楚地显示了百度在与新浪和搜狐对比时的优势。图表列出了在过去5年多时间里Alexa统计到的全球用户对各网站访问量的日平均量。 &lt;/span&gt;&lt;/p&gt;&lt;center&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;&lt;img src="http://cimg2.163.com/tech/2007/3/22/200703220121279dcb0.jpg" border="0" /&gt;&lt;/span&gt;&lt;/center&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;下表显示出百度和搜狐与Google、雅虎和MSN在过去5年多时间里的访问量对比。它们之间的差距相当大。&lt;/span&gt;&lt;/p&gt;&lt;center&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;&lt;img src="http://cimg2.163.com/tech/2007/3/22/2007032201213844bf0.jpg" border="0" /&gt;&lt;/span&gt;&lt;/center&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;下表列出了各国的知名网站在网络总流量中所占比例。大体上，百度、搜狐和新浪的访问量完全来自于中国。&lt;/span&gt;&lt;/p&gt;&lt;center&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;&lt;img src="http://cimg2.163.com/tech/2007/3/22/200703220121498c399.jpg" border="0" /&gt;&lt;/span&gt;&lt;/center&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;最后一张表列出了对中国和美国各自的三家顶级网站的各项关键评估参数。百度上个季度的同比增长率达到了400％，而Google的同比增长率为67％，雅虎和MSN的分别只有13％和6％。&lt;/span&gt;&lt;/p&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;百度的PE、EV/Rev和EV/EBITDA得分都很高，因此它的增长率也很高。&lt;/span&gt;&lt;/p&gt;&lt;center&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;&lt;img src="http://cimg2.163.com/tech/2007/3/22/2007032201220085855.jpg" border="0" /&gt;&lt;/span&gt;&lt;/center&gt;&lt;p st="TEXT-INDENT: 2em"&gt;&lt;span style="font-size: 10.5pt; line-height: 150%;" id="contents"&gt;我们不禁要问，百度会成为下一个Google吗？或者Google、雅虎或者微软是否会收购百度并借此在中国坐大，以免从快速发展的中国市场上冒出一个强有力的竞争对手呢？（网易科技 三张）&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-1079375297951119153?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/1079375297951119153/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=1079375297951119153' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1079375297951119153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1079375297951119153'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google_23.html' title='百度是否是下一个Google？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-6258372295144573747</id><published>2007-03-20T19:40:00.001+08:00</published><updated>2007-03-20T19:40:54.408+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>谷歌主页周二将改版 加强用户定制功能</title><content type='html'>北京时间3月20日消息，据国外媒体报道，谷歌(Google)计划改变网站主页一贯的“朴素”形象，为其加入多种全新主题，使搜索栏背景可随着时间和&lt;a href="http://weather.sina.com.cn/" target="_blank" class="akey"&gt;天气&lt;/a&gt;的变化而变化。 &lt;p&gt;　　谷歌将于周二公布一组彩色图片，用于装饰主页，以满足网络用户对于个性化的需求。过去十年里，谷歌主页上一直只有公司标识和搜索栏。尽管大多数人都对这一“朴素”的页面表示满意，但也有数百万名用户优化了登录页面，目的是更方便地访问不同功能，包括股市行情、本地&lt;a href="http://weather.sina.com.cn/" target="_blank" class="akey"&gt;天气&lt;/a&gt;、以及重要新闻。&lt;/p&gt; &lt;p&gt;　　谷歌主管搜索产品和用户体验的副总裁玛丽莎·梅耶尔(Marissa Mayer)表示，该公司推出新主题是为了让主页看起来更舒适。他说：“谷歌已经成为了很多用户的网络门户，因此我们希望让网站看起来更像一个网络&lt;span class="yqlink"&gt;&lt;form class="yqin" action="http://www.iask.com/n" method="post"&gt;&lt;input name="k" value="%BF%CD%CC%FC" type="hidden"&gt;&lt;/form&gt;&lt;a href="http://www.iask.com/n?k=%BF%CD%CC%FC" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="客厅"&gt;客厅&lt;/a&gt;&lt;/span&gt;。我认为，我们的主题非常有品位，而且实用。”在此之前，谷歌的主要竞争对手雅虎已经为用户提供了多种主题选择，作为“我的雅虎”服务升级计划的一部分。&lt;/p&gt; &lt;p&gt;　　创业公司Pageflakes的CEO丹·科恩(Dan Cohen)表示：“相比较而言，谷歌迈出的步子更大，因为在此之前，该公司一直以朴素的主页为傲。科恩此前曾经在谷歌和雅虎从事个性化方面的工作，不久 前就任网页定制公司Pageflakes的CEO。在主页加入更多图片，意味着谷歌正逐步从一家搜索引擎向网络门户转型。目前，谷歌已开始提供电子邮件、 新闻、图片共享、即时信息、购物和地图等多种服务。&lt;/p&gt; &lt;p&gt;　　过去五年里，谷歌一直在发展多种经营，希望逐步摆脱对网络搜索的依赖。曾有分析师担心谷歌过度扩张，但目前看来，这一担心还未变为现实。过去一年里，谷歌的净利润增长了一倍以上，达到31亿美元。梅耶尔表示，谷歌希望让网站看起来更加活泼，而不是臃肿和商业化。&lt;/p&gt; &lt;p&gt;　　谷歌最初只为用户提供6个主题，主要由风景构成。谷歌计划未来每月推出几款新主题，有可能会接受外部建议。(摩尔) &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-6258372295144573747?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/6258372295144573747/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=6258372295144573747' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6258372295144573747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6258372295144573747'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_20.html' title='谷歌主页周二将改版 加强用户定制功能'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-9121280294795222050</id><published>2007-03-19T21:16:00.000+08:00</published><updated>2007-03-19T21:17:48.233+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Flex挑战Java和.NET Adobe能否再度崛起？</title><content type='html'>如果你是一个IT人士，Adobe Flash你一定不会陌生，在Real、Windows Media和Quicktime的众多竞争重重围攻下，终于杀出了一条血路，成为当前在网页内嵌入视频的第一选择，近期，Adobe 也正在考虑在其产品线中增添通过Web实现的服务。全速进军客户端应用开发市场，它能成功翻版Flash在Web中的成功么?&lt;br /&gt;&lt;br /&gt;　　上个月，Adobe公司的Ben Forsaith演示了一个Flex 2的开发工具FlexBuilder，显示了其新的基于Eclipse的集成开发环境，意味着Flex在开发领域市场迈出了坚实的一步。&lt;br /&gt;&lt;br /&gt;　　&lt;strong&gt;揭开Flex的面纱?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　　Adobe Flex 是为满足希望开发 Rich Internet 应用程序的企业级程序员的需求而推出的表示&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;服务器&lt;/b&gt;和应用程序框架。RIA 将桌面软件的响应速度和丰富功能与 Web 应用程序的广度结合在一起，以提供效果更好的最终用户体验。Flex 表示服务器提供基于标准的、声明性的编程方法和流程，并提供运行时服务，用于开发和部署丰富客户端应用程序的表示层。&lt;br /&gt;&lt;br /&gt;　　Flex 开发者使用直观的基于 XML 的语言来定义丰富的用户界面;该语言由 Flex 服务器翻译成智能的客户端应用程序，在普遍存在的 Flash 运行环境中。&lt;br /&gt;&lt;br /&gt;　　从本质上来说，Flex只是编译Flash的另一种方式，不过Flex是以代码为中心，使用结构化查询语言XML和脚步语言ActionScript 来编译，对开发者来说，这种方式要比在面向设计的Flash集成开发环境更加容易掌握。它具有图形化控制功能的可视化设计器，同时它又是一个有效的应用程 序开发工具;当然，与那些比较成熟的开发工具比起来，例如微软的Visual Studio，还是有不足之处。&lt;br /&gt;&lt;br /&gt;　　不过，这些缺点还不足以说明什么，Flash视频的成功很大程度上得益于它易于部署的特点。只需要在你的计算机上安装最新版的Flash播放器就一切OK了。同样，Flex也是如此。ActionScript 3.0改进了JavaScript&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;脚本&lt;/b&gt;语言，开发者使用它不仅仅可以来编写脚本而且还可以对主要的新功能进行即时编译强壮它类型选择。ActionScipt的强类型不仅仅是花架子，可以被编译器来创建更有效的字节代码。很明显，这种方式可以大大提高客户端程序的运行速度。&lt;br /&gt;&lt;br /&gt;　　Ajax的成功已经证明，运行在客户端的互联网应用程序，如果具备平滑的功能和丰富的用户体验，是十分受用户欢迎的，因此编写JavaScipt脚本语言即使承受一点烦恼，也是值得的。同时在你的AJAX应用程序和Flex应用程序中的代码可有效进行融合互通。&lt;br /&gt;&lt;br /&gt;　　上述特点对从事开发的编程人员不是很陌生，例如，Java的Applets，微软的ActiveX和其他浏览器插件，都是同样的运行原理。在浏览器中 运行的Java应用程序功能虽然强大，但是，与Flash相比，Java运行环境非常庞大，而且存在令人困惑的不同版本问题，这阻挡了它被广泛采用的步 伐。而微软的AcitveX则既不跨平台又不跨浏览器，且开发的时候还要对相关的安全问题保持足够的警惕性。&lt;br /&gt;&lt;br /&gt;　　一个更类似的例子当属微软的展示层技术WPF，它看上去已经解决了基于浏览器的.NET应用程序的安全问题，而且非常容易部署。不幸的是，WPF需要一个非常大的运行环境，且只工作在微软最近发布的强大的Vista&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;操作系统&lt;/b&gt;中。尽管WPF可以提供相当丰富强大的图形和多媒体效果，但是它相对狭窄的应用范围限制了广泛发展的可能性。微软同时也有一个跨平台的的WPF版本，即WPF/Everywhere，但是它目前依然处于开发阶段。&lt;br /&gt;&lt;br /&gt;　　此外，Adobe为开发人员构建下一代丰富互联网应用提供了无限可能，其可用性和效率均大大提高。&lt;br /&gt;&lt;br /&gt;　　包括波音(Boeing)、道琼斯(Dow Jones)、三星(Samsung)、Indexes 和SAP在内的各行业领军人物，纷纷使用Adobe Flex和Flash Player来创建下一代Web应用，该应用将桌面软件的优势和网络的广泛范围结合在一起，从而为用户创造出更有价值的体验。永明金融公司(Sun Life Financial)软件工程师Chris Culhane说：“利用Flex 2，我们已经改进了员工使用的程序界面的丰富程度和可用性，这直接提高了我们的工作效率。在开发方面，和其它开发环境相比我们的应用开发速度提高了一倍。 我们只需编写很少的代码，Flex应用程序可以将其与后台系统无缝的集成在一起，因而最终的应用程序非常简单，易于维护。”&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;Flex的未来之路&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　　因此在这个领域，Adobe无疑具有比较大的领先优势，但是在成绩和荣誉的背后，Flex的未来之路并不是一帆风顺的。&lt;br /&gt;&lt;br /&gt;　　在接受CNET的采访时Adobe掌门人布鲁斯(Bruce Chizen)曾经说过“我不知道微软是否会争夺Adobe 的客户，但它正在进入我们已经进入的领域，我不清楚这是一种直接攻击呢，还是它的业务的一种副产品。通过PDF 和Flash ，与包括微软在内的任何其它公司相比，我们与最终用户有更多的接触。&lt;br /&gt;&lt;br /&gt;　　用于文档交换的标准是PDF ，我认为微软不喜欢PDF 成为标准，Flash 成为动画标准。我认为微软不喜欢人们使用Adobe 的&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;解决方案&lt;/b&gt;创建文本和电子表格之外的信息。&lt;br /&gt;&lt;br /&gt;　　如果你是微软，就会试图取代PDF ，XPS 就是微软为此而进行的一次尝试。微软具有雄厚的财力和庞大的开发人员社区，它在桌面软件领域具有垄断优势，因此我不敢轻视它的一举一动。我们在全速前进，预计微软会紧紧追随我们。&lt;br /&gt;&lt;br /&gt;　　从对Adobe公司掌门人的谈话我们不难发现，微软开始吞食Adobe的市场领域，Adobe公司要想通过Flex重现当年的神话传说，必须闯过微软的关口。&lt;br /&gt;&lt;br /&gt;　　外因是一方面，Flex自身的缺点，也是没有在RIA市场确立主力位置的原因之一，使用ActionScript脚步语言对Java和.NET开发者来说简直是一种灾难，因为他们将丢失原来平台上功能的全面框架，此外，创建离线工作的应用程序对Flex是一个挑战。&lt;br /&gt;&lt;br /&gt;　　尽管Flash运行环境已经被广泛部署，但是它不是通用的，尤其是在移动设备中，并且Flex 2要求Flash 9，不支持早期的版本。&lt;br /&gt;&lt;br /&gt;　　随着下一个版本的Adobe Creative Suite以及一个被称作Apollo的新产品的发布，Flex的一些缺陷将被解决。更新版的Creative Suite将意味着，Flash 集成开发环境像Flex一样支持相同版本的播放器，这将使得开发者可以很轻松的集成Flash电影到Flex项目中。&lt;br /&gt;&lt;br /&gt;　　Apollo将使调整后Flex更适合创建桌面应用程序，适全离线使用，提供对本地系统文件的访问。另外，还将包含一个PDF整合功能。&lt;br /&gt;&lt;br /&gt;　　但是，我预感到，Flex和Apollo将进一步分裂RIA应用程序的市场，能否重现WEB领域的辉煌，还得要未来实践中得到印证。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-9121280294795222050?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/9121280294795222050/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=9121280294795222050' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/9121280294795222050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/9121280294795222050'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/flexjavanet-adobe.html' title='Flex挑战Java和.NET Adobe能否再度崛起？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7054033572337633752</id><published>2007-03-19T21:12:00.000+08:00</published><updated>2007-03-19T21:13:43.543+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Frails诞生，JSF一统WEB天下不再是梦想？</title><content type='html'>&lt;p&gt;长久以来，JSF一直没有成为WEB框架的主流，不仅是遗留系统的原因，JSF原始的标准并没有使得开发简化和&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;清晰&lt;/b&gt;。一直不断有这样或者那样的小问题阻碍着JSF成为绝对主流。&lt;br /&gt;&lt;br /&gt;        事实上，JSF的目标是相当不错的，希望代码人员能和美工分离，并且能够快速的开发。但是其中的一些有待解决的问题，貌似与初衷相违背：烦琐的配置，比较 依赖开发工具，不够灵活等等。直到Frails这个JSF框架的诞生，JSF以往的烦恼都解决了。Frails能帮助你快速的开发JSF，效率可以和 ROR媲美！&lt;br /&gt;&lt;br /&gt;        你可以在Souceforge找到这个项目 &lt;a href="https://sourceforge.net/projects/frails"&gt;https://sourceforge.net/projects/frails&lt;/a&gt; 。中文站为&lt;a href="http://frails.hexiao.cn/"&gt;http://frails.hexiao.cn/&lt;/a&gt; 。 目前Frails的最新版本是1.2，不过马上2.0就要发布了。&lt;br /&gt; &lt;br /&gt;  Frails的特性如下：&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;Frails 让开发者使用约定(习惯)和注解(annotations)来省略在 faces-config.xml 文件中 managed-bean 和 navigation-rule的配置. &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 提供一个更简单的方法来使用 Faces API. &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 重定向非 faces 请求为一个 faces 请求,这样可以避免因为URL输入的疏忽导致的异常. &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 提供一些预定义的 Managed Bean 基类让开发者扩展 . &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 可以让开发者在 Managed Bean 中使用注解(Annotation)来支持AOP功能 ,如 函数拦截(method interception). &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 提供 Managed Bean 属性的injection 和 outjection &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 中的Hibernate GenericDao 对象提供了基本的 CRUD 函数 和 其他一些有用(常用)的数据访问函数. &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 还提供了一些有用的注解(annotations)来简化JSF的开发. &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 完全支持 jsf 1.1 和 jsf 1.2 规范,并且可以自动的探测你使用的版本. &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frails 提供了对action Method 和 Listener 函数的增强,在这些函数中现在你可以传递参数了. &lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;        作为一名Frails的开发人员，我会继续写很多关于Frails的文章。不过先在这里简单的展示一下Frails的几个特性，如果你要详细的察看使用方法，请到 &lt;a href="http://frails.hexiao.cn/user-guide.html"&gt;http://frails.hexiao.cn/user-guide.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;不需要配置faces-config.xml&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       再也不需要在faces-config.xml里一个个的写导航规则，注册ManageBean了。在Frails框架下注册一个ManageBean只 需要在Bean的Class文件前加上@DefMbean这样的Annotation就可以了。而导航会根据一定的导航规则实现。比如导航去 index.jsp就可以直接返回"index"就可以了，当然，还有更灵活的方式。&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;轻松实现GET&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;        URL里加上参数－值对能够轻松的解析出来了，甚至不需要写方法。在一个String属性前加上@Param（name=paramName）后，这个属性就自动获得来自URL里paramName的值。如：&lt;/p&gt; &lt;div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@Param(name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;paraName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;String paVa;&lt;/span&gt;&lt;/div&gt; &lt;p&gt;URL是./xxx.jsp?paraName=Yes 那么paVa的值就是Yes。&lt;br /&gt;       &lt;br /&gt;        而在一个无返回方法前加上@PreRender后，这个方法将回在页面渲染前调用，提前获取一些相关的&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;信息&lt;/b&gt;。如：&lt;/p&gt; &lt;div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@PreRender&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; preRender()&lt;br /&gt;&lt;img id="Codehighlighter1_35_79_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_79_Open_Text.style.display='none'; Codehighlighter1_35_79_Closed_Image.style.display='inline'; Codehighlighter1_35_79_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /&gt;&lt;img id="Codehighlighter1_35_79_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_35_79_Closed_Text.style.display='none'; Codehighlighter1_35_79_Open_Image.style.display='inline'; Codehighlighter1_35_79_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_35_79_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"&gt;&lt;img alt="" src="http://www.blogjava.net/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_35_79_Open_Text"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;do something for rendering the page&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;p&gt;　　当然了，Frails提供了让方法在各个声明周期得到调用的Annotations，不仅仅是预渲染。&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;从烦琐的验证中解脱&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;        Frails使得你能在申明一个属性的时候就能快速简单的加上一些限制条件，成为这个属性的验证器。如下&lt;/p&gt; &lt;div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@Prop&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;    @ValidateNumber(required &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, max &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;33&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, id &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;indexForm:id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, message &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;error.id.invalid&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; id;&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;&lt;/span&gt;&lt;/div&gt; &lt;p&gt;       这样就使得在setID的时候根据需要进行验证，而不必再写validate方法。&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;使用简单、&lt;b onmouseout="javascript:isShowAds = false;isShowAds2 = false;" onmouseover="'isShowAds" isshowads2 =" true;ads.Move(this," style="color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;"&gt;功能&lt;/b&gt;强大的JSFHelper&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;        例如,如果一个对象要放入HttpSession. 使用标准的 Faces API, 代码如下:&lt;/p&gt; &lt;div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  FacesContext.getCurrentInstance().getExternalContext()&lt;br /&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;  .getSessionMap().put(name, val); &lt;/span&gt;&lt;/div&gt; &lt;p&gt;        如果使用 JSFHelper,代码是如此的简单:&lt;/p&gt; &lt;div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"&gt;&lt;img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;JSFHelper.putIntoSession(name, val);&lt;/span&gt;&lt;/div&gt; &lt;p&gt;        当然，JSFHelper还有很多其他的功能。如导航功能，能将页面之间的数据最大化独立开，之间的联系只需要规定有什么属性就可以了。（以后会详细介绍：Frails下网站快速开发模式）&lt;br /&gt;&lt;br /&gt;还有很多特性，帮助你快速开发JSF。当你真正体验过Frails后，你就回发现JSF一统天下的时代的来临！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7054033572337633752?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7054033572337633752/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7054033572337633752' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7054033572337633752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7054033572337633752'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/frailsjsfweb.html' title='Frails诞生，JSF一统WEB天下不再是梦想？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3958152619622603663</id><published>2007-03-18T11:11:00.002+08:00</published><updated>2007-03-18T11:14:25.132+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>IT人离开IT还能干什么？</title><content type='html'>2007年03月13日 18:46:23 中财网&lt;br /&gt;　　今天一位同事（已三十多了），被老板叫到他的办公室去。老总对他说，由于效益不好，公司不再和他续订到期的合同！我看到他很落寞地离去。他前年才结婚，还供着房子，老婆孩子要养，这一下子就失业了，而且又是快过年的时候！我跑去和他道别，他没有说什么，只让我好好干，公司还是大有前途的。&lt;br /&gt;　　他是一个好人，在技术上决不保密。记得三年前我刚进公司的时候，他正是公司的主力，他对我这个应届毕业生十分关照，只要我不懂的，他一定尽力相告。那时公司的老板也很器重他，可能是正当壮年的时候（还有很多剥削价值）。但自去年开始，公司转向了。NET平台，我们都去研发新技术了，原有的PB老版本程序基本上都由一些老程序员来维护（可能老板想他们年龄不小了，学新技术有些障碍）。公司产品的升级工作进展很快，PB版本的程序越来越少了，我们晚上经常加班，而他由于年龄和家庭的缘故，并不经常加班了。我渐渐地从老板对他的态度的变化--从最早的极为欣赏到一般到渐渐地嫌弃。今年公司的效益不太好，也许正是到了鸟尽弓藏、兔死狗烹的时候了？&lt;br /&gt;　　上世纪末那会儿，曾有"做IT，35岁就可以退休"的说法，历经沧海这么多年，35岁退休成了童话， 35岁的职业坎儿却无法让众多IT人回避。有人说，可以转为管理，然而管理的一条线就像窄窄的独木桥，又有多少人可以通过呢（据统计平均大约一百个程序员也就只有一两个做管理的机会）？转向传统行业？已经30多了，能再重新来过吗？绝大多数平凡IT人的出路又在哪儿呢？&lt;br /&gt;　　35岁对于IT人是个坎儿，过了这个年纪基本技术生涯即告终结，这是IT界多数人认可的。所以，也让IT人着实为35岁后的自己生了不少忧虑：IT人离开IT后能干什么？&lt;br /&gt;　　印象中的IT人都因为职业的缘故而木讷寡言。他们与机器沟通的能力显然优于与人沟通的能力。从机器到人，IT人必须跨过来。&lt;br /&gt;　　IT业的技术语言过于狭窄。社会却是复杂的。IT人的知识面不够广泛。社会上不需要人人都懂如何设计程序，但IT人却必须要懂社会。&lt;br /&gt;　　IT内的项目，有些人也有些经验，但这些经验性的东西多数是专业性的，个别种类项目的经验能否转化为普遍的社会经验，也确实需要时间。&lt;br /&gt;　　这些劣势，可以说，凡是地球上的IT人大概都知道。除了IT，要重新换个活法一时还真的玩不转。&lt;br /&gt;　　但IT人毕竟是IT人。IT是高薪行业，IT人从业几年十几年，一般都有了一定的物质基础。这是IT人比其他行业的人具有的优势。&lt;br /&gt;　　有了这样的物质基础，我认为，后IT人的关键是要实现思维方式的转变：从技术性思维到社会性思维，从而开创人生事业的第二高峰。&lt;br /&gt;　　技术性思维是面向机器的、僵硬的、封闭的、单向性的；社会性思维要求是面向常识和社会的、灵活的、开放的、多向综合的。后IT的人士最需要的是这种思维方式的转变。&lt;br /&gt;　　思维一转天地宽。后IT人会发现社会比IT里面其实更精彩。&lt;br /&gt;　　后IT人可以走出来干销售。这个工作富于挑战，而且收入与工作业绩直接挂钩。IT人有很强的技术背景，更擅长发掘产品性能的优缺点，对于IT产品的介绍具有权威性，容易被客户相信。&lt;br /&gt;　　后IT人可以走出程序迷宫来做培训。IT人在运用某一技术语言上相当精深，另外他们在技术研发中的实战经验，对于学员来说也是相当宝贵的教学资源。&lt;br /&gt;　　后IT人也可以由直面数字转为面向众人做咨询。成功的咨询师决不会因为年龄而贬值。有过实际项目经验的IT人，解决实际问题的能力非常强，出身IT的人作为咨询师是其他行业人士无法取代的。还可以做老板，做IT活动策划等等。&lt;br /&gt;　　需要提醒的是，思维方式的转变不是一朝一夕的事。一旦离开IT，IT人所要做的是不断调整自我，保持对社会的参与激情。阅读一些人际沟通技巧之类的书籍是必要的，还可以参加社会活动，给自己洗洗脑，从以数字中心、个人中心的思维方式转换到以人为中心、社会为中心的模式中。要注意多与人沟通。同时，个人应该尽早明确自己的发展方向，并根据新的事业来重新积累，不断升级完善自身的"软硬件"。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-3958152619622603663?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/3958152619622603663/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=3958152619622603663' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3958152619622603663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/3958152619622603663'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/itit.html' title='IT人离开IT还能干什么？'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-6929708355354534268</id><published>2007-03-18T11:11:00.001+08:00</published><updated>2007-03-18T11:11:32.567+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>JSF 进入Java Web世界的跳板</title><content type='html'>初学&lt;a href="http://dev.yesky.com/devjava/" class="bluekey" target="_blank"&gt;Java&lt;/a&gt; Web编程的程序员，现在不必像以前一样，非得从JSP入手了，因为JSF为初学者提供了进入Java Web世界的跳板。JSF站在比其他Java Web框架更高的高度，用统一的眼光看待桌面编程和Web编程，模糊了桌面编程和Web编程的界限，使得具备有限桌面编程经验的程序员，也能够用JSF编 写功能强大的Web应用。 &lt;p&gt;　　&lt;strong&gt;1. 抛开JSP，直接从JSF入手&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　曾几何时，学Java Web编程必从JSP开始，成了Java Web程序员们公认的定律。好比少林寺的武僧，习武之初一定先蹲几年马步一样。在论坛上，我经常看到“过来人”以先知的口吻教导初来乍到的菜鸟，想搞 Java Web编程的话，必须先从JSP入手，然后再研究某某框架云云。两年前，这是正确的，但现在，这样的教条已经过时了。&lt;/p&gt; &lt;p&gt;　　1840年的第一次鸦片战争，当英国人敲开清政府闭关锁国的大门时，据我所知，少林寺的武僧恐怕没有帮上什么忙吧。纵然武艺高强，下盘稳固，可 是在枪炮面前，血肉之躯如何抵挡得了呢?技术在进步，时代不同了，现在，JSP已经不是Java Web的必经之路了，如果你是初学者，别听信那些“过来人”三年前的经验，直接以JSF作为你Java Web的跳板，站在巨人的肩膀上，也许用不了多久，你就能超越曾经教导过你的前辈了。&lt;/p&gt; &lt;p&gt;　　这不是作者信口雌黄，哗众取宠，从JSF入手，是你不甘人后、敢为人先的绝佳机会。你没有必要再为什么JSP费神了。如果说三年前JSF刚刚诞 生时，稚嫩的JSF1.0尚需JSP扶上马送一程、尚需借助JSP的名义和程序员们“混个脸熟”的话，那么，三年后的今天，当JSF已经发展到1.2版本 时，JSP也许到了该退休的时候了。即便JSP生命力顽强，还能撑几年，发挥点余热，也已经不值得你费九牛二虎之力，苦苦追随了。在我看来，JSP更适合 作为一种底层技术，退到幕后，像Servlet一样，默默奉献，把发展的空间让给更能提高程序员生产力的后起之秀。&lt;/p&gt; &lt;p&gt;　　不必担心有人说你眼高手低，好高骛远，JSF是一个新的框架，它并不需要你有深厚的技术底子，你只需知道组件、事件、JavaBean这些基本 概念，就可以放手去干了。玩过网络游戏的人都知道，在游戏中，装备有着举足轻重的作用。同样，作为一个程序员，选择一项领先的编程技术，对于你的生产力也 是至关重要的。&lt;/p&gt; &lt;p&gt;　　从JSP开始学习Java Web编程，就像笨人玩网络游戏，把自己当成一架机器，在网吧里无休止地打怪练级，只有苦劳，没有功劳;聪明的玩家花钱买一个装备，瞬间就把自己送入强手 的行列。JSF就是这样的装备，能够让你马上成为Java Web编程的熟手，而且，JSF还是免费的。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;2. JSF对程序员技能的要求&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　初学Java Web编程的程序员，能否跳过JSP，从JSF直接入手，只要看看JSF对于程序员的技能有什么基本要求就明白了。前文提到过，JSF是一个Java Web用户界面的框架，JSF的设计目标是填平桌面编程和Java Web编程之间的鸿沟，模糊桌面编程和Web编程的界限，让有着桌面编程经验的程序员，能够快速地进入Web编程的领域，并以他们熟悉的方式编写代码，用 他们惯常的思维考虑问题，甚至用完全类似的工具设计界面、调试程序。&lt;/p&gt; &lt;p&gt;　　事实上，经过这么多年的发展，桌面编程不论是在Java下还是在C++下，已经没有什么区别了，所以，只要你有过桌面编程的经历，不管是Java的还是C++的，你都可以借助JSF，立即着手编写功能强大的Java Web程序。&lt;/p&gt; &lt;p&gt;　　所以，有限的桌面编程经验，就是JSF对程序员的要求。概括起来，所谓桌面编程经验，其实就是：第一，理解UI组件的概念，知道如何拖放组件到 界面上，如何设置组件的属性;第二，理解事件和事件驱动，知道如何编写事件例程，对事件作出响应;第三，掌握面向对象的基本知识，以便理解 JavaBean的技术(这其实很简单，只是符合一定规范的Java类而已);第四，熟悉HTTP协议的一些基础知识，为你进入JSF高级编程作好准备。&lt;/p&gt; &lt;p&gt;　　这就是全部。对于一般的Java Web编程，JSF要求具备这些技能就足够了，至于Web应用和桌面应用的不同之处，JSF会为你处理，无需你费心。站在更高的高度，用同样的眼光看待桌面应用和Web应用，是JSF领先于其他Java Web框架的根源所在。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-6929708355354534268?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/6929708355354534268/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=6929708355354534268' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6929708355354534268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/6929708355354534268'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/jsf-java-web.html' title='JSF 进入Java Web世界的跳板'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-8879593905832612032</id><published>2007-03-18T11:07:00.000+08:00</published><updated>2007-03-18T11:10:07.370+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>初学者入门教程：软件测试从零开始</title><content type='html'>本文面向软件测试新手，从测试前的准备工作、测试需求收集、测试用例设计、测试用例执行、测试结果分析几个方面给出建议和方法。鉴于国内的软件开发、测试不规范的现状，本文为软件测试新手提供了若干个软件测试的关注点。 &lt;p&gt;　　【关键词】软件测试、测试用例、测试需求、测试结果分析&lt;/p&gt; &lt;p&gt;　　引言&lt;/p&gt; &lt;p&gt;　　几年前，从学校毕业后，第一份工作就是软件测试。那时候，国内的软件企业大多对软件测试还没有什么概念，书店里除了郑人杰编写的《计算机软件测 试技术》之外，几乎没有其它的软件测试相关书籍，软件测试仅仅在软件工程的教材中作为一个章节列出来，因此，我对软件测试一无所知。不过，在正式走上工作 岗位之前，公司提供了为期两周的系统的软件测试技术专题培训，对接下来的软件测试工作有很大的指导意义。现在，我继续从事软件测试的培训与咨询服务，在这 个过程中，亲眼目睹了很多软件测试新手面对的困惑，他们初涉软件测试行业，没有接受系统的培训，对软件测试一无所知，既不知道该测试什么，也不知道如何开 始测试。下面针对上述情况，给出若干解决办法。&lt;/p&gt; &lt;p&gt;　　测试准备工作&lt;/p&gt; &lt;p&gt;　　在测试工作伊始，软件测试工程师应该搞清楚软件测试工作的目的是什么。如果你把这个问题提给项目经理，他往往会这样回答： “ 发现我们产品里面的所有 BUG ，这就是你的工作目的 ” 。作为一名软件测试新手，如何才能发现所有的 BUG ?如何开始测试工作?即便面对的是一个很小的软件项目，测试需要考虑的问题也是方方面面的，包括硬件环境、操作系统、产品的软件配置环境、产品相关的业务 流程、用户的并发容量等等。该从何处下手呢?&lt;/p&gt; &lt;p&gt;　　向有经验的测试人员学习&lt;/p&gt; &lt;p&gt;　　如果你进入的是一家运作规范的软件公司，有独立的软件测试部门、规范的软件测试流程、软件测试技术有一定的积累，那么，恭喜你!你可以请求测试 经理委派有经验的测试人员作为你工作上的业务导师，由他列出软件测试技术相关书籍目录、软件测试流程相关文档目录、产品业务相关的文档目录，在业务导师的 指导下逐步熟悉软件测试的相关工作。其实，在很多运作规范的软件公司，已经把上述的师父带徒弟的方式固化到流程中。&lt;/p&gt; &lt;p&gt;　　如果你进入的是一个软件测试一片空白的软件企业，那么，也恭喜你!你可以在这里开创一片自己的软件测试事业，当然，前提是老板确实认识到软件测 试的重要性，实实在在需要提高产品的质量。这时候，可以到国内的软件测试论坛和相关网站上寻找软件测试资源，这种情况下，自学能力和对技术的悟性就至关重 要了。&lt;/p&gt; &lt;p&gt;　　阅读软件测试的相关书籍&lt;/p&gt; &lt;p&gt;　　现在，中文版的软件测试书籍越来越多，有的是国人自己写的，有的是翻译国外经典之作。可以到 www.chinapub.com 或者 www.cnforyou.com 等网络购书的站点查找软件测试相关的书籍。目前，从国外引入的软件测试书籍有很多经典之作，但是，翻译成中文后，翻译质量对阅读效果有很大的影响。&lt;/p&gt; &lt;p&gt;　　走读缺陷跟踪库中的问题报告单&lt;/p&gt; &lt;p&gt;　　如果您所在的公司已经有软件缺陷跟踪库了，无论采用的是商用工具，如 ClearQuest 、 TestDirecter 等工具，还是采用的 Bugzilla 、 Mantis 等开源工具，这都无关紧要，缺陷跟踪库中的缺陷报告单才是有价值的。缺陷跟踪库中的问题报告单是软件测试工程师工作绩效的集中体现，同时也是软件产品问题 的集中体现。一般来说，缺陷报告单中最关键的几个部分包括：第一部分是发现缺陷的环境，包括软件环境、硬件环境等;第二部分是缺陷的基本描述;第三部分是 开发人员对缺陷的解决方法。通过对上述缺陷报告单的三个部分作仔细分析，不知不觉你已经吸收了其他软件测试人员的工作经验，并掌握了软件产品常见的基本问 题。这是迅速提高软件测试经验的好方法。&lt;/p&gt; &lt;p&gt;　　走读相关产品的历史测试用例&lt;/p&gt; &lt;p&gt;　　如果你所在的公司有测试用例管理系统，那么，走读相关产品的软件测试用例是迅速提高测试用例设计水平的一条捷径。走读测试用例也是有技巧的。测 试用例写作一般会包括测试用例项和根据测试用例项细化的测试用例，下面举例说明。 “ 测试用户登录的功能 ” 是一个测试项，该测试项的目的是测试用户登录功能是否正确，是否能够完成正常的登录功能，是否能够对非法用户名和密码做异常处理等等。因此，根据该用例 项，可以设计出若干个测试用例，大多数情况下，测试用例项和测试用例是一对多的关系。&lt;/p&gt; &lt;p&gt;　　通过走读测试用例项目，你可以掌握应该从哪些功能点着手未来的测试工作;通过走读软件测试用例，你可以了解如何根据被测试的功能点开展软件测试用例的设计工作，包括如何确定测试用例的输入、测试用例的操作步骤和测试用例的输出结果等。&lt;/p&gt; &lt;p&gt;　　总之，走读其他软件测试人员设计的优秀软件测试用例，是提高自身用例设计水平的好方法。&lt;/p&gt; &lt;p&gt;　　学习产品相关的业务知识&lt;/p&gt; &lt;p&gt;　　软件测试人员不仅要掌握软件测试技术相关知识，对产品相关的业务知识也要学习。这很好理解，如果从事财务软件的测试工作，一定要学习财务知识; 如果从事通讯产品测试工作，那么相关的通讯理论知识也是必须的;如果从事银行软件的测试，银行的业务流程也是不可或缺的知识点。&lt;/p&gt; &lt;p&gt;　　因此，在学习软件测试技术的同时，千万不要忽略产品相关业务知识的学习。如果你是一个软件测试技术专家，但是对产品业务知识一无所知，那么也只能测试出来纯粹的软件缺陷，而面对眼前出现的产品业务相关的缺陷，很可能是视而不见，如此这般，软件测试的效果会大打折扣。&lt;/p&gt; &lt;p&gt;　　识别测试需求&lt;/p&gt; &lt;p&gt;　　识别测试需求是软件测试的第一步。如果开发人员能够提供完整的需求文档和接口文档，那固然好。可以根据需求文档中描述的每个功能项目的输入、处理过程和输出，来设计测试用例。如果开发人员没有提供软件需求文档，那该如何是好?下面给出几个有效的方法：&lt;/p&gt; &lt;p&gt;　　主动获取需求&lt;/p&gt; &lt;p&gt;　　开发人员通常不会更好地考虑软件测试，如果没有开发流程的强制规定，他们通常是不愿意提供任何开发文档，即便有强制规定，需求文档也未必能够真 正指导软件系统测试工作。因此，需要测试人员发挥主观能动性，与相关的软件开发项目经理和软件开发人员保持沟通，了解软件实现的主要功能是什么，并记录得 收集到的信息。一般来说，开发人员即便没有提供相关需求文档，也会保存一些简单的过程文档，主动向开发人员索要这些文档，可以作为测试的参考。此外，可以 与公司的技术支持人员交流，技术支持人员是最贴近用户的人，因此，通过交流可以获取第一手的用户使用感受，在测试的过程中会更加贴近用户。&lt;/p&gt; &lt;p&gt;　　当拿到相关的资料后，从哪些方面分析需求?如何与开发人员交流需求?其实，只要把握需求分析的几个关键的点就可以解决问题：输入、处理过程、输出、性能要求、运行环境，下面针对每一个项目逐一分析：&lt;/p&gt; &lt;p&gt;　　软件输入： 与该需求相关的一切可能输入，可以从这几方面考虑，输入来源、输入参数的数量、输入参数的度量单位、输入参数的时间要求、输入参数的精度和输入参数的有效输入范围。在测试用例设计中，这部分内容作为测试用例输入的依据。&lt;/p&gt; &lt;p&gt;　　处理过程： 描述对输入数据所执行的所有操作和如何获得输出的过程。测试人员了解处理过程即可，在测试过程中发现 BUG 时候，如果对处理过程了解的深入，对定位问题根源有很大的帮助。&lt;/p&gt; &lt;p&gt;　　软件输出： 描述每个需求的输出结果，包括输出的位置(如计算机显示器、&lt;a href="http://oa.yesky.com/" class="bluekey" target="_blank"&gt;打印&lt;/a&gt;机，文件)，输出参数的数量、输出参数的度量单位、输出参数的时序、输出参数精确度、输出参数的有效输出范围、错误消息。在测试用例设计中，这部分内容作为测试用例的预期输出。&lt;/p&gt; &lt;p&gt;　　性能要求： 与该需求相关的性能要求，比如 “ 插入 ATM 取款卡后， 3 秒钟内弹出提示用户取款的图形界面 ” 。 3 秒钟这一限制，就是对需求的基本性能要求。&lt;/p&gt; &lt;p&gt;　　运行环境： 软件的运行所需的环境，包括硬件平台的要求、操作系统的要求、数据库的要求，以及其它相关支撑软件的要求。&lt;/p&gt;&lt;p&gt;确认需求的优先级 &lt;/p&gt;&lt;p&gt;　　确认需求的优先级是很必要的，如果在产品进度比较紧的情况下，测试人员可以考虑优先测试优先级高的需求项，如果进度允许，那么在测试优先级低的 需求项，如果进度不允许，那么就放弃测试优先级低的需求项。如果软件公司有规范的流程支撑，开发人员在提供软件需求文档的时候，应该在文档中确定需求的优 先级。但是，如果开发人员连基本的软件需求文档都没有提供，又怎能指望他们确定软件需求的优先级?如果是这样，需求的优先级只能由测试人员完成了。&lt;/p&gt; &lt;p&gt;　　加入开发小组的邮件群组&lt;/p&gt; &lt;p&gt;　　测试人员需要通晓被测试产品，但是，产品在开发的过程中往往是不断变化的。如果软件开发团队有一套变更控制流程，测试人员会对产品的变更了如指 掌。如果没有变更控制，那就要采用其他的土方法了。如果公司里面有自动化办公系统，也许采用的是 Lotus Notes 系统，也许使用的是 E-mail 系统，测试人员应该加入到开发人员的邮件群组中。当开发人员通过邮件讨论问题、通知召开技术会议的时候，测试人员可以及时知晓，如果必要，可以参加开发人 员的技术会议。即便公司里面有了软件变更控制流程，加入到开发邮件群组也是一个很好的习惯。&lt;/p&gt; &lt;p&gt;　　与开发人员为邻&lt;/p&gt; &lt;p&gt;　　建议测试人员与开发人员为邻。我所在的测试组曾经与开发组是在相邻的写字间里，开发人员与测试人员的关系非常融洽，抛去同事关系，大家还是不错 的朋友。不管开发人员有什么样的活动，测试人员都能第一时间获得信息。无论从事软件测试工作，还是从事其它的工作，与工作中上下游环节的同事保持良好的个 人关系对工作有很大便利。一般的公司内部都存在部门墙，良好的人际关系是打通部门墙的手段之一。向领导建议测试人员与开发人员为邻，这很必要。&lt;/p&gt; &lt;p&gt;　　测试用例设计&lt;/p&gt; &lt;p&gt;　　测试需求收集完毕后，开始测试设计。测试用例是什么?测试用例就是一个文档，描述输入、动作、或者时间和一个期望的结果，其目的是确定应用程序的某个特性是否正常的工作。设计测试用例需要考虑以下问题：&lt;/p&gt; &lt;p&gt;　　测试用例的基本格式&lt;/p&gt; &lt;p&gt;　　软件测试用例的基本要素包括测试用例编号、测试标题、重要级别、测试输入、操作步骤、预期结果，下面逐一介绍。&lt;/p&gt; &lt;p&gt;　　用例编号： 测试用例的编号有一定的规则，比如系统测试用例的编号这样定义规则： PROJECT1-ST-001 ，命名规则是项目名称+测试阶段类型(系统测试阶段)+编号。定义测试用例编号，便于查找测试用例，便于测试用例的跟踪。&lt;/p&gt; &lt;p&gt;　　测试标题： 对测试用例的描述，测试用例标题应该清楚表达测试用例的用途。比如 “ 测试用户登录时输入错误密码时，软件的响应情况 ” 。&lt;/p&gt; &lt;p&gt;　　重要级别： 定义测试用例的优先级别，可以笼统的分为 “ 高 ” 和 “ 低 ” 两个级别。一般来说，如果软件需求的优先级为 “ 高 ” ，那么针对该需求的测试用例优先级也为 “ 高 ” ;反之亦然，&lt;/p&gt; &lt;p&gt;　　测试输入： 提供测试执行中的各种输入条件。根据需求中的输入条件，确定测试用例的输入。测试用例的输入对软件需求当中的输入有很大的依赖性，如果软件需求中没有很好的定义需求的输入，那么测试用例设计中会遇到很大的障碍。&lt;/p&gt; &lt;p&gt;　　操作步骤： 提供测试执行过程的步骤。对于复杂的测试用例，测试用例的输入需要分为几个步骤完成，这部分内容在操作步骤中详细列出。&lt;/p&gt; &lt;p&gt;　　预期结果： 提供测试执行的预期结果，预期结果应该根据软件需求中的输出得出。如果在实际测试过程中，得到的实际测试结果与预期结果不符，那么测试不通过;反之则测试通过。&lt;/p&gt; &lt;p&gt;　　软件测试用例的设计主要从上述 6 个域考虑，结合相应的软件需求文档，在掌握一定测试用例设计方法的基础上，可以设计出比较全面、合理的测试用例。具体的测试用例设计方法可以参见相关的测 试书籍，白盒测试方法和黑盒测试方法在绝大多数的软件测试书籍中都有详细的介绍，这里不作赘述。&lt;/p&gt; &lt;p&gt;　　重用同类型项目的测试用例&lt;/p&gt; &lt;p&gt;　　如果我看得远，那是因为我站在巨人的肩上 --牛顿。&lt;/p&gt; &lt;p&gt;　　一般来说，每个软件公司的项目可以分为固定的几大类。可以按业务类型划分，比如 ERP 软件、产品数据管理软件、通信软件、地理信息系统软件等等;可以按软件结构来划分，比如 B/S 架构的软件、 C/S 架构的软件、嵌入式软件等等。参考同类别软件的测试用例，会有很大的借鉴意义。如果，公司中有同类别的软件系统，千万别忘记把相关的测试用例拿来参考。如 果，系统非常接近，甚至经过对测试用例简单修改就可以应用到当前被测试的软件。 “ 拿来主义 ” 可以极大的开阔测试用例设计思路，也可以节省大量的测试用例设计时间。&lt;/p&gt; &lt;p&gt;　　利用已有的软件 Checklist&lt;/p&gt; &lt;p&gt;　　在上面一个小节中，按照不同的规则划分了不同的软件类型。每种类型的软件都有一定的测试规范，比如， WEB 软件系统在系统测试过程中，会有一系列的范式，比如针对 Cookie 就会有很多测试点。在设计测试用例的时候，不妨到网上去搜索相关的 Checklist ，不过国内外的网站很少有这方面的资料，即便有，也不是特别系统。可以先找一份粗糙的 Checklist ，然后，在设计测试用例的时候不断的去完善它，以作为下次测试用例设计的基础。&lt;/p&gt; &lt;p&gt;　　加强测试用例的评审&lt;/p&gt; &lt;p&gt;　　测试用例设计完毕后，最好能够增加评审过程。同行评审是 CMM3 级的一个 KPA ，如果因为公司没有通过 CMM3 级，就不开展同行评审是不恰当的。测试用例应该由产品相关的软件测试人员和软件开发人员评审，提交评审意见，然后根据评审意见更新测试用例。 如果认真操作这个环节，测试用例中的很多问题都会暴露出来，比如用例设计错误、用例设计遗漏、用例设计冗余、用例设计不充分等等;如果同行评审不充分，那 么，在测试执行的过程中，上述本应在评审阶段发现的测试用例相关问题，会给测试执行带来大麻烦，甚至导致测试执行挂起。&lt;/p&gt;&lt;p&gt;定义测试用例的执行顺序 &lt;/p&gt;&lt;p&gt;　　在测试用例执行过程中，你会发现每个测试用例都对测试环境有特殊的要求，或者对测试环境有特殊的影响。因此，定义测试用例的执行顺序，对测试的 执行效率影响非常大。比如某些异常测试用例会导致服务器频繁重新启动，服务器的每次重新启动都会消耗大量的时间，导致这部分测试用例执行也消耗很多的时 间。那么在编排测试用例执行顺序的时候，应该考虑把这部分测试用例放在最后执行，如果在测试进度很紧张的情况下，如果优先执行这部分消耗时间的异常测试用 例，那么在测试执行时间过了大半的时候，测试用例执行的进度依然是缓慢的，这会影响到测试人员的心情，进而导致匆忙地测试后面的测试用例，这样测试用例的 漏测、误测就不可避免，严重影响了软件测试效果和进度。因而，合理地定义测试用例的执行顺序是很有必要的。&lt;/p&gt; &lt;p&gt;　　测试用例执行&lt;/p&gt; &lt;p&gt;　　测试用例设计完毕后，接下来的工作是测试执行，测试执行中应该注意以下几个问题：&lt;/p&gt; &lt;p&gt;　　搭建软件测试环境，执行测试用例&lt;/p&gt; &lt;p&gt;　　测试用例执行过程中，搭建测试环境是第一步。一般来说，软件产品提交测试后，开发人员应该提交一份产品安装指导书，在指导书中详细指明软件产品 运行的软硬件环境，比如要求操作系统系统是 Windows 2000 pack4 版本，数据库是 Sql Server 2000 等等，此外，应该给出被测试软件产品的详细安装指导书，包括安装的操作步骤、相关配置文件的配置方法等等。对于复杂的软件产品，尤其是软件项目，如果没有 安装指导书作为参考，在搭建测试环境过程中会遇到种种问题。&lt;/p&gt; &lt;p&gt;　　如果开发人员拒绝提供相关的安装指导书，搭建测试中遇到问题的时候，测试人员可以要求开发人员协助，这时候，一定要把开发人员解决问题的方法记录下来，避免同样的问题再次请教开发人员，这样会招致开发人员的反感，也降低了开发人员对测试人员的认可程度。&lt;/p&gt; &lt;p&gt;　　测试执行过程应注意的问题&lt;/p&gt; &lt;p&gt;　　测试环境搭建之后，根据定义的测试用例执行顺序，逐个执行测试用例。在测试执行中需要注意以下几个问题：&lt;/p&gt; &lt;p&gt;　　全方位的观察测试用例执行结果： 测试执行过程中，当测试的实际输出结果与测试用例中的预期输出结果一致的时候，是否可以认为测试用例执行成功了?答案是否定的，即便实际测试结果与测试的 预期结果一致，也要查看软件产品的操作日志、系统运行日志和系统资源使用情况，来判断测试用例是否执行成功了。全方位观察软件产品的输出可以发现很多隐蔽 的问题。以前，我在测试嵌入式系统软件的时候，执行某测试用例后，测试用例的实际输出与预期输出完全一致，不过在查询 CPU 占用率地时候，发现 CPU 占用率高达 90 %，后来经过分析，软件运行的时候启动了若干个 1ms 的定时器，大量的消耗的 CPU 资源，后来通过把定时器调整到 10ms ， CPU 的占用率降为 7 %。如果观察点单一，这个严重消耗资源的问题就无从发现了。&lt;/p&gt; &lt;p&gt;　　加强测试过程记录： 测试执行过程中，一定要加强测试过程记录。如果测试执行步骤与测试用例中描述的有差异，一定要记录下来，作为日后更新测试用例的依据;如果软件产品提供了 日志功能，比如有软件运行日志、用户操作日志，一定在每个测试用例执行后记录相关的日志文件，作为测试过程记录，一旦日后发现问题，开发人员可以通过这些 测试记录方便的定位问题。而不用测试人员重新搭建测试环境，为开发人员重现问题。&lt;/p&gt; &lt;p&gt;　　及时确认发现的问题： 测试执行过程中，如果确认发现了软件的缺陷，那么可以毫不犹豫的提交问题报告单。如果发现了可疑问题，又无法定位是否为软件缺陷，那么一定要保留现场，然 后知会相关开发人员到现场定位问题。如果开发人员在短时间内可以确认是否为软件缺陷，测试人员给予配合;如果开发人员定位问题需要花费很长的时间，测试人 员千万不要因此耽误自己宝贵的测试执行时间，可以让开发人员记录重新问题的测试环境配置，然后，回到自己的开发环境上重现问题，继续定位问题。&lt;/p&gt; &lt;p&gt;　　与开发人员良好的沟通： 测试执行过程中，当你提交了问题报告单，可能被开发人员无情驳回，拒绝修改。这时候，只能对开发人员晓之以理，做到有理、有据，有说服力。首先，要定义软 件缺陷的标准原则，这个原则应该是开发人员和测试人员都认可的，如果没有共同认可的原则，那么开发人员与测试人员对问题的争执就不可避免了。此外，测试人 员打算说服开发人员之前，考虑是否能够先说服自己，在保证可以说服自己的前提下，再开始与开发人员交流。&lt;/p&gt; &lt;p&gt;　　及时更新测试用例&lt;/p&gt; &lt;p&gt;　　测试执行过程中，应该注意及时更新测试用例。往往在测试执行过程中，才发现遗漏了一些测试用例，这时候应该及时的补充;往往也会发现有些测试用 例在具体的执行过程中根本无法操作，这时候应该删除这部分用例;也会发现若干个冗余的测试用例完全可以由某一个测试用例替代，那么删除冗余的测试用例。&lt;/p&gt; &lt;p&gt;　　总之，测试执行的过程中及时地更新测试用例是很好的习惯。不要打算在测试执行结束后，统一更新测试用例，如果这样，往往会遗漏很多本应该更新的测试用例。&lt;/p&gt; &lt;p&gt;　　提交一份优秀的问题报告单&lt;/p&gt; &lt;p&gt;　　软件测试提交的问题报告单和测试日报一样，都是软件测试人员的工作输出，是测试人员绩效的集中体现。因此，提交一份优秀的问题报告单是很重要 的。软件测试报告单最关键的域就是 “ 问题描述 ” ，这是开发人员重现问题，定位问题的依据。问题描述应该包括以下几部分内容：软件配置、硬件配置、测试用例输入、操作步骤、输出、当时输出设备的相关输出 信息和相关的日志等。&lt;/p&gt; &lt;p&gt;　　软件配置： 包括操作系统类型版本和补丁版本、当前被测试软件的版本和补丁版本、相关支撑软件，比如数据库软件的版本和补丁版本等。&lt;/p&gt; &lt;p&gt;　　硬件配置： 计算机的配置情况，主要包括 CPU 、内存和硬盘的相关参数，其它硬件参数根据测试用例的实际情况添加。如果测试中使用网络，那么网络的组网情况，网络的容量、流量等情况。硬件配置情况与被 测试产品类型密切相关，需要根据当时的情况，准确翔实的记录硬件配置情况。&lt;/p&gt; &lt;p&gt;　　测试用例输入 \ 操作步骤 \ 输出： 这部分内容可以根据测试用例的描述和测试用例的实际执行情况如实填写。&lt;/p&gt; &lt;p&gt;　　输出设备的相关输出信息： 输出设备包括计算机显示器、打印机、磁带等等输出设备，如果是显示器可以采用抓屏的方式获取当时的截图，其他的输出设备可以采用其它方法获取相关的输出，在问题报告单中提供描述。&lt;/p&gt; &lt;p&gt;　　日志信息： 规范的软件产品都会提供软件的运行日志和用户、管理员的操作日志，测试人员应该把测试用例执行后的软件产品运行日志和操作日志作为附件，提交到问题报告单中。&lt;/p&gt; &lt;p&gt;　　根据被测试软件产品的不同，需要在 “ 问题描述 ” 中增加相应的描述内容，这需要具体问题具体分析。&lt;/p&gt; &lt;p&gt;　　测试结果分析&lt;/p&gt; &lt;p&gt;　　软件测试执行结束后，测试活动还没有结束。测试结果分析是必不可少的重要环节， “ 编筐编篓，全在收口 ” ，测试结果的分析对下一轮测试工作的开展有很大的借鉴意义。前面的 “ 测试准备工作 ” 中，建议测试人员走读缺陷跟踪库，查阅其他测试人员发现的软件缺陷。测试结束后，也应该分析自己发现的软件缺陷，对发现的缺陷分类，你会发现自己提交的问 题只有固定的几个类别;然后，再把一起完成测试执行工作的其他测试人员发现的问题也汇总起来，你会发现，你所提交问题的类别与他们有差异。这很正常，人的 思维是有局限性，在测试的过程中，每个测试人员都有自己思考问题的盲区和测试执行的盲区，有效的自我分析和分析其他测试人员，你会发现自己的盲区，有针对 性的分析盲区，必定会在下一轮测试用避免盲区。&lt;/p&gt; &lt;p&gt;　　总结：&lt;/p&gt; &lt;p&gt;　　限于文章的篇幅，本文不可能给出一个类似于 checklist 的指导性的软件测试新手入门。无论从事软件测试还是从事其它的工作，技术上的和技巧上的问题都可以通过查询相关的软件测试技术书籍获取，掌握一套基本的方 法论是最重要的。以上文字，都是专家从事软件测试工作积累的经验之谈，初学者可以从中学习些经验，掌握软件测试基本知识和需要注意的问题.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-8879593905832612032?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/8879593905832612032/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=8879593905832612032' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/8879593905832612032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/8879593905832612032'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/blog-post_18.html' title='初学者入门教程：软件测试从零开始'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-7316032970896453897</id><published>2007-03-17T21:10:00.000+08:00</published><updated>2007-03-17T21:11:53.980+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>把你的Google Talk贴到各种网页里去</title><content type='html'>Google Talk近日推出了一项新服务Google Talk Gadget（不知道中文名会不会译为Google Talk小玩意儿）。利用这个服务，你可以把Google Talk贴到任意您可以编辑内容的网页，比如博客、个人网站、个性主页等里面，实现真正的Google Talk在线聊天。 &lt;p&gt;　　所谓“真正”，是因为之前Google已经在Gmail里加入了chat功能，可以直接在Gmail邮箱里与Google Talk上的好友聊天（&lt;b&gt;相关专题&lt;/b&gt;：&lt;a href="http://soft.yesky.com/lianluo/328/2320828.shtml"&gt;体验Google Talk与Gmail整合应用&lt;/a&gt;）。&lt;/p&gt; &lt;p&gt;　　各大即时通讯软件先后推出了在线版，他们运作的諓各有不同。QQ、MSN、雅虎通、POPO等属于一类，它们配有一个固定的网址，用浏览器打开 后，就可以登录聊天。另外一类采用嵌入代码的方式，支持在任何网页上运行，只需把一些固定的代码加到网页里，就能与好友聊天，这类的代表主要有 gabbly、imhaha等。Google Talk新推出的这项服务显然是属于后者。&lt;/p&gt; &lt;p&gt;　　不多说了，下面请随小编来了解如何把你的Google Talk嵌到网页里去。先来看看使用了Google Talk Gadget后的在线版Google Talk：&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/mb892bxu9560.jpg" height="487" width="364" /&gt;&lt;/p&gt; &lt;p&gt;　　上图是在小编在Google个性化主页里放置Google Talk Gadget后的效果。从Google网站开通这项服务后，Google会自动把相应代码加到你的Google个性主页中。开通地址：&lt;a href="http://www.google.com/ig/add?moduleurl=googletalk.xml"&gt;http://www.google.com/ig/add?moduleurl=googletalk.xml&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/2689893055u2.jpg" height="492" width="355" /&gt;&lt;/p&gt; &lt;p&gt;　　这是Google Talk在线版的聊天窗口。可以清楚地看到，与单机Google Talk一样，具有语音聊天、Gmail邮箱入口等常用功能。&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/q239y28nj1i2.jpg" height="492" width="346" /&gt;&lt;/p&gt; &lt;p&gt;　　点击Add，可以添加好友。&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/492qk3sf2blg.jpg" height="492" width="349" /&gt;&lt;/p&gt; &lt;p&gt;　　这是新添加的好友。&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/rua746oh1127.jpg" height="500" width="363" /&gt;&lt;/p&gt; &lt;p&gt;　　小编平时不用Google Talk，上面的好友比较少，哈哈。&lt;/p&gt;&lt;p&gt;在使用Google Talk Gadget之前，您必须安装最新的Adobe Flash控件。没有没关系，Google Talk Gadget会提示您安装，只需按提示的步骤操作就行了。 &lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/3j8101i8e26p.jpg" height="489" width="352" /&gt;&lt;/p&gt; &lt;p&gt;　　在Google Talk区域点击右键，可以看到它带有Flash的相关提示。点击“设置...”，可以对Google Talk进行简单配置。&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/jz2e70fkq1vy.jpg" height="490" width="355" /&gt;&lt;/p&gt; &lt;p&gt;　　如图，您可以对麦克风、语机、存储等项目进行设置。从软件设计来看，Google预留了关于视频设置的部分，可能打算让用户在这里也能使用视频聊天功能。&lt;/p&gt; &lt;p&gt;　　下面我们看如何获得相应的代码，把Google Talk加到你想加的网页里。&lt;/p&gt; &lt;p&gt;　　&lt;a href="http://gmodules.com/ig/creator?synd=open&amp;url=http%3A//www.google.com/ig/modules/googletalk.xml&amp;amp;pt=&amp;context=b&amp;amp;synd=open&amp;lang=en&amp;amp;.lang=en&amp;country=us&amp;amp;.country=us&amp;cat=all&amp;amp;num=24&amp;start=0&amp;amp;cols=4&amp;objs=w,mO,jyq,gQq,jhP,NL,Hg,pV,RB,p,33G,EKT,6aZ,7Wu,aag,2C,vB,sMg,j0,xQO,5WIK,Rm,gP1,acyU&amp;amp;sn=2C&amp;lang=en"&gt;&lt;span style="color:red;"&gt;&lt;b&gt;点这里&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;打开获取代码的页面。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://soft.yesky.com/syscore/483/474483d_7.shtml" target="_blank"&gt;&lt;img style="border-color: rgb(0, 0, 0);" alt="点击放大此图片" src="http://soft.yesky.com/imagelist/2007/075/09fd9p6hvah7s.jpg" border="1" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　　可以在这里对将要显示到网页上的Google Talk作一些配置，如大小、显示名称、边框颜色等。如图，小设置的大小是200x200，再加上个醒目的红色边框。&lt;/p&gt; &lt;p&gt;　　配置完成后，点击"Get the Code"，即可生成一串代码，把它拷到你编辑的网页里适当位置即可。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://soft.yesky.com/syscore/483/474483d_8.shtml" target="_blank"&gt;&lt;img style="border-color: rgb(0, 0, 0);" alt="点击放大此图片" src="http://soft.yesky.com/imagelist/2007/075/hb747d958k25s.jpg" border="1" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　　下图是小编在一个html文件里加上这段代码后本地浏览的效果。&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://soft.yesky.com/imagelist/2007/075/nrtu32g012wl.jpg" height="349" width="384" /&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;span style="color:#ff0033;"&gt;　　问题与总结：&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;　　经过简单试用，我们发现Google Talk Gadget有几个问题：一、只支持英文；二、无法发送消息（一个巨大的Bug，没有任何消息发送按钮，试了很多快捷键也不起作用，始终没法把消息送出 去，倒是好友在输入的时候，会看到提示说对方正在输入消息，输入完成后也会有相应提示）；三、最终显示效果有乱码（见上图）。&lt;/p&gt; &lt;p&gt;　　Google这次似乎发力不够猛，做的东西不怎么好用。除了和Flash拉上关系，其它功能真的比不上gabbly之类。革命远未成功，Google还需努力啊！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-7316032970896453897?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/7316032970896453897/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=7316032970896453897' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7316032970896453897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/7316032970896453897'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google-talk.html' title='把你的Google Talk贴到各种网页里去'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2701298793016462904</id><published>2007-03-16T13:17:00.000+08:00</published><updated>2007-03-16T13:18:11.097+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>增加网站流量方法之ASP.NET弹出窗口技术</title><content type='html'>作为Microsoft的最新建立动态Web网站的工具,ASP.NET相对于ASP和JSP在改变原始的Web编程方式方面有了长足的长进。它的 代码与页面分离技术(CodeBehind)以及完善的Web服务器控件为程序员提供了一个更加符合传统编程的Web服务器端开发方式。但Web编程还是 有着与传统编程不相同的特点,这些特点决定了ASP.NET编程中必须以一些特殊的技巧来完成程序要求,弹出窗口正是这类编程方式的代表。相当多的编程书 籍对弹出窗口采取缄默或者一语带过,似乎看不过弹出窗口的巨大使用天地。本文将为你解开弹出窗口使用中的大多数问题。 &lt;p&gt;　　为了提高网站的访问的并发度和吞吐量,与其它服务器脚本一样,ASP.NET同样使用了客户端脚本来减轻服务器的压力。ASP.NET到现在(1.1版)为止并不直接支持弹出窗口,必须通过JavaScript(或VBScript)来使用客户端弹出窗口。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;一、 警告窗口与在CodeBehind中使用客户端脚本的方式&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　要在浏览器中弹出一个最简单的警告窗口,可以使用JavaScript语句：&lt;/p&gt; &lt;p&gt;　　window.alert( [sMessage])&lt;/p&gt; &lt;p&gt;　　其中,sMessage是提示信息。可惜,这样的弹出窗口是只有一个“确定”按钮,只能起到提示作用。如果我们要在删除记录时候弹出一个询问的弹出窗口,此时你需要使用：&lt;/p&gt; &lt;p&gt;　　bConfirmed = window.confirm( [sMessage])&lt;/p&gt; &lt;p&gt;　　其中：bConfirmed是返回值,sMessage是提示信息。这个弹出窗口有两种选择：“确定”或“放弃”,其选择的返回值放在bConfirmed中,可供代码作出判断。&lt;/p&gt; &lt;p&gt;　　为了提高代码的可重用性与可读性,应当使JavaScript与Codehind相互溶合。通常有两种方式可以达到这样的效果。&lt;/p&gt; &lt;p&gt;　　(1) 使用Response.Write方法：&lt;/p&gt; &lt;p&gt;　　使用Response.Write方法早在ASP时代就已经被支持了。它可以把代码写到客户端,是一种相当方便且直观的方法。以下代码演示了如何使用Response.Write方法来显示一个警告信息。&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=";color:#f3f3f3;" bg&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;以下是引用片段：&lt;/span&gt;&lt;br /&gt;　　Private Sub btalert_Click(ByVal sender As System.object, ByVal e As System.EventArgs) Handles btalert.Click&lt;br /&gt;　　’演示Response.Write方法和alert窗口。&lt;br /&gt;　　Response.Write(" ")&lt;br /&gt;　　End Sub&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　(2) 使用RegisterXXX方法&lt;/p&gt; &lt;p&gt;　　如果你观察Response.Write的生成HTML代码,你会发现Response.Write方法生成的代码是写到了HTML代码的最开 始,即标签之前。此时,所有的 HTML对象都还没有生成,如果要想使用HTML内的对象,并与之交互,就会出现“找不到对象”的错误。因此,笔者推荐一个更加符合CodeBehind 方式的方式----使用RegisterXXX方法。RegisterXXX包括：RegisterClientScriptBlock、 RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数。&lt;/p&gt; &lt;p&gt;　　RegisterStartupScript 的原型是：&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=";color:#f3f3f3;" bg&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;以下是引用片段：&lt;/span&gt;&lt;br /&gt;　　Overridable Public Sub RegisterStartupScript( _&lt;br /&gt;　　ByVal key As String, _&lt;br /&gt;　　ByVal script As String _&lt;br /&gt;　　)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　其中：key表示这个脚本的唯一标识,script是代表脚本的字符串。&lt;/p&gt; &lt;p&gt;　　RegisterClientScriptBlock的原型与RegisterStartupScript相同,两个函数不同在于将其包含的脚 本代码写入到HTML文件的不同位置。RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(doucument对象)进行交互的语句(这在我们后面的例子中看到),则推荐使用 RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行,则可以使用RegisterClientScriptBlock或 Response.Write。&lt;/p&gt; &lt;p&gt;　　为了防止在页面中反复加入脚本,在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作为注册的Key,然后在程序中可以使用IsClientScriptBlockRegistered作判断。&lt;/p&gt; &lt;p&gt;　　以下例子将使用RegisterClientScriptBlock来演示confirm的使用方法。&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=";color:#f3f3f3;" bg&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;以下是引用片段：&lt;/span&gt;&lt;br /&gt;　　Private Sub btConfirm_Click(ByVal sender As System.object, ByVal e As System.EventArgs) Handles btConfirm.Click&lt;br /&gt;　　’演示RegisterClientScriptBlock方法和confirm窗口&lt;br /&gt;　　If (Not IsClientScriptBlockRegistered("clientScript")) Then&lt;br /&gt;　　‘判断是否已经加入了该脚本,没有则加入。&lt;br /&gt;　　Dim strScript As String&lt;br /&gt;　　strScript = " "&lt;br /&gt;　　‘注册脚本&lt;br /&gt;　　RegisterClientScriptBlock("clientScript", strScript)&lt;br /&gt;　　‘如果选择”否”,则继续向下执行。&lt;br /&gt;　　End If&lt;br /&gt;　　End Sub&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　&lt;strong&gt;二、 弹出指定页面&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;　　光有提示窗口还远远不能满足我们的要求,在程序中,我们常常需要弹出指定页面。此时可以使用JavaScript的window.open方法。配合前面的RegisterClientSciptBlock方法,我们就可以实现指定页面的弹出。&lt;/p&gt; &lt;p&gt;　　以下代码展示了如何弹出指定页面:&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;table style="border: 1px dotted rgb(204, 204, 204); table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=";color:#f3f3f3;" bg&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;以下是引用片段：&lt;/span&gt;&lt;br /&gt;　　Private Sub btWinOpen_Click(ByVal sender As System.object, ByVal e As System.EventArgs) Handles btWinOpen.Click&lt;br /&gt;　　’使用window.open与registerStartupScript简单演示。&lt;br /&gt;　　If (Not IsClientScriptBlockRegistered("OpenScript")) Then&lt;br /&gt;　　’判断是否已经加入了该脚本,没有则加入。&lt;br /&gt;　　Dim strScript As String = " "&lt;br /&gt;　　RegisterStartupScript("OpenScript", strScript)&lt;br /&gt;　　End If&lt;br /&gt;　　End Sub&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;　　程序使用Window.open方法来弹出新的页面,它只一个参数：新的弹出窗口的URL地址。事实在window.open方法有多个参数,但这是javascipt的简单内容,我们将不会在这儿详细分说。如果你有相关的问题,请查询MSDN。&lt;/p&gt; &lt;p&gt;　　这段程序在IE中直接使用一切正常。但如果你正在使用类如GoSurf、MyIE2、NetCapter之类的浏览器,那么,很不幸! 你将看不到弹出窗口。这就是我们将要讨论的弹出窗口过滤问题。&lt;/p&gt; &lt;p&gt;　　&lt;strong&gt;三、 非标准IE浏览器对弹出窗口的过滤行为讨论&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;　　广告窗口的泛滥使得不少网民不堪铺天盖地的广告骚扰纷纷放弃标准IE浏览器而使用诸如GoSurf、MyIE2、NetCapter这样的使用 IE内核支持多页面并能自动屏蔽广告的软件。据说在即将发布的IE6 sp2中微软也将加入封杀广告窗口功能。这对大多数网民当然是件好事,可对于程序员而言,我们使用弹出窗口的方式与一般广告并无本质的不同,这样的窗口也 会被弹出窗口管理器不分青红皂白的封杀,其结果当然是我们不愿看到的。有没有一个标准的方式能让窗口正常的弹出呢?这就要求我们了解浏览器封杀广告的原 理。通常的广告封杀器使用以下三种方式进行广告过滤：&lt;/p&gt; &lt;p&gt;　　(1)、基于窗口标题的封杀方式&lt;/p&gt; &lt;p&gt;　　这种封杀方式的原理是定时检查所有的IE窗口标题,然后于已经有的列表(由程序维护的一个数组列表)来比较,如果有相同的,我们就关闭这个窗 口。显然,这种方式有着诸多缺陷,它封杀了所有的弹出的窗口,管得太死,在程序真正使用的很少。不过,依据它进行的变形方式倒使用得相当的普遍。那就是, 基于窗口标题名称的智能过滤技术,它根据弹出窗口的标题是否含有关于广告的关键字进行封杀,这为提高过滤效果作出了很好的探索。&lt;/p&gt; &lt;p&gt;　　(2)、基于窗口类和位置的封杀方式&lt;/p&gt; &lt;p&gt;　　经过分析发现正常浏览窗口的类名是IEFRAME和CabinetWClass,而广告窗口的类名是CabinetWClass。进一步分析发 现：广告窗口的WorkerA类和Shell Docobject View类的rect.top的值是相同的,正常IE窗口的WorkerA类和Shell Docobject View类的rect.top的值是不相同的。根据以上两点就可以书写广告杀手程序了。 事实上,我对此程序的通用性持怀疑态度。因为笔者用Spy++分析发现,在Windows2000( 笔者使用的XX 作系统)中,IE窗口的类都为IEFrame。同时,由于Win2000是一个基于Unicode代码的XX 作系统,所以没有WorkerA类,而以WorkerW类取而代之。同时,也不存在rect.top不相同的情况,由于笔者没有WindowsXPXX 作系统,所以不能针对WindowsXP作进一步的试验。&lt;/p&gt; &lt;p&gt;　　(3)、基于IE COM组件的封杀方式&lt;/p&gt; &lt;p&gt;　　以上两种方式都是把IE窗口当作一个普通的Windows窗口对待,进行判断的。事实上,IE是一个典型的基于COM组件的浏览器,所有的基于 IE内核的浏览器都是包装shdocvw.dll文件,然后书写相应的BHO代码。只有这样才能做到真正的控制IE浏览器,而不是方法一、二这样的隔靴搔 痒。&lt;/p&gt; &lt;p&gt;　　还有一种基于IE内核的弹出窗口封杀方法。它可以在弹出窗口打开之前加以拦截。其原理是：每当IE打开一个新的窗口时候都会触发 NewWindow事件,执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)方法。重载此方法,判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。如果是,说明是正常的弹出窗口,反之加以拦截。&lt;/p&gt; &lt;p&gt;　　由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2701298793016462904?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2701298793016462904/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2701298793016462904' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2701298793016462904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2701298793016462904'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/aspnet.html' title='增加网站流量方法之ASP.NET弹出窗口技术'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-2224643313702578541</id><published>2007-03-16T13:15:00.000+08:00</published><updated>2007-03-16T13:16:38.796+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>DirectX 10游戏编程困难</title><content type='html'>&lt;p&gt;目前看来DirectX 10编程并非向微软描述的那样容易。尽管微软承诺DirectX 10带来Shader Model 4.0（着色模式4.0）、统一着色架构等先进功能和技术，但是现在看起来，所有的DirectX10游戏都遭遇到严重的延期。&lt;/p&gt; &lt;p&gt;Crytek研发的DirectX 10 3D游戏《Crysis》现在延期到今年第3季度，去年年底外界期待《Crysis》作为Windows Vista首发DirectX 10游戏登场。另外，《地狱：伦敦之门》也被延期到今年年中。即便是微软自己，也无法迅速拿出DirectX 10版本的《飞行模拟X》。&lt;/p&gt; &lt;p&gt;所有的DirectX 10游戏都有1个共性，那就是编程非常困难，困难程度超越开发者之前的预。&lt;/p&gt; &lt;p&gt;在没有DirectX 10游戏很快上市的情况下，玩家近期可以期待的游戏只有支持DirectX 9的《切尔诺贝利风云》。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-2224643313702578541?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/2224643313702578541/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=2224643313702578541' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2224643313702578541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/2224643313702578541'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/directx-10.html' title='DirectX 10游戏编程困难'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-1745696343345113474</id><published>2007-03-16T13:14:00.000+08:00</published><updated>2007-03-16T13:15:10.385+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>J2EE应用性能问题的常用优化项目</title><content type='html'>性能问题的最明显表现是网页的响应时间变慢。在J2EE系统中，经常体现有下面更为基本的症状：&lt;div class="postText"&gt;&lt;li&gt;应用服务器资源的使用情况 &lt;/li&gt;&lt;li&gt;JVM堆的使用情况 &lt;/li&gt;&lt;li&gt;系统资源的使用情况 &lt;/li&gt;&lt;li&gt;数据库资源的使用情况 &lt;/li&gt;&lt;li&gt;网络活动&lt;p&gt;        这些现象表明J2EE应用依赖很多外部资源，并且是运行在一个层次化的执行模式的环境中：&lt;/p&gt;&lt;img src="http://www.innovatedigital.com/publicimg/sp6-1.gif" alt="" height="199" width="188" /&gt;&lt;br /&gt;&lt;p&gt;        由于Java虚拟机和应用服务器掩盖了操作系统和硬件的特性，所以在设计软件系统时，架构工程师更应该深刻理解整个操作环境。 &lt;/p&gt;&lt;p&gt;        在设计软件系统时，架构工程师应把性能和可扩展性放在首位，然后开始寻找容易解决的问题，反应时间缓慢通常的原因是访问数据库效率低和过多地调用远程对象和方法。接下来，架构工程师可继续寻找不明显的原因，例如算法的累积影响和不必要的开销。&lt;/p&gt;&lt;p&gt;        现在市场上的各个J2EE应用服务器有很多配置项目。这里只简单介绍一些常见的性能优化配置项目。&lt;/p&gt;&lt;p&gt;        很多应用服务器都有一些与J2EE规范有关的操作系统配置项目或非标准的特性，这可以提高系统性能。应该化时间来理解这些性能配置。&lt;/p&gt;&lt;h3&gt;Java虚拟机堆和垃圾回收设置&lt;/h3&gt;&lt;p&gt;        任何Java应用的性能调整基础都涉及到堆的大小和垃圾回收设置。（这里主要讨论Sun HotSpor JVM）.&lt;/p&gt;&lt;p&gt;        堆可分为三代，年轻的（新的），年老的和持久的。Hotspot JVM的内存基本配置包括最大堆大小，初始堆大小和年轻一代堆的大小。当配置最大堆大小时可参考下面一些指导：&lt;/p&gt;&lt;/li&gt;&lt;li&gt;最大大小应小于物理内存，避免虚存的页面调度。 &lt;/li&gt;&lt;li&gt;需要减去其他进程使用的内存 &lt;/li&gt;&lt;li&gt;在负载测试时进行优化&lt;p&gt;        注意不要将最大堆大小设置得过大。堆越大，内存中保存的对象越多。内存中对象越多，回收过程时间越长。&lt;/p&gt;&lt;p&gt;        配置初试堆大小的一般性策略包括： &lt;/p&gt;&lt;h3&gt; &lt;/h3&gt;&lt;p&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;将初始大小设置为最大堆大小 &lt;/li&gt;&lt;li&gt;将初始大小设置为最大堆大小的1/4到1/2&lt;p&gt;        对于年轻一代堆大小，Sun 推荐是设置为最大堆大小的1/3。&lt;/p&gt;&lt;p&gt;        也可以选择不同的垃圾回收算法。首先是增量垃圾回收。该算法的意思是减少单个对象回收停顿时间，这样的结果是整体回收性能的下降。该算法将相互引用的对象分组，然后尝试按组回收。尝试回收的部分越小，回收处理的时间往往会越少。&lt;/p&gt;&lt;p&gt;        1.4.1版的HotSpot JVM增加了两个垃圾回收算法：并行算法和并发算法。&lt;/p&gt;&lt;p&gt;        在年轻一代堆中实现了并行算法。在多处理器的机器上，这种回收算法使用了多线程来提高性能。虽然这个算法会暂停所有的应用线程，但是由于利用了多个CPU使得回收时间非常快。在年轻一代堆中，该算法显著地减少了回收带来的停顿。&lt;/p&gt;&lt;p&gt;         在年老一代堆中实现了并发算法。在应用中最大限度地执行并发。回收过程分为4个阶段，覆盖了可回收对象的标记和清除操作。前两个过程会暂停应用线程，后两 阶段可与应用并发执行。并发垃圾回收算法的"最大限度并发"特点可以使JVM利用更大的堆和多个CPU。因此应关注由于采用缺省的mark- compact(标记-压缩)和stop-the-world（停顿所有处理）等垃圾回收算法所带来的延迟和吞吐量问题。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h3&gt;处理线程&lt;/h3&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;        J2EE应用服务器是多线程的应用。应用服务器的线程是一种资源池，处理请求和和应用服务器的内部功能等任务共享这些资源。&lt;/p&gt;&lt;p&gt;        很多应用服务器允许为特定的任务或应用配置不同大小的线程池。通常需要增加这些线程池的大小以满足应用负载的需要。&lt;/p&gt;&lt;p&gt;        架构工程师应该避免将线程池大小设置过大，这是因为会增加上下文交换的次数，从而降低应用的性能。线程池的大小通常应该能最大利用机器上的CPU，同时又不能使CPU过载。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h3&gt;EJB配置项目&lt;/h3&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;         在应用服务器中，很多不同类型的EJB是以资源池的方式实现的。通常这些池大小和初始Bean的数量会明显影响应用的性能。&lt;/p&gt;&lt;p&gt;        架构工程师应该避免将这些池大小设置的过大，这样会导致不必要地消耗JVM和操作系统内存。另外，将初始Bean数量设置过高会使得应用服务器的启动时间长的难以接受。&lt;/p&gt;&lt;p&gt;        在应用服务器中，缓存很多不同类型的EJB。缓存大小和超时设置通常也会对应用性能带来显著影响。&lt;/p&gt;&lt;p&gt;         架构工程师应该避免将缓寸大小设置过大，这同样会不必要地消耗大量JVM和操作系统内存。此外，应避免设置过长的超时--例如当EJB不用时，仍被缓存---，这也会导致不必要地消耗大量内存。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h3&gt;数据库配置项目&lt;/h3&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;        J2EE 规范要求应用服务器厂商必须提供数据库连接资源池功能。通常增加数据库连接池的大小会提高性能。架构工程师应该考虑不同类型的SQL操作（例如事务型和批 处理型）应使用不同的连接池。如果一个消息Bean执行批处理操作，那么应该为此另创建一个连接池，而不要与事务型操作使用同一个连接池。&lt;/p&gt;&lt;p&gt;         很多J2EE应用服务器提供了Prepared Statement 的缓存功能。创建Prepared Statement是很耗费资源的。在事务型的J2EE应用中通常执行很多同样的SQL语句，只是参数不同而已。所以在应用中应发挥数据库配置项目的作 用，尽量使用Prepared Statement。 &lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;p id="TBPingURL"&gt;Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1527474&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-1745696343345113474?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/1745696343345113474/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=1745696343345113474' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1745696343345113474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/1745696343345113474'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/j2ee.html' title='J2EE应用性能问题的常用优化项目'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-5618823542190858813</id><published>2007-03-16T13:12:00.000+08:00</published><updated>2007-03-16T13:13:18.663+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Windows Vista新完美“激活”方式登场</title><content type='html'>Vista从诞生之初便是全球破解爱好者的攻击目标，而目前最“时兴”的新激活方式名为“Timerstop t2a”。 &lt;p&gt;　　Timerstop t2a能够让你的Vista试用版在30天试用期到期后自动重新计数——让Vista的激活最后期限无限延长。&lt;/p&gt; &lt;p&gt;　　据称，该“延长激活期限”方式已经证实适用于所有Windows Vista版本，而且通过这种方式激活的Vista版本可以直接进入Windows Update，甚至下载Ultimate Extras、进行互联网时间同步并且下载微软下载中心的免费软件等。&lt;/p&gt; &lt;p&gt;　　这种新激活方式比此前的激活方式更为傻瓜，能够自动安装所需的TimerStop.sys&lt;a href="http://drivers.yesky.com/" class="bluekey" target="_blank"&gt;驱动&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;　　有兴趣的朋友可以&lt;a class="f14_link" href="http://newbeta.org/2007/03/12/new-vista-crack-method-appeared/" target="_blank"&gt;点击这里查看详细步骤、下载Timerstop安装程序&lt;/a&gt;——当然，仅限研究。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-5618823542190858813?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/5618823542190858813/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=5618823542190858813' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5618823542190858813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/5618823542190858813'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/windows-vista.html' title='Windows Vista新完美“激活”方式登场'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-320026629620465392</id><published>2007-03-16T13:11:00.000+08:00</published><updated>2007-03-16T13:12:10.147+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Google Earth又将添加新特色</title><content type='html'>&lt;p&gt;Google Earth现在十分火暴，它可以提供一个很好的平台，让用户足不出户就能欣赏世界各地的美好景色。马上Google Earth又将出现新的功能上。&lt;/p&gt; &lt;p&gt;　　环保宣传组织将与Google Earth合作，将共同为提高人们的环抱意识而努力。Google Earth将设计一个新的层，讲述有关滥开采煤矿造成470座山脉毁灭，对附近的生态造成了严重影响的相关介绍。世界野生动物组织也将扩大与Google 合作，Google Earth的应用范围将逐渐延伸到各个领域。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://www.gjgy.com/huangshan.html" target="_top"&gt;&lt;img src="http://news.newhua.com/Newhua_Files/Net_pic/2007-3/13/78365123GEhuangshan.jpg" align="top" border="0" height="268" width="332" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26572176-320026629620465392?l=qzjackie.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qzjackie.blogspot.com/feeds/320026629620465392/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26572176&amp;postID=320026629620465392' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/320026629620465392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26572176/posts/default/320026629620465392'/><link rel='alternate' type='text/html' href='http://qzjackie.blogspot.com/2007/03/google-earth.html' title='Google Earth又将添加新特色'/><author><name>Jackie</name><uri>http://www.blogger.com/profile/12572223755813743741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26572176.post-3150648183524138509</id><published>2007-03-16T13:10:00.000+08:00</published><updated>2007-03-16T13:11:35.155+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>戴尔网上调查用户OS偏好 为预装Linux造势</title><content type='html'>&lt;p class="text01"&gt;新浪科技讯 北京时间3月14日消息，据国外媒体报道，为进一步了解消费者对台式机和笔记本电脑中所用操作系统的偏好问题，戴尔周二开始在公司博客上张贴了一份调查问卷，请求参与者对不同Linux操作系统偏好及其他问题作出选择。  &lt;/p&gt;&lt;p&gt;　　该问卷要求参与者在Fedora、Ubuntu等Linux操作系统中选出自己最爱，同时回答究竟喜欢笔记本还是台式机、偏好高端还是 低端产品等问题。戴尔称，该调查有效日期将持续到3月23日；活动结束后，戴尔将参考调查结果而推出预装Linux操作系统的PC。此前戴尔已推出数款基 于Linux的服务器。&lt;/p&gt; &lt;p&gt;　　近一段时间以来，戴尔遭遇了一系列挑战，其中包括收入低于预期、推迟提交财务报告、美国&lt;span class="yqlink"&gt;证券&lt;/span&gt;交 易委员会(SEC)对其进行账目调查及遇到投资者起诉等等。为扭转困局，戴尔创始人和董事长迈克尔·戴尔(Michael Dell)今年2月初重新担任CEO。他复出后，便创建了公司博客以获取消费者的反馈信息。随后便有消费者向戴尔提出意见，要求该公司在推出预装微软 Vista&lt;span class="yqlink"&gt; 操作系统&lt;/span&gt;、Office办公软件的PC之外，还应让用户可选用Linux操作系统及OpenOffice办公软件。&lt;/p&gt; &lt;p&gt;　　戴尔2月23日宣布，将与Novell合作推出多
