java060515/
共190个网摘 [
1 2 3 4 5 6 ...
7 ]
下一页 |
访问java060515的个人空间
java060515收录,使用标签:Java,时间:2008-4-3 17:04:19 | 相关网摘,我也收藏
作者: DenialSu , 出处:赛迪网
Java是一种杰出的产业开发语言,这是因为它带来了伟大的统一和对事实上以前并不存在的重要标准的关注。但是和所有语言一样,Java将来也会褪色。依据我做的超越Java的研究,一个重复出现的主题是有越来越多的人相信Java已不再足够的有效率。以下一组技术可以使你更有效率。他们不是对所有的工程都适合,但当被应用于适合的工程时,他们是优秀的工具。
1.动态语言
动态语言可以比像C++或Java这样的静态语言更加有效率。他们可以让你用更少的语言表达更多的意思。这里,我会关注现在新出现最流行的动态语言Ruby。用Ruby的"Hello, World"和Java的作一个比较:
puts "Hello, world."
这显然既简单又明了。你不需要写一些其他的代码去做这件事。下面是用Java语言的描述:
class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!") }}
在Java中,类型是静态的。这就代表了编译器要检查所有的类型;你必须建立和编译一个完整的程序。在Ruby中,类型是动态的,所以你不需要去声明他们,你可以马上编写和运行他们。下面是用两种语言描述的Fibonacci 序列:
First, Ruby:x1, x2 = 0, 1 //110.times do puts x2 x1, x2 = x2, x1+x2 //4end
注意到在第一、四行同时声明两个变量,让你可以简洁地表达两种不同的声明形式。
另外,注意到10是一个对象,它支持方法,如:times。再另外,在do和end之间是一个代码块。
Ruby代码块可以让你把代码块传入方法。。这种技术导致了难以置信的效率和简洁的代码。
接下来,看一看用Java实现的代码:
class Fib { public static void main (String args[]) { int x1 = 0; int x2 = 1; int total = 1; for (int i=0; i<10; i++) { System.out.println(total); total = x1+x2; x1 = x2; x2 = total; } }}
你需要去声明所有的变量,以及详细地写出来你用for循环实现的迭代。每个变量都是独立的,所以你必须有一个临时变量用于存放total。
相比,动态语言更为简洁。按照一个普通的规则,如果你可以写更少的代码而不牺牲可读性,这些代码将导致更高的效率。
(但是你不可以牺牲可读性来达到这一步,我们可以以Perl举例作为结尾。)
更为重要的是,动态语言在Java开发者想要去解决的重要问题上表现得更好,如: 元编程。 Hibernate 使用元编程技术使对象持久化。
Spring使用元编程来为Java对象增加服务,而免除你为他们构建额外支持的烦恼。在Rails框架上,当红的Ruby利用了自己能力来构建某种已存的
最有效率的应用开发框架。
令人惊讶的是,许多Java开发者采用了Ruby。Ant和Tomcat的发明者James Duncan Davidson正在Rails上使用Ruby,以及Java的畅销书作者之一,JSP专家组的
成员David Geary正在写一本关于Rails上的Rub的书y。许多在Java社区里有着聪明思想的人都转向使用像Ruby一样的动态语言。这是因为这种新出现的语言能更好的解决最有兴趣的问题。动态语言将不会完全取代Java,但是他们会适合于解决小的,轻量级的问题。
2。Continuation 服务
Web编程绝对是个的灾难。在Java诞生十年后,我们仍旧不能构建一个使返回按钮正确的框架。Web应用是无国界的,所以Web应用会发展得更好。但是很难去构建无国界的应用,而我们现有的框架不能给与我们足够的帮助。你使用大多数Java的Web框架时,从根本上说,你构建了许多
不相关的使用servlets或JSP技术的应用。然后通过手工保存对象来把他们集成起来,这些对象就是你需要的,用来暂时存储对象的会话。
Continuation是语言的构造器,它可以使你快速存储某个线程的状态,过后执行这个线程。基于 Continuation的web框架总体上是通过模拟一个监控状态的应用来使web开发变得更为容易。当你的应用需要从用户那取得数据时,这种框架使用continuation来自动保存应用程序的状态。如果用户按下返回按钮或者通过浏览器的历史纪录回到以前的页面,应用程序可以重新读取一个continuation。
基于continuation最好的框架是用动态语言来开发的。到目前为止,最健壮的框架是Seaside。他是基于一种Smalltalk的Squeak语言的框架。Seaside支持很好的调试功能,你可以实时检查、调试以及在浏览器里改动你的代码。Borges、Iowa和Wee都是基于Ruby且支持continuation的框架。
Java不支持continuations,但是一些在特殊限制下构造的Java框架支持模拟continuations。这些框架具有用其他语言编写的continuations框架的某些特征。
。流行的框架是用了一些高级的技术,如:字节码增强、反射以及特殊类的装载器。这些技术用Java部分地实现了continuations。
。Cocoon 2在Rhino JavaScript 虚拟机中增加了continuations,用来模拟监控状态的应用。
。Spring Webflow使用了状态机来提供对返回按钮良好的支持,以及其他一些continuation服务的特征。
。Lakeshore使用了悬挂的线程来模拟continuations。这种方法不像其他方法一样有可扩展性,同时还缺乏对返回按钮完整的支持,但是这些预计在将来
都会具有。
每个月都会有新的框架出现。我认为在未来的三年内,我们都会使用支持基于continuations的方法的web开发框架,这种框架是由一种语言或者其他语言
编写的。
3.惯例超越配置
Java开发者经常探索用于改进配置的方法。新的框架越来越多的使用Java 5批注来进行配置。其他的框架是用一种不同的方法。Rails中的Ruby常用惯例来推断需要在其他框架进行配置的联系。例如:在结束的时候,一个叫BlogController且有一个show方法的Rails控制器,会自动在blog_controller目录里提交一个叫show.rhtml的视图。Rails还使用命名惯例来绑定数据库表里持久化的类。默认情况下,Perosn类会与用英语的复数people与表进行匹配。
新的框架将会支持惯例,而不是配置。
4.元编程
就像前面提到的一样,在Rails编程框架上的Ruby里,存在着许多hype的。我认为这种hype是正确的。在Rails上的Ruby让你比起java,可以在一个更抽象的层次上编写你的程序。有了Rails上的Ruby,你可以创建域对象,这种对象可以发现相关联的数据库表的内容。例如:你可以写这样简单的模型对象:
class Person < ActiveRecord::Baseend
这种类表面看起来相当的受限制。但是一旦你执行它,Rails就会展现它的神奇。这种实现了持久化Rails的活动纪录框架与相关的数据库关联,以及为了表定义扫描系统表,还发现数据库里列项。然后,活动记录为数据库中的每一列增加一个属性,为数据库中id列名在类中增加一个独一无二的标示符。你可以用下面的类去编写代码:
person=Person.newperson.name='Bruce Tate'person.email='bruce.tate@j2life.nospam.com'person.save
数据库的列名和行为都会在运行时后加入Person类。你可以很容易的扩展Person类:
class Person < ActiveRecord::Base has_many :carsend
通过Ruby中一个belongs_to的简单方法和:department标示符,我实现了所有我想做的。活动记录隐式调用了Ruby的元编程来添加了所有的方法和变量,这些方法和变量用来管理一个任何一个部门之间的一对多关系。Rails用户使用域语言来管理像继承这样的关系,另外可以用Ruby语言在一个更抽象的层次上工作。Rails无缝扩展了Ruby语言。
Rails会不会是下一代伟大的框架?有可能。要做一个选择的话,Rails应该会是在使用Ruby或是其他动态编程语言的元编程框架潮流中的第一个。或者,你可能看到Rails会作为某些松散对齐技术的中枢,它是以元编程作为基础的。在任何情况下,你都会更有效率。
http://webservices.ctocio.com.cn/340/8063840.shtml
java060515收录,使用标签:Java,时间:2008-4-1 17:10:33 | 相关网摘,我也收藏
Spring 2.5 TestContext 测试框架用于测试基于 Spring 的程序,TestContext 测试框架和低版本 Spring 测试框架没有任何关系,是一个全新的基于注解的测试框架,为 Spring 推荐使用该测试框架。
概述
Spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点:
基于注解的 IoC 功能;
基于注解驱动的 Spring MVC 功能;
基于注解的 TestContext 测试框架。
Spring 推荐开发者使用新的基于注解的 TestContext 测试框架,本文我们将对此进行详细的讲述。
低版本的 Spring 所提供的 Spring 测试框架构在 JUnit 3.8 基础上扩展而来,它提供了若干个测试基类。而 Spring 2.5 所新增的基于注解的 TestContext 测试框架和低版本的测试框架没有任何关系。它采用全新的注解技术可以让 POJO 成为 Spring 的测试用例,除了拥有旧测试框架所有功能外,TestContext 还添加了一些新的功能,TestContext 可以运行在 JUnit 3.8、JUnit 4.4、TestNG 等测试框架下。
直接使用JUnit 测试Spring 程序存在的不足
在拙作《精通 Spring 2.x — 企业应用开发详解》一书中,笔者曾经指出如果直接使用 JUnit 测试基于 Spring 的程序,将存在以下 4 点明显的不足:
导致 Spring 容器多次初始化问题:根据 JUnit 测试用例的调用流程,每执行一个测试方法都会重新创建一个测试用例实例并调用其 setUp() 方法。由于在一般情况下,我们都在 setUp() 方法中初始化 Spring 容器,这意味着测试用例中有多少个测试方法,Spring 容器就会被重复初始化多少次。
需要使用硬编码方式手工获取 Bean:在测试用例中,我们需要通过 ApplicationContext.getBean() 的方法从 Spirng 容器中获取需要测试的目标 Bean,并且还要进行造型操作。
数据库现场容易遭受破坏:测试方法可能会对数据库记录进行更改操作,破坏数据库现场。虽然是针对开发数据库进行测试工作的,但如果数据操作的影响是持久的,将会形成积累效应并影响到测试用例的再次执行。举个例子,假设在某个测试方法中往数据库插入一条 ID 为 1 的 t_user 记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例执行失败。所以测试用例应该既能够完成测试固件业务功能正确性的检查,又能够容易地在测试完成后恢复现场,做到踏雪无迹、雁过无痕。
不容易在同一事务下访问数据库以检验业务操作的正确性:当测试固件操作数据库时,为了检测数据操作的正确性,需要通过一种方便途径在测试方法相同的事务环境下访问数据库,以检查测试固件数据操作的执行效果。如果直接使用 JUnit 进行测试,我们很难完成这项操作。
Spring 测试框架是专门为测试基于 Spring 框架应用程序而设计的,它能够让测试用例非常方便地和 Spring 框架结合起来,以上所有问题都将迎刃而解。
一个需要测试的 Spring 服务类
在具体使用 TextContext 测试框架之前,我们先来认识一下需要测试的 UserService 服务类。UserService 服务类中拥有一个处理用户登录的服务方法,其代码如下所示:
清单1. UserService.java 需要测试的服务类
package com.baobaotao.service;
import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
import com.baobaotao.dao.UserDao;
import com.baobaotao.dao.LoginLogDao;
public class UserService{
private UserDao userDao;
private LoginLogDao loginLogDao;
public void handleUserLogin(User user) {
user.setCredits( 5 + user.getCredits());
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getUserId());
loginLog.setIp(user.getLastIp());
loginLog.setLoginTime(user.getLastVisit());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(loginLog);
}
//省略get/setter方法
}
UserService 需要调用 DAO 层的 UserDao 和 LoginLogDao 以及 User 和 LoginLog 这两个 PO 完成业务逻辑,User 和 LoginLog分别对应 t_user 和 t_login_log 这两张数据库表。
在用户登录成功后调用 UserService 中的 handleUserLogin() 方法执行用户登录成功后的业务逻辑:
登录用户添加 5 个积分(t_user.credits);
登录用户的最后访问时间(t_user.last_visit)和 IP(t_user.last_ip)更新为当前值;
在日志表中(t_login_log)中为用户添加一条登录日志。
这是一个需要访问数据库并存在数据更改操作的业务方法,它工作在事务环境下。
http://www.51testing.com/?action_viewnews_itemid_78499.html
java060515收录,使用标签:Java,时间:2008-3-21 14:46:00 | 相关网摘,我也收藏
NAC产品一般在边缘位置采用802.1X认证;通过一个限制性的入口,采用基于Web的认证,或私有的客户端或协议认证,或采用被动式认证;它使用RADIUS或其它的协议嗅探;或采用静态的基于媒体访问控制的或基于端口的认证。评估一个NAC产品认证性能的关键是决定其机制是否足够宽泛从而可以在你的环境中运行。
更大的NAC部署依赖于与公司认证数据库紧密集成,如活动目录或某个其它的轻量级目录访问协议服务器。
评测一个NAC产品的端点特性时,关注每一次评估可以提供的信息是很重要的。测试每一个NAC时,需要注意:
·它是否能够评估一个用户系统的设备水平。
·它是否考虑用户系统的安全状态
·它如何处理多用户团体(管理的、未管理的及临时用户等),它如何适应各种用户平台。
·端点的安全评估如何与可能的补救策略相集成。
NAC的强化可从两个方向进行观察:细节水平和位置。要评估细节水平,你必须测试一些主要的强化类型,如基于虚拟局域网的访问限制和简单的数据包过滤器等,看其如何与你的NAC计划相适应。
要评估位置,你应当评测NAC强化的三个选择:网络访问的所在地点,网络访问之后的位置,网络的核心,将其映射到你的网络中。
任何NAC的部署都会带来网络、安全、桌面人员的引进,因此,应当在每一个层次上考查每一种NAC产品。
下面我们看一些适用于一个NAC方案标准的管理评估问题:
·图形用户界面设计是否令人满意而舒适,其设计使操作更容易了还是妨碍了操作?
·安装过程容易理解吗,特别是在客户端工具需要被技术人员和非技术人员反复安装时,更需要考虑这个问题。
·对技术人员和非技术人员这些产品的报告功能可用吗?
·警告功能可以充分地配置吗?
·这种产品支持公司需要的正常操作(包括灾难恢复、伸缩性、可测量性和高可用性)要求吗?
下面是一些与NAC产品客户端的管理有关的特定问题:
·客户端管理能够轻松地将网络访问功能(认证或授权)与端点安全评估结合起来吗?
·如果安装了客户端软件,客户端包括了可轻松地部署和更新NAC所需要的所有部件的能力吗?
强化的端点管理要求下面的评估标准:
·在NAC产品提供了其自己的增强点,这种机制能够与一般的企业管理工具相集成并生成日志信息吗?
·NAC的强化管理与现有架构的强化和改变控制的过程是如何集成的?
在评估策略服务器的管理时需要考虑的关键因素有:
·策略服务器与公司的客户端安全产品和控制台是怎样集成的?
·策略服务器与公司现有的目录集成得怎样?
·策略服务器是如何促进策略描述和部署的?
·NAC产品如何交付分布式管理功能?
来源:赛迪网 作者:freedom
http://tech.ccidnet.com/art/1099/20080320/1396851_1.html
java060515收录,使用标签:Java,时间:2008-3-18 15:19:10 | 相关网摘,我也收藏
上任第一天: 上锁的门,错过的联系
我的新办公室位于曼哈顿闹区,上任第一天,在早晨7:30分我就拖着我的大包就直奔新的公司,包里装满了我的家庭照片、大学本科学历书、各种证书、奖状和代码样本。对于我CIO工作的第一天到底什么会是什么样子的,我心里没有底。我是在昨天,也就是上任前一天的晚上才抵达纽约的。
我的新办公室位于Innovation Ads Office,之前这座大楼一直用作虚构小说创作室(众所周知的情景喜剧‘丑女贝蒂’就出自该创作室)。电梯在21楼停下了,我走出电梯,径直走向我的办公室,却发现这间明亮的办公室大门紧锁。这时,我才发现我是第一个来到公司的人,因为我没有钥匙,所以我就只能在门外等着。几分钟后,一名穿着时髦的员工也进来了。我向他介绍了我自己,说明了自己是公司新任CIO。然后,我问他是否可以进入办公室。这时,他从钱包中拿出一张信用卡,在办公室门和插销之间滑了一下,锁就被挑开了。我在一旁看得目瞪口呆,不过谢天谢地,我终于进来了。
我迅速的找到了我的办公位置,放下我的东西,然后我就去找我的老板Iain Grae。他是Innovation Ads的主席和创始人之一。他不在他的办公室,我试着喊他,同样没有回应。后来我才知道他去了欧洲。
20世纪90年代后期,Iain和我都在佛罗里达大西洋大学的求学,我们第一次见面就成为了好朋友。2005年,他邀请我担任Innovation Ads 公司的CIO,当时,我在Corporate Express的事业发展得很好,并且当时绑到纽约对我来说根本是不可行的(我当时生活和工作在佛罗里达州)。但是,伊Iain和我一直保持着联系,两年后也就是在2007年,他再次邀请我加入Innovation Ads公司。这次时机对于我和我的家人来说要好得多。我刚刚在Corporate Express公司完成了一个大项目,并准备好进行一次转变。并且Lain在2007年对我发出邀请的时候,Innovation Ads公司发展地也更加强大。
我漫无目的的回到了我的班公司,坐到了座位上,关于要做哪些工作并不十分清楚。我知道以后我会成为这个团队做出巨大贡献。然而,目前我也没有具体的方向。上任第一天我应该做些什么事呢?我们是不是正处于一个项目的中期阶段?现在的工作同我之前在Corporate Express的经验是完全不同的,我心里也有些紧张和不安。每一次我走向一个新的工作岗位,我的第一个星期基本都是熟悉新的办公司、熟悉信的员工、熟悉新的工作。有这样一个过度阶段,我可以安心的投入工作。但是,这次不同的是,当我第一天进入这个公司的时候,我不是一个普通员工,我是这个公司的CIO。
大约9点钟的时候,IT部门的5名员工陆续出现了。他们透过我办公室的玻璃盯着我看,就好像我是一条水族馆里的鱼,我也用一种不确定的眼光回应着他们。15分钟以后,我对自己说:这可真荒谬。然后,我打定了主意走了出去,并向他们介绍了我自己。我告诉他们我的背景以及我丰富的编程经验。他们看着我,就好像我浑身都写满了代码,呵呵。最后,他们告诉我说:“每个来这里的人都告诉我们,他们懂得系统和开发。”我询问了他们一些有关他们工作的事情和公司的一些事情。我只是想多了解一些公司的情况。
毫无疑问,我的第一天CIO生活很有趣。我感觉自己就像正在进行一场和世界拳击冠军的拳击比赛,而第一回合我幸存了下来:我没有赢得比赛,因为我没有打倒了冠军,但我也没有输或者被淘汰。我上任的第一天没有遇到太大的问题,这让我感到很欣慰。
克服孤独、恐惧、沮丧和自我怀疑
我的第一个星期是在沮丧中度过的。我不认识任何一个员工员。我不认识任何的厂商。我不了解这个互动营销行业及其行业术语。
在Corporate Express公司工作的时候,当有人谈到交货问题,或FIFO(先入先出)、LIFO(后进先出)成本计算时,我总是能参与其中并能发表自己的意见。但是,在Innovation Ads,大家都在谈论商业活动、注册管理和潜在客户开发等等。我不知道也不懂他们在谈论什么。有人给我一些项目的资料,并说:“我们需要这个客户能够做到合作注册(co-reg),但他们还在操纵一个联属网络营销联盟(Affiliate Network)。我把这些都记在了笔记上,但我不知道他们要求我做些什么。这是很可怕的。
有些时候,我会不由自主地想,我的上帝啊,如果我把事情搞糟怎么办?如果我不能做好这份工作怎么办?如果公司的核心系统崩溃5天,公司就会亏损1000万美元,那时我会怎样呢?我不知道如果除了事情应该去找谁。我也不知道如果我的员工能不能完成我要求他们完成的工作。
在我之前的工作中,我可以向很多人请教,征求他们的意见和建议。我已经和他们共事了十几年了,彼此之间非常熟悉,并且他们也很乐意同我谈论问题,而不会隐藏什么。但是在这里,我没有人可以询问。我不得不依靠自己,并且做做我认为是正确的事情。
熟悉公司的情况,并找到一个(暂时)可以求助的人
Innovation Ads公司与Corporate Express公司的差别太明显了。
首先,2002年才成立的Innovation Ads公司是一家私人公司。它是由速度、进步和成长驱动的。而Corporate Express公司是一家上市公司,任何事情都要围绕制度、规章、报告和管理来进行。我一直以为,当我成为首席信息官时,无论在哪个公司---都将会是很正式的并且属于一定的层次,就像在Corporate Express公司那样,你必须有“灰白的头发”才能被提升到行政管理层,并且每一个行政管理人员的车位都位于停车场的前部。但是,在Innovation Ads公司,每个在职人员基本都和我同龄或者比我还要年轻。Innovation Ads公司的办公室里还专门有一个为员工准备的音乐工作室。这里的工作环境与我之前的工作环境大大不同,并且也不是我所预料的。但我必须说,与Corporate Express相比,这儿的工作效率与利润率并不一定就低。
我试着适应新的工作环境,并且我下定决心把工作做好。每天,我很早就来到了办公司,而晚上加班到很晚才回去。我熟了读了关于开放源码技术的书,比如Apache、PHP和MySQL,因为这些技术都是我所陌生的。我也开始阅读有关在线广告、电子邮件市场营销、行为定位等领域的非技术性书籍、新闻文章和白皮书。
为了能使自己尽快适应新的职位和新的老板,我在IT员工中找到了一个可以征求意见和建议的人---我的“顾问”。每当我接到一个工作时,我都会同他讨论,征求一下他的意见。我向他请教他对于这件任务的看法、他的计划以及公司以往对这项工作的做法。我是根据他们在Corporate Express的工作年限来选择我的“顾问”的。当我刚到这个公司的时候,IT部门只有五个人,我的“顾问”是他们之中加入公司时间最长的---一年。
依赖“顾问”解决问题其实是一把双刃剑。首先,我对他不是非常了解,我不知道他是否真得很出色。同时我还发现,随着时间的推移,我对他的依赖程度越来越高了---尤其是其它开发人员,他们已经适应了我的前任制定的发展方向,而现在我却要把他们拉向相反的方向,他们对此很不满,纷纷开始离职。
不久,公司最要的系统不能正常运转了。在我刚上任两个星期后,我们的核心在线广告引擎iPMS, 停止了运转,iPMS主要用来跟踪商业活动和成功率并且在客户和供应商之间传递潜在客户的信息。iPMS应用软件无法正常接收这些信息并存入数据库,并且客户提交的这些信息也无法进入该系统。
在我们的业务中,这些潜在客户的信息就是我们的生命线。它们就是我们的产品。因此,当iPMS无法正常工作的时候,销售总监怒气匆匆地冲进我的办公室并大声质问:“我们的系统是不是处了什么问题?”说实话,我对此一无所知,所以我问研发小组到底出了什么事。他们进行了一系列查询和测试后,告诉我销售总监的意思“看起来像没有新的数据插入到数据库中。”
我坐了下来,并开始同研发人员一起寻找代码中的错误。利用纯粹的系统逻辑,我很快发现了问题的所在。一个低级的程序员在测试过程中意外地改变了系统的一个核心配置文件,这一变化使得iPMS指向了一个不存在的数据库服务器,因此潜在客户的信息提交不到我们的数据库中。几分钟后,我们就解决了这个问题,公司的业务也正常运转了。
这是一个伟大的时刻。我刚刚为公司解决了一个关乎存亡的关键问题。有趣地是,我开始担任CIO这个职位时,踌躇满志,一心要干一番大事业,但当问题到来时,才发现其实不过是一个很小的系统问题,前后历时最多五分钟。但是这也是一个催化剂,帮助我建立信心,并且使我对公司有信心。
一个星期后,情形变得更坏了,我的“顾问”向我提交了离职信。我慌了神。我不停地想:“现在该怎么办呢?”我将要招聘一个“全新”的工作人员,他对于这套系统一无所知,而我也一样。
我的“顾问”的突然离职验证了这样一句话“塞翁失马,焉知非福。”我没有了可以依赖的人,任何事情都得自己干了,我必须自己做决策。事情开始渐入佳境了,而且我很快就熟悉了这套系统。我感觉自己能力越来越强,依赖性越来越小。这太棒了。
雇用权,凝聚团队
当我刚开始在Innovation Ads工作时,我发现这里的IT员工很明显缺乏团队合作精神。这主要是由于他们对于前任技术领导层一直以来都缺乏信心。员工9点开始上班,每个人都呆在属于自己的小格子里,带着耳机,干着自己的活,六点钟准时下班。没有人互相交谈,互相切磋,或知道有其他人在干什么。他们不关心其它事情。
我上任后的第一件事就是辞退那些对于编程开发没有热情的员工。我热爱软件开发和应用程序设计这项工作。除了这些事情,我根本无法做任何其它事情。打个比方,如果我明天中了大奖,我一样还会坐在家中编程。这是我的爱好,谁都无法改变。我雇用了6个新的开发人员,每个人都是精英。这正是我想要的团队,他们会把公司推向一个新的高度。
毫无疑问,雇用是每一个CIO和每一个经理人最重要的事情。如果你不能建立一个良好的团队并聘请合适的人,你肯定会失败,没有其它的理由。CIO们很少有的仔细研究并解决技术问题。每天从早到晚,我都在与供应商、管理者、股东及员工打交道。即使我想亲自解决技术问题,但是在白天,根本就没有足够的时间。
寻找你可以指望的合适的人---并让他们知道他们对于公司是如何的重要---是关键问题。我告诉我的研发小组说,他们是公司的珍宝,而公司要想取得成功就必须依赖他们。我还告诉他们,他们才是最关心的,公司的老板只能排第二。我对他们说:“最重要的是你们需要我做什么。我的老板有五个直接领导,而你们只有一个。”我要让他们知道,我是他们的直接代表,我会为他们尽可能的向上层管理部门争取权益,当且当出现任何技术问题时没我会承担全部责任。我想保护他们免于政治问题和责任,并提高他们对我的信任,因为我是他们的领导。
当我在Corporate Express公司工作的时候,我努力工作的原因不是我真正关心公司(一个人能从办公产品那得到多少兴奋呢?),而是因为我的老板,销售副总裁Al Zoldos。和他共事的每一天,我都能从他身上学到很多东西,我的信赖并尊敬他。我真心希望让他为我感到自豪。
在Innovation Ads公司,我决定不再试图劝说我的员工努力为公司工作。这是一个老生常谈。我想要让他们努力为我工作,就像我受Al Zoldos的影响努力工作那样。作为交换,我会尽我得一切力量帮助我的员工。如果他们相信我所做的是出于真心关心他们,那么他们也会真心帮我,其实也就是在帮助公司。
上任后,我给我的员工配备了新的电脑---显示器为90英寸的大家伙。公司的所有员工都对技术团队的巨型新机器很好奇。这使得我的团队特别关注,我想这有助于激励他们将工作做到最好。
我还给他们的电脑精心挑选了壁纸---步枪的十字瞄准线正对谷歌的logo,并把这个壁纸装在了所有人的机器上。谷歌是目前我们公司最大的竞争者,我想让我的开发人员时刻提醒自己要对敌人保持警惕,并励志做到最好。我们正在努力成为一个成功的在线营销公司。我想要让Innovation Ads的广告平台家喻户晓,就像谷歌、微软和雅虎那样。
当公司的其它人看到这个壁纸后,他们也都替换了自己电脑的壁纸。经历了显示器和壁纸事件以后,我所领导的技术部门的团队精神开始形成了。
六个月带来的巨大差别
我在Corporate Express度过了10年的职业生涯,而我也成为了该公司的“顾问”级人物。我感觉自己就像一个明星,但同时,我一直打心眼里想知道,我所谓的“顾问”地位是因为我的资历呢还是因为我的天赋。我接受Innovation Ads公司的这项工作的原因是多方面的。首先,我一直想成为一个CIO。第二,Innovation Ads是一个伟大的公司,它处于一个新兴的并且令人振奋的领域,而且我想利用这个机会帮助公司发挥其真正的潜力。最后,我想考验自己---看看我是否能够在一个新的公司、新的职位、新的行业、新的同事、新的工作环境中复制我在Corporate Express公司取得的成功,这都是我之前从来没有接触过的。
虽然刚开始工作的前几个星期是很艰苦的,现在我已经在新的岗位上工作了6个月了,我想说地是我很热爱这项工作。这正是我想要做的。这正是我想工作的地方。之前的十年工作经验就是为了能有今天。这就是我的梦想。
从公司成立之初就一直在Innovation Ads工作的行政人员和管理人员都是极为出色的员工。他们所做的真是非常了不起,他们白手起家,使一个公司从一文不值发展到几天拥有数百万美元这样一个规模。虽然他们可能没有一个人有灰白色头发,作风绝对更是随心所欲,从来不拘泥于古板的条例,但他们却和其它美国公司一样成功---效率高、富有建设性。在这里,我已经学到了很多关于管理和激励的东西,这要比我在Corporate Express公司继续工作时间学到的还要多。
在Innovation Ads,我忙着筹建并培养自己的队伍,从中我得到了极大的快乐和满足感,这是我在Corporate Express作为“顾问”所不曾得到的。看着自己的团队一天天地成长、做出正确的举动、并越来越有生产力,这真是一件令人高兴的事。现在,我的开发团队成员数番了一番,达到了12人。生产率也极大地增强了。代码的准确性也大大加强。当出现争执时,我从来不火上浇油,而是尽量使他们互相理解。他们总是面带微笑的讨论问题,笑声市场从我的部门里传出来。受我的开发团队的影响,整个公司的士气就提高了。有时,我都会微笑地坐在自己的办公室里看着他们工作,我为他们感到自豪。
你可能想知道,现在办公室的门是不是安全的,这点,你可以打可放心。我们在门上加了电子安全锁,开门和关门都要通过电子安全卡。我们很清楚任何时间谁进来了、谁离开了。如果需要,我们甚至可以通过互联网把门打开和锁上。
http://cio.ctocio.com.cn/exchange/208/8043208.shtml
java060515收录,使用标签:Java,时间:2008-3-10 10:45:56 | 相关网摘,我也收藏
在近几年,随着计算机硬件性能的提高,脚本语言也受到了开发人员的不追捧。然而,很多流行的脚本语言都是各自为战(如Ruby、Python、Perl等)。它们都拥有自己的解析器和丰富的功能库。然而Sun可能是看到了脚本语言是未来开发语言发展的趋势,因此,为很多常用的脚本语言提供了JVM版本。
由于动态语言和以Java、C#为首的强类型语言有着本质的区别,因此,直接将它们编译成Java的字节码有些困难。因此,Sun想了个更好的方法,直接使用Java语言为这些动态语言来编写解析器。这样以来,不仅可以很容易解决动态语言的跨平台问题,而且也更容易实现。
一、JRuby:JVM的第一件动态语言外衣
第一个进入Sun的视线的是Ruby,Ruby是一种功能强大的面向对象的脚本语言,她可以使您方便快捷地进行面向对象编程。有时使用像Smalltalk、Eiffel或C++这样正式的面向对象语言来开发一些小项目显得有点"小题大作",而Ruby刚好可以满足这些面向对象编程的需求。当然了,您也可以使用Ruby进行普通的面向过程编程。Ruby的文本处理能力极强,与Perl不分伯仲。同时,Ruby的语法简单,还有异常处理以及迭代器等构造,使编程变得更简单了。
同时,Ruby还拥有一个类似Struts的MVC Web框架Rails,利用Rails可以非常快速的开发基于MVC模式的Web程序。Sun看到了Ruby和Rails的发展前景,类此,首先提供了基于JVM的Ruby:JRuby。因此,也可以这么说,JVM + Ruby = JRuby。
Sun不仅提供了JRuby,而且也在自己的NetBeans中提供了很好的Ruby/JRuby支持。
在以前,Sun很少为某种动态语言提供开发环境,而JRuby的特殊待遇可见Sun对JRuby的重视程度非同一般。这也许是Sun在将JVM变成真正的虚拟机(也就是去掉JVM前面的J)的第一步。由于JRuby运行在JVM上,因此,JRuby就理所当然地可以使用JVM及庞大的Java库了。也许这也正是Sun认为JRuby才是Ruby和Rails发展的真正王道的原因。
二、Jython:JVM阵营的又一力作
当Sun看到了JRuby/Ruby的成功后,并不甘心在JVM上只支持Ruby一种动态语言。因此,在支持JRuby后不久,Sun就雇佣了两位Python社会的开发人员来为JVM披上一件新的外衣,这就是Jython。
Jython是Python编程语言100%纯Java实现,它结合了Python和Java虚拟机和库的优点,成为了Java平台的有益补充。
最初的Jython又称为JPython,是一个十足的Java应用程序,它允许使用Python编程语言的语法和大多数特性。和其它编程语言比较,Jython有如下几个优点:
1. Python解释器shell的Jython版本可以对某些想法和API作便利的实验和研究。而不必经历一般的Java编译运行周期。
2. Python被设计成动态且通用的,因此你不必通过使用复杂的库(如用于Java反射和内省的库)来添加这些特性。这使开发更简单,而且它在自动测试框架中特别有用。
3. 部署简捷,提供了及时部署能力,无需花大量时间在打包和编译周期上。
4. 易于学习和使用,技术门槛低,可以轻松地找到大量的使用者。
三、总结
虽然在JVM上运行的这些动态语言在性能上可以略逊于原生的动态语言。但是由于它们可以和JVM无缝连接,因此,这些J...语言天生就具有了和Java语言一样强大的功能。正所谓抱棵大树好乘凉。看来以后Sun还会在JVM中支持更多的动态语言(也许以后会出现JPHP或是JHP,哈哈)。当然,目前除了Sun官方提供的支持,第三方也有了很多关于其他动态语言的支持,如原生的Groovy。还有Tcl、BeanShell等。看来以后JVM这个词要消失了,也许我们以后要直接叫JVM为VM了。但愿这一天会早日到来。
http://news.csdn.net/n/20080310/114199.html
java060515收录,使用标签:Java,时间:2008-2-29 15:19:14 | 相关网摘,我也收藏
Sun Microsystems公布了一个Java插件的重要更新,Java插件能让基于Java的Web应用程序跨平台运行在所支持的操作系统和浏览器中。
新版本被称为Java SE UPDAte N,包含一系列性能更新,值得注意的是支持微软Direct3D 9 API.该更新已经测试了一段时间,在今年年中就会有最终版本发布,FireFox 3届时会将其加入软件中,当然,最新的nightly版本就已经开始部署这一插件,支持的平台包括Windows XP,vista,Solaris与Linux. 当然,Internet Explore 6与7同样能享受到本次更新的好处。
http://news.csdn.net/n/20080229/113983.html
java060515收录,使用标签:Java,时间:2007-8-6 16:37:29 | 相关网摘,我也收藏
3年前,“Spring之父”Rod.Johnson写了一本在Java界引起轰动的书:《Expert One-on-One J2EE Development Without EJB》。这本书阐述了EJB作为J2EE核心技术所带来的意义与价值,但作者用了更大篇幅介绍EJB的一些缺陷与不足,并提出了Without EJB的解决方案。正是由于“J2EE Without EJB”这个激动人心的口号及这本书奠定的基础,导致了Spring Framework这个经典轻量级框架的诞生。
2年前,Ajax开始进入人们的视野。时至今日,Ajax已经成为一个红得发紫的技术。但是今天,我想说一句:JavaEE without Ajax。
Ajax的“原罪”
Ajax为什么这样红?有人说,是因为起了个好听易记的名字(比如荷兰著名的Ajax球队,即阿贾克斯);也有人说,是因为Google全新的Ajax应用产品给人们带来的超酷体验(比如伟大的Google Maps、GMail等)。确实如此,Ajax能够如此流行的最主要原因就是它带来了更好的用户体验,改变了人们对传统Web应用的不佳印象。
然而,即使Ajax的狂热Fans也不得不承认的是,从技术层面上来说,Ajax并没有带来什么新鲜的东西。它本质上是一种新瓶装旧酒的技术,好处是通过Java Script与DHTML提供了一种异步编程模型,从而使Web应用给客户带来了更好的人机体验。正如我在去年引起大家争论的拙文《Ajax,只是一种过渡技术》中表述的:Ajax解决问题的层面较低。或者说,它解决问题的方法与手段,很难形成一种可高度抽象的框架级解决方案。并且,正是因为Ajax基于Java Script,因此不可避免地带来了Java Script的诸多缺点,譬如:
跨浏览器是一场噩梦
对搜索引擎的支持不好
干掉了Back、History等按钮(尽管我并不认为Back、History是什么好东西)
开发与维护成本过高
要Java, 不要Java Script
We Love Java, Not Java Script。套用毛泽东的惯用句式就是:“要Java, 不要Java Script”。相信很多读者看完这个标题也许会不以为然,但这句话却代表了许多J2EE开发人员的心声。
众多Java工程师都对Java有一种近乎偏执的喜爱,他们热爱Java的简洁与优雅。但一旦让他们去进行Java Script的开发,却往往会不知所措:过度灵活的语法,无法通过编译器进行语法校验,缺乏良好的调试工具等等这些,都会让人们对Java Script畏手畏脚,更遑论Ajax的开发。
一句话,Java社区需要Ajax,需要它来提升基于JavaEE的Web应用的人机体验;但是,人们并不喜欢Ajax目前的开发模式。无疑,我们需要一种新的解决方案。
谁来拯救JavaEE的Ajax?
我给出的答案是JSF。目前,关于JSF的一种流行说法是“悲剧人生:Sun让JSF光着身子降临到Java Web世界”。然而,我的看法却是:作为一种革命性的服务器端组件技术,JSF犹如早晨八九点钟的太阳,前途不可限量。
让事实说话,我们先来看看JSF请求/响应过程的标准生命周期:
任何一个JSF“Faces Request” 请求,经过Restore View、Apply Request Values、Process Validations、Update Models、Invoke Application等阶段以后,产生了一个 “Render Response” 返回给客户端。那么,常规JSF引擎是如何实现上述过程的呢?
回顾一下常规JSF引擎针对请求与响应的过程:首先,客户端请求某个资源,产生一个Faces Request;服务器端接收到此请求以后,经过一系列后台处理,产生一个Faces Response。我们注意到:响应的Content-Type是text/html,而产生的内容主体是一段HTML文本;浏览器在接收到HTML文本以后,进行整个页面的渲染与刷新。
无需写Ajax代码的Ajax Enabled应用
我用自己开发的JSF引擎,这样处理上述过程(详见参考资料www.OperaMasks.org )
首先可以观察到,Faces Request的发出是基于“x-requested-by: XML Http Request”,也就是说,这是一个Ajax请求,而该请求在到达服务器端以后,服务器端所产生的Faces Response同常规Faces Response相比也发生了变化:Content-Type不再是text/html,变成了text/javascript;并且,响应的主体也不再是html文本,而是一堆script脚本。浏览器在接收到响应以后,再也不需要进行整个页面的渲染与刷新,而只仅仅需要执行这段脚本内容,将页面的控件进行更新即可。
显而易见,通过上述JSF技术,我们获得了:
基于Ajax的请求、应答、及页面控件的更新
数据传输量明显减少
避免整个页面的刷新,更好的用户体验
系统保持敏捷、高效
换言之:任何标准JSF应用,只需将其在OperaMasks JSF引擎上运行,就可以达到这样的效果。我们并没有写任何一行Ajax的代码,但是,我们的应用却是自然而然的Ajax Enabled的应用。大道至简,大象无形。
奥妙所在:JSF的Render机制
为什么可以这样?
JSF组件只是特定状态和行为的载体,而组件以什么形式去和用户交互,是完全可定制的、独立于该特定的表现语言,可以是HTML、WML或者其他形式;具体是什么,可以通过指定JSF组件的Render Kit来实现,而每一种Render Kit,对应于组件作者写的同一风格和形式的一系列Render。
比如,如果想在网页中实现图表功能(Chart),MSIE有VML,Gecko和Opera有SVG;而在服务器端只需要简单地判断一下浏览器类型,就可以选择一个Render Kit,生成不同的客户端表现来完成相同功能――这是用常规JSP技术很难完成的任务。
通俗的说,JSF组件可以翻译成任何你想要的形式。So,JSF框架比现有其它开源框架具有更强的生命力。上文所述的OperaMasks JSF,其容器级别Ajax实现,正是灵活应用Render Kit的具体案例。
从容器级别对Ajax予以支持的JSF引擎
我们提出的JSF是直接由JSF容器来处理Ajax请求的,它会根据请求类型来判断这是一个正常HTTP请求还是一个 Ajax请求:如果是常规HTTP请求就运行JSP页面,生成页面文档(特定的,对于Ajax Render kit,要加入一些Ajax基础JavaScript代码);如果是Ajax请求,服务器对请求参数正常解码,并执行JSF中除页面输出阶段以外的所有其他阶段,生成一个JSF组件树。
一直到这一步为止,处理方式与对普通HTTP请求的处理完全一致,唯一不同的是:在随后Render Response阶段,容器除了调用组件作者写的Ajax功能 Renderer以外,更重要的是在生成响应页面时,会过滤掉一切不会变化的静态内容――也就是说,静态内容不会生成到响应页面中去,而对每一个动态内容则会生成一个相应JavaScript代码(可以更进一步优化为只有变化了的动态内容才处理)。这样,传给客户的Ajax应答实际上是由这样一些JavaScript语句构成。在Ajax响应返回到客户端时,就可以自动由Ajax回调函数执行这些JavaScript语句,完成对页面即时的、局部的更改,而不需要刷新整个页面。依赖JSF组件的具体功能,甚至可以改变页面的外观。而整个Ajax机制由JSF引擎提供,对用户完全透明。
实际上,在JSF规范中JSF页面输出阶段所采用的Render Kit是可替换的,默认的HTML_BASIC Render Kit输出的是标准HTML语法,不包含任何Java Script代码。我们提出的JSF引擎实现了一个 Ajax Render Kit,可以在HTML文档中嵌入Java Script代码来实现Ajax特性,而替换Render Kit只需要修改配置文件即可。
简单地说,这种JSF引擎为每个标准组件都实现了相应的Ajax Render, 比如对UICommand组件,其Ajax Render会在onclick事件中加入JavaScript的Ajax提交代码,向服务器提交Ajax请求。通过这种方式,任何一个包含标准JSF组件的Web应用,都可以通过只更改Render Kit配置为Ajax来实现Web应用Ajax化。而对于第三方的组件,可能本身并不支持 Ajax,但使用一个名为〈Ajax:renderGroup〉的标签,就可以立即将这个第三方组件转换成Ajax Enabled。
例如,Apache myfaces的Tomahawk项目提供了一个Tree组件,这个组件本身并不支持Ajax,每当按下一个Tree结点都将重新刷新整个页面。使用〈Ajax:renderGroup〉标签后,则只刷新Tree部分,而不刷新页面的其他部分。当然更好的方式是,提供一个本身就支持Ajax的Tree组件,以减少冗余数据的传递。
关于〈Ajax:renderGroup〉标签的原理,有兴趣的读者可以参考OperaMasks JSF的源码(详见参考资料),这里就不再一一赘述了。
综上,JavaEE 需要Ajax,但并不需要传统的Ajax开发模式。通过我们提出的OperaMasks JSF技术,我们不再需要知道什么是Ajax,而我们的应用却是自然而然的Ajax Enabled应用。
因此,我们认为:JavaEE Without Ajax!
http://news.csdn.net/n/20070806/107092.html
java060515收录,使用标签:Java,时间:2007-7-20 9:23:02 | 相关网摘,我也收藏
日前,Roy Thomas Fielding博士关于REST的论文Architectural Styles and the Design of Network-based Software Architectures中文版(《架构风格与基于网络的软件架构设计》)正式对外发布。在这个2000年所著的论文中,首次系统阐述了REST的架构风格和设计思想,对理解Web架构和HTTP、URI等标准背后的原理非常有帮助。InfoQ中文站编辑霍泰稳就此采访了主导此次公益性翻译的Ajaxcn.org网站站长李锟。
Fielding博士是HTTP和URI等Web架构标准的主要设计者,也是Apache HTTP服务器的主要设计者,他的这篇论文是Web发展史上的一个重要的技术文献。深入理解REST等Web架构背后的工作原理,对于开发者设计和构建高效的Web应用,这也是李锟决定发起这个翻译项目的主要原因:
翻译这篇论文就是为了将REST的思想介绍到中国。我们翻译了《Ajax模式与最佳实践》,这是一本关于REST架构设计的非常好的书籍,内容非常深入。但是如果不懂REST,就难以理解这本书中介绍的架构。而这本书的作者对于REST的来龙去脉也语焉不详,似乎认为每个读者都已经读过了Fielding的论文,对于母语不是英语的中国读者而言,这个假设是不成立的。而Fielding的论文阅读的难度非常大,如果不翻译过来,普通的读者肯定无法读懂(这个判断是客观的,因为我们自己也是在初稿翻译出来后,又费了很大功夫才真正理解了这篇论文)。为了帮助这本书的读者,我启动了这个公益性的翻译项目。
翻译的过程也是一次学习的过程,在这篇论文的翻译过程中,李锟充分理解了REST的各种架构约束,例如通用接口、操作语义的可见性、支持大粒度的数据通信等等。也理解了HTTP和URI的正确的使用方式,因为HTTP和URI正是基于REST的思想设计出来的。所有HTTP的扩展或者使用HTTP的Web应用,都应该与REST的各种架构约束相匹配,否则肯定无法在Web上面取得成功。
在过去的7年中,Web技术的发展验证了本论文所主要阐述的REST技术的有效性,李锟举例说:
一个典型的反例就是SOAP,尽管它在企业应用中取得了一些成功,并且被某些人吹嘘的天花乱坠,但是在Web应用中,却几乎没有人愿意使用SOAP。我的判断是,主要的原因在于SOAP违反了REST的通用接口和语义可见性等架构约束。它仅仅是将HTTP作为一种传输协议来使用的,这种将HTTP仅仅作为一种能够穿越防火墙的传输协议来使用的扩展不只SOAP。
但李锟表示虽然理解REST对Web开发非常重要,这一技术在国内的应用现状却并不乐观:
REST应用目前在国内刚刚萌芽,还谈不上有什么应用。在REST的思想传入国内之前,国内绝大多数开发者并不理解HTTP和URI是用来做什么的,当然也包括我在内。
这篇论文由李锟和他的几个朋友共同翻译,如91yee翻译社区的负责人廖志刚、Matrix技术社区负责人刘丹和《重构与模式》的译者杨光等,由李锟负责全文的审校和润色。在这期间还得到了国内技术社区一些专家的支持,比如庄表伟、李琳骁、孟岩、骆古道、范凯、刘新生、刘江等。全程用时两个半月时间。
本文来自于infoQ中文站 作者:霍泰稳
原文地址:http://www.infoq.com/cn/news/2007/07/dlee-fielding-rest
http://www.infoq.com/cn/news/2007/07/dlee-fielding-rest
java060515收录,使用标签:Java,时间:2007-7-19 15:43:57 | 相关网摘,我也收藏
一种思维方式影响了软件行业的发展。REST软件架构是当今世界上最成功的互联网的超媒体分布式系统。它让人们真正理解我们的网络协议HTTP本来面貌。它正在成为网络服务的主流技术,同时也正在改变互联网的网络软件开发的全新思维方式。AJAX技术和Rails框架把REST软件架构思想真正地在实际中很好表现出来。今天微软也已经应用REST并且提出把我们现有的网络变成为一个语义网,这种网络将会使得搜索更加智能化。
REST与HTTP协议
REST软件架构是由Roy Thomas Fielding博士在2000年首次提出的。他为我们描绘了开发基于互联网的网络软件的蓝图。REST软件架构是一个抽象的概念,是一种为了实现这一互联网的超媒体分布式系统的行动指南。利用任何的技术都可以实现这种理念。而实现这一软件架构最著名的就是HTTP协议。通常我们把REST也写作为REST/HTTP,在实际中往往把REST理解为基于HTTP的REST软件架构,或者更进一步把REST和HTTP看作为等同的概念。
今天,HTTP是互联网上应用最广泛的计算机协议。HTTP不是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软件的协议。它不仅仅能够对于互联网资源进行唯一定位,而且还能告诉我们对于该资源进行怎样运作。这也是REST软件架构当中最重要的两个理念。而REST软件架构理念是真正理解HTTP协议而形成的。有了REST软件架构理念出现,才使得软件业避免了对HTTP协议的片面理解。只有正确的理论指导,才能避免在软件开发的实际工作过程中少走弯路。
REST与URI(资源定位)
REST软件架构之所以是一个超媒体系统,是因为它可以把网络上所有资源进行唯一的定位,不管你的文件是图片、文件Word还是视频文件,也不管你的文件是txt文件格式、xml文件格式还是其它文本文件格式。它利用支持HTTP的TCP/IP协议来确定互联网上的资源。
REST与CRUD原则
REST软件架构遵循了CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建(Create)、获取(Read)、更新(Update)和销毁(DELETE)就可以完成对其操作和处理了。其实世界万物都是遵循这一规律:生、变、见、灭。所以计算机世界也不例外。这个原则是源自于我们对于数据库表的数据操作:insert(生)、select(见)、update(变)和delete(灭),所以有时候CRUD也写作为RUDI,其中的I就是insert。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。
REST与网络服务
尽管在Java语言世界中网络服务目前是以SOAP技术为主,但是REST将是是网络服务的另一选择,并且是真正意义上的网络服务。基于REST思想的网络服务不久的将来也会成为是网络服务的主流技术。REST不仅仅把HTTP作为自己的数据运输协议,而且也作为直接进行数据处理的工具。而当前的网络服务技术都需要使用其它手段来完成数据处理工作,它们完全独立于HTTP协议来进行的,这样增加了大量的复杂软件架构设计工作。REST的思想充分利用了现有的HTTP技术的网络能力。在德国电视台上曾经出现过一个这样的五十万欧元智力题:如何实现网络服务才能充分利用现有的HTTP协议?该问题给出了四个答案:去问微软;WSDL2.0/SOAP1.2;WS-Transfer;根本没有。这个问题告诉我们HTTP并不是一个简单的数据传来传去的协议,而是一个聪明的会表现自己的协议,这也许是REST = Representational State Transfer的真正含义。
实际上目前很多大公司已经采用了REST技术作为网络服务,如Google、Amazon等。在Java语言中重要的两个以SOAP技术开始的网络服务框架XFire和Axis也把REST作为自己的另一种选择。它们的新的项目分别是Apache CXF 和Axis2 。Java语言也制定关于REST网络服务规范:JAX-RS: Java API for RESTful Web Services (JSR 311)。相信还会出现更多与REST相关的激动人心的信息。
REST与AJAX技术
尽管AJAX技术的出现才不到两年时间,但是AJAX技术遵循了REST的一些重要原则。AJAX技术充分利用了HTTP来获取网络资源并且实现了HTTP没有的对于异步数据进行传输的功能。AJAX技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了AJAX引擎,其它企业内部的人员,就可以共享该资源了。AJAX技术遵守REST准则的应用程序中简单和可伸缩的架构,凡是采用AJAX技术的页面简洁而又丰富,一个页面表现了丰富多彩的形态。
AJAX技术还使用了一种不同于XML格式的JSON文件格式,这个意义在哪里呢?在REST软件架构下我们不能对于XML文件进行序列化处理,这样程序员必须要使用自己的XML绑定框架。而以序列化的JavaScript对象为基础的JSON已经获得了广泛认可,它被认为能以远比XML更好的方式来序列化和传输简单数据结构,而且它更简洁。这对REST是一个极大贡献和补充。
当前的网络应用软件还违背了REST的“无状态服务器”约束。REST服务器只知道自己的状态。REST不关心客户端的状态,客户端的状态自己来管理,这是AJAX技术的应用之地。通过AJAX技术,可以发挥有状态网络客户机的优势。而REST的服务器关心的是从所有网络客户端发送到服务器操作的顺序。这样使得互联网这样一个巨大的网络得到有序的管理。
REST与Rails框架
Ruby on Rails框架(简称Rails或者Rails框架)是一个基于Ruby语言的越来越流行的网络应用软件开发框架。它提供了关于REST最好的支持,也是当今应用REST最成功的一个软件开发框架。Rails框架(从版本1.2.x起)成为了第一个引入REST作为核心思想的主流网络软件开发框架。在Rails框架的充分利用了REST软件架构之后,人们更加坚信REST的重要性和必要性。Rails利用REST软件架构思想对网络服务也提供了一流的支持。从最直观的角度看待REST,它是网络服务最理想的手段,但是Rails框架把REST带到了网络应用软件开发框架。这是一次飞跃,让REST的思想从网络服务的应用提升到了网络应用软件开发。利用REST思想的simply_restful插件已经成为了Rails框架的核心内容。
REST安全性
我们把现有基于SOAP的网络服务和基于REST/HTTP网络服务作个比喻,前者是一种传统的寄信方式,而后者是现代网络的电子邮件方式。要是是寄信和电子邮件都有病毒存在的话,传统的寄信被送到对方就很危险,而电子邮件是开发的,电子邮件供应商比如Google为我们检查了电子邮件是否有病毒。这里并不是说明SOAP网络服务消息包含义病毒,而是说明HTTP是无法处理SOAP信息包究竟好不好,需要额外的软件工具解决这一问题,包括防火墙也用不上和管不了。
REST/HTTP网络服务的信息包可以被防火墙理解和控制。你可以按照操作和链接进行过滤信息包,如你可以规定从外部来的只能读取(GET操作)自己服务器的资源。这样对于系统管理员而言使得软件管理更为简单。REST的安全性还可以利用传输安全协议SSL/TLS、基本和摘要式认证(Basic und Digest Authentication)。除了这些REST自身的安全性功能外,还可以利用像基于信息的Web Services Security(JSR 155)作为REST不错的补充。
本文来自于infoQ中文站
原文地址:http://www.infoq.com/cn/articles/rest-architecure
http://www.infoq.com/cn/articles/rest-architecure
java060515收录,使用标签:Java,时间:2007-7-19 15:38:38 | 相关网摘,我也收藏
今天与一起翻译Fielding论文的朋友杨光讨论技术问题,杨光认为因为REST是基于文本来进行通信,所以其性能肯定不如基于二进制格式的通信协议好。因为这是一个对于REST的明显的误解,所以我觉得有必要专门在这里澄清一下。以下是我们的讨论内容,David是我,Allen是杨光。
David: 他们客户端用C#,服务器端用Java,准备用RIA+REST+Java的架构。C#也有类似XMLHttpRequest的对象。
Allen: 为啥是这么怪异的结构,都用.net得了~
David: 那是不可能的,企业应用服务器端主要还是用Java。
Allen: 那就都用java
David: C#与Java通信,主要有两种方式:基于SOAP或者基于HTTP。基于HTTP就是REST了。
David: 如果基于SOAP,肯定会影响开发效率。另外性能也会差很多。
Allen: 无论什么方法,性能都要比单一使用一种平台慢的
David: 不会的,REST只用到了HTTP。
David: 单个平台,客户服务器间走二进制的通信协议,性能也许比REST要好,那就与HTTP无关了。不过这样做不够灵活,客户端与服务器耦合太紧。
Allen: 怎么不会呢?rest也没有直接用servlet快啊。
David: REST当然可以直接用Servlet提供服务
David: 但是你基于Servlet,很多日常事务的处理都要自己做,例如URI到处理器的映射。所以最好是有一个框架帮助你做这些事情。
Allen: 一种是通过xml或者json,一种是直接序列化的参数,性能还是不一样吧
David: REST没有说一定要用XML或者一定要用JSON格式,任何基于文本的格式都是允许的。
Allen: 但是肯定不是序列化的
David: 你说的序列化是什么意思呢?
Allen: 我的意思是C#和java通信,走的肯定是语言外的通道,使用rest也是通过语言外的通道传输数据。如果是一个平台,那么就可以走语言内的通道,这个和rest没关系了。
David: 这只是一种猜测。所谓的语言内的通道,对于Java来说,只有RMI,连SOAP都不算。
Allen: 嗯,我也是空想,实际做出来最有说服力。到时候你可以把资讯的经验和我分享一下。
David: RMI是RPC的风格,中间传输二进制数据,性能应该比HTTP的纯文本稍微高一些,但是这样做有很多的代价。
David: 那篇论文将来我们都需要反复多看几次,实际上REST是权衡很多种架构风格之后的结果,已经能够得到最佳的性能了。
David: 性能不单纯取决于传输数据是二进制还是纯文本。我告诉你为什么。
David: 因为二进制数据的语义对于中间组件是不可见的,它就无法做有效的缓存,当然也无法确定此数据是否会对安全构成威胁。
David: REST强调通信语义对于中间组件的可见性,这样可以改善性能和可伸缩性。
David: 所谓的中间组件,浏览器就是一种。浏览器可以根据通信的语义来确定数据有没有发生改变,从而进行有效的缓存。
David: RMI传输数据再有效,它的数据也无法做有效的缓存。因此RMI的性能未必比REST好,况且不能缓存会带来严重的可伸缩性问题。
David: 这些思想其实在论文中都有很详细的描述,你再看一遍就全明白了。
Allen: 这么说也有道理,等有实现rest的经验后,就一切都明白了
http://blog.csdn.net/mozilla/archive/2007/05/23/1622128.aspx
java060515收录,使用标签:Java,时间:2007-7-3 13:41:07 | 相关网摘,我也收藏
buffalo 2.0版本已经正式发布。Buffalo是一个J2EE轻量级AJAX框架,也是国内著名的开源项目。它与DWR 和JSON-RPC一样,着眼于Web远程调用(Web Remoting),其简洁而实用的特性一直以来深受开发者喜爱。 Buffalo2.0最大的特点在于其性能的提升,还有完全自行实现的Java到JavaScript协议转换。得益于新的协议实现以及为大规模AJAX调用而进行的优化,2.0版本比前一阶段版性能有进一步的提高。
2.0最大的关注点在于性能的提升和完全自行实现的java到javascript协议转换。另外,2.0版本要比前一阶段版本最高提升30%性能。这要归于新的协议实现以及为大规模AJAX调用而进行的优化。
2.0版本的新特性:
核心:
重写了整个协议的实现。
支持方法超负载
支持onException, onTimeout事件
文档和Demo:
以它t2t格式重写了所有的文档
文档内容更丰富
改变了Demo站点的颜色样式
Demo站点:http://demo.amowa.net/buffalo-demo/
http://news.csdn.net/n/20070703/106068.html
java060515收录,使用标签:Java,时间:2007-7-3 13:13:47 | 相关网摘,我也收藏
Eclipse基金会已经发布了命名为Europa的2007年度开发工具集
Europa为软件开发者提供了21个各具特色的Eclipse项目。新版Europa的特点列出如下:
新版本在容量上是去年Callisto发行版的两倍
总共拥有17万行代码
来自19个国家,超过310位开放源代码开发者参与
工作量约为5055人年
在新版的Europa中,引人注目的特性包括:
Eclipse Equinox项目已增添了新的服务和功能,可以减少开发和部署应用服务的工作量,同时便于应用运行在Equinox运行时之上。
Eclipse商业智能和报表工具(BIRT)增加了对于动态交叉表的支持,并可以将报表内容输出为Microsoft Word和Excel格式,目前还允许使用Web Services作为数据源。这些新的特性为用户提供了更加完善的报表功能,同时方便用户将其整合在Java应用之中。
Eclipse SOA工具项目(STP)已经可供使用。发布版为用户提供了SOA开发工具,支持SCA和JAX-WS标准,以及BPMN建模工具。
Eclipse Modeling建模项目更新了Eclipse建模框架(EMF)以支持Java 5的属名,使之可以创建并管理更为复杂灵活的数据模型。
Eclipse Mylyn(原先被称作Mylar)添加了新的协作功能来为开发团队提供以任务为中心的协作过程。对于大型应用的开发者,Mylyn提供的面向任务UI减少了信息超载并且简化了多重任务处理过程。
Eclipse动态语言工具(DLTK)为Ruby开发增加了IDE支持,并且提供相应框架来减少IDE环境在进行TCL或Pyhton等其他动态语言开发时的复杂性。
Eclipse CDT发布版做出了众多的改进,包括更为轻松的工具链整合,以及与MinGW的GNU工具链更为紧密的整合,这使得在Windows平台上开发C/C++应用更为方便。
Java开发工具项目(JDT)引入了一系列的特性来增强使用Eclipse进行Java开发的编码效率,包含一个具备超链接的增强调试器,以及新的Quick Access特性来提供更为方便的IDE导航功能。
Eclipse Web Tools项目(WTP)引入众多的特性来提升Web开发者的生产力,包括新的HTML、JSP和JSF的可视化编辑工具,以及为Axis2和JEE 5等新标准提供支持。
业界分析人士也对Europa项目的发布做出了评论。来自于Burton Group的Joe Niski最近对于Europa这款新的工具开发平台这样评论道:
...Europa明确定位于工具开发者以及独立软件供应商们。正如Europa主页中声明的那样“我们正在开发这个同期版本,来支持用户圈的各个成员的需求,帮助他们整合Eclipse框架到其自有的软件和产品之中。”
如果你对模型启动架构和领域特定语言(DSL)感兴趣,如果你的公司里使用类似于Ruby和PHP等动态脚本语言的开发者逐步增加,如果你正在寻找增进分处异地开发者之间相互协作的方法,或如果你已经评估了你的开发工具策略,那么你一定要熟悉在Eclipse Europa工具集中包含的各个项目...
RedMonk公司的Michael Coté同样给出了详细的分析。他指出了3个关键的方面:
针对于平台开发的平台
...Eclipse最主要的任务是提供开发其他软件的平台工具。这些工具可以通过IDE的形式(类似于Java开发工具包JDT,或C/C++开发工具包CDT以及动态语言工具包)或是以开发其他软件的框架的形式出现,而不是现有这些就已是“完成的工具”... 因为Eclipse平台在很大程度上关注于为创建新工具而提供开发工具 ... 如同NASA的案例中,通过使用Eclipse作为工具开发平台而将项目引入成功...
开发者的工具
...Eclipse Mylyn将会对开发者起到不可思议的帮助作用,并且Europa工具集的发行包看起来更是如此。即使你并不立刻通过Mylyn任务相关的特性“得到 Mylyn”,整合的缺陷和任务跟踪系统足以保证一般性的观察任务 ...Data Tools项目(DTP)看起来就像是可以传达外置信息,在Eclipse中实现免费的数据库浏览工具和查询工具... 在Europa中其他精巧的设计以打包的形式出现。Callisto版本包含如何将Eclipse与相关插件关联起来的文档,这些插件作用于Java、 C/C++、企业级开发、移动开发等不同角色,Europa将会包含实时的文档下载。正如一位开发者向我提到的那样,NetBeans总是在这方面表现出 色,如果Eclipse能在这方面有所超越,那就再好不过了...
http://news.csdn.net/n/20070702/106000.html
java060515收录,使用标签:Java,时间:2007-7-3 11:16:15 | 相关网摘,我也收藏
当.NET在2000/2001年第一次发布的时候,Java社区认为它仅仅是从语言以及标准库上对Java的一个“克隆”。我们把二者的简单实例代码进行比较以后就可以很轻易地得出这样一个感受。不过,微软从它多年的Java经验中获益匪浅,并且成功解决了一些Sun现在才后知后觉的问题。Java社区也有人开始认为,.NET和CLR要比Java发展得更加快速。Neil Bartlett称:
我认为微软在CLR上的创新速度更快是非常明显的。举例来说:LINQ就是一个极其强大的新特性(补充一下,它基于Haskell语言的monads);泛型(Generics)在C#中也比在Java中得到更早、更良好的支持(两者的泛型风格都受到Haskell的多态类型类[Polymorphic Type Classes]的启发……嗯!);CLR提供比JVM更好的多语言支持,而且现在它又有了DLR,而JVM上还需要两年时间才能出现能够相提并论的产品。
其它的例子有:模块化以及版本控制,对此.NET采用了Assembly(一些类的集合)离作为基本的部署单元来解决这个问题。Assembly包含了诸如版本信息之类的元数据,与之相反的是Java的Jar文件是缺乏这些版本信息的元数据的。这个缺陷会为那些加载了许多类库,不断增大的大型项目带来许多麻烦。目前,OSGi为这个问题提供了解决方案,而Sun也正在为将类似的解决方案加入Java 7中而忙碌着。
通过增加泛型、自动装箱(AutoBoxing)、枚举类型(Enumerated types)和Annotations等特性,Java语言正在不停地追赶.NET,C#现在提供了对匿名表达式的支持,这个特性是LINQ技术的基础组成之一。LINQ可以被认为是一种针对多种不同数据源的静态类型查询语言,这里说的数据源可以是XML,可以是关系数据库,甚至可以是任意的对象图。与此同时,Java社区还在争论语言的琐碎问题,比如说语言支持的属性(Properties),以及到底四种匿名方法(闭包)的哪一种应该被语言内建支持。
随着DLR的发布,微软再次领先了,这一次是在CLR对动态语言或者脚本语言的支持领域再次开始领跑。Java领域目前还没有能够相对应的措施。Mono项目是一个非常纯净的.NET实现,它的发起者Miguel de Icaza对DLR的特点概括如下:
一个针对动态语言的共享式类型系统;
一个共享的AST,可以被语言开发人员用来创建新的动态语言;
针对编译器开发人员的辅助/工具类;
一个通用的宿主接口,从而可以将通用脚本语言的接口嵌入你的程序中,并且允许开发人员用一种货多种动态语言扩展系统;
控制台支持,DLR甚至提供了一个简单的控制台接口,用于进行交互式编程。
共享式类型系统(Shared Type System)是使动态语言之间能够互动及交换对象重要因素。Jim Hugunin揭示了隐藏在这之后的机制,并且演示了Java是如何处理这种情况,以及DLR是如何独辟蹊径的。Jim Hugunin肯定明白之间的区别的,毕竟他开发了Jython项目,一个基于JVM的Python实现。最近他转向微软平台,并且开发了IronPython(基于CLR的Python实现)。Jim Hugunin是这样解释其中一个问题的:
使用Wrapper(包装器)的方式也可能会有更深层次的问题,挑战之一就是确定需要传递的对象。举例来说:如果Python有一个PyString对象并且它调用了一个需要Object的C#方法,是应该传递PyString对象呢,还是应该将它解包成一个String对象呢?这些非常难以捉摸的类型问题永远都没有一个完美的答案。更糟糕的是,想在程序员不知情的情况下对对象进行包装或者解包,而导致对象标识的丢失而引起的一些超级棘手的问题。
这些问题毫无疑问也存在于Java领域中,比如说JRuby 1.0在Java和Ruby代码间处理字符串传递的方式:
传入Ruby代码的Java字符串将被编码为UTF-8,这暗示了你应该在接收参数的代码中用UTF-8 byte[]来工作。
Ruby 字符串传出到Java时也被假定为UTF-8,Java端调用的返回结果应该符合该假定。
Java领域并没有实现我们上面提到的那些东西,除了宿主接口(Hosting Interface),它将在Java 6中按照JSR 233的规范实现。(Java中的)宿主接口只是一个框架,该框架提供添加新的语言运行时,并对其进行初始化和访问的标准方式。
Jim Hugunin进一步揭示了动态方法分派是如何被处理的,这个过程利用了扩展方法(Extension Methods)以及其它已有的CLR系统。在Java方面,唯一可以相提并论的努力就是JSR 292,其中要做到的一件事就是为了加入一种新的字节码invokedynamic。这个想法来源于Gilad Bracha,他在创建了这个JSR之后很快离开了Sun公司,现在他并不看好这个项目会在短期内有任何解决方案出台:
JSR 292是我为了解决这些问题所发起的一项努力。我希望在缺席的情况下它仍能继续下去,但这个项目还需要若干年才能出成果(如果可能的话)。坦白地说,向JVM为这些特性添加支持,然后使Strongtalk变得更稳定是更为困难的一件事情。
注:Strongtalk是一个Smalltalk实现,其VM是HotSpot技术的基础,而HotSpot技术已经随着Sun的JVM发布很长一段时间了。
本文来自于InfoQ中文站
原文地址:http://www.infoq.com/cn/news/2007/06/java-dlr
http://www.infoq.com/cn/news/2007/06/java-dlr
java060515收录,使用标签:Java,时间:2007-7-2 13:52:14 | 相关网摘,我也收藏
袁红岗是一位低调的技术侠客,他很少出现在公众的视野中,但他的名字却在中国软件界越来越响亮,在每年极少的能与袁红岗面对面的接触中,他带给大家的技术创新却每次都能让人振奋。
6月,在广州的一个技术论坛上,我早早来到了会场,见到了袁红岗,闻名不如见面,看上去远比照片上年轻许多,个头不高,言谈也不多,我忙上前请教了几个问题,袁红岗给我的回答是简约而不简单。让我们一起看看这次袁红岗带给我们的思考是什么。
袁红岗先生除了是中国Java及J2EE核心技术领域公认的技术权威,他也一直在研究Web技术,我问道如何看待最近形势一片大好的REST框架和Ajax时,袁红岗说其实他所研究的Web框架一直也没有背离现在的这些技术,现在研究的Opera Masks就是可以兼容所有集大成的一个项目。
Opera Masks是一个开源的项目,是以JSF作为核心引擎,同时加入丰富的JSF组件和集成开发环境,使Web开发变得更简单和方便,也使未来的RIA应用能更好的利用带宽。
在Opera Masks这个框架下开发软件的时候,不需要你了解什么是AJAX,也不需要你知道如何用JavaScript编程,你只需要遵守JSF的标准,按照流程进行代码编写,出来的应用效果就可以自然呈现Ajax的效果。REST、Ruby等这些热门的技术在Opera Masks下也都是可以直接应用的。虽然Opera Masks仍然还是在服务器端的,但重点是它会随着需求的不同随时生成适合的客户端软件,对现在流行的各类在客户端的应用都可以随时随需的在Opera Masks下生成。
Opera Masks是一个技术创新。上面介绍的对Rich Client的支持只是其中的一部分,还有很多其它的功能。袁红岗说,“目前为止,我认为Opera Masks是世界上最好的Web框架”。因为在这一块儿到现在为止是没有人在做的,而袁红岗已经把这个可以称得上是世界都领先的技术做出来了。
当问道一些关于JSF的问题时,袁红岗谈到很多人其实并没有完全理解JSF。他并不是解决开发问题的,它实际上是一种思想,是一种思想框架。在这样的框架下,能够更容易的适应各种各样的需求。这样就有了顽强的生命力,不管技术怎么变,都能够适应这种变化。所以它生命周期是无限的。JSF的精髓就是“与表现层无关的表现层技术”。
袁红岗说下个月Opera Masks就要正式发布了,对于这次颠覆性的技术创新,相信很多人都和我一样想尽快一睹尊荣,那让我们一起拭目以待吧。【撰文:马沛】
http://news.csdn.net/n/20070629/105895.html
java060515收录,使用标签:Java,时间:2007-7-2 13:50:01 | 相关网摘,我也收藏
Spring IDE的2.0版已经发布。InfoQ有幸访问了Christian Dupuis,Spring IDE的领导之一,以更详细地了解这次的新版本。按照Dupuis的介绍,2.0版中主要的新功能包括:
支持Spring Web Flow——增加了对web flow的验证和图形化编辑功能,并通过对Eclipse Web Tools Project的扩展提供了自动提示和超链接功能。
支持完整的基于XSD的配置——重新改写了Spring IDE内部的bean定义模型,以改善Spring Tooling API。
Spring AOP开发工具——现在对基于和@AspectJ风格的横剖面引用(cross-cutting references)两种方式都提供了可视化支持,另外还有可视化的配置(如pointcut表达式)验证。
若干可用性和用户界面改进——原来的Beans View被一个新的Spring Explorer代替,重构功能也做了加强,现在一些重构操作的对象已经包括了Spring Bean,还增加了一些新的操作向导(如Spring Bean配置文件和新建项目)。
Spring IDE 2.0版的完整更新列表请参阅这里。这一版的Spring IDE还包括了对若干Spring 2.1的语言特性的支持。InfoQ请Dupuis详细谈谈这个方面,他回答说:
Spring 2.1引入了新的bean()pointcut基本元素。Spring IDE 2.0已经能够支持这个新的pointcut基本元素。另外,Spring 2.1增加了在package树中扫描被Annotation标注的类,并自动根据标注的元数据创建Spring bean定义(更详细的说明见此)。Spring IDE 2.0已经支持这个功能。
从制造工具的角度来看,Spring 2.1中的新的仔细斟酌过的命名空间也是有意思的一点。目前新增了和两个命名空间;随后还将进一步地修改和增加新的东西。我们计划在这些命名空间稳定之后立即提供支持。因此时间基本可以确定是在Spring 2.1 RC1和RC2之间。
Spring IDE 2.0还完全支持Eclipse 3.3,Eclipse 3.3预计在在本周晚些时候发布。
InfoQ另外还询问了Dupuis关于Spring IDE支持的Spring子项目的问题。他回答说:
当然Spring IDE 2.0的目标是完全支持Spring 2.0。前面已经提过,我们对Spring Web Flow提供了特别的支持工具。另外Spring IDE 2.0支持由Spring JavaConfig创建的Spring bean配置文件;它甚至还尝试解析JavaConfig从Java源代码创建的bean定义之间的依赖关系。
这一版将全面支持Spring Security(旧名Acegi)的配置。就在Spring Security首次发布的同时,我们已经开始着手为这个非常有价值的扩展提供工具支持。
目前我们对Spring Modules没有任何特别打算。如果社区对此有所需求,我们可以增加对Spring Modules命名空间的支持。Spring IDE 2.0是开放的,可扩展的,这一点很重要。我们遵循Eclipse的模式来定义扩展点,以便其他插件可以贡献它们的功能。通过Spring IDE的扩展点,其他开发者可以自行增加对自定义命名空间的支持而不必改动Spring IDE的代码。基本上只需要给Spring增加一个NamespaceHandler或者一个BeanFactoryPostProcessor。
而且我们还暴露出了为Spring bean定义提供自定义验证规则的扩展点。
最后,Dupuis 被问到Spring IDE的未来计划。他对我们说出了他的想法:
未来我们的团队会提高和改善Spring IDE的使用体验:我们试图更加强调Spring的强大而简单的风格。因此你将会看到Spring IDE和Mylyn之间更加紧密的集成,Mylyn插件可以调整Eclipse的工作空间以帮助人们专注于当前任务。我们将利用Mylyn来调整Spring IDE的XML编辑器里面自动提示的优先次序,过滤Spring Explorer,甚至折叠你的XML bean定义文件中当前不关心的部分。
这些集成工作已经开始了一段时间。在与以Mik Kersten为核心的Mylyn团队的合作下,我们计划大约在本月末Eclipse发布Europa版本(即3.3版)的时候,发布一个Spring IDE和Mylyn集成的预览版。
查看原文链接:http://www.infoq.com/cn/news/2007/06/springide2
http://news.csdn.net/n/20070630/105944.html
java060515收录,使用标签:Java,时间:2007-6-29 12:12:50 | 相关网摘,我也收藏
开始之初的架构设计决定着软件产品的生死存亡。“好的开始相当于成功一半”。
开始的架构设计也是最难的,需要调研同类产品的情况以及技术特征,了解当前世界上对这种产品所能提供的理论支持和技术平台支持。再结合自己项目的特点(需要透彻的系统分析),才能逐步形成自己项目的架构蓝图。
比如要开发网站引擎系统,就从Yahoo的个人主页生成工具 到虚拟主机商提供的网站自动生成系统,以及IBM Webphere Portal的特点和局限 从而从架构设计角度定立自己产品的位置。
好的设计肯定需要经过反复修改,从简单到复杂的循环测试是保证设计正确的一个好办法
由于在开始选择了正确的方向,后来项目的实现过程也验证了这种选择,但在一些架构设计的细部方面,还需要对方案进行修改,属于那种螺旋上升的方式,显然这是通过测试第一的思想和XP工程方法来实现的。
如果我们开始的架构设计在技术平台定位具有一定的世界先进水平,那么,项目开发实际有一半相当于做实验,是研发,存在相当的技术风险。
因此,一开始我们不可能将每个需求都实现,而是采取一种简单完成架构流程的办法,使用最简单的需求将整个架构都简单的完成一遍(加入人工干预),以检验各个技术环节是否能协调配合工作(非常优秀先进的两种技术有时无法在一起工作),同时也可以探知技术的深浅,掌握项目中的技术难易点。这个过程完成后,我们就对设计方案做出上面的重大修改,丰富完善了设计方案。
设计模式是支撑架构的重要组件
架构设计也类似一种工作流,它是动态的,这点不象建筑设计那样,一开始就能完全确定,架构设计伴随着整个项目的进行过程之中,有两种具体操作保证架构设计的正确完成,那就是设计模式(静态)和工程项目方法(RUP或XP 动态的)。
设计模式是支撑架构的一种重要组件,这与建筑有很相象的地方,一个建筑物建立设计需要建筑架构设计,在具体施工中,有很多建筑方面的规则和模式。
我们从J2EE蓝图模式分类http://java.sun.com/blueprints/patterns/catalog.html中就可以很清楚的看到J2EE这样一个框架软件的架构与设计模式的关系。
架构设计是骨架,设计模式就是肉
这样,一个比较丰富的设计方案可以交由程序员进一步完成了,载辅助以适当的工程方法,这样就可保证项目的架构设计能正确快速的完成。
时刻牢记架构设计的目标
由于架构设计是在动态中完成的,因此在把握架构设计的目标上就很重要,因此在整个项目过程中,甚至每一步我们都必须牢记我们架构设计的总体目标,可以概括下面几点:
1. 最大化的重用:这个重用包括组件重用 和设计模式使用等多个方面。
比如,我们项目中有用户注册和用户权限系统验证,这其实是个通用课题,每个项目只是有其内容和一些细微的差别,如果我们之前有这方面成功研发经验,可以直接重用,如果没有,那么我们就要进行这个子项目的研发,在研发过程中,不能仅仅看到这个项目的需求,也要以架构的概念去完成这个可以称为组件的子项目。
2. 尽可能的简单明了:我们解决问题的总方向是将复杂问题简单化,其实这也是中间件或多层体系技术的根本目标。但是在具体实施设计过程中,我们可能会将简单问题复杂化,特别是设计模式的运用上很容易范这个错误,因此如何尽可能的做到设计的简单明了是不容易的。
我认为落实到每个类的具体实现上要真正能体现系统事物的本质特征,因为事物的本质特征只有一个,你的代码越接近它,表示你的设计就是简单明了,越简单明了,你的系统就越可靠。更多情况是,一个类并不能反应事物本质,需要多个类的组合协调,那么能够正确使用合适的设计模式就称为重中之重。
我们看一个具备好的架构设计的系统代码时,基本看到的都是设计模式,宠物店(pet store)就是这样的例子。或者可以这样说,一个好的架构设计基本是由简单明了的多个设计模式完成的。
3. 最灵活的拓展性:架构设计要具备灵活性 拓展性,这样,用户可以在你的架构上进行二次开发或更加具体的开发。
要具备灵活的拓展性,就要站在理论的高度去进行架构设计,比如现在工作流概念逐步流行,因为我们具体很多实践项目中都有工作流的影子,工作流中有一个树形结构权限设定的概念就对很多领域比较通用。
树形结构是组织信息的基本形式,我们现在看到的网站或者ERP前台都是以树形菜单来组织功能的,那么我们在进行架构设计时,就可以将树形结构和功能分开设计,他们之间联系可以通过树形结构的节点link在一起,就象我们可以在圣诞树的树枝上挂各种小礼品一样,这些小礼品就是我们要实现的各种功能。
有了这个概念,通常比较难实现的用户级别权限控制也有了思路,将具体用户或组也是和树形结构的节点link在一起,这样就间接实现了用户对相应功能的权限控制,有了这样的基本设计方案的架构无疑具备很灵活的拓展性
http://hi.baidu.com/hyingj/blog/item/3ec949afbe3a59f9faed5066.html
java060515收录,使用标签:Java,时间:2007-6-29 11:40:34 | 相关网摘,我也收藏
上一篇中我们说到了,如何使用 HttpClient 抓取所需要的数据,接下来介绍一下如何对这些数据进行处理。基本的处理原理是使用正则表达式进行内容的匹配。
为了便于处理,我们首先把使用 HttpClient 抓取到的数据做一些简单的处理。
第一步要做的就是删除回车符,当然我不会写含有回车符的正则表达式才会这么写的,当然如果您有更好的方法也可以不用这么做。
代码很简单:
1protected String removeEnter(String response) {
2 response = StringUtils.replace(response, "\r\n", "");
3 response = StringUtils.replace(response, "\n", "");
4 return response;
5}
接下来就可以使用正则表达式来对所抓取的内容进行匹配了:
正则表达式是一种可以用于模式匹配和替换的强有力的工具,一个正则表达式就是由普通的字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式,它描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。正则表达式在字符数据处理中起着非常重要的作用,我们可以用正则表达式完成大部分的数据分析处理工作,如:判断一个串是否是数字、是否是有效的Email地址,从海量的文字资料中提取有价值的数据等等,如果不使用正则表达式,那么实现的程序可能会很长,并且容易出错。对这点本人深有体会,面对大量工具书电子档资料的整理工作,如果不懂得应用正则表达式来处理,那么将是很痛苦的一件事情,反之则将可以轻松地完成,获得事半功倍的效果。
在这里,我使用了 Jakarta-ORO 作为正则表达式工具来进行匹配。
Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做OROMatcher,是由Daniel F. Savarese编写,后来他将其赠与Jakarta Project,读者可在jakarta.apache.org的网站下载该API包。
因为在这里我们不需要用到太多正则表达式的知识,仅仅是简单的用用而已,所以几行简单的代码就可以解决问题:
protected String match(String response, String template, int index) {
Perl5Util engine = new Perl5Util();
String name = null;
if (response != null) {
if (engine.match(template, response)) {
name = engine.group(index);
}
}
return name;
}
第一个参数 response 表示抓取到的页面源码,第二个参数 template 表示我们预先设定的模板,第三个表示第几个匹配。返回的结果是匹配成功的 group 中的内容。
于是我们可以这样的调用它:
String template = "/(沪综指)〈/font〉〈/b〉〈/a〉 〈span id=\"STK1\"〉(\\d{4,5}\\.\\d{1,4})〈/span〉";
String name = match(response, template, 1);
String index = match(response, template, 2);
注意一下,我们正则表达式前后都有 "/"。
另外,我们用() 括起来的部分表示我们要匹配的内容,所以这里 name 可以匹配到 沪综指,index 可以匹配到大盘的点数。
该匹配对应于: http://web7.jrj.com/homev1/StockIndex.htm
为了防止页面以后打不开了大家找不到,我把其中相关的匹配部分的页面源码也发出来:
〈a href=javascript:ShowImg('000001',2) target=_self〉〈b〉〈font color=#000000〉沪综指〈/font〉〈/b〉〈/a〉 〈span id="STK1"〉3914.20〈/span〉 〈span id="STK2" class="c1"〉〈img src=/HomeV1/images/down.gif width=8 height=8〉164.40〈/span〉 〈a href=javascript:ShowImg('399001',1) target=_self〉〈b〉〈font color=#000000〉深成指〈/font〉〈/b〉〈/a〉 〈span id="STK3"〉12882.17〈/span〉 〈span id="STK4" class="c1"〉〈img src=/HomeV1/images/down.gif width=8 height=8〉701.53〈/span〉 〈a href=javascript:ShowImg('399300',1) target=_self〉〈b〉〈font color=#000000〉沪深300〈/font〉〈/b〉〈/a〉 〈span id="STK5"〉3858.52〈/span〉 〈span id="STK6" class="c1"〉〈img src=/HomeV1/images/down.gif width=8 height=8〉181.96〈/span〉 〈b〉香港恒生〈/b〉 〈span id="STK7"〉21938.22〈/span〉 〈span id="STK8" class="c3"〉〈img src=/HomeV1/images/up.gif width=8 height=8〉232.66〈/span〉 〈b〉道琼斯〈/b〉 〈span id="STK9"〉13414.48〈/span〉 〈span id="STK10" class="c1"〉〈img src=/HomeV1/images/down.gif width=8 height=8〉13.25〈/span〉 〈b〉纳斯达克〈/b〉 〈span id="STK11"〉2612.02〈/span〉 〈span id="STK12" class="c3"〉〈img src=/HomeV1/images/up.gif width=8 height=8〉6.67〈/span〉
〈div id="indexdata"〉〈object id="STKData" width="0" height="0" classid="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83" viewastext〉〈param name="FieldDelim" value="F"〉〈param name="DataURL" value="/HomeV1/text/StockIndex.htm"〉〈param name="UseHeader" value="true"〉〈/object〉〈input type="hidden" id="STKValue" datasrc="#STKData" datafld="a" name="STKValue"〉〈/div〉
因为我不是为了介绍正则表达式而写这篇文章的,所以对正则表达式不会做太多的介绍,如果大家对正则表达式有兴趣或想进一步了解的话可以参考:
JAVA中正则表达式的应用
http://www.ibm.com/developerworks/cn/java/l-regp/part1/index.html
http://www.ibm.com/developerworks/cn/java/l-regp/part2/index.html
本文来自于BlogJava 作者:steady
http://www.blogjava.net/steady/archive/2007/06/28/126937.html
java060515收录,使用标签:Java,时间:2007-6-29 11:37:24 | 相关网摘,我也收藏
在WEB应用下实现定时任务的简便方法
在web方式下,如果我们要实现定期执行某些任务的话,除了用quartz等第三方开源工具外,我们可以使用Timer和TimeTask来完成指定的定时任务:
第一步:创建一个任务管理类,实现ServletContextListener 接口
以下是引用片段:
public class TaskManager implements ServletContextListener {
/**
* 每天的毫秒数
*/
public static final long PERIOD_DAY = DateUtils.MILLIS_IN_DAY;
/**
* 一周内的毫秒数
*/
public static final long PERIOD_WEEK = PERIOD_DAY * 7;
/**
* 无延迟
*/
public static final long NO_DELAY = 0;
/**
* 定时器
*/
private Timer timer;
/**
* 在Web应用启动时初始化任务
*/
public void contextInitialized(ServletContextEvent event) {
//定义定时器
timer = new Timer("数据库表备份",true);
//启动备份任务,每月(4个星期)执行一次
timer.schedule(new BackUpTableTask(),NO_DELAY, PERIOD_WEEK * 4);
// timer.schedule(new BackUpTableTask(),NO_DELAY, 30000);
}
/**
* 在Web应用结束时停止任务
*/
public void contextDestroyed(ServletContextEvent event) {
timer.cancel(); // 定时器销毁
}
}
第二步:创建一个时间任务类
以下是引用片段:
public class BackUpTableTask extends
TimerTask {
private static Log log = LogFactory.getLog(BackUpTableTask.class);
private static boolean isRunning = false;
public void run() {
if (!isRunning) {
isRunning = true;
log.debug("开始执行任务..."); //开始任务
//working add what you want to do
log.debug("执行任务完成..."); //任务完成
isRunning = false;
} else {
log.debug("上一次任务执行还未结束..."); //上一次任务执行还未结束
}
}
}
第三步:在web中添加一个监听器
以下是引用片段:
〈listener〉
〈listener-class〉***.TaskManager〈/listener-class〉
〈description〉要定期执行的任务〈/description〉
〈/listener〉
那么在web服务器启动的时候,任务也被启动,并且会周期性的执行
http://www.ccw.com.cn/soft/apply/programming/htm2007/20070629_279818.shtml
java060515收录,使用标签:Java,时间:2007-6-29 11:29:04 | 相关网摘,我也收藏
Dan Allen 在本文展示了如何使用 Seam Remoting API 和 Ajax4jsf 组件与服务器上的受管 bean 通信……
时下,大多数 Java 开发人员都很看好 mashup,所以您可能会困惑:Seam 与号称 Web 2.0 的技术,尤其是 Ajax,如何能集成。若能使用 Seam 启动 JSF 中的部分页面更新或者用 Google Map 协助 JSF 应用程序 mashup,那将非常酷,不是么?您不仅能这么做,而且还非常容易。
我将为您展示如何使用 Seam Remoting API 和 Ajax4jsf 组件来协助基于 JSF 应用程序中的 Ajax 风格的交互。正如您将会看到的,结合 Seam 和 Ajax 的最大好处在于它让您可以享用所有 Web 2.0 的奢侈东西,而同时又不需要 陷于使用 JavaScript XMLHttpRequest 对象的痛苦之中。借助 Seam Remoting 和 Ajax4jsf,可以与服务器上的受管 bean 通信,就好像这些 bean 与浏览器同在本地一样。浏览器和服务器状态保持同步,而且永远无需处理促成它们之间通信的低层 API。
我首先会为您展示 Seam 是如何推动 Ajax 编程的基于组件的新方式的。您将学会如何使用 Seam Remoting API 来通过 Ajax 进行 JavaScript 和服务器端对象间的通信。一旦理解了这种面向 Ajax 的新(且简单的)方式,您就可以使用它来增强 Open 18 应用程序,方法如下:
在 Open 18 球场目录和 Google Maps 之间创建一个 mashup。
使用 Ajax4jsf 合并应用程序的球场目录页和球场细节页。
重新访问应用程序的 Spring 集成并让 Spring bean 在 Seam Remoting 的生命周期可用。
Open 18 和 Google Maps 之间的 mashup 让用户可以定位地图中的高尔夫球场目录中的位置。将此球场目录和球场细节页合并起来(并将低层代码 Ajax 化)可以让您显示球场的细节信息而无需加载新页。将 Spring bean 和 Seam Remoting 相集成让您可以捕获 Google Maps 位置标记的重定位并能将相关球场的经度和纬度存储到数据库中。如您所见,结果就是会产生所有高尔夫球员都喜欢使用的 Web 2.0 风格的应用程序,这真是让人印象深刻!
如果您曾经深受涉及到大量 JavaScript 的过于复杂的 Ajax 编程之苦,如果到目前为止,您都由于不想面对其复杂性而一直尽量避免使用 Ajax,那么本文所要教授的内容将会帮助您免除这种担心。在重构应用程序时,您需要进行一些 JavaScript 编码,但与大多数 Ajax 实现不同,JavaScript 并不会占据您代码中的大部分;相反,它只扩展了服务器端的 Java 对象。
通向 Ajax 的不同之路
正如在应用程序中希望避免显式的内存管理一样,您亦不 希望必须要处理低层的 Ajax 请求协议。这么做只会带来更大的麻烦(更确切地说,是更多的麻烦),比如多浏览器支持、数据封送处理、并发冲突、服务器负载以及定制 servlet 和 servlet 过滤器。其中您想要避免的最大的麻烦是无意间公开的无状态的请求-响应范例,但该范例是基于组件的框架,比如 JSF,所想要隐藏的。
JSF 生命周期通过对底层的 servlet 模型屏蔽应用程序代码促进了面向组件的设计。为了保持处理 Ajax 的这种抽象性,您可以将低层的这些琐碎工作交由 Seam Remoting 或 Ajax4jsf 处理。这两个库均可负责通过 Ajax 交互将 JSF 组件熔合到浏览器时所需的管道处理。当事件触发时,比如用户单击了一个按钮,消息就会异步发送给服务器上的组件。一旦收到响应,它就会用来对此页进行增量更新。用来处理浏览器和服务器端组件间的交互的低层通信协议都藏于 API 之后。
用户能看到单击按钮后所发生的方法调用的结果。在研究此用例时,有两个要点需要注意: (1) 该页永远无法刷新;(2) 客户端代码与组件上的方法进行透明通信,而不是显式地构建然后再请求 URL。标准的 HTTP 请求在后台使用,但客户端代码永远无需直接与 HTTP 协议交互。
Seam Remoting 和 Ajax4jsf
Seam Remoting 和 Ajax4jsf 是两个独特的库,可分别服务于 JSF 的 “Ajax 化” 的目的。两个库均使用 Ajax 来引入交互模型,其中浏览器和服务器间的通信可以在后台异步发生,并对用户不可见。没有必要为了执行服务器上的方法而浪费用户页面重载的时间。在这些库所发出的 Ajax 请求中由服务器检索到的信息可用来增量地 “实时” 更新页面的状态。两个库均可配备生命周期,此生命周期可以在浏览器需要的时候恢复(restore)组件的状态。这种 Ajax 交互并不是真的请求而是一种 “恢复并执行”。浏览器像是 “敲敲” 服务器的 “肩膀”,请它在服务器端的一个受管 bean 上执行一个方法并返回结果。
虽然这两个库工作起来有些差别,但它们并不是相互排斥的。由于它们都采用的是 JSF 组件模型,所以二者可以很容易地相互结合,这将在本文后面的部分详细介绍。目前,我们只需分别考虑二者各自将 Ajax 风格的交互引入 JSF 应用程序的方式:
Seam Remoting 提供了 JavaScript API,可以使用这些 API 来像访问本地对象一样来访问 JavaScript 中的服务器端组件,以便通过方法调用发送和检索数据。Seam Remoting 使用定制的、非 JSF 生命周期来使该浏览器能够与服务器端的组件通信。只有 Seam 容器和其组件可以在这些请求期间被恢复。透明协议是 Ajax,但您无需费心数据包如何传输的细节。
Ajax4jsf 则通过完全隐藏 JavaScript 的使用让抽象更进了一步。它将所有逻辑都包裹在基本 UI 组件内。Ajax4jsf 通过完整的 JSF 生命周期接受 Ajax 请求。因而,支持 Ajax 的组件可以在不触发浏览器导航事件的前提下执行动作处理程序、升级 JSF 组件树以及重新呈现该页的某些部分。同样地,通信也是通过 Ajax 实现的,但所有这些均在后台发生,页面开发人员不可见。Ajax4jsf 面向组件的方法让 Ajax 功能得以成为 JSF 很自然的一部分,而不是格格不入的外来者。
我将深入探究这些方式,但我们还是先来看看 Ajax 的基础知识吧。
本文来自developerWorks 中国
原文链接:http://www.ibm.com/developerworks/cn/java/j-seam3/index.html
http://searchwebservices.techtarget.com.cn/tips/472/3407472.shtml
java060515收录,使用标签:Java,时间:2007-6-28 12:49:36 | 相关网摘,我也收藏
Apache最近宣布了Apache CXF 2.0的发布。Apache CXF提供了一套创建SOA服务的基础设施框架,用户由此可以按照自己喜欢的编程模式,利用Apache CXF提供的简单易用工具(包括Maven插件),创建适合SOA环境的任何WEB服务,包括SOAP/HTTP服务及REST/HTTP服务。Apache CXF可扩展的插拔式架构不但支持XML消息格式和HTTP通信协议,而且还支持基于其他通信协议如IIOP和非XML消息格式如CORBA CDL或JSON。
Apache CXF项目是由Objectweb Celtix和Codehaus XFire在一年前合并成立的。Objectweb Celtix是由IONA公司赞助、于2005年成立的开源Java ESB产品,XFire则是业界知名的SOAP堆栈。合并后的Apache CXF融合该两个开源项目的功能精华,提供了实现SOA所需要的核心ESB功能框架,包括SOA服务创建,服务路由,及一系列企业级QoS功能。此次发布代表了Apache CXF开发人员及社区用户一年的努力结果,并标志 Apache CXF软件的进一步成熟,成为实现SOA的优秀技术解决方案之一。
Apache CXF实现了JCP及Web服务的主要技术标准,大大方便了用户使用不同编程模式进行SOA服务开发,并为企业遗留系统的集成提供了可扩展性。Apache CXF支持的主要技术标准及功能包括:
多种技术标准。Apache CXF完全实现了多个JSR标准,包括JAX-WS 2.0(JSR-224) 、Java Web服务元数据(JSR-181)、和SAAJ (JSR-67)。Apache CXF 2.0发布还通过了JAX-WS 2.0 TCK,成为开源社区继JAX-WS RI之后的第一个通过JAX-WS TCK的SOAP堆栈。Apache CXF还实现了多个Web服务标准,为用户实现企业级的Web服务提供了广泛的支持,这些 Web服务标准包括SOAP 1.1、SOAP1.2、MTOM/XOP 、WSDL 1.0、WS-Addressing、WS-ReliableMessaging 、WS-Policy,WS-Security及WS-I Basic Profile。
多种编程模式。为方便用户按照自己喜欢的方式创建web服务,Apache CXF提供了多种web服务开发模式。除了完全支持JAX-WS 各种编程模式如client/server、同步、异步 、单程及动态调用接口,Apache CXF还支持JavaScript及ECMAScript 4 XML(E4X) 编程。Spring用户可以很容易地按照 Spring编程方式快速创建并部署web服务。传统的Java开发人员则可以通过注释(Annotation)方便地进行web服务开发,喜欢POJOs 的Java开发人员更可直接配置并部署基于POJOs的web服务。更值得一提的是,通过Apache Yoko,用户不需要任何CORBA编程知识就可以轻松地把现有CORBA 应用转化为web服务,或开发客户端与现有CORBA应用直接交互。
多种通信协议及消息格式。Apache CXF支持多种通信传输协议,包括HTTP/HTTPS、JMS、 Servlet及同一JVM内通信,并提供了SOAP或纯XML通信消息格式(payload) 支持。同时,Apache CXF具有创新意义的REST/HTTP支持也大大方便了用户创建真正符合REST风格的web服务。对于那些需要重用IT遗留系统的用户来说,Apache CXF可扩展的插拔式架构允许定制开发并混合使用任何类型的通信协议及通信消息格式。
支持多种容器部署。基于Apache CXF的web服务可以单独运行,也可部署在多种容器里,包括轻量级容器如Tomcat及Spring ,JEE容器如Geronimo, JBOSS, WebLogic等。同时,Apache CXF web服务还可以服务引擎方式部署于JBI容器如ServiceMix或OpenESB 。SCA容器如Apache Tuscany的支持也在计划之中。
目前,与Apache CXF类似的开源项目有Apache Axis2,JBOSS ESB和Sun的Metro项目。据Apache CXF社区宣称,Apache CXF以其性能和插拔式架构的优势正与其他开源项目区别开来,引起许多SOA编程高级用户的注意。
本文来自InfoQ中文站
原文链接:http://www.infoq.com/cn/news/2007/06/apache-cxf2-jax-ws
http://news.csdn.net/n/20070628/105826.html
java060515收录,使用标签:Java,时间:2007-6-28 12:44:12 | 相关网摘,我也收藏
昨天晚上写了Eclipse3.3的新特性,心中异常兴奋,想快点用到现有的产品开发框架中,于是开始把玩最大化最小化的新特性。
研究了整整一下午也没有发现有什么方法可以设置一个Viewer让它在透视图启动的时候自己做最小化,其实刚开始思路是不对的,不应该考虑让Viewer自己有什么变化;Viewer的大小,位置都是在透视图中设置的,它自己是没有任何能力干涉的。
在Eclipse的新闻组中咨询了一下PW告诉我org.eclipse.ui.perspectiveExtensions扩展点,提供了定义Viewer最小化的属性,而且这个属性是Eclipse3.3新增的,只要有就好办~有样学样!
拉出来PerspectiveExtension管理注册代码读读就明白了~原来:
1 public void createInitialLayout(IPageLayout layout) {
2 } 透视图类中的IPageLayout的实现类是PageLayout,晕死,在Eclipse的API中竟然没有人告诉我~
于是只需要这样就可以让一个Viewer在透视图启动时做最小化了,如果你用的是Eclipse3.3开发RCP程序,那么就可以非常方便的给客户在一个透视图中展现多个Viewer了~
代码如下:
public void createInitialLayout(IPageLayout layout) {
PageLayout pageLayout = (PageLayout)layout;
//layout.addView(ViewPart1.class.getName(), IPageLayout.LEFT, 0.35f, layout.getEditorArea());
pageLayout.addView(ViewPart1.class.getName(), IPageLayout.LEFT, 0.35f, layout.getEditorArea(), true);
} Eclipse开发团队其实就是在IPageLayout实现类中追加了一个方法~哎~什么遵循接口编程~他们竟然不修改接口~希望正式版发布的时候这个问题有修改~
距离Eclipse3.3正式发布还有2天~大家拭目以待吧~
本文来自于BlogJava 作者:阿南
http://www.blogjava.net/leeguannan/archive/2007/06/27/126674.html
java060515收录,使用标签:Java,时间:2007-6-28 11:08:01 | 相关网摘,我也收藏
我们知道 XML+XSLT就可以直接输出到支持XML的浏览器上,如IE 5.0以上,但是,我们还要考虑到有不少浏览器不直接支持XML,在这种情况下,我们需要在服务器上进行转换成html输出到浏览器,这种临时过渡办法恐怕要