演讲人:浙大高分子物理郑强教授
地点: 浙江图书馆报告厅
精彩语录节选:
“在中国这个发展中国家,你能建10所世界一流大学,那美国有多少所?日本有多少所?现在的实际状况是:世界上前200所大学,中国一所都排不进!在亚洲能排出几所?我到国外去看了以后,感到要将浙大建成世界一流大学就像共产主义理想.“
“以前说“无知无畏“,现在却是“无知才无畏“,许多企业把浙江省技术监督局、科委的人请来吃一顿饭,喝一点酒,他就给你签个字,再把我们这些教授胁迫到那里去,给你盖个章,然后就是“填补国内外空白“、“国际先进水平“,写论文则是“国际领先水平的研究成果“、“首次科学发现“等等,这都是目前非常严重的问题!作为一个大学教授,我深深地为此担忧!这不是我们的责任,是我们的领导无知,是他们倡导了这个主流.我知道在座的处长或老总日子很难过,因为你们不写这样的报表,就拿不到钱,项目就得不到批准.教授也同样如此,天天写报告,而不是在实验室静下心来好好搞研究,这是很严重的!“
“我们国家的现实和发展就是这样:凡是依赖不成的,我们自己都能搞得像模像样,比如二弹一星;凡是能够引进的,就都搞不成.......现在很多合资企业就这样,卖点东西,而没有去考虑这些深层次的东西.殊不知,这就是社会的恶性循环!“
“我认为:语言、计算机就是工具.中国的外语教授讲英语还不如美国卖菜的农民!怎么看待这个问题?日本博士、德国教授说不出英语的多得是!我们怎么能说一个人不会说英语就是文盲呢?语言就是一个工具!你没有那个环境,他怎么能讲这个语言呢?......如果我是教育部长,我要改革二件事:第一,取消六级考试,你一个研究生连中文一级都不及格,你英文考六级干什么呢?看看研究生写得论文,自己的民族文化都没有学好,天天考英语──打勾:托福打勾,GRE打勾,英文考出很高的分,可哪个写的英文论文在我面前过得了关呢?过不了关!这样培养出来的人能干什么?自己搞的专业一点都没学好!......说不会计算机就是文盲,这又是一个误区!我现在是教授,我顾不上搞计算机!“
“你看我,从高中开始学英语,大学学,硕士学,博士学,花了我多少精力!你说中国人怎么做得出高科技的研究成果?我这几天就教训我手下的几位女学生,问她们在干什么,看不到人影,一天到晚考这样、考那样的,到美国去干什么?在国内要干的事多着呢!你整天考英语,美国人连报个名都要收你们的钱,日本人也是如此,中国学生到日本去要交手续费,到日本留学是为日本人打工,好不容易挣点钱交了学费,读完博士在日本的公司就职,当劳动力,挣了一笔钱后要回国了就买了家电,把钱全给了日本人.你们都没有注意这件事,这里面都是经济问题.这就是素质教育到底是什么.“
“中小学的教育就是听话,老师管干部,干部管同学,孩子们都学会了成年化的处世方式,这是害人啊!这样强迫性地做了一些好事后,没有把做好事与做人准则结合起来去培养,而只学会了拍马屁、讨老师喜欢、说成人话.上次电视上就曾经播出,一个小孩得了个奖,主诗人问他最愿意说什么,他说:“我最愿意跟江爷爷说:我向你报告!““江爷爷“是谁?还不是老师教的!孩子们在中小学活得很累,到了大学就没人管了,所以就要玩、就要谈恋爱.
“我们有很多同学成绩好,却什么都做不了.在我们大学像我这种程度的人,招博士生是从来不看成绩的,成绩算什么!现在我从事的这个领域在中国有叁个杰出的人才,当初在读研究生时都补考过,而成绩考得好的几个人却都跑到美国去卖中药了,这说明了什么问题?作老板的可不能这样啊!......人才的梯队一定要合理,而不要认为教授就是万能的、博士就是万能的.中国的教育体系就是让每一个老百姓都充满希望和理想,教育孩子们要树立远大的理想.实际上,人的能力是不一样的,扫地能扫好,也应该受到尊重;打扫厕所能打扫干净,也应该受到尊重,不能动不动就要高学历.我要提醒的是:在国外可不是这样,美国、日本的博士就很难找到工作,为什么?因为老板心疼钱,招了博士要给他高工资,而他能做什么用呢?这是个具体问题.“
“科技到底该干什么?高科技到底该干什么?如果我是科技部长,该玩的就玩,就像陈景润,他就是玩!陈景润如果是处在今天的中国,他绝对是要去讨饭的,因为他不会去搞产业化,他的英语也不好,他说话都不流利,中文都讲不好,按现在“标准“,他是个文盲,还谈什么教授!日本人就是喜欢美国人,我跟日本人说:你们这个民族爱谁,谁就要向你们扔原子弹.日本人就是喜欢黑人也不喜欢中国人.......我特别对我们的女教授、女同学说:在日本人面前一句日文都不要讲,会也不要讲;日本人一听说你讲英文,特别是看到中国女孩讲英文,腿都要发软,这是真的!“
“中国人为什么这些年都往外跑,最重要的是要让国民自己爱自己国家.......如果我是杭州的市长,我绝对不是狭隘的民族自尊心──如果杭州有什么灾难,我就首先把杭州的老百姓安排在香格里拉,让外国人在外面排队!(掌声!)这样,你才会让你的国民爱自己的国家!一个日本的农民跑到峨嵋山去玩,骨头摔断了,你就用中国空军的直升飞机去救他,而在日本大学一名中国留学生在宿舍里死了7天才被发现;名古屋大学的一对中国博士夫妇和孩子误食有毒磨菇,孩子和母亲死了,父亲则是重症肝炎,在名古屋大学医学院的门诊室等了12个小时,也没有一个日本教授来看望!而你们为什么还要这么友好,以为自己很大度,实际上是被人家耻笑,笑你的无知!你们这个民族*!我们不能这样!我们的领导人跑到国外去访问,看到有几个人在欢迎他们,就感到挺有面子;而外国来了个什么人物,都是警车开道,这究竟是怎么回事?这让我们中国人感到是自豪还是悲哀?所有这些,对教育工作来讲,都是深层次的问题.所以我经常讲,我作为一位自然科学工作者,我教育我的学生,首先是学会做人,没有这些,你学了高分子,外语都是花架子,你不是一个完整的人!“
“一个观念或是一个问题:是不是技术越新越好?今天谈的就都是提醒大家的......技术并不是越新越好,技术要有储备.日本的企业现在卖的东西大都是10年或15年前的技术,好东西他不拿出来,他要等到现有的技术把成本收回并获得尽可能高额的利润以后才会拿出来.其次,我的对手什么时候推出新东西时,我才会出手.不要以为你今天好不容易搞了生产线,明天又有新的了,你的钱还没赚到就换新的,有什么用?我这次到日本刚好谈到悬浮列车──即使何先生在我也要说,这是中国人又在玩高新科技.悬浮列车目前在理论上都还不成熟.日本现在最完善,最经济的就是新干线!
从经济和市场的概念来讲,越先进的东西,风险越大,有可能得到的回报就越少!"
posted @
2006-05-19 14:23 崛起的程序员 阅读(148) |
评论 (0) |
编辑 收藏
java.lang.NoSuchFieldError: tokenTypeToASTClassMap
at org.hibernate.hql.antlr.HqlBaseParser.buildTokenTypeASTClassMap(HqlBaseParser.java:4224)
at org.hibernate.hql.antlr.HqlBaseParser.<init>(HqlBaseParser.java:107)
at org.hibernate.hql.antlr.HqlBaseParser.<init>(HqlBaseParser.java:112)
at org.hibernate.hql.ast.HqlParser.<init>(HqlParser.java:47)
at org.hibernate.hql.ast.HqlParser.getInstance(HqlParser.java:42)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:203)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)
at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:422)
at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:383)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286)
很简单:查看antlr.jar这个包,把它替换成与当前版本hibernate统一的antlr包,其实也就包的版本不同一所造成的。
posted @
2006-05-18 20:07 崛起的程序员 阅读(821) |
评论 (0) |
编辑 收藏
1、新建一个启动画面Window类
2、调用prepareSplash()函数,初始化启动界面
- private void prepareSplash()
- {
- Toolkit toolkit = Toolkit.getDefaultToolkit();
- windowSplash = new Window( this );
- Image image = toolkit.getImage( "images" + File.separator + "splash.gif" );
- ImageCanvas canvas = new ImageCanvas( image );
- windowSplash.add( canvas, "Center" );
- Dimension scmSize = toolkit.getScreenSize();
- int imgWidth = image.getWidth( this );
- int imgHeight = image.getHeight( this );
- windowSplash.setLocation( scmSize.width2 - (imgWidth2), scmSize.height2 - (imgHeight2) );
- windowSplash.setSize( imgWidth, imgHeight );
- }
3、在Application的JFrame类(主界面)中调用startSplash(),显示启动界面,然后初试
化JFrame的各个可视化组件,初始化后台数据库等(如数据库的连接)
- private void startSplash()
- {
- windowSplash.setVisible( true );
- windowSplash.toFront();
- }
4、在所有的初始化工作完成之后,调用stopSplash()函数,停止显示启动画面
- private void stopSplash() {
- windowSplash.dispose();
- }
posted @
2006-05-18 13:11 崛起的程序员 阅读(271) |
评论 (0) |
编辑 收藏
作者:金蝶中间件公司CTO袁红岗
不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。
1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。
2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。
3. 最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
4. 不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
6. 多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
7. 良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。
8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。A good programming is 99 weat and 1ffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个 10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。
这些是我这几年程序员生涯的一点体会,希望能够给大家有所帮助
posted @
2006-05-16 14:35 崛起的程序员 阅读(298) |
评论 (0) |
编辑 收藏
创业者要遵循的5个基本做事方法
|
|
对于想创业的人,我对他们的提醒是:不要被成功企业所编写的创业故事所迷惑,因为那里讲的都是一个企业成长过程中过五关斩六将的最精彩的部分。作为创业者,有5个很基本的做事方法你必须遵循。
我鼓励大家创业,但鼓励大家创业不等于盲目创业。对于想创业的人,我对他们的提醒是:不要被成功企业所编写的创业故事所迷惑,因为那里讲的都是一个企业成长过程中过五关斩六将的最精彩的部分。你要用自己的头脑去思考,去学习。作为创业者,有5个很基本的做事方法必须遵循:
第一,一定要有激情和理念,你才能感染自己和其他人。在最困难的时候,在所有人绝望的时候,你要感染你的客户,感染你的员工,感染你的合作伙伴……你要感染所有人!
第二,要专注。别说小公司,大公司多元化也有失败的例子,小公司更应该抓准一个点把它做深、做透。这样才能积累所有的资源。小公司到处试验,会让你的企业耗尽很多资源。专注就是有所不为才能有所为,这点非常重要。
3721坚持了6年,一直坚持做中文上网、中文搜索,我就做这一件事情;Google也是很专注,有了一定的积累以后才能横向扩展。很多创业者都栽在不够专注上,是因为他自己脑子里面没有想清楚,今天在这儿打一口井,明天在那儿打一口井,最后哪儿也没有挖出水,地面上只是留下了许多坑而已。你5个指头都叉开和一个拳头是不一样的,专注就是你把所有的资源都凝聚在一个点上。
第三是执行力,很多创业者很容易在这里摔跟头。我见过很多人夸夸其谈,估计他们创业,至少第一次肯定都不会成功,因为我觉得真正的创业者要少说多做,要把自己美妙的想法努力转化成结果。
创业者做事情着眼点要低,要现实。很多创业者去见风险投资人的时候,说起自己的事业都说得云山雾罩的,其实这样会让风险投资人根本不明白你在说什么。你只要踏踏实实地说你想做什么,这个东西能解决什么问题就可以了。
想法只是一个开头的方式,是不值钱的。我们坐在这儿,一个小时可以天马行空,弄出几十个想法来,脑子稍微一转,你的思想已经在宇宙走了好几个来回了—- 行动的成本才是最高的,对创业者来讲要看自己是不是有这种经验和执行力。同样的想法两个人同样做,谁的执行力更强,谁的经验更丰富,谁就更容易成功。
第四,创业者还要有一种胸怀,就是所谓与时俱进的学习能力。我看到很多人创业不成功就是因为他们太自负,不能从成功人士那里学到一些优点,听不进好的建议。很多创业者没有经验,没有经验不可怕,问题是你有没有谦虚、开放学习的心态,使你不能与时俱进。很多创业者会陷入一个死循环,他们通常认为自己看得准,才是出手的前提;积累经验越多,才能越看越准。但你没经验,又怎么可能看准?
解决这个问题有办法,时机不成熟,就不创业,先给别人打工。把公司让我做的事情做好,提高自己的能力,逐步就知道创业的方向了。我不赞成年轻人刚毕业就创业,我认为他们还是应该在公司里踏踏实实干五六年,虽然是打工,实际上是公司在给你“缴”学费,你在不同的平台通过积累经验,这是任何老板剥夺不走的,只有积累这种经验,你的创业能力才更高,才更有把握。我在方正工作时,从来没有觉得自己是打工,我一直认为自己是在创业,因为我觉得是在积累自己的能力,积累自己的资源。客观上,我对方正还是作了很多贡献。我到雅虎还是一种创业的心态,我把雅虎的文化改成创业的文化,因此雅虎中国在2004年取得了很好的业绩。保持良好的心态,这是你创业成功的前提。
第五,不要盲目去模仿和抄袭大公司的做法。比如,很多人在新浪、搜狐做过,他出来就会不自觉按照大公司的做法建立一些规范制度等,但大公司为了稳妥,一般都比较慢。大公司为这个“慢”付得起代价,小公司不能用大公司的这种做事方法。我讲过大象和兔子的故事:大象和骆驼3天不吃也没事,但是新创业的公司像小兔子一样,每一步都要跑得快,要到处找食。本来就是个兔子,却以为自己是个大象,用大象的心态做事,在狼面前慢慢踱步,最后就会被狼吃掉。创业意味着你要有创业的做事方式。
如果你跟大公司做一样的事,他的实力很强,跟他比是没有优势的。因此,如果把整个产业画成一张地图,你可以看哪些领域被谁占了,谁有什么优势。你应该找一个不在这张地图上的事情去做。比如说,前几年大家都不重视的搜索,现在就做起来了。创业公司应该踏踏实实把自己的事做好,不要在自己很小的时候就想要通吃,要颠覆,要灭掉谁,这是没有意义的。小公司要学会跟大公司合作,要学会广交朋友,在这个产业链跟别人合作,会使自己成功得更快一些。
周鸿祎:1970年10月生于湖北,1995年毕业于西安交大管理学院系统工程系,获硕士学位。曾就职方正集团,先后任研发中心副主任、事业部总经理等职。1998年10月,创建3721公司。2003年3721被雅虎收购,2004年3月出任雅虎中国总裁。2005年7月6日,宣布将于8月31日正式辞去雅虎中国总裁一职。9月1日,他将以投资合伙人的身份正式加盟IDGVC(国际数据集团风险投资基金)。
|
posted @
2006-05-16 10:53 崛起的程序员 阅读(223) |
评论 (0) |
编辑 收藏
Eclipse Communication Framework (ECF) 是一个新的ECLIPSE项目,目的是为了提供一个开源的通讯框架,让开发者可以更容易开发出通讯相关的项目。
IBM的文章Getting started with the Eclipse Communication Framework 介绍了ECF,同时告诉我们如何开始使用ECF,同时还提供了一个基于Yahoo IM 的例子。
Getting started with the Eclipse Communication Framework
http://www.ibm.com/developerworks/opensource/library/os-ecl-commfwk/?ca=dgr-jw22ECF
下载地址
http://www.eclipse.org/ecf/downloads.html
引用页 http://www.eclipse.org/downloads/download.php?file=/technology/ecf/org.eclipse.ecf.sdk-0.8.0.S20060507.zip
安装完毕插件后,起服务目录在
$:\eclipse\features\org.eclipse.ecf.serverfeature_0.8.0\bin
startserver.cmd
然后打开eclipse 菜单ECF链接选择协议ecf generic 后设置服务器url例如http://localhost:3282/server,输入别名
进入强大的聊天室.让我们一起XP 编程吧
posted @
2006-05-12 17:41 崛起的程序员 阅读(1051) |
评论 (0) |
编辑 收藏
posted @
2006-04-30 09:36 崛起的程序员 阅读(426) |
评论 (0) |
编辑 收藏
web2.0定义是什么?
web2.0定义是什么?这是一个简单直接但又是最核心的问题,讨论web2.0的文章层出不穷,内容包括如何实现web2.0, web2.0如何盈利, web2.0如何击败web1.0等。但没有多少人愿意讨论web2.0的定义,也没有多少人讨论web2.0已有的定义存在什么问题。没有清晰理性的定义,我们的讨论就像唐吉珂德骑着毛驴冲向他心目中的怪兽-大风车一样。可笑而又毫无意义。
翻阅搜索引擎带给我们关于web2.0的海量资料,找到了Blogger Don的“WEB2.0概念诠释”,他写道“Web2.0是以 Flickr、Craigslist、Linkedin、Tribes、Ryze、Friendster、Del.icio.us、43Things.com等网站为代表,以Blog、TAG、SNS、RSS、wiki等社会软件的应用为核心,依据六度分隔、xml、ajax等新理论和技术实现的互联网新一代模式。” 这个定义把一些让人眼花缭乱的前卫名词和计算机专用术语堆砌在一起作为WEB2.0概念诠释,。把应用,协议,语言格式混杂在一起来描述WEB2.0概念。定义者要么对计算机知识一知半解,要么是企图让人们的感到神秘从而对其顶礼膜拜。按照其定义的方式对“国家”这个概念进行诠释,那国家就是“以中国,法国,美国,俄罗斯,土耳其等集合体为代表,以军队,警察,文官系统,议会等社会团体的应用为核心,依照量子力学,马斯络需求层次理论,混沌学等新理论和技术实现人类社会的聚集模式。“,多么荒唐的的定义
一个新概念或新理论不可能从石头里蹦出来,也不会超越我们的时代凭空想象。他必然有自己的历史传承。理解WEB2.0,我们要了解WEB甚至是bbs的历史。 World Wide Web,简称WWW,由英国人TimBerners-Lee 1989年发明。通过WEB把互联网上的资源在一个网页里直观的表示出来并通过网页相互连接。在web之前,互联网相当数量的文档资源是存放在bbs上。通过对bbs发展历史的研究,我们发现web时代的内容服务网站主要是从bbs的功能中演化而成。
BBS诞生于70年代末,那时还没有浏览器,搜索引擎,甚至没有个人网站。我们在BBS上可以做四件事1。发布新闻 2。发布交易信息 3。发布个人感想,心情描述4。互动式问答 前三个功能逐渐从bbs中分离出去,发展成三个方向的网站----新闻类,电子商务类和博客类,这三类网站经过整合逐渐成为各自的门户。如新浪,易趣,博客中国。第四个功能互动式问答正在分离,但还没有出现该领域的门户网站。如www.ideacool.net ,新浪的爱问,小i等网站。我们可以把这一类网站模式称之为威客模式,英文名witkey。
我们应该已注意到1。新闻类网站。2.电子商务类网站 与3。博客类 4。威客类网站的功能和形式上有一个明显的鸿沟。这个鸿沟就应该是web1.0 与web2.0的划分界线。 新闻类网站和电子商务类网站为代表的web1.0时代是以信息接收者为中心,免费分享信息的时代。博客类和威客类网站为代表的web2.0时代是以信息提供者为中心。互联网用户能够管理个人的资料和信息。通过各种途径让自己的智慧,知识,经验,技能体现价值。简而言之,web2.0的定义就是提供一种平台让个人的智慧,知识,技能体现价值的一种互联网新模式。这种模式的表现形式主要为博客类,和威客类两种。实现的支撑包括互联网技术,信用制度,支付制度等。
--------------------------------------------------------------------------------
Web2.0的盈利点
主要集中在威客模式上:
1. 威客模式面向的对象主要是有专业专长的用户如科学家,工程师,医生等,博客面向的是善于表达个人观点和思想的用户如记者,娱乐明星,专栏作家等等。
2。个人的知识,技能,智慧可以体现价值。其中“体现价值”不一定指获得经济利益,获得受帮助者的赞扬,获得公众的认可也是体现价值的方式之一。但让参与者获得经济利益是威客模式的重要特点。
3。个人的知识,技能,智慧可以体现价值,但不代表参与者一定能够获得收益,这要取决于其知识,技能的含金量,可以说,能力越大,收益越大。
4。威客模式的建立需要实践该模式的平台建立信用制度,支付制度,例外处理制度等等。这些制度是否完善是该平台能否持续发展的决定性因素。
5。威客模式也是人类大脑通过互联网协同工作的一种模式。
6.为威客提供服务的平台通过分享威客交易知识的收益获取利润。
posted @
2006-04-30 09:30 崛起的程序员 阅读(214) |
评论 (0) |
编辑 收藏
进入2004年,伴随着各种机遇和挑战,中国的软件开发仍然在摸索中前进,程序员也在不断的学习和工作中探寻自己的未来。在这个过程中,当然少不了各种技术和公司对他们施加的影响。跟随谁,选择什么路线永远是一种充满未知数的挑战。
谈到影响,可能以微软为首的软件巨头更容易被提及,毕竟开发人员所直接应用的操作系统、语言、开发工具等各种技术都掌握在这些公司手中。然而,这并不能抹杀和妨碍提起国内一些企业和人士对中国软件开发各方面产生的影响。
站在这个角度,本刊在国内的软件企业和个人中评选出了如下20位人士,他们对近期软件开发产生了一定程度的影响。选出这些人,也是为了抛砖引玉,让国内的开发者更了解自己正在经历的变化和面临的挑战。
在这些人员中,有些属于早一代的程序员,他们创造的业绩激励了很多程序员进入软件开发。鲍岳桥就是一个,尽管现在他已经成为了联众的总裁,但之前从UCDOS步入辉煌,Windows时代一度面临困境,最终凭借网
络游戏
成功
转型
,这种以技术创业成功的例子对中国的程序员来说就是巨大的诱惑。
与此同时,很多人从软件教育方向在逐渐改变整个软件行业的人才结构,这一说法毫不夸张。青鸟APTECH就是将印度软件教育模式带到中国来的典型,尤其是在中国软件人才结构并不合理的情况下,他们所做的工作也是有益的尝试。
而且,面向未来的眼光也必不可少,很多人所做的工作带来的变化现在还不显著,但对未来可能会产生相当的影响。比如,中国软件人才的培养结构在逐渐向国际化靠拢,软件学院功不可没。更为超前的是,为了探索未来中国软件在底层技术上的引导性,有很多人在做努力,从Linux在中国的推广,到科泰世纪打造自己的操作系统和开发平台,尽管这些尝试可能会失败,但带给我们的是经验和深入的思考。
现在,有人说程序员面对着太多的头绪,已经迷失了方向。的确,是有一些人迷失了方向,但这里的20位人士能够让我们以更清醒的眼光看待中国的软件开发,了解我们取得的成绩和面临的挑战。
开国元勋
严援朝
所属公司:新浪网
入选理由:开发第一个中文操作系统CCDOS,参与创办四通利方,掌控最大的中文网站新浪网技术总架构。
“做软件就是在不断地明确目标,就是搞清楚你的GO 是什么,所有的软件都逃不出那三句话——IF、THEN、 ELSE。棒的程序员很快能够知道自己的GO是什么,没长进的程序员老也弄不清楚自己到底要干嘛,所以永远处在 学习过程中,手里永远拿着一本书,永远在学,永远也学不会。”这是严援朝很经典的一句话,甚至有程序员把这作为自己的座右铭。作为中国第一代程序员的象征,他如今依然负责在新浪网的整体技术架构上。不知是不是严援朝怕别人忘记自己,不久前,从新浪网炮制出了两篇文章,大谈自己的一些深奥看法。其实如果单纯是这种原因,应该大可不必,因为严援朝在中国软件开发史上奠定的地位无人可撼。
求伯君
所属公司:金山软件
入选理由:软件领域的常青树,以榜样的力量激励众多程序员。
每一个听到这个名字的程序员,都会有一种莫名的激动和敬仰。从金山成立的那一天起,公司的招聘广告上就把求伯君作为吸引程序员加入的重要宣传词,由此可见求伯君在程序员中的影响力。
不久前,我们准备做“程序员的一天”的栏目,找到求伯君。他说:“做是可以,不过现在这些天不太适合,整天要陪着很多官员应酬。”看来,作为董事长的求伯君也仅仅能在精神上鼓舞程序员了。据说,金山正在筹拍一部
《剑侠情缘》
的电视剧,求伯君还可能在其中饰演一位方丈。到时候,我们或许可以欣赏求伯君的影视风采了。
王江民
所属公司:
江民科技
入选理由:38岁开始编程,挖掘了杀毒软件的巨大市场潜力
“38岁开始学习计算机,两三年之内成为中国最出色的反病毒专家之一;45岁只身一人独闯中关村办公司,产品很快占据反病毒市场的80%以上。”这些事实已经让我们无法忽视王江民对中国软件开发带来的影响力,在业内被尊称为老师的王江民,凭借坚持而开拓出了杀毒软件市场,这也成为中国软件产业所仅有的几个亮点之一。尽管现在KV系列产品中早已没有了一行他的代码,而且在市场中的表现也差强人意。但毋庸置疑,KV系列让众多的程序员知道了王江民,而他身残志坚的毅力和品质也让很多程序员面对困难和挫折时,从中得到鼓舞。
鲍岳桥
所属公司:联众公司
入选理由:在DOS和Windows平台、网络时代下都获得成功的典型
从UCDOS流行的那一天起,鲍岳桥也成为了中国无数程序员的偶像。然而,和很多程序员一样,他也并没有从UCDOS的成功中得到多少具体的物质利益。接下来,Windows平台开发的巨大冲击到来了,网络的冲击到来了,有谁能同时抓住两个机会?鲍岳桥无疑做了最好的注释。鲍岳桥认为,是否掌握某项技术不是关键,技术这个东西完全是触类旁通的,当今计算机的发展如此迅速,一个人不可能掌握所有的新技术,一个有经验的程序员应该能够利用自己原有的知识和经验,很快地掌握新技术和新知识。他与简晶、王建华的合作也是联众成长中的精彩经历,尽管现在他容登总裁宝座,而简晶和王建华离去创业,但他们当初的合作还让现在的众多程序员看到了初期团队合作的成功例子。
宫敏
所属公司:凝思科技
入选理由:最早将自由软件引入中国
宫敏,对很多人来说,这是一个陌生的名字。但正是宫敏博士,在芬兰参与了LINUX操作系统的开发与研究。后来,他用磁带背回了20GB容量的自由软件,形成了中国第一个自由软件库,被称为是中国自由软件界元老。
然而,就在国内自由软件运动掀起狂潮时他却全身而退,埋头于开发和做实事去了。2000年,宫敏回国创办北京凝思科技有限公司,目标是在较短时间内为国家相关部门提供具有完全自主知识产权的高性能、高安全的国产信息安全
高技术
产品。宫敏认为,自由软件首先要重视教育,培养出一批有良好心态和真才实学的人。
教育先导
谭浩强
入选理由:计算机基础教育
雷军曾经说过:“是谭浩强让程序员感到了写程序就是自己的生命。”这可能是早一代程序员的感觉吧。在计算机基础教育方面,谭浩强无疑拥有极高的声望和经验。不过,现在社会已经进入新的阶段,尽管谭浩强已经成立了工作室,并不断出版了一系列的书籍,但真正如《Basic 语言》这样风行的书籍并没有再次出现。
谭浩强的书集中体现了中国计算机教育的特点,浅显,作为入门级的书籍非常不错,但一旦真正要深入下去,可能就要选择国外那些大师级人物所写的书籍了。这也是国内很多程序员对谭浩强某些书籍颇有微词的原因所在。
然而,不管如何,时代和机遇都造就了谭浩强在中国计算机史上的地位,这一点无法抹杀。
李开复
所属公司:微软
入选理由:创办微软亚洲研究院,在学生中影响巨大
有人说微软亚洲研究院现在很会作秀,大事小事总要通报一番,而且不时出来组织一些成果演示,或许这继承了李开复的风格。做过研究又在企业中多年锻炼的经历使得李开复把亚洲研究院当作企业一样的来运作,《追随智慧》等书籍的出版更将这种宣传推上了顶点。但从另外一方面来看,李开复的确给国内的计算机科学研究带来了新的气象,亚洲研究院的一些技术成果也对IT产业有着深远的影响。同时,微软亚洲研究院在大学中深入的各种活动使得李开复在学生中的影响力颇高。而最近《给中国学生的一封信》和《给中国学生的第二封信》都言辞恳切,引起了巨大反响。微软给中国印象最好的地方是亚洲研究院,这也算是李开复的高明之处吧。
陈钟
所属院校:北京大学软件学院院长
入选理由:软件学院的积极倡导和实践者
其实选择陈钟,不如说选择了软件学院更为恰当。毕竟从国家重视软件学院开始,有几十家高等院校开始了这方面的探索。而32岁就成为博导的陈钟作为北京大学软件学院的院长,在大兴开拓了新的天地,并取得了不错的成绩。
最近,有朋友说:“以前,计算机系的学生对软件学院很不屑一顾,认为就是一群杂牌军。但现在,他们笑不起来了,软件学院的课程配置和教学完全是按照市场的要求去进行的,他们已经得到了市场的认可。” 当然在这些探索中,有的学院做的并不好,但作为国家希望改变现在计算机人才培养的方式而设的试点,我们有理由期待软件学院带来的改变。而陈钟将继续在这个过程中施展自己的才华。
杨明
所属公司:北大青鸟APTECH
入选理由:将印度软件人才培养模式引进中国
印度发展软件产业的成功被大肆宣扬后,吸收印度经验的探讨逐渐风行起来。但真正实施借鉴印度经验就是北大青鸟APTECH了。作为总经理的杨明,力图将这种模式和中国的实际情况相结合,打造出一种独特的软件从业人员的培训渠道。杨明并不喜欢别人称他培养出来的是“软件蓝领”,因为,在他看来,通过APTECH模式培养的人才是帮助很多人进入IT领域的“金光大道”。而且,采取特许经营这套模式也被巨额资金打造的产业链证明是可行的,因为目前已在全国建立和发展了近100家授权培训中心。据说,北大青鸟还将继续投资几个亿用来扩张,无论如何,教育模式方面,杨明带领的北大青鸟APTECH将会给国内软件业人才市场带来相当的影响。
侯捷
入选理由:技术写作创造品牌
侯捷深入浅出的写作手法,给国内枯燥的技术书籍写作注入了一针强心剂。而且,国内的出版公司也从侯捷身上看到了一个优秀技术作者的市场潜力,因此将挖掘国内优秀作者作为重要的工作内容。
同时,在侯捷直接和间接的影响下,国内一批软件开发者看到了技术写作的价值,开始出版技术书籍。现在,程序员发现了另外的一条可供选择的方向:技术写作。随着更多的开发者参与到其中,对提升国内开发者交流、共享技术起到了很好的促进作用。
侯捷并不掩饰自己对财富的追求,他说:“好的作者就应该得到好的报酬,这样才能保证他能够静心研究技术,再写出更好的书来。”当网上攻击自己的帖子越来越多的时候,侯捷选择了自己的方式,他以老师的口吻试图来解释自己所倡导的这一切。然而,他的回应和解释并不能排解一些人的继续攻击,因为网络就是网络。
创新者
王志东
现属公司:点击科技
入选理由:在网络上取得成功后仍然钟情软件,投巨资做面向未来的协同软件
不了解王志东的人觉得他放弃了软件,而后又被网络所抛弃;但了解王志东的都知道他最钟爱的还是软件,而且现在他同时拥有了网络。
自从离开新浪之后,王志东的消息就逐渐从网络上减少了。应该说,王志东带给我们的消息更多是互联网所带来的影响力。
对于王志东正在做的协同软件,很多人到现在也没有完全明白。尽管国外的一些厂商正在投巨资开发协同软件,但在国内,推广起来还存在很多的问题。但无论如何,王志东能够在功成名就后仍然投入资金来开发一个仍属未知数的软件领域,这种对软件的痴情不正彪显了开发者执著的特质吗。
周奕
入选理由:倡导走向国际市场,以共享软件挣美元的先行者。
2001年的10月份,周奕从美国打来一个长途电话,对共享软件在国外寻求注册谈了很多他的想法,当时的他充满着发现新大陆的喜悦,也迫切希望与国内的程序员共同分享。随着媒体的宣传,“宝马车”给程序员带来了极大的吸引,一大批程序员、没有毕业的学生、甚至包括刚刚学习VB两三天的小孩子也都做起了美元梦。不过,周奕在国际上面临的压力也不小,一大批类似MP3 to CD的软件不断出现,其中不乏其他中国程序员的作品。尽管周奕的软件销售量下滑,但他从来没有后悔过这样做。
现在国际市场上有数量众多的共享软件,其中中国、俄罗斯和美国占据了最大的份额,一大批共享软件作者通过这种途径换来了丰足的生活,当然也有另外一批人并没有带来所企盼的收获。但无论如何,周奕作为“共享软件走向国际市场”创始人被众多的程序员称为“老大”,这种影响力在中国的软件开发史值得一书。
陈天桥
所属公司:上海盛大
入选理由:用市场的成功加速了网络游戏开发的进程
陈天桥的入选可能争议很大,之所以坚持把他列入,完全是基于他给网络游戏市场带来的巨大冲击。掰开手指数数,中国有几个软件行业被如此追捧过,除财务管理软件和杀毒软件之外,还没有那个软件行业被疯狂的关注。正是基于上海盛大为代表的公司在网络游戏市场上取得的成绩,才使人把目光放在了网络游戏上。而且,正是盛大和韩国游戏开发商产生的冲突才使得自己和其他的运营商意识到了国产网络游戏研发的重要性。网络游戏程序员一时物以稀为贵,很多培训结构和高校都开设了相关专业,国家在这方面的政策也有了调整。以一己之力影响了网络游戏开发的产业进程,陈天桥带领盛大产生的影响力不可忽略。
陈榕
所属公司:科泰世纪
入选理由:打造新一代操作系统
陈榕的身上散发着一股锐气,有人说他是个天生的演讲家。不过当陈榕刚到国内推广其思想的时候,很多人不理解,他的情绪也会很激动。有人说他对技术研究的太深刻了,虽然提出的思想很对,但这种事情不应该在国内做,因为中国没有这样的环境。不知道陈榕如何看待这个问题。
现在,美国的风险投资已经不易获得,而政府对这方面的支持使陈榕找到了一个机会。能否取得市场成功尽管是陈榕所关注的,但他可能更在意将多年以来在微软无法实现的一个梦在这里实现吧。
然而,在微软的.NET已经推出,多种嵌入式操作系统相互争夺的市场上,科泰世纪的操作系统要取得成功还面临严峻的挑战。不过陈榕很有信心,他用一个例子来证明:微软很多的产品在1.0和2.0版本的时候都不被人看好,都是到3.0才成熟并得到市场认可的。我们也期望那一天早些到来。
吴涛
入选理由:易语言创始人
如果说在中文语言编程上,中国有为数不多的开发者还寄托希望的话,那身处湖北省枝江市鑫源村的吴涛无疑是其中之一。这位数年前就开始做易语言的程序员远离了喧嚣的北京,毅然回家做起了中文可视化编程环境。
在最近的版本中,吴涛建立了完全的易程序编译器系统,支持全编译,可以直接将程序编译为CPU指令码运行,从而突破了长期以来的速度瓶颈。同时,他的商业推广也做的不错,从易语言支持论坛的火爆中就可以看出这点。而吴涛一直执著在语言研究和底层编程工具的态度也是很多程序员需要学习的。尽管吴涛所做的工作不会撼动整个软件开发的大局,但有人执著于这样的工作也应该得到我们的尊敬。想一想,同样是基于中文的出发点,为什么WPS会得到推崇,而不能容忍易语言的存在呢。
个人典范
雷军
现属公司:金山软件
入选理由:从程序员向管理者成功转型的代表
2003年初,当雷军在亚运村的一个并不为人所知的酒吧中聊天,探讨程序员成长和转型的时候,雷军曾说:“我现在认识到,CEO也是一种职业,这个职业对我更有吸引力。对公司未来的几年发展,我心中已经有了一个方向,关键就是如何去实施和时间快慢的问题而已。”
应该说,媒体已经将雷军塑造成为了一个从程序员到管理者转型的典型例子。然而,在这种转变中,有谁能够了解到雷军当时所面临的压力和风险,如果失败了呢?没有人会问这个问题,也没有人会回答它。雷军带领金山发动的红色风暴也将通用软件的价格拉了下来,这也给程序员一次重新审视自己的机会。记得当时有报道谈到铭泰的程序员看到自己开发的软件不得不以几十元的低价销售时,甚至哭了起来。这算不算的雷军带给程序员的另外一种影响呢?
不过,现在雷军作为管理者,同样面临着多种问题,当网络游戏火爆之后,雷军将赌注放在了剑侠情缘网络版上,有人还说雷军精于战术,但战略还有欠缺,这次的宝押对了吗?不管怎样,如果雷军成功了,这是管理者的成功,如果他失败了,也不过是管理者的失败案例之一。但雷军曾经有过的程序员身份将永远让我们关注他的人生。
丁磊
所属公司:网易
入选理由:技术眼光抓住网络时代机遇的典范
如果告诉你中国的首富也在看《程序员》杂志,你是否相信?这可能很难想像,但事实的确如此。
如果说网络给了很多人一个机遇,包括软件开发人员,但并不是所有人都能抓住了这个机遇,即便抓住,又很难有人把这个机遇发挥到像丁磊这样极至。
有人说丁磊不是一个技术人员,因为并没有开发过哪个令其扬名的产品,但丁磊所具有独到的技术眼光在转向网络服务和网络游戏时都起到了重要作用,说丁磊属于那种“玩技术”的更为合适。开发者如何利用各种技术挖掘到更为广阔的商业价值,这可能就是丁磊带给我们的启示吧。
张小龙
所属公司:博大
入选理由:开发Foxmail和微软的OutLook抗衡,以免费软件一夜成名
一个普通的程序员开发的软件能和微软的产品相抗衡,这很少见,而产品被巨资收购就更加是传奇,创造这个传奇的人就是张小龙。如果说互联网时代的软件只有几个算上成功的话,Foxmail肯定会名列其中。
依靠这两点,张小龙对很多程序员产生的激励就不可小视。当然,这也是在当时的背景下发生的传奇,现在这样的故事可能不会再次发生了。
张小龙加盟博大任副总裁和CTO后,他现在的工作首先是管理和组织各个产品和项目开发组,其次是规划公司的产品结构,公司现在有很多的产品和项目都要由他来统筹。这一次,团队合作的力量将成为他再次成功的基础。
廖恒毅
现属公司:佳软公司
入选理由:十多年从事一线软件开发的代表,正打造基于.NET的企业级开发平台
廖恒毅从不掩饰自己对微软的喜爱。从中文之星2.0到开发基于.NET的大型企业管理软件,他与微软的关系密不可分。而之前曾经在杜家滨领导下的微软中国公司担任开发合作部经理的经历,更给他身上打下了深深的微软烙印。尽管廖恒毅很坦率的谈到,他当时所做的工作不如现在的负责人,但作为一个纯粹的程序员,他利用微软技术创造的价值却无人可及。从中文之星2.0的热卖,到创造的拼音加加输入法带动了输入法技术的创新都是证明,而现在,他用.NET构架了佳软公司未来超速发展的动力,他说:“今天我更关注我的技术能否给社会而不仅仅是个人带来的价值。”
如果有人说,微软的技术能做什么样的系统呢?廖恒毅一定会毫不迟疑的拿自己的系统举例,利用创建的软件平台,一个人可以在10多天的时间中打造出一个完整的企业管理系统,这是类似SAP和Sibel的平台,只是现在中国的软件环境并不适合其拿出来做公开的标准,公司更愿意使用这套系统来面向最终客户。未来,廖恒毅所创造的这一软件架构给中国企业软件开发带来冲击也并非不可能。当然,技术的领先并不代表市场的领先,这一点他也很清楚。
廖恒毅并不习惯去公司分配给他的办公室去办公,他更喜欢扎在公司程序员的房子里面和大家一起工作。有次,聊程序员能做到什么时间,廖恒毅笑着说:“做了程序员,只要活着,就要一直写程序了。”
袁红岗
所属公司:金蝶中间件公司
入选理由:最早开发Windows上的企业应用软件,打造独立知识产权的EJB服务器
很多JAVA程序员对袁红岗极其佩服,源于他做了很多人不敢想更不敢做的事情,这就是他打造了国产的EJB服务器,很快,金蝶将在国内推出自主产权EJB服务器的3.0版本。
同时,袁红岗还是在Windows平台上开发企业应用软件的最早的一批程序员,当时写出的适合小型企业使用的财务购销存一体化软件KINGDEE 2.7,令IT行业对金蝶刮目相看,使金蝶一举成名,正是这些人才奠定了中国的管理软件的基础。
袁红岗将自己多年的经验以一种朴实的风格写出来,这些帖子在网上也影响深远。
后记:
我们选择了20位对中国软件开发最具影响力的人,从侧面也展示了中国软件开发的脉络。其中我们可以看到中国的软件开发大部分以国内市场为主,很多过去的那些软件英雄都与中文、汉化有着千丝万缕的联系。正是在这种情况下,这些人取得了成功,但同时也让国内的开发人员将目光局限在了国内市场上。而国内市场的不成熟以及其他一系列原因又导致了无法支撑起语言和底层开发工具技术厂商的存活。
正因为如此,我们也有一些无奈,这些人大部分都是在心理上给程序员施以影响的人,而在技术层面上能够对软件开发方向产生影响的很少,即便是有影响力,其影响范围也很小。
软件设计方面,国内没有一个企业或者个人引领某种规范使得大家可以靠过来。在全球技术统一化的今天,能否开发出面向全球市场的软件技术,这是需要重视的问题。我们的软件公司和程序员能否向这个方向努力呢?
posted @
2006-04-30 09:11 崛起的程序员 阅读(217) |
评论 (0) |
编辑 收藏
摘要
Hibernate和struts是当前市面上几个最流行的开源的库之一。它们很有效率,是程序员在开发Java企业应用,挑选几个竞争的库的首选。虽然它们经常被一起应用,但是Hibernate的设计目标并不是和Struts一起使用,而Struts在Hibernate诞生好多年之前就发布了。为了让它们在一起工作,仍然有很多挑战。这篇文章点明了Struts和Hibernate之间的一些鸿沟,尤其关系到面向对象建模方面。文章也描述了如何在两者间搭起桥梁,给出了一个基于扩展Struts的解决方案。所有的基于Struts和Hibernate构建的Web应用都能从这个通用的扩展中获益。
在Hibernate in Action(Manning,2004十月)这本书里,作者Christian Bauer和Gavin King揭示了面向对象世界的模型和关系数据模型,两个世界的范例是不一致的。Hibernate非常成功地在存储层(persistence Layer)将两者粘合在一起。但是领域模型(domain model)(也就是Model-View-Controller的model layer)和HTML页面(MVC的View Layer)仍然存在不一致。在这篇文章中,我们将检查这种不一致,并且探索解决的方案。
范例不一致的再发现
让我们先看一个经典的parent-child关系例子(看下面的代码):product和category。Category类定义了一个类型为long的标示符id和一个类型为String的属性name。Product类也有一个类型为long的标示符id和一个类型为Category的属性category,表示了多对一的关系(也就是说很多product可以属于一个Category)
/**
* @hibernate.class table="CATEGORY"
*/
public class Category {
private Long id;
private String name;
/**
* @hibernate.id generator-class="native" column="CATEGORY_ID"
*/
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
/**
* @hibernate.property column="NAME"
*/
public String getName() {
return name;
}
public void setName(Long name) {
this.name = name;
}
}
/**
* @hibernate.class table="PRODUCT"
*/
public class Product {
private Long id;
private Category category;
/**
* @hibernate.id generator-class="native" column="PRODUCT_ID"
*/
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
/**
* @hibernate.many-to-one
* column="CATEGORY_ID"
* class="Category"
* cascade="none"
* not-null="false"
*/
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
我们希望一个product可以被更改category,所以我们的HTML提供了一个下拉框列出所有Category。
<select name="categoryId">
<option value="">No Category</option>
<option value="1">Category 1</option>
<option value="2">Category 2</option>
<option value="3">Category 3</option>
</select>
这里我们看出了两者的不一致:在Product领域对象里,category属性是Category类型,但是ProductForm只有一个类型为long的categoryId。这种不匹配不但增加了不一致,而且导致了不必要的代码进行primitive type的标示符和对应的对象之间的转换。
这种不一致部分是由于HTML Form自己引起的:它只代表了一种关系模型,不能代表面向对象的模型。面向对象和关系模型的不一致在存储层由对象关系映射(O/RM)解决。但是类似的问题在表示层(view layer)仍然存在。解决的关键是让他们一起无缝地工作。
Struts的功能和局限
幸运的是,Struts能够生成和解释内嵌的对象属性。Category下拉框可以用Struts page-construction(html) tag library:
<html:select property="category.id">
<option value="">No Category</option>
<html:options collection="categories" property="id" labelProperty="name"/>
</html:select>
我们假设categories是Category对象的一个list。所以现在我们要修改ProductForm,让它变得更加“面向对象”,我们要修改ProductForm的categoryId,改成类型为Category的category。这种改变会导致在Product和ProductForm之间复制属性的工作更加繁琐,因为两者有相同的属性。
public class ProductForm extends ActionForm {
private Long id;
private Category category;
...
}
当我们完成剩余的Struts Action, configuration, validator, jsp, hibernate层后,开始测试,我们马上在访问ProductForm.category.id时遇到了NullPointerException。这是预料中的!因为ProductForm.category还没有被设置,同时,Hibernate也会将多对一所联系的对象引用设为空(如果database field为空指)(译者:这里指Hiberate将product.category为Null,如果该Product没有联系到任何category)。Struts要求所有的对象在显示(生成HTML Form)和传播(提交HTML FORM)之前被建立。
让我们看看如何用ActionForm.reset()来架起桥梁。
(并非如此)臭名昭著的Struts ActionForm
在我第一个星期接触Struts的时候,我最大的一个疑问就是:为什么我必须为Properties, getter方法, setter方法保持几乎完全相同的两份copy, 一份在ActionForm Bean, 一份在DomainObject。这个繁琐的步骤成了Struts社区最主要的抱怨之一。
以我的观点,ActionForm存在有原因的。首先,它们可以区别于Domain Object因为他们但当了不同的角色。在MVC模式下,Domain Object是Model层的一个部分,ActionForm是View层的。因为Webpage的Field和Database的Field可能不一样,某些特制的转换是常见的。第二,ActionForm.validate()方法可以定义非常好用的验证规则。第三,可能有其他的,特定的View行为,但是又不想在domain layer实现,特别当persistence framework来管理domain object的时候。
提交Form
让我们来用ActionForm内有的方法-reset()-来解决view和model之间的不一致。这个reset()方法是在ActionForm在被Struts Controller Servlet处理request时候复制ActionForm属性之前调用的。这个方法最常见的使用是:checkbox必须被显式地设为false,让没有被选中的checkbox被正确识别。Reset()也是一个初始化用于view rending对象的合适地方。代码看起来是这样的:
public class ProductForm extends ActionForm {
private Long id;
private Category category;
...
public void reset(ActionMapping mapping, HttpServletRequest request)
{
super.reset( mapping, request );
if ( category == null ) { category = new Category(); }
}
}
Struts在使用用户提交的值填写ProductForm之前,Struts会调用reset(),这样category属性将会被初始化。请注意,你必须检查category看它是不是null,后面我们会讨论这个。
编辑Form
到目前为止,我们已经解决了form提交时候的问题。但是当我们在生成form页面的时候呢?Html:select tag也希望有一个非空的引用,所以我们将在form生成页面之前调用reset()。我们在action类里加入了一行:
public class EditProductAction extends Action {
public final ActionForward execute( ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response ) throws Exception
{
...
Product product = createOrLoadProduct();
ProductForm productForm = (ProductForm)form;
PropertyUtils.copyProperties( productForm, product );
productForm.reset( mapping, request );
...
}
}
我假设读者已经对action类和Jakarta commons Beanutils包非常熟悉了。CreateOrLoadProduct()建立了一个新的Product实例或者从数据库里载入一个已有的实例,具体取决于这个action是建立或者修改Product的。ProductForm被赋值后(译者:也就是调用PropertyUtils.copyProperties后),productForm.category已经从Product.category复制过来了(译者:实际上只是复制了category对象引用,并没有开销),然后,ProductForm就能用来生成页面了。我们同时也必须保证:不覆盖已经被Hibernate载入的对象,所以我们必须检查(category)是不是为null。
因为reset()方法是在ActionForm中定义的,我们可以把上述代码放入一个superclass,比如CommonEditAction,来处理这些事情:
Product product = createOrLoadProduct();
PropertyUtils.copyProperties( form, product );
form.reset( mapping, request );
如果你需要一个只读的Form, 你有两个选择: 第一检查所联系的jsp对象是不是null, 第二复制domain对象到ActionForm之后调用Reset()
保存domain对象
我们解决了提交Form和生成Form页面的问题, 所以Struts可以满足了。但是Hibernate呢?当用户选择了一个null ID option – 在我们的例子中“no category”option- 并且提交form, productForm.category指向一个新建立的hibernate对象,id为null。当category属性从ProductForm复制到Hibernate控制的Product对象并且存储时,Hibernate会抱怨product.category是一个临时对象,需要在Product存储前先被存储。当然,我们知道它是Null,并且不需要被存储。所以我们需要将product.category置为Null,然后Hibernate就能存储Product了(译者:在这种情况下,数据库product.category被设成空值)。我们也不希望改变Hibernate的工作方式,所以我们选择在复制到Domain对象之前清理这些临时对象,我们在ProductForm中加了一个方法:
public class ProductForm extends ActionForm {
private Long id;
private Category category;
...
public void reset(ActionMapping mapping, HttpServletRequest request) {
super.reset( mapping, request );
if ( category == null ) { category = new Category(); }
}
public void cleanupEmptyObjects() {
if ( category.getId() == null ) { category = null; }
}
}
我们在copyProperties之前清理掉这些临时对象,所以如果ProductForm.category只是用来放Null的,则将ProductForm.category置为Null。然后Domain对象的category也会被设成null:
public class SaveProductAction extends Action {
public final ActionForward execute( ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response ) throws Exception
{
...
Product product = new Product();
((ProductForm)form).cleanupEmptyObjects();
PropertyUtils.copyProperties( product, form );
SaveProduct( product );
...
}
}
一对多关系
我还没有解决Category到Product的一对多关系。我们把它加入到Category的Metadata中:
public class Category {
...
private Set products;
...
/**
* @hibernate.set
* table="PRODUCT"
* lazy="true"
* outer-join="auto"
* inverse="true"
* cascade="all-delete-orphan"
*
* @hibernate.collection-key
* column="CATEGORY_ID"
*
* @hibernate.collection-one-to-many
* class="Product"
*/
public Set getProducts() {
return products;
}
public void setProducts(Set products) {
this.products = products;
}
}
注意:Hibernate的cascade属性为all-delete-orphan表明:Hibernate需要在存储包含的Category对象时候,自动存储Product对象。和parent对象一起存储child对象的情况并不常见,常见的是:分别控制child的存储和parent的存储。在我们的例子中,我们可以容易地做到这一点,如果我们允许用户在同一个html page编辑Category和ProductS。用set表示Products是非常直观的:
public class CategoryForm extends ActionForm {
private Set productForms;
...
public void reset(ActionMapping mapping, HttpServletRequest request) {
super.reset( mapping, request );
for ( int i = 0; i < MAX_PRODUCT_NUM_ON_PAGE; i++ ) {
ProductForm productForm = new ProductForm();
productForm.reset( mapping, request );
productForms.add( productForm );
}
}
public void cleanupEmptyObjects() {
for ( Iterator i = productForms.iterator(); i.hasNext(); ) {
ProductForm productForm = (ProductForm) i.next();
productForm.cleanupEmptyObjects();
}
}
}
更进一步
我们已经可以察看,编辑,提交forms,并且存储相关的objects,但是为所有的ActionForm类定义CleanupEmptyObjects()和reset()方法是个累赘。我们将用一个抽象的ActionForm来完成协助完成这些工作。
作为通用的实现,我们必须遍历所有的Hibernate管理的domain对象,发现他们的identifier,并且测试id值。幸运的是:org.hibernate.metadata包已经有两个Utility类能取出domain对象的元数据。我们用ClassMetadata类检查这个object是不是Hibernate管理的。如果是:我们把它们的id Value取出来。我们用了Jakarta Commons Beanutils包来协助JavaBean元数据的操作。
import java.beans.PropertyDescriptor;
import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.metadata.ClassMetadata;
public abstract class AbstractForm extends ActionForm {
public void reset(ActionMapping mapping, HttpServletRequest request) {
super.reset( mapping, request );
// Get PropertyDescriptor of all bean properties
PropertyDescriptor descriptors[] =
PropertyUtils.getPropertyDescriptors( this );
for ( int i = 0; i < descriptors.length; i++ ) {
Class propClass = descriptors[i].getPropertyType();
ClassMetadata classMetadata = HibernateUtil.getSessionFactory()
.getClassMetadata( propClass );
if ( classMetadata != null ) { // This is a Hibernate object
String propName = descriptors[i].getName();
Object propValue = PropertyUtils.getProperty( this, propName );
// Evaluate property, create new instance if it is null
if ( propValue == null ) {
PropertyUtils.setProperty( this, propName, propClass.newInstance() );
}
}
}
}
public void cleanupEmptyObjects() {
// Get PropertyDescriptor of all bean properties
PropertyDescriptor descriptors[] =
PropertyUtils.getPropertyDescriptors( this );
for ( int i = 0; i < descriptors.length; i++ ) {
Class propClass = descriptors[i].getPropertyType();
ClassMetadata classMetadata = HibernateUtil.getSessionFactory()
.getClassMetadata( propClass );
if ( classMetadata != null ) { // This is a Hibernate object
Serializable id = classMetadata.getIdentifier( this, EntityMode.POJO );
// If the object id has not been set, release the object.
// Define application specific rules of not-set id here,
// e.g. id == null, id == 0, etc.
if ( id == null ) {
String propName = descriptors[i].getName();
PropertyUtils.setProperty( this, propName, null );
}
}
}
}
}
为了让代码可读,我们省略了Exception的处理代码。
我们的新AbstractForm类从Struts的ActionForm类继承,并且提供了通用行为:reset和cleanup多对一关联对象。当这个关系是相反的话(也就是一对多关系),那么每个例子将会有所不同,类似在Abstract类里实现是比较好的办法。
总结
Struts和Hibernate是非常流行和强大的框架,他们可以有效地相互合作,并且弥补domain模型和MVC视图(view)之间的差别。这篇文章讨论一个解决Struts/Hibernate Project的通用的方案,并且不需要大量修改已经有的代码。
posted @
2006-04-30 09:01 崛起的程序员 阅读(279) |
评论 (0) |
编辑 收藏