??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产成人亚洲精品影院,国产精品亚洲A∨天堂不卡,亚洲AV无码成H人在线观看http://m.tkk7.com/qq13367612/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font class="subhead" size=3><b>一些技术文?& 一些生zL?lt;/b></font>zh-cnSun, 11 May 2025 02:31:21 GMTSun, 11 May 2025 02:31:21 GMT60逝者如斯夫http://m.tkk7.com/qq13367612/archive/2006/02/19/31433.htmlSungSungSat, 18 Feb 2006 17:17:00 GMThttp://m.tkk7.com/qq13367612/archive/2006/02/19/31433.htmlhttp://m.tkk7.com/qq13367612/comments/31433.htmlhttp://m.tkk7.com/qq13367612/archive/2006/02/19/31433.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/31433.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/31433.html一q多的Java学习Q半q多的javaDQ再到如今实习彻d底脱javaQ想到现在的路由器交换机Q再惛_外包公司的web目Q有的时候发玎ͼ工作不比兴趣Q逝者如斯夫Q再回blogjavaQ踩个脚印?/P>

Sung 2006-02-19 01:17 发表评论
]]>
值得回顾和体呻IJava语言?个关键特?http://m.tkk7.com/qq13367612/archive/2005/11/04/18135.htmlSungSungFri, 04 Nov 2005 06:16:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/11/04/18135.htmlhttp://m.tkk7.com/qq13367612/comments/18135.htmlhttp://m.tkk7.com/qq13367612/archive/2005/11/04/18135.html#Feedback2http://m.tkk7.com/qq13367612/comments/commentRss/18135.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/18135.htmlJava的白皮书为我们提ZJava语言?个关键特?BR>
(1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能软g在很的机器上运行,基础解释其和cd的支持的大小Uؓ40kbQ增加基本的标准库和U程支持的内存需要增?25kb?BR>
(2)分布?Java带有很强大的TCP/IP协议族的例程库,Java应用E序能够通过URL来穿q网l来讉Kq程对象Q由于servlet机制的出玎ͼ使Java~程非常的高效,现在许多的大的web server都支持servlet?BR>
(3)OO:面向对象设计是把重点攑֜对象及对象的接口上的一个编E技?光向对象和C++有很多不同,在与多重l承的处理及Java的原cL型?BR>
(4)健壮Ҏ?Java采取了一个安全指针模型,能减重写内存和数据崩溃的可能型?BR>
(5)安全:Java用来设计|\和分布系l,q带来了新的安全问题QJava可以用来构徏防病毒和防攻ȝSystem.事实证明Java在防毒这一斚w做的比较好?BR>
(6)中立体系l构:Java~译其生成体pȝ构中立的目标文g格式可以在很多处理器上执行,~译器生的指o字节?Javabytecode)实现此特性,此字节码可以在Q何机器上解释执行?BR>
(7)可移植?Java中对基本数据l构cd的大和法都有严格的规定所以可UL性很好?BR>
(8)多线E?Java处理多线E的q程很简单,Java把多U程实现交给底下操作pȝ或线E程序完?所以多U程是Java作ؓ服务器端开发语a的流行原因之一?BR>
(9)Applet和servlet:能够在网上执行的程序叫AppletQ需要支持Java的浏览器很多Q而applet支持动态的|页Q这是很多其他语a所不能做到的?BR>
值得回顾和体味的概念

1.OOP中唯一关系的是对象的接口是什么,像计算机的销售商她不电源内部结构是怎样的,他只关系能否l你提供电就行了Q也是只要知道can or not而不是how and why.所有的E序是由一定的属性和行ؓ对象l成的,不同的对象的讉K通过函数调用来完成,对象间所有的交流都是通过Ҏ调用Q通过对封装对象数据,很大限度上提高复用率?BR>
2.OOP中最重要的思想是类Q类是模板是蓝图Q从cM构造一个对象,卛_Zq个cȝ一个实?instance)?BR>
3.装:是把数据和行ؓl合起在一个包?q对对象使用者隐藏数据的实现q程Q一个对象中的数据叫他的实例字段(instance field)?BR>
4.通过扩展一个类来获得一个新cdl承(inheritance)Q而所有的c都是由Object根超cL展而得Q根类下文会做介绍?BR>
5.对象?个主要特?BR>
behavior---说明q个对象能做什么?BR>
state---当对象施加方法时对象的反映?BR>
dentity---与其他相D为对象的区分标志?BR>
每个对象有唯一的indentity 而这3者之间相互媄响?BR>
6.cM间的关系:

use-a :依赖关系

has-a :聚合关系

is-a:l承关系--?Acȝ承了Bc,此时AcM仅有了BcȝҎQ还有其自己的方?(个性存在于共性中)

7.构造对象用构造器:构造器的提出,构造器是一U特D的ҎQ构造对象ƈ对其初始化?BR>
?Datacȝ构造器叫Data

new Data()---构造一个新对象Q且初始化当前时间?BR>
Data happyday=new Data()---把一个对象赋值给一个变量happydayQ从而该对象能够多ơ用,此处要声明的使变量与对象变量二者是不同的。newq回的值是一个引用?BR>
构造器特点:构造器可以?个,一个或多个参数Q构造器和类有相同的名字。一个类可以有多个构造器Q构造器没有q回|构造器L和newq算W一起用?BR>
8.重蝲:当多个方法具有相同的名字而含有不同的参数Ӟ便发生重?~译器必L选出调用哪个Ҏ?BR>
9.?package)Java允许把一个或多个cL集在一hZl,UC包,以便于组lQ务,标准Java库分多包.java.lang java.util javaQnet{,包是分层ơ的所有的java包都在java和javax包层ơ内?BR>
10.l承思想:允许在已l存在的cȝ基础上构建新的类Q当你承一个已l存在的cLQ那么你复用了q个cȝҎ和字D,同时你可以在新类中添加新的方法和字段?BR>
11.扩展c?扩展cd分体Cis-a的承关p? 形式?class (子类) extends (基类)?BR>
12.多?在java中,对象变量是多态的.而java中不支持多重l承?BR>
13.动态绑?调用对象Ҏ的机制?BR>
(1)~译器检查对象声明的cd和方法名?BR>
(2)~译器检查方法调用的参数cd?BR>
(3)静态绑?若方法类型ؓpriavte static final ~译器会准确知道该调用哪个方法?(4)当程序运行ƈ且用动态绑定来调用一个方法时Q那么虚拟机必须调用x所指向的对象的实际cd相匹配的Ҏ版本?BR>
(5)动态绑?是很重要的特性,它能使程序变得可扩展而不需要重~译已存代码?BR>
14.finalc?为防止他Z你的cMz新类Q此cL不可扩展的?BR>
15.动态调用比静态调用花费的旉要长?BR>
16.抽象c?规定一个或多个抽象Ҏ的类本n必须定义为abstract?BR>
?
public abstract string getDescripition


17.Java中的每一个类都是从ObjectcL展而来的?

18.objectcM的equal和toStringҎ?

equal用于试一个对象是否同另一个对象相{?

toStringq回一个代表该对象的字W串Q几乎每一个类都会重蝲该方法,以便q回当前状态的正确表示?toString Ҏ是一个很重要的方?

19.通用~程:Mcȝ型的所有值都可以同objectcL的变量来代ѝ?

20.数组列表:ArrayList动态数l列表,是一个类库,定义在java.uitl包中Q可自动调节数组的大?

21.classcobjectcM的getclassҎq回ckasscd的一个实例,E序启动时包含在mainҎ的类会被加蝲Q虚拟机要加载他需要的所有类Q每一个加载的c都要加载它需要的cR?BR>
22.classcMؓ~写可动态操Ujava代码的程序提供了强大的功能反,q项功能为JavaBeans特别有用Q用反Java能支持VBE序员习惯用的工具?BR>
能够分析c能力的E序叫反器QJava中提供此功能的包叫Java.lang.reflect反射机制十分强大?BR>
1).在运行时分析cȝ能力?BR>
2).在运行时探察cȝ对象?BR>
3).实现通用数组操纵代码?BR>
4).提供Ҏ对象?BR>
而此机制主要针对是工兯而不是应用及E序?反射机制中的最重要的部分是允许你检查类的结?用到的API?

  java.lang.reflect.Field //q回字段.  

  java.reflect.Method //q回Ҏ.  

  java.lang.reflect.Constructor //q回参数.


Ҏ指针:java没有Ҏ指针Q把一个方法的地址传给另一个方法,可以在后面调用它Q而接口是更好的解x案?
23.接口(Interface)说明c该做什么而不指定如何dQ一个类可以实现一个或多个interface?

24.接口不是一个类Q而是对符合接口要求的cȝ一套规范?BR>
若实C个接口需?个步?

1.声明c需要实现的指定接口?BR>
2.提供接口中的所有方法的定义?BR>
声明一个类实现一个接口需要用implements 关键?class actionB implements Comparable 其actionb需要提供CompareToҎQ接口不是类Q不能用new实例化一个接口?BR>
25.一个类只有一个超c,但一个类能实现多个接口。Java中的一个重要接口:Cloneable

26.接口和回?~程一个常用的模式是回调模式,在这U模式中你可以指定当一个特定时间发生时回调对象上的Ҏ?BR>
?ActionListener 接口监听.

cM的API?

java.swing.JOptionPane

java.swing.Timer

java.awt.Tookit

27.对象clone:cloneҎ是object一个保护方法,q意味着你的代码不能单的调用它?BR>
28.内部c?一个内部类的定义是定义在另一个内部的cR?BR>
原因?

1.一个内部类的对象能够访问创建它的对象的实现Q包括私有数据?BR>
2.对于同一个包中的其他cL_内部c能够隐藏v来?BR>
3.匿名内部cd以很方便的定义回调?BR>
4.使用内部cd以非常方便的~写事g驱动E序?BR>
29.代理c?proxy):

1.指定接口要求所有代?BR>
2.objectcd义的所有的Ҏ(toString equals)

30.数据cd:Java是强调类型的语言Q每个变量都必须先申明它都类型,java中d?个基本类型?U是整型Q?U是点型,一U是字符型,被用于Unicode~码中的字符Q布型?BR>

Sung 2005-11-04 14:16 发表评论
]]>
Java的Web框架Ҏ http://m.tkk7.com/qq13367612/archive/2005/11/04/18086.htmlSungSungFri, 04 Nov 2005 01:54:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/11/04/18086.htmlhttp://m.tkk7.com/qq13367612/comments/18086.htmlhttp://m.tkk7.com/qq13367612/archive/2005/11/04/18086.html#Feedback8http://m.tkk7.com/qq13367612/comments/commentRss/18086.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/18086.htmlW一Ҏ优点Q第二项是缺炏V?BR>
以下是各Uweb框架比较: (by Matt Raible & 个h观点)

StrutsQ?
轻量U表现层框架Q在适当的时间适当的出玎ͼ
|上拥有很多信息和示例;学习曲线较缓Q容易上手;
HTML标签库是一个非常好的东ѝ?BR> 
静态Forms难以让h接受Q不能够做单元测试;
大量的邮件列表o人无法忍?BR> 
Spring MVC
生命周期由重写绑定,效验{确定;能够无缝隙地与各U表现层E序l合在一P如JSPQXSL{;IC使得很容易测试?

实际使用较少Q有q轻量U框架向包容万象发展的趋势;需要在JSP中写入大量代码;q于灉|Q反而不能得到通用的控制?BR> 
WebWork
l构单,Ҏ被扩展;标签库容易被自定义,q获得Velocity支持Q拦截机制成熟可靠?
文档资源不够充分Q示例很;客户端效验很不成熟?BR> 
Tapestry
效率较高QHTML模板很合适美工;有良好的C֌支持?
文档q于理论Q而缺实践;学习曲线陡峭Q示例非常少Q?


JSF
J2EE规范Q能够快速和Ҏ地开发;丰富的导航框架。已有不公司开始尝试该斚w技术的应用Q?
标签依赖JSPQ技术不够成熟;实现资源不单U?


大家可以发表一下意?BR>

Sung 2005-11-04 09:54 发表评论
]]>
[强烈推荐]IBM公司面试题(附答案)——病狗问?/title><link>http://m.tkk7.com/qq13367612/archive/2005/10/31/17544.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Mon, 31 Oct 2005 06:12:00 GMT</pubDate><guid>http://m.tkk7.com/qq13367612/archive/2005/10/31/17544.html</guid><wfw:comment>http://m.tkk7.com/qq13367612/comments/17544.html</wfw:comment><comments>http://m.tkk7.com/qq13367612/archive/2005/10/31/17544.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://m.tkk7.com/qq13367612/comments/commentRss/17544.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/qq13367612/services/trackbacks/17544.html</trackback:ping><description><![CDATA[<FONT size=2><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=3><STRONG>村子中有50个hQ每人有一条狗。在q?0条狗中有病狗(q种病不会传?。于是h们就要找出病狗。每个h可以观察其他?9条狗Q以判断它们是否生病Q只有自q狗不能看。观察后得到的结果不得交,也不能通知病狗的主人。主Z旦推出自己家的是病狗就要枪毙自q狗,而且每个人只有权利枪毙自q狗,没有权利打死其他人的狗。第一天,W二天都没有枪响。到了第三天传来一阉|壎ͼ问有几条病狗Q如何推得出?</STRONG></FONT> <BR></FONT><BR>推论 见本文结束(字体为白ԌQ?BR><BR>另附QIBMC会招聘W试?BR><BR>1Q一个粗l均匀的长直管子,两端开口,里面?个白球和4个黑球,球的直径、两端开口的直径{于子的内径,现在白球和黑球的排列是wwwwbbbbQ要求不取出M一个球Q得排列变为bbwwwwbb?<BR><BR>2Q一只蜗牛从井底爬到井口Q每天白天蜗牛要睡觉Q晚上才出来zdQ一个晚上蜗牛可以向上爬3,但是白天睡觉的时候会往下滑2,井深10,问蜗牛几天可以爬出来Q?<BR><BR>3Q在一个^面上?999条直U最多能这一q面划分成多个部分Q?<BR><BR>4Q在太^z的一个小岛上生活着土hQ他们不愿意被外人打扎ͼ一天,一个探险家C岛上Q被土h抓住Q土人的司告诉他,你dq可以有一个机会留下一句话Q如果这句话是真的,你将被烧死,是假的,你将被五马分,可怜的探险家如何才能活下来Q?<BR><BR>5Q怎样U四|使得L两棵树的距离相等?<BR><BR>6Q?7个小q动员在参加完比赛后Q口渴难耐,d店买饮料Q饮料店搞促销Q凭三个I瓶可以再换一Ӟ他们最买多少瓉料才能保证一ZӞ <BR><BR>7Q有一座山Q山上有座庙Q只有一条\可以从山上的庙到pQ每周一早上8点,有一个聪明的和去׃化缘Q周二早?点从p回山上的庙里Q小和尚的上下山的速度是Q意的Q在每个往q中Q他L能在周一和周二的同一钟点到达p\上的同一炏V例如,有一ơ他发现星期一??0和星期二??0他都Cp\靠山脚的3/4的地方,问这是ؓ什么? <BR><BR>8Q有两根不均匀分布的香Q每栚w烧完的时间是一个小Ӟ你能用什么方法来定一D?5分钟的时_ <BR><BR>IBM面试题目 <BR><BR>1. Describe your greatest achievement in the past 4-5 years? <BR><BR>2. What are your short & long term career objectives? What do you think is the most ideal job for you? <BR><BR>3. Why do you want to join IBM? What do you think you can contribute to IBM? <BR><BR><BR><FONT color=#ffffff size=2>推论Q?<BR><BR>  A、假设有1条病狗,病狗的主Z看到其他狗都没有病,那么q道自q狗有病,所以第一天晚上就会有枪响。因为没有枪响,说明病狗数大??<BR><BR>  B、假设有2条病狗,病狗的主Z看到?条病狗,因ؓW一天没有听到枪响,是病狗数大于1Q所以病狗的Mh会知道自q狗是病狗Q因而第二天会有枪响。既然第二天也每有枪响,说明病狗数大??<BR><BR>  由此推理Q如果第三天枪响Q则?条病狗?</FONT><BR><img src ="http://m.tkk7.com/qq13367612/aggbug/17544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/qq13367612/" target="_blank">Sung</a> 2005-10-31 14:12 <a href="http://m.tkk7.com/qq13367612/archive/2005/10/31/17544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用微软试题膨胀你的思维http://m.tkk7.com/qq13367612/archive/2005/10/31/17543.htmlSungSungMon, 31 Oct 2005 06:07:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/31/17543.htmlhttp://m.tkk7.com/qq13367612/comments/17543.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/31/17543.html#Feedback1http://m.tkk7.com/qq13367612/comments/commentRss/17543.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/17543.html“微软”招聘考试Q除了专业知识,往往更看重一个h的聪明程度。据参加招聘考试的学生说Q“微软”笔试题“古怪刁钠Z,有些直“异惛_开”,令h匪夷所思。不q,“微软”似乎不为所动,q年Z些“怪题目”。几q下来,q些题目不再被认为怪,更逐渐成ؓ许多大企业拿来考大学生的“经典”?

  快速估题Q测试你的快速反应能?

  q类题目有不同的版本。比如说Q问你如何在不用台U的情况下,U出一枉机的重量Q估一下长江里的水的质量? q是大的、宏观方面的问题Q小的方面试题,q会问你q一c题目:“估一下一个行q在雨中的?分钟内n上淋到的雨的质量。?

  再看另一道快速估题。去q?月,“微软”在复旦大学举行了一场校园招聘,W一轮笔试题目中有一道o应试者困惑的“东Ҏ珠”题Q“请估算一下东Ҏ珠电视塔的重量”。当时真是难倒了众多学子。据上v微Y软g有限公司负责招聘考试的Y件研发部l理蔡先生说Q“其实,有同学认个题目刁d怪也在情理之中,毕竟q种cd的试题在国内q不太多Q所以大安有些怸着头脑。”他表示Q“就东方明珠q道题来_它和一般的谜语或智力题q是有区别的。这c题为快速估题Q主要考的是快速估的能力Q这是开发Y件必备的能力之一。重要的是对考生得出q个l果的过E也是Ҏ的考察。?

  蔡经理说了一U比较合理的{法。他首先在纸上画ZҎ珠的草图Q然后快速估支架和各个支柱的高度,以及球的半径Q算出各部分体积Q然后进行各部分密度q算Q最后相加得Z个结果。蔡l理认ؓQ“像q样的题目,包括一些推理题Q考的都是决问题的能力Q不是哪道题你记住了{案可以了的。?

  开放性思维题:考验你的逻辑推理能力

  d应聘“微软”的大学生,考试旉C一道“古怪”的智力题。题目是Q一楼到十楼的每层电梯门口都攄一颗钻矻Iȝ大小不一。你乘坐甉|从一楼到十楼Q每层楼甉|门都会打开一ơ,只能拿一ơ钻矻I问:怎样才能拿到最大的一颗﹖应试者不知该怎么办。考试后主考官q没有明公布答案,但他对其中一位女士的做法表示赞赏。那位女士的回答是:选择前五层楼都不拿,观察各层ȝ的大,做到心中有数。后面五个楼层再选择Q选择大小接近前五层楼出现q最大钻矛_的ȝ。这位女士后来在互联|上谈体会时_ “我至今也不知道q道题的准确{案Q也许本来就没有准确{案Q就是考一下你的思\。?

  q种说法得到微Y中国有限公司人力资源部招聘经理a冬梅的肯定。a冬梅表示Q以上这些都是属于笔试的题目。“微软”希望招到更多开攑֞思维的hQ因此很多题目其实都没有一个标准答案。比如说Q你认ؓ北京有多公共汽车站H你可以随便l出{案Q?家或?000Ӟ但你得有理由?

  基础数学题:考核你的数学基础是否扎实

  一般来_“微软”招聘只收理工科的学生,要求有扎实的数学基础Q因此基数学题量是最大的。有些题目初看很复杂Q思\一打开Q其实相当简单,所以有的大学生戏称是“小学三q的题目”。比如如下这道题Q有8颗弹子球Q其?颗是“缺L”,也就是它比其他的球都重。你怎样使用天^只通过两次U量p够找到这个球H?

  主考官在解释这道题的答案时指出Q要惌册个问题,必须充分利用天^可以量出两边弹子球重量是否相{这一事实Q即无论什么时候只要两辚w量相{,p明“缺L”不在这些弹子球中。第一ơ称重,在天q的两边各Q意放3颗球。这时候会有两U可能的l果。如果天q两边的重量是^衡的Q就可以定所U量?个球当中没有“缺L”。因此第二次U重时只要称量剩下的2颗球Q较重的 1颗就是“缺L”。如果天q的一Ҏ另一辚w。那么可以确?“缺L”肯定位于天q重一边的3颗球当中。第二次U量时只要从q?个球当中L拿出2个进行称量。如果两边^衡,?颗球中剩下的没有参加U量?颗球是“缺L”,如果两边不^衡,则较重的一边就是“缺L”?

  从上面这道题和其他大量的数学题内Ҏ看,“微软”招聘考试重视数学基础是由它工作性质军_的。“微软”招聘主戴lbh里查得先生认为,软g开发需要极严格的数学模式。对数学没有兴趣的h难以胜Q最L的程序员工作。他表示Q对于笔试题目,如果有大学生对他_“这真是一个愚蠢的问题”,qƈ不是错误的回{?

  智力试题:看你能否创造性地思?

  “请用一W画出四根直U,图?个点全部联结。?{案Q画一根与水^?5度角的斜U到某一点,然后以此点作为直角三角Ş两个直角边的交点Q向M一边作直角三角形,可以把9个点联结h?

  q类智力题考的是在懂得数学原理基础上的创造性思考。比如下面这个问题就需要动动脑子了。题目是Q一个正三角形的每个角上各有一只蚂蚁。每只蚂蚁开始朝另一只蚂蚁做直线q动Q目标角是随机选择。蚂蚁互不相撞的概率是多﹖

  {案应当是:只有两种Ҏ可以让蚂蚁避免相撞:或者它们全部顺旉q动Q或者它们全部逆时针运动。否则,肯定会撞C赗选择一只蚂蚁,一旦它定了自己是逆时针或者是时针运动,其他的蚂蚁就必须做相同方向的q动才能避免相撞。由于蚂蚁运动的方向是随机选择的,那么W二只蚂蚁有1Q?的概率选择与第一只蚂蚁相同的q动方向。第三只蚂蚁也有1Q?的概率选择与第一只相同的方向。因此,蚂蚁避免撞到一L概率?Q??

  q有一些问题虽然不需要数学知识,但要懂得基本的科学常识。比如问你:太阳L从东边升起吗H答案应该是否定的。因为在北极点,Ҏ没有“东方”这个方向。每一个方向都是南。在6个月的“极昼”时_太阳从南边升起从南边落下。另外在南极也一P每一个方向都是北斏V?

  诸如此类的问题我们还可以丑և一些,其中包括拎쀜微软”领袖比L茨“开涮”的题目。此题是“比L茨的办公桌下有五只带锁的抽屉Q分别脓着财富、兴、幸、荣誉和成功五个标签Q盖茨L只带一把钥匙,请问是哪一把??{案Q兴。

  所有这些都Zq样的考虑Q?“微软”想䏀聪明的、有开放思维的h。”负责“微软”招聘工作的戴维·普里查得先生Q其实我们ƈ不是惛_到“正”的{案Q我们是想看看应聘者是否能扑ֈ最好的解题ҎQ看他们是否能够创造性地思考问题?“我们的目的是选hQ而不是难倒学生。?/SPAN>

Sung 2005-10-31 14:07 发表评论
]]>
一些腾讯笔试题?http://m.tkk7.com/qq13367612/archive/2005/10/31/17524.htmlSungSungMon, 31 Oct 2005 03:50:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/31/17524.htmlhttp://m.tkk7.com/qq13367612/comments/17524.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/31/17524.html#Feedback17http://m.tkk7.com/qq13367612/comments/commentRss/17524.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/17524.html2、如何输出源文g的标题和目前执行行的行数
3、两个数怹Q小数点后位数没有限Ӟ请写一个高_ֺ法
4、写一个病?BR>5、有A、B、C、D四个人,要在夜里q一座桥。他们通过q桥分别需要耗时1???0分钟Q只有一支手电,q且同时最多只能两个h一赯桥。请问,如何安排Q能够在17分钟内这四个人都q桥Q?BR>
2005q腾讯招?BR>选择?60) 
  c/c++ os linux 斚w的基知识 c的Sizeof函数有好几个! 
E序填空(40) 
1.(20) 4Ix5 
  不用额外空? A,B两链表的元素交叉归ƈ 
2.(20) 4Ix5 
MFC  树序列化 {存在数组或 链表中!


Sung 2005-10-31 11:50 发表评论
]]>
VO、TO、PO、POJO、BOhttp://m.tkk7.com/qq13367612/archive/2005/10/28/17149.htmlSungSungFri, 28 Oct 2005 03:39:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/28/17149.htmlhttp://m.tkk7.com/qq13367612/comments/17149.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/28/17149.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/17149.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/17149.html
ViewObjectQUI需要的对象Q如Struts的FormBean

Value ObjectQValueObject和Transfer Object的ȝ?

TOQ?Transfer ObjectQ数据传输物Ӟ在应用程序不同tie之间传输的对?

POQPersistent ObjectQ持久化物gQ,基本上就是Entity?

POJOQplain ordinary java object QPOJO是这样一个对象,它是一个普通的Java对象Q它不同于EJBq样的带有繁重的容器控制功能的对象,它也不是JDO那种被Enhancedq的对象Q也不是cMHibernate那样被动态的byte code generationq?BR>
BOQBusiness Object。可以参?A HREF="/qq13367612/archive/2005/10/21/16250.aspx">q里的讨论?img src ="http://m.tkk7.com/qq13367612/aggbug/17149.html" width = "1" height = "1" />

Sung 2005-10-28 11:39 发表评论
]]>
关于VO、PO的理?/title><link>http://m.tkk7.com/qq13367612/archive/2005/10/28/17147.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 28 Oct 2005 03:30:00 GMT</pubDate><guid>http://m.tkk7.com/qq13367612/archive/2005/10/28/17147.html</guid><wfw:comment>http://m.tkk7.com/qq13367612/comments/17147.html</wfw:comment><comments>http://m.tkk7.com/qq13367612/archive/2005/10/28/17147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/qq13367612/comments/commentRss/17147.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/qq13367612/services/trackbacks/17147.html</trackback:ping><description><![CDATA[O/R Mapping ?Object Relational MappingQ对象关pL)的羃写。通俗点讲Q就是将对象与关pL据库l定Q用对象来表C关pL据。在O/R Mapping的世界里Q有两个基本的也是重要的东东需要了解,即VOQPO?BR>  VOQ值对?Value Object)QPOQ持久对?Persisent Object)Q它们是׃l属性和属性的get和setҎl成。从l构上看Q它们ƈ没有什么不同的地方。但从其意义和本质上来看是完全不同的?BR><BR>Q.VO是用new关键字创建,由GC回收的?<BR>  PO则是向数据库中添加新数据时创建,删除数据库中数据时削除的。ƈ且它只能存活在一个数据库q接中,断开q接卌销毁?<BR><BR>Q.VO是值对象,_点讲它是业务对象Q是存活在业务层的,是业务逻辑使用的,它存zȝ目的是为数据提供一个生存的地方?<BR>  PO则是有状态的Q每个属性代表其当前的状态。它是物理数据的对象表示。用它Q可以我们的程序与物理数据解耦,q且可以化对象数据与物理数据之间的{换?BR><BR>Q.VO的属性是Ҏ当前业务的不同而不同的Q也是_它的每一个属性都一一对应当前业务逻辑所需要的数据的名U?<BR>  PO的属性是跟数据库表的字段一一对应的?BR><BR>PO对象需要实现序列化接口?BR><img src ="http://m.tkk7.com/qq13367612/aggbug/17147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/qq13367612/" target="_blank">Sung</a> 2005-10-28 11:30 <a href="http://m.tkk7.com/qq13367612/archive/2005/10/28/17147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>热点招聘信息汇?!http://m.tkk7.com/qq13367612/archive/2005/10/26/16899.htmlSungSungWed, 26 Oct 2005 09:32:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/26/16899.htmlhttp://m.tkk7.com/qq13367612/comments/16899.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/26/16899.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16899.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16899.html
Morgan Stanley
http://www.morganstanley.com/careers/recruiting/apply_now.html

UBS
http://graduates.ubs.com/career/cms/index.html

瑞士信贷W一波士?
http://www.csfb.com/standout
Deadline: 24th.Oct

高盛
www.gs.com/careers/apply_online


http://www.ml.com/index.asp?id=7695_8199_8205_14187_14215_16358

中国国际金融有限公司公司(CICC)
http://www.cicc.com.cn/CICCHRWEB/Resume_CPage.asp?op=Jobs_1&typ=2

麦肯?
http://www.mckinsey.com/locations/ChinaSimplified/index.asp
或http://campus.chinahr.com/pages/mckinsey/
截止日期Q?1.4下午5?

BCG
邮寄地址:
Anna Zhang
Boston Consulting (Shanghai) Co., Ltd Beijing Branch
朝阳区徏国\?18号京汇大?02室,邮编Q?00022

贝恩
www.joinbainchina.com
׃|络问题,请同学们?0?1号到11?h间提交简?

Monitor
Mailing Address: 北京市朝阛_霄云?8L代汽车大?08?100027
Deadline for candidates in Beijing: November 3, 2005
Deadline for candidates in Shanghai: November 10, 2005


U尔?
Application Methods (Choose ONE ONLY)
Submitting your application on the campus presentation day;
or Sending in your application electronically to BA-recruiting.bj@atkearney.com;or Mailing in your application to A.T. Kearney Beijing Office at the belowaddress:
U尔g业咨询有限公司北京办事处
人力资源?
北京市徏国门外大??
中国国际贸易中心西办公楼504?
邮政~码 100004
Application Deadline:November 9, 2005

Booz Allen Hamilton
具体甌方式QDownload the application form from : www.bah.com.cn ,
"people and career" and go to "application" and then download the
application form and send applicaton form, Chinese and English CV as well as cover letter to china_hr@bah.com

PWC
http://www.pwccn.com/home/eng/graduate_opportunities.html
Deadline: 10.28

KPMG
http:// www.kpmg.com.hk

德勤
http://career.deloitte.com.cn/RMS0102_Requisition.aspx?Loc=BJ#
Deadline: 11.6

安永
www.eygraduate.com
Deadline: November 6, 2005
{疑邮箱: graduate.bj@cn.ey.com

?IT,通信,电子电器c?

微Y(MS China, MSN China, MSRA, MSATC)
http://campus.chinahr.com/pages/microsoft/

IBM
http://campus.chinahr.com/pages/ibm/
截至日期:10.31

q?Intel)
http://campus.chinahr.com/pages/intel/jobs.asp
(宣讲会前一周截?

癑ֺ
http://www.baidu.com/hr/index.html

英飞?
http://campus.chinahr.com/pages/Infineon/Programs.asp

锐捷|络
http://campus.chinahr.com/pages/ruijie/index.asp

卓越|?
http://joyo.com/campus

华ؓ集团
http://career.huawei.com/career/zh/campus.do
截至日期:11??

中兴
http://job.zte.com.cn/zte.graduate.web/index.aspx

掌中万维U技有限公司
http://www1.zhaopin.com/Publish/Company/Newpalm/index.htm

威盛电子QVIAQ电子股份有限公?
http://campus.chinahr.com/viatech/
截止日期Q?0.24

中电赛龙
http://campus.chinahr.com/pages/cecw/

Google中国
http://www.google.com/intl/zh-CN/jobs/

|易互动׃2006高校巡回招聘?
http://hr2006.163.com/ 十月中旬上线

松下电器Q中国)有限公司
http://recruit.panasonic.cn/campusjob.asp

创维集团
http://skyworth.com/job/default.asp?action=1&title

ericsson
http://www.pincn.com/clientpages/2005/ericsson/
截至日期:11?8?

联想集团
http://campus.chinahr.com/pages/lenovo

腾讯
http://hr.tencent.com/

ABB甉|校园招聘
http://companyads.51job.com/companyads/shanghai/bj/abb050824/index.htm

台积?
http://tsmcsh.51job.com/

信Hisense
http://campus.chinahr.com/pages/hisense/

TCL校园招聘
http://www.tcl.com/job/hr/school/

中奥集团OTIS(奥的斯电?2006q校园招聘网画I
http://otis.51job.com/page/6-4.htm

施奈L?
http://career.schneider-electric.com.cn/hr0001.nsf/pwelcome?open

2006 GE China Campus
http://hr.ge-china.com

的集团
http://campus.chinahr.com/pages/midea/

襉K?
http://www.careers.siemens.com.cn/graduates

?其他c?

玛氏中国Mars
http://campus.chinahr.com/pages/mars
截至日期:11.1

强生(中国)有限公司
http://campus.chinahr.com/pages/jnj/
截至日期:11?5?

高露z?
http://campus.chinahr.com/pages/colgate

BP
http://www1.zhaopin.com/Publish/Market/bp/index.htm

联合利华
http://www.unilever.com.cn/ourcompany/careers/trainee/
截止日期10.31

博世QBoschQ?
http://campus.chinahr.com/pages/bosch/jobs.asp

壳牌QShellQ?
http://student.zhaopin.com/extend/shell/grad_apply.htm

N生网l能源有限公?006q校园招?
登陆|站http://www.emersonnetwork.com.cn

金地Q集团)股䆾有限公司2006q校园招?
公司|址Qhttp://www.gemdale.com
历投递地址Q?006gemdale@gemdale.com

马士?006校园招聘
http://campus.chinahr.com/pages/maersk/

q州本田
http://campus.chinahr.com/pages/gzhonda/

中国q东核电集团有限公司
http://campus.chinahr.com/pages/cgnpc/

Ƨ莱?
http://campus.chinahr.com/pages/loreal/

龙湖房地?
http://pages.chinahr.com/2005/cd/longhu_1009/

世联房地?
http://companyadc.51job.com/companyads/shanghai/shzh/shilian051011/index.htm

ICI
http://campus.chinahr.com/pages/ici/

炬力
http://www.actions.com.cn/campus.aspx

招商证券
http://news.newone.com.cn/adv/zhaopin/zhaopin.html
泰鼎多媒体技术(上vQ有限公?
http://www.trident.com.cn/careers.asp

优识
http://www.ucamp.com.cn/About_us/usys_job.jsp

农夫山泉
http://www.51job.com/hot/show_list.php?id=4670965

青岛啤酒
http://campus.chinahr.com/pages/tsingtao/index.asp

环球
http://career.globalmarket.com/jobs.aspx
截至日期:10?6?

=================================================

有借鉴价|值得保留


Sung 2005-10-26 17:32 发表评论
]]>
2005各大公司薪水民间版本http://m.tkk7.com/qq13367612/archive/2005/10/26/16848.htmlSungSungWed, 26 Oct 2005 02:57:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/26/16848.htmlhttp://m.tkk7.com/qq13367612/comments/16848.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/26/16848.html#Feedback4http://m.tkk7.com/qq13367612/comments/commentRss/16848.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16848.html我们在学校都混得差不多,可是因ؓM不同的城市、进了不同的公司Q薪水有了差异,g也有了“贵贱”之分?BR>
  下面是我的老同学们从各大公怼来的薪水民间版本?BR>
  日本SONY 索尼  1万/月,仅要研究生?BR>
  韩国三星电子中国总部 25万/q?BR>
  法国索姆软g 20万/q_赴欧工作?BR>
  国Cisco 思科  1.5万/月,仅要研究生?BR>
  国INTEL q? 1.3万/?BR>
  国IBM 5000左右Q月

  德国襉K?nbsp;8000Q月

  西藏联?nbsp;8q?00万,不过高原反应太艰苦?BR>
  青v联?nbsp;5000-7000Q月Q可以只{一q?BR>
  深圳联?nbsp;3000-4000Q月 

  深圳记忆U技 本科10-15万/q_士15-20万/q?BR>
  上v|道信息技?除房食补?7000-8000Q月

  中国电信 7-10万/q_另有房交补?BR>
  AVANT 6-8万/q?nbsp;

  东方通信 6-8万/q_仅要研究生?BR>
  北京联想 6-7.5万/q?nbsp;

  深大通信 6万/q?BR>
  州康顺光通讯 5-10万/q?BR>
  国FIBERON公司 本科6万/q_士10万/q?BR>
  深圳华ؓ 5480Q月

  青岛尔 5-6万/q?BR>
  ut斯达?nbsp;本科5000Q月Q研I生6000-8000Q月?BR>
  MOTOROLA(苏州) 5000Q月

  深圳中兴 5000Q月

  北京华虹NEC 4000-5000Q月

  深圳黎明|络 ?000Q月Q硕6500Q月Q博8500Q月?nbsp;

  q东北电 4000-5000Q月

  上v贝尔 4万/q?nbsp;Q?nbsp;1.5?q终?

  成都q普 5万/q?研发)

  中国银行新疆分行 4.5万/q?BR>
  北大Ҏ奥d 3500-4000Q月

  青岛信 4万/q_两年?-7万/q?BR>
  中华通信 ?000元/月,?000元/月,?000元/?nbsp;?BR>
  烟台东方电子 4000Q月Q年l奖1.5万,婚后分房?BR>
  q东金鹏 3000-4000Q月

  深圳康佳 3000-4000Q月 

  TCL 3800Q月 深圳 Q?000-3000Q月 惠州 ?BR>
  深圳奥林巴斯 ? 3000Q月Q另1200Q月房补?BR>
  武汉邮科?nbsp;本科 3000Q月Q研I生5000Q月?BR>
  徏实达 3万/q?BR>
  上v计算机研I所 2500-4000Q月

  深圳飞?nbsp;本科3000Q月Q研I生5000Q月?BR>
  中讯 3000Q月

  北京|?nbsp;3000Q月

  宁L雅戈?nbsp;3000Q月

  q州华南资讯 本科2500Q月Q硕?万/q?BR>
  宁L波导 2.5-5万/q?BR>
  青岛朗讯 合资  2.5-3万/q?nbsp;Q研I生 大連朗a?1?月)

  上v늜I研I所 2000Q月Q{?000Q月?BR>
  和记黄埔 ?000-4000Q月Q硕4000-6000Q月?BR>
  中国电信q州研究中心 2-10万/q?BR>
  西安电子工程研究所 2000-3000Q月

  南京自动化研I所 2000Q月

  AMD 本科2000Q月

  厦门厦新 1800-1900Q月

  q东的 1800-2400Q月

  苏州明基电脑 台资 1600-2000Q月

  四川长虹 1500-2000Q月

  深圳天马微电?nbsp;1500Q月Q{?-4万/q?BR>
  合肥英图微电?合资  1500Q月Q?000Q月(转正)?BR>
  长城电脑 1500Q月

  成都国腾通信 1200Q月Q研发h?000-4000Q月?BR>
  成都TOP 1500Q月

        三菱Q三星研发中?5000/?BR>
        襉K子制造部 3200/?BR>

Sung 2005-10-26 10:57 发表评论
]]>
正确优雅地解决用户退出问题——JSP及Struts解决Ҏhttp://m.tkk7.com/qq13367612/archive/2005/10/25/16710.htmlSungSungTue, 25 Oct 2005 02:00:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/25/16710.htmlhttp://m.tkk7.com/qq13367612/comments/16710.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/25/16710.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16710.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16710.html    与上q情形相似的q有位处图书馆、医院等公共场所的计机。在q些地方Q许多用户共同用几台计机Q此时保护用L个h数据显得至关重要。设计良好编写优U的应用对用户专业知识的要求少之又?BR>    我们来看一下现实世界中一个完的Web应用是如何表现的Q一个用户通过览器访问一个页面。Web应用展现一个登陆页面要求用戯入有效的验证信息。用戯入了用户名和密码。此时我们假讄h供的w䆾验证信息是正的Q经q了验证q程QWeb应用允许用户览他有权访问的区域。用h退出时Q点击退出按钮,Web应用要求用户认他是否则真的需要退出,如果用户定退出,Sessionl束QWeb应用重新定位到登陆页面。用户可以放心的d而不用担心他的信息会泄露。另一个用户坐C同一台电脑前Q他点击后退按钮QWeb应用不应该出C一个用戯问过的Q何一个页面。事实上QWeb应用在第二个用户提供正确的验证信息之前应当一直停留在登陆面上?BR>    通过CZE序Q文章向您阐qC如何在一个Web应用中实现这一功能?BR>


JSPCZ
      Z更ؓ有效地阐q实现方案,本文从展示一个示例应用logoutSampleJSP1中碰到的问题开始。这个示例代表了许多没有正确解决退E的Web应用。logoutSampleJSP1包含了下qjsp面Qlogin.jsp, home.jsp, secure1.jsp, secure2.jsp, logout.jsp, loginAction.jsp, and logoutAction.jsp。其中页面home.jsp, secure1.jsp, secure2.jsp, 和logout.jsp是不允许未经认证的用戯问的Q也是_q些面包含了重要信息,在用L陆之前或者退Z后都不应该出现在览器中。login.jsp包含了用于用戯入用户名和密码的form。logout.jsp包含了要求用户认是否退出的form。loginAction.jsp和logoutAction.jsp作ؓ控制器分别包含了登陆和退Z码?BR>    W二个示例应用logoutSampleJSP2展示了如何解决示例logoutSampleJSP1中的问题。然而,W二个应用自w也是有疑问的。在特定的情况下Q退出问题还是会出现?BR>    W三个示例应用logoutSampleJSP3在第二个CZ上进行了改进Q比较完善地解决了退出问题?BR>    最后一个示例logoutSampleStruts展示了Struts如何优美地解决登陆问题?BR>    注意Q本文所附示例在最新版本的Microsoft Internet Explorer (IE), Netscape Navigator, Mozilla, FireFox和Avant览器上试通过?BR>

Login action
      Brian Pontarelli的经典文?A target=_new>《J2EE Security: Container Versus Custom?/A>讨论了不同的J2EE认证途径。文章同时指出,HTTP协议和基于form的认证ƈ未提供处理用户退出的机制。因此,解决途径便是引入自定义的安全实现机制?BR>    自定义的安全认证机制普遍采用的方法是从form中获得用戯入的认证信息Q然后到诸如LDAP (lightweight directory access protocol)或关pL据库的安全域中进行认证。如果用h供的认证信息是有效的Q登陆动作往HttpSession对象中注入某个对象。HttpSession存在着注入的对象则表示用户已经登陆。ؓ了方便读者理解,本文所附的CZ只往HttpSession中写入一个用户名以表明用户已l登陆。清?是从loginAction.jsp面中节选的一D代码以此阐q登陆动作:


Listing 1
//...
//initialize RequestDispatcher object; set forward to home page by default
RequestDispatcher rd = request.getRequestDispatcher("home.jsp");

//Prepare connection and statement
rs = stmt.executeQuery("select password from USER where userName = &#39;" + userName + "&#39;");
if (rs.next()) { //Query only returns 1 record in the result set; only 1
  password per userName which is also the primary key
   if (rs.getString("password").equals(password)) { //If valid password
      session.setAttribute("User", userName); //Saves username string in the session object
   }
   else { //Password does not match, i.e., invalid user password
      request.setAttribute("Error", "Invalid password.");

      rd = request.getRequestDispatcher("login.jsp");
   }
} //No record in the result set, i.e., invalid username
   else {

      request.setAttribute("Error", "Invalid user name.");
      rd = request.getRequestDispatcher("login.jsp");
   }
}

//As a controller, loginAction.jsp finally either forwards to "login.jsp" or "home.jsp"
rd.forward(request, response);
//...



    本文所附示例均以关pd数据库作为安全域Q但本文所阐述的观点对Mcd的安全域都是适用的?BR>
Logout action
      退出动作就包含了简单的删除用户名以及对用户的HttpSession对象调用invalidate()Ҏ。清?是从loginoutAction.jsp面中节选的一D代码以此阐q退出动作:


Listing 2
//...
session.removeAttribute("User");
session.invalidate();
//...



L未经认证讉K受保护的JSP面
      从form中获取用h交的认证信息q经q验证后Q登陆动作简单地往 HttpSession对象中写入一个用户名Q退出动作则做相反的工作Q它从用LHttpSession对象中删除用户名q调用invalidate()Ҏ销毁HttpSession。ؓ了登陆和退出动作真正发挥作用,所有受保护的JSP面都应该首先验证HttpSession中是否包含了用户名以认当前用户是否已经登陆。如果HttpSession中包含了用户名,也就是说用户已经登陆QWeb应用则将剩余的JSP发送给览器,否则QJSP将跌{到登陆页login.jsp。页面home.jsp, secure1.jsp, secure2.jsp和logout.jsp均包含清?中的代码D:


Listing 3
//...
String userName = (String) session.getAttribute("User");
if (null == userName) {
   request.setAttribute("Error", "Session has ended.  Please login.");
   RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
   rd.forward(request, response);
}
//...
//Allow the rest of the dynamic content in this JSP to be served to the browser
//...



      在这个代码段中,E序从HttpSession中减~username字符丌Ӏ如果字W串为空QWeb应用则自动中止执行当前页面ƈ跌{到登陆页Q同时给出Session has ended. Please log in.的提C;如果不ؓI,Web应用则l执行,也就是把剩余的页面提供给用户?BR>
q行logoutSampleJSP1
      q行logoutSampleJSP1会出现如下几种情ŞQ?BR>    &#8226;  如果用户没有登陆QWeb应用会正确中止受保护页面home.jsp, secure1.jsp, secure2.jsp和logout.jsp的执行,也就是说Q假如用户在览器地址栏中直接敲入受保护JSP늚地址试图讉KQWeb应用自动蟩转到登陆ƈ提示Session has ended.Please log in.
      &#8226;  同样的,当一个用户已l退出,Web应用也会正确中止受保护页面home.jsp, secure1.jsp, secure2.jsp和logout.jsp的执?BR>    &#8226;  用户退出后Q如果点L览器上的后退按钮QWeb应用不能正保护受保护的页面——在Session销毁后Q用户退出)受保护的JSP重新在览器中昄出来。然而,如果用户点击q回面上的M链接QWeb应用会跌{到登陆页面ƈ提示Session has ended.Please log in.

L览器缓?/B>
      上述问题的根源在于大部分览器都有一个后退按钮。当点击后退按钮Ӟ默认情况下浏览器不是从Web服务器上重新获取面Q而是从浏览器~存中蝲入页面。基于Java的Web应用q未限制q一功能Q在ZPHP、ASP?NET的Web应用中也同样存在q一问题?BR>    在用Ld退按钮后,览器到服务器再从服务器到浏览器q样通常意思上的HTTP回\q没有徏立,仅仅只是用户Q浏览器和缓存进行了交互。所以,即包含了清?上的代码来保护JSP面Q当点击后退按钮Ӟq些代码是不会执行的?BR>    ~存的好坏,真是仁者见仁智者见智。缓存的提供了一些便利,但通常只在使用静态的HTML面或基于图形或影响的页面你才能感受到。而另一斚wQWeb应用通常是基于数据的Q数据通常是频J更改的。与从缓存中dq显C期的数据相比Q提供最新的数据才是更重要的Q?BR>    q运的是QHTTP头信息“Expires”和“Cache-Control”ؓ应用E序服务器提供了一个控制浏览器和代理服务器上缓存的机制。HTTP头信息Expires告诉代理服务器它的缓存页面何时将q期。HTTP1.1规范中新定义的头信息Cache-Control可以通知览器不~存M面。当点击后退按钮Ӟ览器重新访问服务器已获取页面。如下是使用Cache-Control的基本方法:
    &#8226;  no-cache:强制~存从服务器上获取新的页?BR>    &#8226;  no-store: 在Q何环境下~存不保存Q何页?BR>    HTTP1.0规范中的Pragma:no-cache{同于HTTP1.1规范中的Cache-Control:no-cacheQ同样可以包含在头信息中?
    通过使用HTTP头信息的cache控制Q第二个CZ应用logoutSampleJSP2解决了logoutSampleJSP1的问题。logoutSampleJSP2与logoutSampleJSP1不同表现在如下代码段中,q一代码D加入进所有受保护的页面中:


//...
response.setHeader("Cache-Control","no-cache"); //Forces caches to obtain a new copy of the page from the origin server
response.setHeader("Cache-Control","no-store"); //Directs caches not to store the page under any circumstance
response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale"
response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility
String userName = (String) session.getAttribute("User");
if (null == userName) {
   request.setAttribute("Error", "Session has ended.  Please login.");
   RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
   rd.forward(request, response);
}
//...



      通过讄头信息和查HttpSession中的用户名确保了览器不~存面Q同Ӟ如果用户未登陆,受保护的JSP面不会发送到览器,取而代之的是登陆面login.jsp?BR>
q行logoutSampleJSP2
      q行logoutSampleJSP2后将回看到如下结果:
    &#8226;  当用户退出后试图点击后退按钮Q浏览器q不会显C受保护的页面,它只会现实登陆页login.jsp同时l出提示信息Session has ended. Please log in.
      &#8226;  然而,当按了后退按钮q回的页是处理用h交数据的面ӞIE和Avant览器将弹出如下信息提示Q?BR>               警告Q页面已q期……(你肯定见q)
    选择h后前一个JSP面重新显C在览器中。很昄Q这不是我们所想看到的因ؓ它违背了logout动作的目的。发生这一现象Ӟ很可能是一个恶意用户在试获取其他用户的数据。然而,q个问题仅仅出现在后退按钮对应的是一个处理POSTh的页面?BR>
记录最后登陆时?
      上述问题之所以出现是因ؓ览器将其缓存中的数据重新提交了。这本文的例子中Q数据包含了用户名和密码。无论是否给出安全警告信息,览器此时vC负面作用?BR>    Z解决logoutSampleJSP2中出现的问题QlogoutSampleJSP3的login.jsp在包含username和password的基上还包含了一个称作lastLogon的隐藏表单域Q此表单域动态的用一个long型值初始化。这个long型值是调用System.currentTimeMillis()获取到的?970q??日以来的毫秒数。当login.jsp中的form提交ӞloginAction.jsp首先隐藏域中的g用户数据库中的D行比较。只有当lastLogon表单域中的值大于数据库中的值时Web应用才认是个有效的登陆?BR>    Z验证登陆Q数据库中lastLogon字段必须以表单中的lastLogonD行更新。上例中Q当览器重复提交数据时Q表单中的lastLogong比数据库中的lastLogon值大Q因此,loginAction转到login.jsp面Qƈ提示Session has ended.Please log in.清单5是loginAction中节选的代码D:


清单5
//...
RequestDispatcher rd = request.getRequestDispatcher("home.jsp"); //Forward to homepage by default
//...
if (rs.getString("password").equals(password)) { //If valid password
   long lastLogonDB = rs.getLong("lastLogon");
   if (lastLogonForm > lastLogonDB) {
      session.setAttribute("User", userName); //Saves username string in the session object
      stmt.executeUpdate("update USER set lastLogon= " + lastLogonForm + " where userName = &#39;" + userName + "&#39;");
   }
   else {
      request.setAttribute("Error", "Session has ended.  Please login.");
      rd = request.getRequestDispatcher("login.jsp");        }
}
else   { //Password does not match, i.e., invalid user password
   request.setAttribute("Error", "Invalid password.");
   rd = request.getRequestDispatcher("login.jsp");  
}
//...
rd.forward(request, response);
//...



      Z实现上述ҎQ你必须记录每个用户的最后登陆时间。对于采用关pd数据库安全域来说Q这点可以可以通过在某个表中加上lastLogin字段L实现。LDAP以及其他的安全域需要稍微动下脑{,但很昄是可以实现的?BR>    表示最后登陆时间的Ҏ有很多。示例logoutSampleJSP3利用了自1970q??日以来的毫秒数。这个方法在许多人在不同览器中用一个用戯̎L陆时也是可行的?BR>
q行logoutSampleJSP3
      q行CZlogoutSampleJSP3展C如何正处理退出问题。一旦用户退出,点击览器上的后退按钮在Q何情况下都不会是受保护的面在浏览器上显C出来。这个示例展CZ如何正确处理退出问题而不需要额外的培训?BR>    Z使代码更l有效,一些冗余的代码可以剔除掉。一U途径是把清?中的代码写到一个单独的JSP中Q通过标签<jsp:include>其他面也可以引用?BR>
Struts框架下的退出实?/B>
      与直接用JSP或JSP/servlets相比Q另一个可选的Ҏ是用Struts。ؓ一个基于Struts的Web应用d一个处理退出问题的框架可以优雅CҎ力的实现。这部分归功于Struts是采用MVC设计模式的因此将模型和视图清晰的分开。另外,Java是一个面向对象的语言Q其支持l承Q可以比JSP中的脚本更ؓҎ地实C码重用。在Struts中,清单4中的代码可以从JSP面中移植到Actioncȝexecute()Ҏ中?BR>    此外Q我们还可以定义一个承Struts Actioncȝ基本c,其execute()Ҏ中包含了清单4中的代码。通过使用cȝ承机Ӟ其他cd以承基本类中的通用逻辑来设|HTTP头信息以及检索HttpSession对象中的username字符丌Ӏ这个基本类是一个抽象类q定义了一个抽象方法executeAction()。所有承自基类的子c都应实现exectuteAction()Ҏ而不是覆盖它。清?是基cȝ部分代码Q?BR>

清单6
  public abstract class BaseAction extends Action {
   public ActionForward execute(ActionMapping mapping, ActionForm form,
      HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {
      
      response.setHeader("Cache-Control","no-cache"); //Forces caches to obtain a new copy of the page from the origin server
      response.setHeader("Cache-Control","no-store"); //Directs caches not to store the page under any circumstance
      response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale"
      response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility
      
      if (!this.userIsLoggedIn(request)) {
         ActionErrors errors = new ActionErrors();

         errors.add("error", new ActionError("logon.sessionEnded"));
         this.saveErrors(request, errors);

         return mapping.findForward("sessionEnded");
      }

      return executeAction(mapping, form, request, response);
   }

   protected abstract ActionForward executeAction(ActionMapping mapping,
      ActionForm form, HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException;      

   private boolean userIsLoggedIn(HttpServletRequest request) {
      if (request.getSession().getAttribute("User") == null) {
         return false;
      }

      return true;
   }
}


      清单6中的代码与清?中的很相像,仅仅只是用ActionMapping findForward替代了RequestDispatcher forward。清?中,如果在HttpSession中未扑ֈusername字符ԌActionMapping对象找到名为sessionEnded的forward元素q蟩转到对应的path。如果找CQ子cd执行其实CexecuteAction()Ҏ的业务逻辑。因此,在配|文件struts-web.xml中ؓ所有子cd明个一名ؓsessionEnded的forward元素是必ȝ。清?以secure1 action阐明了这样一个声明:

清单7
<action path="/secure1"
   type="com.kevinhle.logoutSampleStruts.Secure1Action"          
   scope="request">
   <forward name="success" path="/WEB-INF/jsps/secure1.jsp"/>
   <forward name="sessionEnded" path="/login.jsp"/>
</action>


    l承自BaseActioncȝ子类Secure1Action实现了executeAction()Ҏ而不是覆盖它。Secure1ActioncM执行M退Z码,如清?Q?BR>

public class Secure1Action extends BaseAction {
   public ActionForward executeAction(ActionMapping mapping, ActionForm form,
      HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {
      
      HttpSession session = request.getSession();            
      return (mapping.findForward("success"));
   }
}



    只需要定义一个基c而不需要额外的代码工作Q上q解x案是优雅而有效的。不怎样Q将通用的行为方法写成一个承StrutsAction的基cL许多Struts目的共同经验,值得推荐?BR>
局限?/B>
    上述解决Ҏ对JSP或基于Struts的Web应用都是非常单而实用的Q但它还是有某些局限。在我看来,q些局限ƈ不是臛_紧要的?I>Q局限性未译Q请参见原文Q?/I>

l论
    本文阐述了解决退出问题的ҎQ尽方案简单的令h惊讶Q但却在所有情况下都能有效地工作。无论是对JSPq是StrutsQ所要做的不q是写一D不过50行的代码以及一个记录用h后登陆时间的Ҏ。在Web应用中؜合用这些方案能够拥护的私人数据不致泄Ԍ同时Q也能增加用Ll验?BR>

Sung 2005-10-25 10:00 发表评论
]]>
Java 性能优化技巧集?http://m.tkk7.com/qq13367612/archive/2005/10/24/16659.htmlSungSungMon, 24 Oct 2005 14:16:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/24/16659.htmlhttp://m.tkk7.com/qq13367612/comments/16659.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/24/16659.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16659.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16659.html1.用new关键词创建类的实例时Q构造函数链中的所有构造函数都会被自动调用。但如果一个对象实CCloneable接口Q我们可以调用它的clone()Ҏ。clone()Ҏ不会调用McL造函数?

在用设计模式(Design PatternQ的场合Q如果用Factory模式创徏对象Q则改用clone()Ҏ创徏新的对象实例非常单。例如,下面是Factory模式的一个典型实玎ͼ

public static Credit getNewCredit() {
return new Credit();
} 
 
改进后的代码使用clone()ҎQ如下所C:

private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}


面的思\对于数组处理同样很有用?

2. 使用非阻塞I/O

版本较低的JDK不支持非dI/O API。ؓ避免I/OdQ一些应用采用了创徏大量U程的办法(在较好的情况下,会用一个缓冲池Q。这U技术可以在许多必须支持q发I/O的应用中见刎ͼ如Web服务器、报价和拍卖应用{。然而,创徏JavaU程需要相当可观的开销?

3. 慎用异常

异常Ҏ能不利。抛出异帔R先要创徏一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本圎ͼNativeQ方法,fillInStackTrace()Ҏ查堆栈,攉调用跟踪信息。只要有异常被抛出,VM必调整调用堆栈,因ؓ在处理过E中创徏了一个新的对象。异常只能用于错误处理,不应该用来控制程序流E?

4. 不要重复初始化变?

默认情况下,调用cȝ构造函数时Q?Java会把变量初始化成定的|所有的对象被设|成nullQ整数变量(byte、short、int、longQ设|成0Qfloat和double变量讄?.0Q逻辑D|成false。当一个类从另一个类zӞq一点尤其应该注意,因ؓ用new关键词创Z个对象时Q构造函数链中的所有构造函数都会被自动调用?

5. 量指定cȝfinal修饰W?

带有final修饰W的cL不可z的。在Java核心API中,有许多应用final的例子,例如java.lang.String。ؓStringcL定final防止了h们覆盖length()Ҏ。另外,如果指定一个类为finalQ则该类所有的Ҏ都是final。Java~译器会LZ内联QinlineQ所有的finalҎQ这和具体的~译器实现有养I。此举能够性能q_提高50%?

6. 量使用局部变?

调用Ҏ时传递的参数以及在调用中创徏的时变量都保存在栈QStackQ中Q速度较快。其他变量,如静态变量、实例变量等Q都在堆QHeapQ中创徏Q速度较慢。另外,依赖于具体的~译?JVMQ局部变量还可能得到q一步优化?

7. 乘法和除?

考虑下面的代码:

for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; } 
 
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码Q?

for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }



修改后的代码不再做乘?的操作,而是改用{h的左U?位操作,每左U?位相当于乘以2。相应地Q右U?位操作相当于除以2。值得一提的是,虽然UM操作速度快,但可能代码比较难于理解Q所以最好加上一些注释?

前面介绍的改善性能技巧适合于大多数Java应用Q接下来要讨论的问题适合于用JSP、EJB或JDBC的应用?

1. 使用~冲标记

一些应用服务器加入了面向JSP的缓冲标记功能。例如,BEA的WebLogic Server?.0版本开始支持这个功能,Open Symphony工程也同h持这个功能。JSP~冲标记既能够缓冲页面片断,也能够缓冲整个页面。当JSP面执行Ӟ如果目标片断已经在缓冲之中,则生成该片断的代码就不用再执行。页面~冲捕获Ҏ定URL的请求,q缓冲整个结果页面。对于购物篮、目录以及门L站的主页来说Q这个功能极其有用。对于这cd用,面U缓冲能够保存页面执行的l果Q供后h使用?

对于代码逻辑复杂的页面,利用~冲标记提高性能的效果比较明显;反之Q效果可能略逊一{V?

2. 始终通过会话Bean讉K实体Bean

直接讉K实体Bean不利于性能。当客户E序q程讉K实体BeanӞ每一个getҎ都是一个远E调用。访问实体Bean的会话Bean是本地的Q能够把所有数据组l成一个结构,然后q回它的倹{?

用会话Bean装对实体Bean的访问能够改q事务管理,因ؓ会话Bean只有在到达事务边界时才会提交。每一个对getҎ的直接调用生一个事务,容器在每一个实体Bean的事务之后执行一个“装?d”操作。一些时候,使用实体Bean会导致程序性能不佳。如果实体Bean的唯一用途就是提取和更新数据Q改成在会话Bean之内利用JDBC讉K数据库可以得到更好的性能?

3. 选择合适的引用机制

在典型的JSP应用pȝ中,头、页脚部分往往被抽取出来,然后Ҏ需要引入页头、页脚。当前,在JSP面中引入外部资源的Ҏ主要有两U:include指oQ以及include动作?

include指oQ例?

<%@ include file="copyright.html" %>



该指令在~译时引入指定的资源。在~译之前Q带有include指o的页面和指定的资源被合ƈ成一个文件。被引用的外部资源在~译时就定Q比q行时才定资源更高效?

include动作Q例?

<jsp:include page="copyright.jsp" />



该动作引入指定页面执行后生成的结果。由于它在运行时完成Q因此对输出l果的控制更加灵zR但Ӟ只有当被引用的内定wJ地改变Ӟ或者在对主面的请求没有出C前,被引用的面无法定Ӟ使用include动作才合?

4. 在部|描q器中设|只d?

实体Bean的部|描q器允许把所有getҎ讄成“只诠Z。当某个事务单元的工作只包含执行d操作的方法时Q设|只d性有利于提高性能Q因为容器不必再执行存储操作?



5. ~冲对EJB Home的访?

EJB Home接口通过JNDI名称查找获得。这个操作需要相当可观的开销。JNDI查找最好放入Servlet的init()Ҏ里面。如果应用中多处频繁地出现EJB讉KQ最好创Z个EJBHomeCachecREJBHomeCachecM般应该作为singleton实现?

6. 为EJB实现本地接口

本地接口是EJB 2.0规范新增的内容,它得Bean能够避免q程调用的开销。请考虑下面的代码?

PayBeanHome home = (PayBeanHome)
javax.rmi.PortableRemoteObject.narrow
(ctx.lookup ("PayBeanHome"), PayBeanHome.class); 
PayBean bean = (PayBean)
javax.rmi.PortableRemoteObject.narrow 
(home.create(), PayBean.class);



W一个语句表C我们要LBean的Home接口。这个查N过JNDIq行Q它是一个RMI调用。然后,我们定位q程对象Q返回代理引用,q也是一个RMI调用。第二个语句C了如何创Z个实例,涉及了创建IIOPhq在|络上传输请求的stubE序Q它也是一个RMI调用。要实现本地接口Q我们必M如下修改Q?

Ҏ不能再抛出java.rmi.RemoteException异常Q包括从RemoteExceptionz的异常,比如TransactionRequiredException、TransactionRolledBackException和NoSuchObjectException。EJB提供了等L本地异常Q如TransactionRequiredLocalException、TransactionRolledBackLocalException和NoSuchObjectLocalException?

所有数据和q回值都通过引用的方式传递,而不是传递倹{本地接口必dEJB部v的机器上使用。简而言之,客户E序和提供服务的lg必须在同一个JVM上运行。如果Bean实现了本地接口,则其引用不可串行化?

7. 生成主键

在EJB之内生成主键有许多途径Q下面分析了几种常见的办法以及它们的特点。利用数据库内徏的标识机ӞSQL Server的IDENTITY或Oracle的SEQUENCEQ。这U方法的~点是EJB可移植性差。由实体Bean自己计算主键|比如做增量操作)。它的缺Ҏ要求事务可串行化Q而且速度也较慢?

利用NTP之类的时钟服务。这要求有面向特定^台的本地代码Q从而把Bean固定C特定的OS之上。另外,它还D了这样一U可能,卛_多CPU的服务器上,同一个毫U之内生成了两个主键。借鉴Microsoft的思\Q在Bean中创Z个GUID。然而,如果不求助于JNIQJava不能定|卡的MAC地址Q如果用JNIQ则E序p依赖于特定的OS?

q有其他几种办法Q但q些办法同样都有各自的局限。似乎只有一个答案比较理惻Il合q用RMI和JNDI。先通过RMI注册把RMIq程对象l定到JNDI树。客L序通过JNDIq行查找。下面是一个例子:

public class keyGenerator
extends UnicastRemoteObject implements
Remote { private static long KeyValue = System.currentTimeMillis();
public static synchronized long getKey()
throws RemoteException { return KeyValue++; }



8. 及时清除不再需要的会话

Z清除不再zd的会话,许多应用服务器都有默认的会话时旉Q一般ؓ30分钟。当应用服务器需要保存更多会话时Q如果内存容量不I操作pȝ会把部分内存数据转移到磁盘,应用服务器也可能Ҏ“最q最频繁使用”(Most Recently UsedQ算法把部分不活跃的会话转储到磁盘,甚至可能抛出“内存不”异常。在大规模系l中Q串行化会话的代h很昂늚。当会话不再需要时Q应当及时调用HttpSession.invalidate()Ҏ清除会话。HttpSession.invalidate()Ҏ通常可以在应用的退出页面调用?

9. 在JSP面中关闭无用的会话

对于那些无需跟踪会话状态的面Q关闭自动创建的会话可以节省一些资源。用如下page指oQ?

<%@ page session="false"%>



10. Servlet与内存?

许多开发者随意地把大量信息保存到用户会话之中。一些时候,保存在会话中的对象没有及时地被垃圑֛收机制回收。从性能上看Q典型的症状是用h到系l周期性地变慢Q却又不能把原因归于M一个具体的lg。如果监视JVM的堆I间Q它的表现是内存占用不正常地大v大落。解册cd存问题主要有二种办法。第一U办法是Q在所有作用范围ؓ会话的Bean中实现HttpSessionBindingListener接口。这P只要实现valueUnbound()ҎQ就可以昑ּ地释放Bean使用的资源?

另外一U办法就是尽快地把会话作废。大多数应用服务器都有设|会话作废间隔时间的选项。另外,也可以用~程的方式调用会话的setMaxInactiveInterval()ҎQ该Ҏ用来讑֮在作废会话之前,Servlet容器允许的客戯求的最大间隔时_以秒计算?

11. HTTP Keep-Alive

Keep-Alive功能使客L到服务器端的q接持箋有效Q当出现Ҏ务器的后l请求时QKeep-Alive功能避免了徏立或者重新徏立连接。市Z的大部分Web服务器,包括iPlanet、IIS和ApacheQ都支持HTTP Keep-Alive。对于提供静态内容的|站来说Q这个功能通常很有用。但是,对于负担较重的网站来_q里存在另外一个问题:虽然为客户保留打开的连接有一定的好处Q但它同样媄响了性能Q因为在处理暂停期间Q本来可以释攄资源仍旧被占用。当Web服务器和应用服务器在同一台机器上q行ӞKeep-Alive功能对资源利用的影响其H出?

12. JDBC与Unicode

惛_你已l了解一些用JDBC时提高性能的措施,比如利用q接池、正地选择存储q程和直接执行的SQL、从l果集删除多余的列、预先编译SQL语句Q等{。除了这些显而易见的选择之外Q另一个提高性能的好选择可能是把所有的字符数据都保存ؓUnicodeQ代码页13488Q。Java以Unicode形式处理所有数据,因此Q数据库驱动E序不必再执行{换过E。但应该CQ如果采用这U方式,数据库会变得更大Q因为每个Unicode字符需?个字节存储空间。另外,如果有其他非Unicode的程序访问数据库Q性能问题仍旧会出玎ͼ因ؓq时数据库驱动程序仍旧必L行{换过E?

13. JDBC与I/O

如果应用E序需要访问一个规模很大的数据集,则应当考虑使用块提取方式。默认情况下QJDBC每次提取32行数据。D例来_假设我们要遍历一?000行的记录集,JDBC必须调用数据?57ơ才能提取到全部数据。如果把块大改?12Q则调用数据库的ơ数减到10ơ。在一些情形下q种技术无效。例如,如果使用可滚动的记录集,或者在查询中指定了FOR UPDATEQ则块操作方式不再有效?

14. 内存数据?

许多应用需要以用户为单位在会话对象中保存相当数量的数据Q典型的应用如购物篮和目录等。由于这cL据可以按照行/列的形式l织Q因此,许多应用创徏了庞大的Vector或HashMap。在会话中保存这cL据极大地限制了应用的可׾~性,因ؓ服务器拥有的内存臛_必须辑ֈ每个会话占用的内存数量乘以ƈ发用h大数量,它不仅服务器h格昂贵,而且垃圾攉的时间间隔也可能廉到难以忍受的E度?

一些h把购物篮/目录功能转移到数据库层,在一定程度上提高了可伸羃性。然而,把这部分功能攑ֈ数据库层也存在问题,且问题的Ҏ与大多数关系数据库系l的体系l构有关。对于关pL据库来说Q运行时的重要原则之一是确保所有的写入操作E_、可靠,因而,所有的性能问题都与物理上把数据写入盘的能力有兟뀂关pL据库力图减少I/O操作Q特别是对于L作,但实现该目标的主要途径只是执行一套实现缓冲机制的复杂法Q而这正是数据库层W一h能瓉通常LCPU的主要原因?

一U替代传l关pL据库的方案是Q用在内存中运行的数据库(In-memory DatabaseQ,例如TimesTen。内存数据库的出发点是允许数据时地写入Q但q些数据不必怹C存到盘上,所有的操作都在内存中进行。这P内存数据库不需要复杂的法来减I/O操作Q而且可以采用比较单的加锁机制Q因而速度很快?

q一中介绍的内定w合于图形用L面的应用QApplet和普通应用)Q要用到AWT或Swing?1. 用JAR压羃cL?

Java档案文gQJAR文gQ是ҎJavaBean标准压羃的文Ӟ是发布JavaBeanlg的主要方式和推荐方式。JAR档案有助于减文件体U,~短下蝲旉。例如,它有助于Applet提高启动速度。一个JAR文g可以包含一个或者多个相关的Bean以及支持文gQ比如图形、声韟뀁HTML和其他资源。要在HTML/JSP文g中指定JAR文gQ只需在Applet标记中加入ARCHIVE = "name.jar"声明?

2. 提示Applet装入q程

你是否看到过使用Applet的网站,注意到在应该q行Applet的地方出C一个占位符Q当Applet的下载时间较长时Q会发生什么事情?最大的可能是用户掉头d。在q种情况下,昄一个Applet正在下蝲的信息无疑有助于鼓励用户l箋{待。下面我们来看看一U具体的实现Ҏ。首先创Z个很的AppletQ该Applet负责在后C载正式的AppletQ?

import java.applet.Applet;
import java.applet.AppletStub;
import java.awt.Label;
import java.awt.Graphics;
import java.awt.GridLayout;
public class PreLoader extends Applet implements Runnable, AppletStub {
String largeAppletName;
Label label;
public void init() {
// 要求装蝲的正式Applet
largeAppletName = getParameter("applet");// “请E等”提CZ?
label = new Label("L{?.." + largeAppletName);
add(label);
}
public void run(){
try 
{
// 获得待装载Applet的类
Class largeAppletClass = Class.forName(largeAppletName);
// 创徏待装载Applet的实?
Applet largeApplet = (Applet)largeAppletClass.newInstance();
// 讄该Applet的StubE序
largeApplet.setStub(this);
// 取消“请E等”信?
remove(label);
// 讄布局
setLayout(new GridLayout(1, 0));
add(largeApplet);
// 昄正式的Applet
largeApplet.init();
largeApplet.start();
}
catch (Exception ex)
{
// 昄错误信息
label.setText("不能装入指定的Applet");
}
// h屏幕
validate();
}
public void appletResize(int width, int height)
{
// 把appletResize调用从stubE序传递到Applet
resize(width, height);
}
}




~译后的代码于2KQ下载速度很快。代码中有几个地方值得注意。首先,PreLoader实现了AppletStub接口。一般地QApplet从调用者判断自qcodebase。在本例中,我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地ҎQAppletStub接口包含许多和AppletcMLҎQ但appletResize()Ҏ除外。这里我们把对appletResize()Ҏ的调用传递给了resize()Ҏ?

3. 在画出图形之前预先装入它

ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate()Q能够用一ơrepaint()操作在屏q上d囑Ş。下面提供了一个例子?

public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {
if ((flags & ALLBITS) !=0 {
repaint();
}
else if (flags & (ERROR |ABORT )) != 0) {
error = true;
// 文g没有扑ֈQ考虑昄一个占位符
repaint();
}
return (flags & (ALLBITS | ERROR| ABORT)) == 0;
}



当图形信息可用时QimageUpdate()Ҏ被调用。如果需要进一步更斎ͼ该方法返回trueQ如果所需信息已经得到Q该Ҏq回false?

4. 覆盖updateҎ

update()Ҏ的默认动作是清除屏幕Q然后调用paint()Ҏ。如果用默认的update()ҎQ频J用图形的应用可能出现昄闪烁现象。要避免在paint()调用之前的屏q清除操作,只需按照如下方式覆盖update()ҎQ?

public void update(Graphics g) {
paint(g);
}



更理想的Ҏ是:覆盖update()Q只重画屏幕上发生变化的区域Q如下所C?

public void update(Graphics g) {
g.clipRect(x, y, w, h);
paint(g);
}


5. 延迟重画操作

对于囑Ş用户界面的应用来_性能低下的主要原因往往可以归结为重dq的效率低下。当用户改变H口大小或者滚动一个窗口时Q这一炚w常可以很明昑֜观察到。改变窗口大或者滚动屏q之cȝ操作D重画屏幕事g大量地、快速地生成Q甚臌q了相关代码的执行速度。对付这个问题最好的办法是忽略所有“迟到”的事g?

在这里引入一个数毫秒的时差,卛_果我们立x收到了另一个重MӞ可以停止处理当前事g转而处理最后一个收到的重画事gQ否则,我们l箋q行当前的重画过E?

如果事g要启动一耗时的工作,分离Z个工作线E是一U较好的处理方式Q否则,一些部件可能被“冻l”,因ؓ每次只能处理一个事件。下面提供了一个事件处理的单例子,但经q扩展后它可以用来控制工作线E?

public static void runOnce(String id, final long milliseconds) {
synchronized(e_queue) {
// e_queue: 所有事件的集合
if (!e_queue.containsKey(id)) {
e_queue.put(token, new LastOne());
}
}
final LastOne lastOne = (LastOne) e_queue.get(token);
final long time = System.currentTimeMillis(); // 获得当前旉
lastOne.time = time;
(new Thread() {public void run() {
if (milliseconds > 0) {
try {Thread.sleep(milliseconds);} // 暂停U程
catch (Exception ex) {}
}
synchronized(lastOne.running) { // {待上一事gl束
if (lastOne.time != time) // 只处理最后一个事?
return;
}
}}).start();
}
private static Hashtable e_queue = new Hashtable(); private static class LastOne {
public long time=0;
public Object running = new Object();
}




6. 使用双缓冲区

在屏q之外的~冲区绘图,完成后立x整个囑Ş昄出来。由于有两个~冲区,所以程序可以来回切换。这P我们可以用一个低优先U的U程负责dQ得程序能够利用空闲的CPU旉执行其他d。下面的伪代码片断示范了q种技术?

Graphics myGraphics;
Image myOffscreenImage = createImage(size().width, size().height);
Graphics offscreenGraphics = myOffscreenImage.getGraphics();
offscreenGraphics.drawImage(img, 50, 50, this);
myGraphics.drawImage(myOffscreenImage, 0, 0, this);



7. 使用BufferedImage

Java JDK 1.2使用了一个Y昄讑֤Q得文本在不同的^C看v来相伹{ؓ实现q个功能QJava必须直接处理构成文字的像素。由于这U技术要在内存中大量地进行位复制操作Q早期的JDK在用这U技术时性能不佳。ؓ解决q个问题而提出的Java标准实现了一U新的图形类型,即BufferedImage。BufferedImage子类描述的图形带有一个可讉K的图形数据缓冲区。一个BufferedImage包含一个ColorModel和一l光栅图形数据。这个类一般用RGBQ红、绿、蓝Q颜色模型,但也可以处理灰度U图形。它的构造函数很单,如下所C:

public BufferedImage (int width, int height, int imageType)



ImageType允许我们指定要缓冲的是什么类型的囑ŞQ比?-位RGB?-位RGB、灰度{?



8. 使用VolatileImage

许多gq_和它们的操作pȝ都提供基本的g加速支持。例如,g加速一般提供矩形填充功能,和利用CPU完成同一d相比Q硬件加速的效率更高。由于硬件加速分M一部分工作Q允许多个工作流q发q行Q从而缓解了对CPU和系lȝ的压力,使得应用能够q行得更快。利用VolatileImage可以创徏g加速的囑Ş以及理囑Ş的内宏V由于它直接利用低层q_的能力,性能的改善程度主要取决于pȝ使用的图形适配器。VolatileImage的内定w时可能丢失,也即它是“不E_的(volatileQ”。因此,在用图形之前,最好检查一下它的内Ҏ否丢失。VolatileImage有两个能够检查内Ҏ否丢qҎQ?

public abstract int validate(GraphicsConfiguration gc);public abstract Boolean contentsLost();



每次从VolatileImage对象复制内容或者写入VolatileImageӞ应该调用validate()Ҏ。contentsLost()Ҏ告诉我们Q自从最后一ơvalidate()调用之后Q图形的内容是否丢失。虽然VolatileImage是一个抽象类Q但不要从它q里z子类。VolatileImage应该通过Component.createVolatileImage()或者GraphicsConfiguration.createCompatibleVolatileImage()Ҏ创徏?

9. 使用Window Blitting

q行滚动操作Ӟ所有可见的内容一般都要重画,从而导致大量不必要的重d作。许多操作系l的囑Ş子系l,包括WIN32 GDI、MacOS和X/WindowsQ都支持Window Blitting技术。Window Blitting技术直接在屏幕~冲Z把图形移到新的位|,只重L出现的区域。要在Swing应用中用Window Blitting技术,讄Ҏ如下Q?

setScrollMode(int mode);



在大多数应用中,使用q种技术能够提高滚动速度。只有在一U情形下QWindow Blitting会导致性能降低Q即应用在后台进行滚动操作。如果是用户在滚动一个应用,那么它L在前収ͼ无需担心M负面影响



Sung 2005-10-24 22:16 发表评论
]]>
Eclipse使用U技 http://m.tkk7.com/qq13367612/archive/2005/10/24/16645.htmlSungSungMon, 24 Oct 2005 14:05:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/24/16645.htmlhttp://m.tkk7.com/qq13367612/comments/16645.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/24/16645.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16645.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16645.html阅读全文

Sung 2005-10-24 22:05 发表评论
]]>
Java Web FrameworklDhttp://m.tkk7.com/qq13367612/archive/2005/10/24/16565.htmlSungSungMon, 24 Oct 2005 06:04:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/24/16565.htmlhttp://m.tkk7.com/qq13367612/comments/16565.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/24/16565.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16565.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16565.html阅读全文

Sung 2005-10-24 14:04 发表评论
]]>
推荐一好文章——Java Web开发构?/title><link>http://m.tkk7.com/qq13367612/archive/2005/10/24/16549.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Mon, 24 Oct 2005 03:24:00 GMT</pubDate><guid>http://m.tkk7.com/qq13367612/archive/2005/10/24/16549.html</guid><wfw:comment>http://m.tkk7.com/qq13367612/comments/16549.html</wfw:comment><comments>http://m.tkk7.com/qq13367612/archive/2005/10/24/16549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/qq13367612/comments/commentRss/16549.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/qq13367612/services/trackbacks/16549.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 width="100%" border=0> <TBODY> <TR> <TD><SPAN>Java Web开发构?/SPAN></TD></TR> <TR> <TD></TD></TR> <TR> <TD> <P>1Q背景、Ş?<BR>能够q行Web开发的~程语言和技术很?<BR>(1) 动态解释语a <BR>PHP; Perl; Python (Zope, Plone); Ruby (Ruby on Rails); <BR>(2) ~译语言 <BR>Java; .net <BR><BR>Java Web开发远非一枝独UQ?<BR>除了受到来自.net q个重量U对手的最大挑战之外,更受到Zope, Ruby on Rail {新式轻骑兵的冲击(当然Q也l箋受到老式L兵PHP, Perl的冲击)?<BR><BR>官方Java走的是复杂\U,Servlet -> JSP -> Taglib?net走的也是复杂路线Q依靠成熟友好的集成化开发环境取胜。Java阵营好容易应对过来,从纷U复杂的各种开发框架基上,发展Z重量UWeb开发框架JSFQ以及相应的集成化开发环境;渴望以此应对.net的攻ѝ胜负未分,前途未卜。这Ӟ另一个方向又杀来了新式轻骑Zope, Ruby on Rail?<BR>Python, Ruby{动态解释语aQ面向对象特性更好,先天支持 动态绑定、AOP、函数式~程、“编E即配置”等旉概念。开发速度更快Q代码量更小Q达到killerU别?<BR><BR>传统的HTML Web开发领域里面,Java已经是腹背受敌。领域外也展开了征战,Rich Client Architecture的兴PAJAX(XMLHttp), Flash RIA, XUL, XAML, Smart ClientQ以及从前的ActiveX, Applet, Web StartQ?<BR><BR>Web的发展趋势是 语义WebQ最l目的是让整个Web成ؓ一个巨大的数据库?<BR>q意味着Q未来的Web应用更加的面向文本内容数据Q更加搜索引擎友??Search Engine Friendly. <BR>二进制的客户端插Ӟ如Flash RIA, ActiveX, Applet, Web Start{,虽然交互性能最好,但不是以文本内容数据Z心,搜烦引擎不友好。所以,我只是保持适当x。我更关注基于文本的UI表现Q如HTML, XUL, XAML{。XUL, XAMLq没有广泛流行,只是保持一U有兴趣的关注?<BR>当下x的重点,q是 XHTML + CSS + Javascript量?AJAX(XMLHttp)增加更好的交互性?<BR><BR>我一直认为:轻量、简z、高?才是道理。后面阐q我对Java Web开发的理解和构惟?</P> <P>2. Web开发框架层ơ概q?<BR>从上CQWeb开发框架的层次如下Q?<BR>(1) HTML, JavaScript, CSS{页面资源?<BR>(2) 面模板层?<BR>如JSP, Freemarker, Velocity, XSLQfastm{。用来生成HTML, JavaScript, CSS{页面资源?<BR>(3) Web框架。把HTTP Request调度分派到对应的Service Entry?<BR>(4) Business Logic. <BR>(5) O/R Mapping. <BR>(6) JDBC <BR>(7) DB <BR><BR>Ҏ我的l验Q一个典型的Web应用中的代码比例如下Q?<BR>面逻辑U占 50%Q商业逻辑U占30%, O/R U占20%?<BR><BR>但事实上Q页面却是最不受重视的部分,从来都被认ؓ是脏z,累活Q杂zR典型的开发过E通常是这P <BR>面设计人员q速的用Dreamweaver{生成一堆文本杂乱无章的面Q然后交lJSPE序员加入更加杂乱无章的Java代码和Taglib?<BR>当页面布局风格需要改变的时候,面设计人员用Dreamweaver{生成一堆新的页面。JSPE序员再重新加入更加杂ؕ无章的Java代码Taglib?<BR>至于面中的脚本逻辑调试Q更是一门精q工夫了?<BR><BR>ҎC会规则Q通常来说Q工作内容越LQ收入越高;工作内容脏月篏Q收入越低;Web开发也是如此:做着最脏最累的zȝ面E序员,工资一般比不上后台业务逻辑E序员?<BR><BR>开发框枉常会带来这Ll果Q让单的东西Q变得更单;让复杂的东西Q变得更复杂?<BR>q其中的原因在于Q?<BR>一般来_一个应用中单重复的东西?0%Q复杂特D的东西?0%?<BR>单重复的东西很容易摸清规律,q行包装Q通用化。但是,在包装的同时Q经常就L住了底层的一些灵zd大的控制能力。在复杂Ҏ的需求中Q确实又需要这些底层控制能力,那么Zl开框架的限Ӟ付出的努力要比不用框?大得多?<BR>打个比方Q一个比较极端的例子。编译语a比汇~语a的开发效率高很多Q但是却无法直接操作寄存器。当需要在~译语言中操作寄存器的时候,非常的痛苦。比如JavaQ也讔R要JNIQ写C代码Q还要在C代码里面嵌入汇编。编译、连接都很麻烦?<BR>所以,一个框架的开发效率,在于这?0%??20%复杂之间的^衡?<BR>假如Q不用框架来开发,单的80%要消?80个资源数Q复杂的20%要消?0个资源数Q总资源数?00Q用了某个框架Q简单的80%只要消?0个资源数Q复杂的20%要消?0个资源数Q总资源数?0。那么,我们_q个开发框架是有效率的?<BR><BR>我的思\是,同时应对复杂和简单。当ӞZ应对复杂Q简单的东西可能应对得不那么好。比如,做这样一个开发框Ӟ单的80%要消?0个资源数Q复杂的20%要消?0个资源数Q总资源数?0?<BR>q种开发框架是有可能实现的。而且是很有意义的。尤其是在复杂部分的比例提高的时候。越复杂的系l,q种开发框架就有意义?<BR><BR>后面的关于Web各层开发的Q主要就按照q个“应对复杂、让复杂更简单”的思\展开?/P> <P>3Q页面资?<BR>也许有h会说Q页面资源,不就是HTML吗?太简单,太低极了Q没劌ӀDreamweaver、Frontpage多简单阿。随便找个h来用可以了。文本内容ؕp糟不要紧,览器里面显C出来的效果好看p。要增加炫的、酷的动L果,那就写JavaScript呗。写在HTML里面Q看看在IE里面能不能运行就可以了呗?<BR>q也正是大多数公司开发页面资源的方式。因为页面的需求变化是最多、最快的Q而页面的制作成本很低Qh们不愿意在上面投入更多的资源?<BR><BR>我的看法是,万丈高楼q_赗应用程序的每一个部分都应该完善理Q结构优。越是需求变化多的地方,是脏ؕ差的地方Q越应该加大力度处理好?<BR><BR>面l构斚wQJavaeye论坛的Dlee做了很多工作?<BR><BR>(1) ?2005 q我们如何写 JavaScript <BR><A target=_blank><FONT color=#004377>http://forum.javaeye.com/viewtopic.php?t=12973</FONT></A> <BR>(2)使用 Unordered Lists 制作的下拉菜单和?<BR><A target=_blank><FONT color=#004377>http://forum.javaeye.com/viewtopic.php?t=12995</FONT></A> <BR>从上面的Dlee的论q和l出的资料。可以看出,面资源分ؓ三部分: <BR>(1) XHTML。结构,Structure?<BR>XHTML里面的Tag部分只应该包?<ul> <table> <p> <div><span>{结构布局TagQ或?lt;strong><emphasis>表示语义的Tag?<BR>XHTML里面不应该包括风g息,比如字体、颜艌Ӏ大、粗l等Q也不应该包?lt;font> <b> <i> <h> {字体信息?<BR>XHTML里面不应该包括Javascript的定义和调用?<BR><BR>(2) JavaScript。行为,behavior?<BR>JavaScritp应该存在于一个独立于XHTML文g的独立文件中。这样可以做自动化单元测试。JavaScript应该只改变HTML DOM的结构和内容Q而不应该改变它的风格?<BR><BR>(3) CSS。StyleQ风根{或者说QPresentationQ表现?<BR>前面说了QXHTML里面不应该包括JavaScript的调用。那么,XHTML的元素是如何JavaScript事gl定hQ就是在CSS里面指定的?<BR>当然Q众所周知QCSS的本职工作是处理面风格?<BR><BR>面资源斚wQ我完全认同Dlee的观炏V从技术和资源U篏的长q目标看来,q方面的初期投入的回报将是非怸厚的?<BR>即ɞ来HTML消亡了,q入了XAML, XUL, RSS时代Q这些结构清晰的各部分,重用的可能性都非常巨大。JavaScript + CSS + XML UI的这U经典设计思\Q将留存很久。؜杂成一团的HTML的命q只能是全盘被抛弃?</P> <P>4Q页面模板层 <BR>面模板层是指Server端运行的用来生成HTMLQ或JavaScriptQCSSQ的Server Side Template Engine?<BR>q一层也是著名的脏ؕ差楼层。著名的HTML的Java代码污染事gQ就发生在这个楼层。不仅JSP有这个问题,其他的template, 如freemarker, velocity, tapestry{含有逻辑的脚本,都不同程度上有HTML的Script Logic污染问题?<BR><BR>Dlee的做法很。直接就不要面模板层,不用Server Side Template Engine。直接用JavaScript更改HTML DOM的结构、内宏V数据。同Ӟ会用到少量的览器端XSL?<BR>q样带来的结果,Template是很干净Ua的HTMLQ不含有MServer Side Script。这个效果,和Servier Side Template ?JivanQXMLC辑ֈ的一栗只是一个是在浏览器端执行,一个是在Server端执行?<BR><BR>我研I比较了几乎所有的Server Side Template EngineQ力N众家之长Q避众家之短Q写了一个Server Side Template Engine -- fastm, 能够最优雅方便的实现页面模板层。关于fastmQ我的Blog上有不少文章?<BR>我的BlogQ里面专门有个fastm 分类?<BR><A target=_blank><FONT color=#004377>http://blog.csdn.net/buaawhl</FONT></A> <BR><A target=_blank><FONT color=#004377>http://buaawhl.blogdriver.com</FONT></A> <BR><BR>Fastm发布在java.net上?<BR><A target=_blank><FONT color=#004377>https://fastm.dev.java.net</FONT></A> <BR><BR><BR>我仍然对Server Side Template Engine持肯定态度。基于如下原因: <BR>(1) JavaScript代码量大、文件多的时候,不容易管理,不容易进行语法检查,不容易跟t调试?<BR>q里有h会争辩,Server Side Template Engine也用C很多脚本阿,比如Freemarker, Velocity, 而且嵌在HTML中,怎么理Q怎么调试Q即使是JSPQ也是Java Code嵌在HTML里面Q怎么理Q怎么调试Q?<BR>q里我要_Jivan, XMLC, fastmQWicket{Template Engine的逻辑都是在Java Code里面?<BR><BR>(2) 用JavaScript生成文本内容Q搜索引擎不友好?<BR>一般的|络蜘蛛E序Q只ҎURL获取HTML文本Q搜索里面的文本内容Q而不会执行里面的JavaScript脚本?<BR><BR>(3) JavaScript代码重用q是有些局?<BR>比如Q有两个HTML文gQ一个是Table布局Q一个是List布局?<BR>我有同样的一Ҏ据,要在q两U布局中显C?<BR>q时候,pl这两个HTML分别写两套JavaScript。这里面的DOM层次Q元素,属性都不同Q再怎么定义IDQClassQ也无法用完全相同的一套JavaScript处理?<BR>q里有h会争辩,Server Side Template Engine也无法做到。别说JSP, Velocity, Freemarker{要在两套HTML里面嵌入相同的代码,是Jivan, XMLC, Wicket也要分别写不同的两套Java CodeQ因为它们的XML DOM Node / Model View (Table, List) 都是不同的?<BR>q里我要说。fastm可以做到只用一套代码逻辑。而且只有fastm可以。fastm的代码重用率是最高的?<BR><BR>关于Ajax(XMLHttp)Q我的意见是必要时才用,而且最好采用粗_度的用?-- JavaScript发出一个URLhQ返回一整段HTMLQ直接替换到面的某一块,而不是用JavaScript来做q样的把数据填充到HTML DOM中。如果你直接在浏览器里面输入那个URLQ也可以获取那整D늚HTML内容?<BR>典型的应用场合是Portal。Portal面的每个Portlet都含有这L Ajax(XMLHttp) javascript代码 -- 发出一个Portlet URLhQ返回一整段Portlet的内容,直接替换当前的Portlet块?<BR>q样做的好处是: <BR>(1) 减少JavaScript代码的量和复杂度?<BR>(2) 搜烦引擎友好。网l蜘蛛程序可以L别JavaScript中的URLQƈҎq个URLQ获取整D处理好的HTML文本Q进行内Ҏ索?<BR>有h可能会争辩:如果URLhq回的是XML数据Q不是整D处理好的HTMLQ搜索引擎也可以q行内容搜烦?<BR>q点我同意。前提是XML数据的内Ҏ_q诏的,而不是散落的。比如,你返回的XML数据是“中国”。这个“中国”要攑֜HTML中的一个{country}位置Q{country}球。这个时候,l果HTML的内容含有“中国球”。而XML数据中只含有“中国”。如果用L“中国球”作为关键字来搜索,找不到q个URL?<BR><BR>从前面给出的fastm资料的连接中Q可以得知。如同Jivan, XMLC, Wicket一Pfastm的template里面不含有逻辑Q所有的逻辑都写在Java里面?<BR>有h会争辩说Q页面逻辑写在Java里面Q我改变了页面逻辑Q还需要重新编译。这也太不方便了。Velocity, Freemarker, JSP׃用重新编译?<BR>q里我的看法是:业务逻辑代码改变了,不也需要重新编译吗Q页面逻辑׃是逻辑了吗QHTML里面的脚本怎么语法查、跟t调试?业务逻辑需要语法检查、跟t调试,面逻辑׃需要语法检查、跟t调试了吗? <BR>Ҏ可能会说Q在我的应用中,面逻辑的改动需求非帔RJ,而且q些面逻辑非常单,不需要语法检查、跟t调试?<BR>q里我的意见是: <BR>(1) 那就使用JSP, Velocity, Freemarker{脚本?<BR>(2) fastm, Jivan, XMLC, Wicket的Java代码部分也可以写在脚本里面,比如QServer Side JavaScript, Jython(Python), Groovy, Bean Shell {脚本语a都可以很方便的和Java怺调用?<BR><BR>fastm的生命周期将很长?<BR>HTML, XUL, XAML都是Q或是可以在浏览器或可视化~辑工具里面昄的XML UI定义语言。Microsoft Office的Word, Excel, Powerpoint{格式都提供了相应的XML格式。这些XML文g都可以在Office里面昄Qƈ~辑?<BR>Adobe公司也提供了PDF的XML格式 -- XDP。可以在Adobe Designer里面昄q编辑?<BR>׃fastm是Designer Friendly的XML UI所见即所得的模板技术。这斚wh很大的潜力?<BR>Ҏ不需要第三方花大力气专门做个IDEQ来昄自定义的Tag。目标文件格式提供商自己的阅ȝ辑工具就可以直接用了Q而且效果是q行后生的l果文g的效果?<BR><BR>即没有可视化要求的场合。比如,Web Service需要的XML数据。fastm同样有用武之地。比如, <BR><!-- BEGIN DYNAMIC: users --> <BR><user> <BR><name>{name}</name> <BR><address>{name}</address> <BR></user> <BR><!-- END DYNAMIC: users --> <BR><BR>可以很容易的把一个Java Object List转化为XML数据?<BR><BR>另外Q我不得不承认。浏览器端的JavaScript的页面逻辑Q可UL性要高于Server Side Template Engine。因为Server Side Template Engine通常是特定语a相关的?<BR>目前fastm是用Java实现的。由于实现很单,UL到其它的语言Q也很简单。如果是UL到Python, Ruby{动态解释语aQ那更单了。我是有q个考虑Q因为Zope, Ruby on Rails 的模板还是Logic ?HTMLh的,fastmq个思\有很大的用武之地?<BR><BR>前面讲了q么多。清理了两层有名的脏乱差的老大隄楼层 -- 面资源层和面模板层。让q两层变得和下面的楼层同L优雅、清z?<BR><BR>下面该讲到Web框架层了。在向下讲之前,׃前面提到了脚本,我想先插入一D关于“可配置”、“可~程”、“可热部|y、“脚本逻辑 vs XML Tag逻辑”的话题。把q个Z比较兛_、讨论比较多的话题,先讲清楚?</P> <P>5Q可配置、可~程、可热部|Ӏ脚本逻辑 vs XML Tag逻辑 <BR>׃Java是编译语aQh们通常把变化的参数部分抽取出来Q放到配|文件中?<BR>q些配置文g通常是XML文g。这很好Q没什么问题。XML很适合用来表达数据l构?<BR>但是Q对于某一U技术的狂热Q通常引v对这U技术的q度使用Q或者误用?<BR>Z开始觉得,XML能够表达一切东西,包括for, if, else{逻辑。这斚w的典型例子有 Workflow XML DefinitionQLogic TagLib, XSL Logic Tag{?<BR>q点我不敢苟同。我的看法是QXML不适合表达逻辑QXML表达逻辑非常y脚。XML表达逻辑相当于自定义一门XML格式的脚本语a?<BR><BR>比如QLogic TablibQ很难自然的支持 if else, switch。只能蹩脚地支持一?<logic:if> <logic:ifNot> <logic:exists> <logic:notExists> <logic:ifNull> <logic:notNull>?<BR>Q注Q好久没有接触过Taglib了。这些Tag Name都是凭以前的使用印象写的Q也许名字不对,但表达这些意思的TagLib都还是有的) <BR>如果要表达if () else if() else 更y脚了。要q行非常ȝ的嵌套?<BR><BR>再比如,XSL 支持if, else 也非常蹩脚。非要多出来一个层ơ才行?<BR><xsl:choose> <BR><xsl:when test="?> <BR>? If ? <BR></xsl:when> <BR><xsl:otherwise> <BR>?else ?<BR></xsl:otherwise> <BR></xsl:choose> <BR><BR>同样Q如果要表达if () else if() else 更y脚了?<BR><xsl:choose> <BR><xsl:when test="?> <BR>? If ? <BR></xsl:when> <BR><xsl:otherwise> <BR><xsl:choose> <BR><xsl:when test="?> <BR>? If ? <BR></xsl:when> <BR><xsl:otherwise> <BR>?else ?<BR></xsl:otherwise> <BR></xsl:choose> <BR></xsl:otherwise> <BR></xsl:choose> <BR><BR>可以看到QXML Tag 表达逻辑Q非帔R烦,可读性很差,完全是一U误用,没有半点优势。当Ӟ逻辑单的情况下,q是可以接受的?<BR>有h会说QXML表达逻辑Q可以免~译ѝ?<BR>那么我说Q语法检查呢Q跟t调试呢Q?<BR>Ҏ_只是一些简单的逻辑Q不需要语法检查、跟t调试?<BR>我说Q如果只是ؓ了免~译Q前面列出的那么多的解释执行的脚本语a更适合。XML表达的逻辑Q比Java{编译语aq要ȝ很多Q而脚本语a比Java{编译语az多了,可读性非常好Q而且脚本语言和Java语言有很好的交互性,可以怺调用。重用、结构方面都h优势?<BR><BR>有h会D?B>Spring</B> IoCZ子,_你看Q?B>Spring</B> IoC的配|文件不都是XML格式吗? <BR>我说Q?<BR>(1) <B>Spring</B> IoC的配|文件基本都是属性设|,Bean ID声明。没有逻辑?<BR>(2) 我也不是很赞?B>Spring</B> IoC在XML配置文g里面引用Javacȝ做法。这斚wQ其它的容器?Pico, Nano都支持多U配|方式,其中包括了不脚本方式。我觉得Q在脚本里面定义生成Java ObjectQ比在XML中要好。当ӞWeb.xml里面也引用了Java Class名字。但那是非常单的情况。没有嵌套引用、属性赋倹{构造参数等复杂的定义方式。XML适合描述一些通用的资源、数据、结构。比如,HTML, XUL, XAMLQRSS是XML用的恰当的例子?<BR><BR>所以,我的基本观点是这栗?<BR>(1) U数据,不用_应该定义在XML中?<BR>(2) 如果是系l中一些Java Object要用到的基本属性。比如,q接池大等。定义在properties, XML, Script中都可以。如果定义中没有出现具体的Java Class名,們֐于定义在properties, XML文g中。如果出C具体的Java Class名,們֐于定义在Script中。这个界限不那么明显Q两者皆可?<BR>(3) 复杂l构的Java Bean的构造生成,那是肯定会出现具体的Java Class名,应该定义在Script中?<BR><BR>关于“可配置 vs 可编E”,有一点要明确Q只要是可编E的Q一定是可配|的。但如果是可配置的,却不一定是可编E的?<BR>q里的可~程Q是指框架给E序员提供了APIQ可配置Q是指框架给E序员提供了配置文g的格式写法?<BR>“可~程”一定是“可配置”的?<BR>(1) 用户臛_可以自己定义配置文gQ读取参敎ͼ调用API?<BR>(2) 有那么多的解释脚本可以直接和Java互操作,完全可以直接用来当作配置文gQ定义参数?<BR>“可配置?却不一定“可~程”的?<BR>如果框架只给你提供了配置方式Q而没有APIQ那意味着Q你只能q行参数的静态配|。很隑֜动态期间改变这些参C。你M能尝试着用代码去改变配置文g的内容吧Q即使你改动了,如果框架不进行文件的旉x查,是一开始装载进来,׃再检查更改了Q你不就一点办法都没有了吗Q?<BR>比如QStruts Tiles的XML定义Q你只能静态配|,你想在运行期间改变布局Q没有办法。Site Mesh也是如此。而我们可以在q行期间L操作XML DOM NodeQ别说布局了,M东西都可以改变?<BR>所以,一个框枉要注重的是提供APIQ而不是提供配|方式。这是一个重要的原则?<BR><BR>讨论完了“可~程”、“可配置”问题,我们来看“热部v”问题?<BR>XML配置文g、脚本文件支持“热部v”当然要比编译语aE序的热部vҎ得多。只要解释执行前Q检查一下时间戳可以了。要注意的问题,只是做好试Q因为没有编译期的语法检查?<BR>不过QJavaE序也是可以“热部v”的。只是稍微麻烦一炏V典型的例子是JSP, EJB Jar{。JSP修改之后Q会自动~译执行QEJB Jar丢到EJB Container里面Q会被检到q装载到JNDI命名I间?<BR>~译语言JavaE序的热部v的一个可能的技术难ҎQClass或者Jar已经存在Q如何监到Class或者Jar的更改,q装载这个新版本Q替换旧版本?<BR>q个问题我具体没有研I过。从道理上讲Q应该在Class Loader上下功夫。如果需要,可以参阅开源EJB Container的相兛_现部分。Javaq有一U“Hot Swap”技术,专门解决q个问题Q可以搜索查阅一下?<BR><BR>q段插Ԍ到q里。下面讨论Web框架?</P> <P>6QWeb框架 <BR>Web框架层是一个清z的楼层。很多优U的程序员在这一层大展n手,做出了很多好作品。我感觉不错的有<B>Spring</B> MVC, Web Work?<BR>对于Web应用来说QWeb框架层是最重要的一层。SOA、Semantic Web{效果都要在q一层实现?<BR>首先Q我们来讨论Q框架的~程l构?<BR>我的Blog中有一《Java Web框架lD》的文章。讲解了一些流行的Web框架的编E结构,很多重复的内容不再赘q?<BR><A target=_blank><FONT color=#004377>http://blog.csdn.net/buaawhl</FONT></A> <BR><BR>Java Web框架lD <BR><A target=_blank><FONT color=#004377>http://blog.csdn.net/buaawhl/archive/2004/12/21/224069.aspx</FONT></A> <BR><BR><B>Spring</B> MVC的编E接口是最清晰的。大多数单情况下QWeb Work的用法是最单有效的Q编E结构比较特D,可以说具有一定的变革意义?<BR><B>Spring</B> MVC的Controller接口相当于Struts ActionQ也hRequest, Response两个参数Q虽然编E接口非常清C雅,但是本质上没有什么变化?<BR><B>WebWork</B>的Action则失MController的n份,只相当于FormBean的n份,或者说相当于ActionBean的n份?B>WebWork</B> Action不具有Request, Response两个参数Q它只具有属性,q过属性Setter获取HTTP Request的参敎ͼ通过属性getter把结果数据输出到HTTP Response?<BR>可以_<B>WebWork</B>的这个把握是相当C的?5%以上的情况下Q程序员是不需要Request, Response参数的。当需要这些参数的时候,<B>WebWork</B>q没有挡住\Q可以通过实现RequestAwareQResponseAware{接口来获取Q或者通过一个Thread Local获取。这U情况下Q编E结构的U定Q就不那么清C?<BR><BR>我从Canonical的帖子和Blog受到了很多启发?<BR><A target=_blank><FONT color=#004377>http://canonical.blogdriver.com</FONT></A> <BR><BR>jsplet:对Model 2模式的批?<BR><A target=_blank><FONT color=#004377>http://canonical.blogdriver.com/canonical/591479.html</FONT></A> <BR><BR>jsplet?B>webwork</B>的概念对?<BR><A target=_blank><FONT color=#004377>http://canonical.blogdriver.com/canonical/594671.html</FONT></A> <BR><BR>从列理论看MVC架构 <BR><A target=_blank><FONT color=#004377>http://canonical.blogdriver.com/canonical/579747.html</FONT></A> <BR><BR>从Canonical的文章可以看出。JSPLet用JSP文g作ؓDispatcherQ然后在JSP里面注册q调用对应的Object。这个寻访Object的过E,完全是根据丰富的URL定义来做的。URL里面包括Object Scope, Object Name, Method Name, Method ParametersQ天生就对事件机制有良好的支持?<BR><BR>Zope的一些做法也有异曲同工之妙?<BR>Zope Object Publishing <BR><A target=_blank><FONT color=#004377>http://www.zope.org/Documentation/Books/ZDG/current/ObjectPublishing.stx</FONT></A> <BR><A target=_blank><FONT color=#004377>http://www.plope.com/Books/2_7Edition/ZopeArchitecture.stx#2-3</FONT></A> <BR><BR>q种通过URL获取Published Object的服务的思\Q是一U实现SOA效果的有效思\?<BR><BR>我们首先来看Web Service的现状。目前Web Service主要分ؓ两大阵营。SOAP和REST。关于RESTQ请参阅 <BR><A target=_blank><FONT color=#004377>http://www.xfront.com/REST-Web-Services.html</FONT></A> <BR>关于SOAP和REST的比较、互操作Q网上有很多文章。如果需要请搜烦查阅?<BR><BR>我个人比较們֐于REST风格的Web Service?<BR>因ؓSOAP是一门固定的协议Q如果用SOAP来编写Web ServiceE序Q需要一个SOAP协议的解析库 Q也许还需要一些专门的“SOAP 数据 -- ~程语言”映库Q如同CORBA IDL的多语言映射一栗如果你要让自己的Web应用支持SOAPQ你需要把发布的服务对象、方法都包装为SOAP协议Q这需要一些编E语a相关的数据结构的映射工作?<BR>REST则只是一U风|而不是一个协议。中心思想是简单的通过丰富的URI定义 (如XLink + XPointer{? 获取资源。如果你要让自己的Web应用支持RESTQ那么很单,只要在URI上下功夫可以了Q比如,多增加一个参数format=RESTQ在E序中多增加一UXML输出格式可以了。(从道理上来说QSOAP也可以这么实玎ͼ但SOAP的输入和输出都要遵守SOAP协议QSOAP的输入参C般都包装在SOAP信封里面Q?<BR><BR>关于HTTP Get和PostQ我表述一下自q看法?<BR>我认为,Web的精髓在于GetQ而不是PostQ在于获取服务器的输出,而不是输入到服务器。即QWeb的精髓在于以搏大,四两拨千斤。最l典的用法就是用一个URLQ获取一个长的文本内容Q这个内定w面充满了其他更多的资源连接。这也是文本连接HTML发明的初街?<BR>至于HTTP PostQ则是这上面的一个扩展。B/Sl构如此行Q很多应用都要{UdWeb上面Q怎么办,应用L交互的,总要让用戯入数据吧Q就增加了HTTP Post协议?<BR>HTTP Getl典、简单、有效。可以用丰富的URI定义把这个优势发挥到极致。这个实C比较单、优雅。就不多说了。主要的隄在于HTTP Post。下面的讨论主要应对“HTTP Post”这个复杂现象?<BR>HTTP Post从来׃让h们满意。当输入逻辑复杂C定程度,表单数据的繁杂、凌乱、散落,C服务器端很难l织h。输入方面B/Sl构实和C/Sl构难以Ҏ。于是,出现了XMLHttpQ能够把参数在浏览器里面l织成ؓ一个统一的XML数据l构Q或其他格式Q,发送到服务器端Q一ơ解析出来。SOAP做这个方面,更是拿手好戏。所以,很多XMLHttpE序直接采用SOAP作ؓ通信协议。而REST风格的HTTP Post则和HTML Form Post没有太大的本质区别?<BR>REST在HTTP Get斚w更胜一{,SOAP在HTTP Post斚w更胜一{V可以根据Web应用的特点,ҎHTTP Get / HTTP Post 面的比例,选择适合的技术?<BR>我们再进一步分析HTTP Post的数据内宏VHTTP Post的数据,可能包含三种cdQ?<BR>(1) 需要存档在服务器的数据 <BR>比如Q用h册时候,输入的基本信息,用户名、密码、电子邮件等。这些信息要存放到服务器的数据库?<BR>对于q种基本信息QHTTP PostQXMLHttpQSOAP处理hQ难度都不大Q没有很大区别?<BR>B2B的数据交换,也属于这个类别。用何种技术区别不大。一般采用SOAPQ因为SOAP是一U流行的标准协议?<BR>(2) 服务调用参数 <BR>比如Q用戯行复合条件查询的时候,输入的查询条件。这个时候,HTTP Post处理h非常蹩脚。而XMLHttpQSOAP则具有很大的优势。可以把复杂的查询条件很好组l成XML数据Q发送到服务器端l一处理。SOAP里面甚至可以定义对象名、方法名{详l的调用信息?<BR>(3) 指o <BR>q种情况比较见。上面的参数cd中提到的“对象名、方法名{详l的调用信息”,和这个指令类别有些交叉?<BR>假如一个SOAP调用Ҏ里面的参C是一个自定义的对象,q个自定义对象的属性数据在SOAP信息中进行了定义。到了服务器端之后,服务端程序首先调用这个自定义参数的构造函敎ͼ生成q个参数对象Q然后调用对应的服务对象Q把q个参数传给服务。这个过E可以看作是一个顺序指令:[1]构造参数[2]调用服务?<BR>q只是最单的情况。而目前的Web Service一般也支持到q个E度?<BR>我的看法是,一不做Q而不休。既焉把调用信息定义到q个E度了,不如做的更彻底一些,全面完善的支持指令。这个指令则意味着逻辑。前面讲q了Q我不赞成用XML Tag表示逻辑Q而赞成脚本。这里比较适合的脚本是JavaScriptQ因为JavaScript比较通用Q客L、服务器端都可以解释执行。注意,q里和一般的做法正好相反Q一般的Web应用L把JavaScript从服务器传到览器里面执行,而这里是把JavaScript在浏览器里组l好Q发l服务器端处理;q个JavaScript会在服务器端执行,调用服务器端的对象。D个SOAP含有JavaScript指o的例?(只是C意Q非标准格式) Q?<BR><soap envelope> <BR><XML Data> <BR><a> <BR><b>12</b> <BR></a> <BR><c> <BR><d>21</d> <BR></c> <BR><e> <BR><e>16</e> <BR></e> <BR></XML Data> <BR><BR><script> <BR>final_result = default; <BR>result1 = service1.service(a.b); <BR>if(result1.ok){ <BR>result2 = service2.service(c.d); <BR>if(result2.ok) <BR>final_result = service3.service(e.f); <BR>} <BR></script> <BR>< /soap envelope > <BR><BR>q个好处是: <BR>[1] 发布了更多的基本Service。给客户提供了更大的灉|度?<BR>比如Q这里就发布?个Service。由用户自己l织逻辑?<BR>按照传统的做法,上述程整个包装在服务器端执行。发布给用户的Service只有最外面的一个ServiceQ而且高度耦合Qif, else, if, else程hard code在服务器端)Q不灉|Q不通用?<BR>q里的方法,可以让客户端随意组lservice1, service2, service3的调用顺序和方式?<BR>[2] 减少了通信ơ数?<BR>假如q段Script在客L执行Q那么和服务器要q行3ơ通信?<BR><BR>传统Web的权限控制一般在URLU别Q这Uscript -> server方式的权限控制则要在对象U别、方法别、Code片断U别了,复杂很多Q也许要大量应用Java的Code权限认证机制?<BR><BR>以上展开讨论?Web Service, HTTP Get/Post。下面我们回到Web框架层?<BR>前面说了QJSPLetl了我很大的启发。很多思\可以借鉴?<BR>当然Q我q不赞成用JSP作Dispatcher, Controller?1) 因ؓJSP要编译成ServletQ而Servlet是Web Server理的比较昂늚资源。一个Webpȝ中JSP辑ֈ几千个,׃遇到性能瓉?2) JSP中的代码重用很成问题。一般只能通过include file的方式?<BR>可以借鉴的思\?1) JSPLet 的入口是JSP文gQ这一步的URL到处理程序的映射是Servlet/JSP Container自然支持的。这是免配置的?2) 丰富的URL参数定义Q良好的对象Ҏd能力?<BR><BR>我开发的开源Web框架lightwebQ将具备如下Ҏ: <BR>(1) 支持两个层次的编E接口?<BR>interface Action { void service(request, response, servletContext); } <BR>q个Action比Struts Action, <B>Spring</B> MVC Controller高一个别。相当于Dispatcher, 相当于JSPLet的JSP控制文g。这个用来做最外层的入口控制?<BR>同时Q也支持单的JavaBean.method的直接调用。相当于<B>WebWork</B> ActionQJSPLet Registered Object。这个用来做具体的事情?<BR><BR>(2) 支持丰富的对象寻址URIQ比如http://my.com/myProject/myModule/myEntry.action?object=calculator&method=add&p1=1&p2=3 <BR>q表C通过 myEntry.acionq个入口Q调用caculator.add(1, 2)Ҏ?<BR>如果用URL Rewriter可以化?<BR><A target=_blank><FONT color=#004377>http://my.com/myProject/myModule/myEntry/calculator/add/1/3</FONT></A> <BR>看v来就很象XLink + XPointer了?<BR><BR>(3) 免配|。或者说极少的配|?<BR>框架Ҏ一定的匚w准则Q把myModule/myEntry.action映射?<BR>com.mycompany.mymodule.MyEntryAction q个cȝserviceҎ?<BR>q个serviceҎ负责Ҏobject, method的名字,L到对应的beanQƈҎ参数q行属性设|验证,q执行对应的bean.method。然后,把这个bean作ؓModel和templatel合Q输出结果?<BR>同样Qtemplate的获取也是根据一定的匚w准则Q根据myModule/myEntry扑ֈ <BR>Mymodule/myentry.html 或者Mymodule/myentry/calculator.html?<BR><BR>q样的lightwebp够同时对应简单和复杂。复杂控制的需求交lAction接口来做Q简单的一般具体Q务交l普通Java Beand?<BR>Web框架层可以做的非常复杂,可以做的非常单。Lightweb的目标,是分成多个单的部分Q各部分合v来就能够完成从非常简单到非常复杂的需求?<BR>接下来,我们来看O/R?</P> <P>7QO/R <BR>Hibernate, EJB Entity Bean产品QJDO产品QiBatis是比较流行的几种O/R Mapping Framework?<BR>我做的一些工作中Q经常涉及到复杂的优化过的native SQLQƈ且涉及到大量的批量复杂逻辑处理Q现有的O/R框架都不能满_能和性能要求?<BR><BR>我做样一个lightor框架Q思\借鉴了Martin Fowler的《企业架构模式》里面讲q的一些O/R的Row Mapper, Column Mapper{概c?<BR><BR>最l典的用法是Q?<BR>ResultSet rs = ps.executeQuery( a long complex native sql); <BR>//will return a lot of records <BR>A a = new A(); <BR>B b = new B(); <BR>IMapper aMapper = MapperService.getMapper(A.class); <BR>IMapper bMapper = MapperService.getMapper(B.class); <BR><BR>While(rs.next()){ <BR>aMapper.populate(a, rs); <BR>bMapper.populate(b, rs); <BR><BR>businessLogic(a, b); <BR>} <BR><BR>可以看到QLightor不需要一下子把所有纪录都攑ֈ一个Object List里面。完全可以随取随用。整个过E中Qa, b只有一份,极大的节省了I间、时_也极大的提高了开发效率,减少了重复代码?<BR>没有M一个其它O/R能够支持q种用法。这里面Qlightor的mapper的populateҎ需要ResultSet参数。一般的O/R不屑于这么做的,别说ResultSetQ连Connection都想包装h不给你看?<BR><BR>Lightor的设计思\也是同时应对单和复杂。Lightor的Mapper实体部分是自动生成代码。类gJDO的静态Enhance。不同的是,JDO静态Enhance直接修改bean class。而Lightor则不动原有的beanQ只是多生成了对应的Mapper Source/Class。这U方式是最利于跟踪调试的。至于发布部|Ԍ和JDO的情况差不多Q不如Hibernate的动态代码增强?<BR>q里我很慕Python, Ruby{动态解释语a?<BR><BR>q一层我主要x的是性能Q缓存策略等{,而不是简ѝ我觉得Q一个应用系l的瓉主要存在于O/R, DB层。不应该单纯Zq求OOl构的优雅,或者编E的方便Q而牺牲了一些可能优化的地方?<BR><BR>关于Lightor的缓存策? 我的Blog上有几篇文章?<BR><A target=_blank><FONT color=#004377>http://blog.csdn.net/buaawhl</FONT></A> <BR><BR>数据库对象的~存{略 <BR><A target=_blank><FONT color=#004377>http://blog.csdn.net/buaawhl/archive/2004/12/21/224184.aspx</FONT></A> <BR><BR>分页 & QueryKey & 定长预取 <BR><A target=_blank><FONT color=#004377>http://blog.csdn.net/buaawhl/archive/2005/01/08/245005.aspx</FONT></A> </P> <P>8Qȝ <BR>我理想中的Web开发架构是q样的: <BR>开发速度快,q行速度快,l构清晰优雅?<BR>具体到每一层?<BR>Web框架层主要追?开发速度快?<BR>O/R层主要追?q行速度快?<BR>面资源层和面模板层主要追?l构清晰优雅?</P></TD></TR></TBODY></TABLE><img src ="http://m.tkk7.com/qq13367612/aggbug/16549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/qq13367612/" target="_blank">Sung</a> 2005-10-24 11:24 <a href="http://m.tkk7.com/qq13367612/archive/2005/10/24/16549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts常见异常信息和解x?http://m.tkk7.com/qq13367612/archive/2005/10/24/16541.htmlSungSungMon, 24 Oct 2005 02:21:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/24/16541.htmlhttp://m.tkk7.com/qq13367612/comments/16541.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/24/16541.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16541.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16541.html以下所说的struts-config.xml和ApplicationResources.properties{文件名是缺省时使用的,如果你用了多模块,或指定了不同的资源文件名Uͼq些名字要做相应的修攏V?/P>

1、“No bean found under attribute key XXX?BR>在struts-config.xml里定义了一个ActionFormQ但type属性指定的cM存在Qtype属性的值应该是Formcȝ全名。或者是Q在Action的定义中Qname或attribute属性指定的ActionForm不存在?BR>

2、“Cannot find bean XXX in any scope?/STRONG>
在Action里一般会request.setAttribute()一些对象,然后在{向的jsp文g里(用tag或request.getAttribute()ҎQ得到这些对象ƈ昄出来。这个异常是说jsp要得C个对象,但前面的Action里ƈ没有对象设|到requestQ也可以是session、servletContextQ里?BR>可能是名字错了,h查jsp里的tag的一般是name属性,或getAttribute()Ҏ的参数|或者是Action逻辑有问题没有执行setAttribute()Ҏ先转向了?BR>q有另外一个可能,Ua是jsp文g的问题,例如<logic:iterate>会指定一个id|然后在@环里<bean:write>使用q个g为name的|如果q两个g同,也会出现此异常。(都是一个道理,request里没有对应的对象。)

3、“Missing message for key "XXX"?/STRONG>
~少所需的资源,查ApplicationResources.properties文g里是否有jsp文g里需要的资源Q例如:

<bean:message key="msg.name.prompt"/>

q行代码会找msg.name.prompt资源Q如果AppliationResources.properties里没有这个资源就会出现本异常。在使用多模块时Q要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名Uͼ否则当然什么资源也找不刎ͼq也是一个很Ҏ犯的错误?/P>

4、“No getter method for property XXX of bean teacher?/STRONG>
q条异常信息说得很明白,jsp里要取一个bean的属性出来,但这个beanq没有这个属性。你应该查jsp中某个标{property属性的倹{例如下面代码中的cade应该改ؓcode才对Q?/P>

<bean:write name="teacher" property="cade" filter="true"/>

5、“Cannot find ActionMappings or ActionFormBeans collection?BR>待解冟?/P>

6、“Cannot retrieve mapping for action XXX?BR>?jsp?lt;form>标签里指定action='/XXX'Q但q个Actionq未在struts-config.xml里设|过?/P>

7、HTTP Status 404 - /xxx/xxx.jsp
Forward的path属性指向的jsp面不存在,h查\径和模块Q对于同一模块中的Action转向Qpath中不应包含模块名Q模块间转向Q记住用contextRelative="true"?/P>

8、没有Q何异怿息,昄I白面
可能是Action里用的forward与struts-config.xml里定义的forward名称不匹配?BR>

9、“The element type "XXX" must be terminated by the matching end-tag "XXX".?BR>q个是struts-config.xml文g的格式错误,仔细查它是否是良构的xml文gQ关于xml文g的格式这里就不赘qC?/P>

10、“Servlet.init() for servlet action threw exception?/STRONG>
一般出现这U异常在后面会显CZ个关于ActionServlet的异常堆栈信息,其中指出了异常具体出现在代码的哪一行。我曄遇到的一ơ提C如下:

java.lang.NullPointerException
    at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:
1003)
    at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:
955)


决问题,先下载struts的源码包Q然后在ActionServlet.java的第1003行插入断点,q对各变量进行监视。很丢hQ我竟然把struts-config.xml文g弄丢了,因此出现了上面的异常Q应该是和CVS同步时不心删除的?/P>

11、“Resources not defined for Validator?/STRONG>
q个是利用Validator插g做验证时可能出现的异常,q时你要查validation.xml文gQ看里面使用的资源是否确实有定义Qform的名U是否正,{等?/P>

上面q些是我在用Struts做项目时遇到q的问题Q其中一些曾困绕我不时_其实大部分都是自׃l心造成的。希望这文章能对你的开发有所帮助QƈƢ迎l箋补充?/P>

Sung 2005-10-24 10:21 发表评论
]]>
?Java 实现回调例程http://m.tkk7.com/qq13367612/archive/2005/10/23/16495.htmlSungSungSun, 23 Oct 2005 13:07:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/23/16495.htmlhttp://m.tkk7.com/qq13367612/comments/16495.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/23/16495.html#Feedback1http://m.tkk7.com/qq13367612/comments/commentRss/16495.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16495.html熟悉 MS-Windows ?X Window System 事g驱动~程模型的开发h员,习惯于传递在某种事g发生时调用(即“回调”)的函数指针。Java 的面向对象模型目前ƈ不支持方法指针,q样g׃可能使用q种很好的机制。但我们q不是一点办法都没有Q?
Java 的接口支持提供了一U获得回调的{h功能的机制。其技巧就是:定义一个简单接口,q在该接口中声明我们要调用的Ҏ?

例如Q假定我们希望在某个事g发生时得到通知。我们可以定义一个接口:

public interface InterestingEvent
{
// q仅是一个常规方法。因此如果需要,
// 它可有返回|也可接收参数?BR>public void interestingEvent ();
}


q得我们可以控制实现该接口的类的Q何对象。因此,我们不必兛_M外部cd信息。与在将 C++ 代码用于 Motif 时用窗口小部g的数据域来容U_象指针的难以控制?C 函数相比Q这U方法要好得多?

发出事g信号的类必须{待实现?InterestingEvent 接口的对象,q在适当时候调?interestingEvent() Ҏ?

public class EventNotifier
{
private InterestingEvent ie;
private boolean somethingHappened;

public EventNotifier (InterestingEvent event)
{
// 保存事g对象以备后用?BR>ie = event;

// q没有要报告的事件?BR>somethingHappened = false;
}

//...

public void doWork ()
{
// 查在别处讄的谓词?BR>if (somethingHappened)
{
// 通过调用接口的这个方法发Z件信受?BR>ie.interestingEvent ();
}
//...
}

// ...
}


在上例中Q我使用 somethingHappened 谓词来跟t是否应触发事g。在许多情况下,调用此方法以保证向 interestingEvent() 发出信号?

希望接收事g通知的代码必d?InterestingEvent 接口Qƈ自w引用传递给事g通知E序?

public class CallMe implements InterestingEvent
{
private EventNotifier en;

public CallMe ()
{
// 创徏事g通知E序Qƈ自w引用传递给它?BR>en = new EventNotifier (this);
}

// Z件定义实际的处理E序?BR>public void interestingEvent ()
{
// 噢!必定发生了感兴趣的事Ӟ
// 执行某些操作 ...
}

//...
}


Sung 2005-10-23 21:07 发表评论
]]>
获取用户需求的十大沟通技?http://m.tkk7.com/qq13367612/archive/2005/10/23/16494.htmlSungSungSun, 23 Oct 2005 13:03:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/23/16494.htmlhttp://m.tkk7.com/qq13367612/comments/16494.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/23/16494.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16494.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16494.html成功的Y件品是建立在成功的需求基之上的,而高质量的需求来源于用户与开发h员之间有效的沟通与合作。当用户有一个问题可以用计算机系l来解决Q而开发h员开始帮助用戯册个问题,沟通就开始了?

  需求获取可能是软g开发中最困难、最关键、最易出错及最需要沟通交的zd。对需求的获取往往有错误的认识Q用L道需求是什么,我们所要做?是和他们交谈从他们那里得到需求,只要问用Ll的目标特征Q什么是要完成的Q什么样的系l能适合商业需要就可以了,但是实际上需求获取ƈ不是惌的这 L单,q条沟通之路布满了荆棘。首先需求获取要定义问题范围Q系l的边界往往是很难明的Q用户不了解技术实现的l节Q这样造成了系l目标的h?

  其次是对问题的理解,用户对计机pȝ的能力和限制~Z了解QQ何一个系l都会有很多的用h者不同类型的用户Q每个用户只知道自己需要的p?l,而不知道pȝ的整体情况,他们不知道系l作Z个整体怎么样工作效率更好,也不太清楚那些工作可以交lY件完成,他们不清楚需求是什么,或者说如何?一U精的方式来描q需求,他们需要开发h员的协助和指|但是用户与开发h员之间的交流很容易出现障,忽略了那些被认ؓ?很明的信息。最后是需?的确认,因ؓ需求的不稳定性往往随着旉的推UM生变动,使之难以认。ؓ了克服以上的问题Q必Ll织的执行需求的获取zd?

  需求获取活动徏议要完成?1个Q务或者说步骤分别是确定需求过E、编写项目视囑֒范围文档、用L分类、选择用户代表、选择用户代表、徏立核 心队伍、确定用实例、召开联合会议、分析用户工作流E、确定质量属性、检查问题报告和需求重用。当然应该根据组l和目的具体情况进行适当的裁减,比如 Ҏ目和用h冉|需求获取会议改成问卯查或者谈等{?

  1、编写项目视囑֒范围文档

  pȝ的需求包括四个不同的层次Q业务需求、用户需求和功能需求、非功能性需求。业务需求说明了提供l用hpȝ的最初利益,反映了组l机构或?户对pȝ、品高层次的目标要求,它们在项目视图与范围文档中予以说明。用户需求文档描qC用户使用产品必须要完成的dQ这在用实例文档或Ҏ脚本?明中予以说明。功能需求定义了开发h员必d现的软g功能Q得用戯完成他们的Q务,从而满了业务需求?

  非功能性需求是用户对系l良好运作提出的期望Q包括了易用性、反应速度、容错性、健壮性等{质量属性。需求获取就是根据系l业务需求去获得pȝ 用户需求,然后通过需求分析得到系l的功能需求和非功能需求。项目视囑֒范围文档是从高层次上描q系l的业务需求,应该包括高层的品业务目标,评估?题解x案的商业和技术可行性,所有的使用实例和功能需求都必须遵从的标准。而范围文档定义了目产品所包括的所有工作及产生产品所用的q程。项目相关h 员对目的目标和范围能达成共识,整个目l都应该把注意力集中在项目目标和范围上?

  2、用L分类

  pȝ用户在很多方面存在着差异Q例如:使用pȝ的频度和E度、应用领域和计算机系l知识、所使用的系l特性、所q行的业务过E、访问权限、地?上的布局以及个h的素质和喜好{等。根据这些差异,你可以把q些不同的用户分成不同的用户cR与UML中Usecase的Actor概念一P用户cM一 定都指hQ也可以包括其他应用pȝ、接口或者硬Ӟq样做得与pȝ边界外的接口也成为系l需求。将用户分cdƈ归纳各自特点Qƈ详细描述出它们的个性特 点及d状况Q将有助于需求的获取和系l设计?

  3、选择用户代表

  不可能对所有的用户都进行需求获取,q样做时间不允许效果也不一定好Q所以要识别够确定需求和了解业务程的用户作为每cȝL代表。每c?用户臛_选择一位能真正代表他们需求的ZZ表ƈ且能够作出决{,用户代表往往是本cȝ户中三类人:寚w目有军_权的领导、熟悉业务流E的专家、系l最 l用戗?

  每一个用户代表者代表了一个特定的用户c,q在那个用户cd开发者之间充当主要的接口Q用户代表从他们所代表的用L中收集需求信息,同时每个用户代表又负责协调他们所代表的用户在需求表达上的不一致性和不兼Ҏ?

  4、徏立核心队?

  通常用户和开发h员不自觉的都有一U?我们和他?的想法,产生一U对立关p,把彼此放在对立面Q每一斚w定义自己?边界"Q只惌q利益 而忽略对方的x。他们通过文档、记录和对话来沟通,而不是作Z个合作的整体去识别和定需求完成Q务。实践证明这LҎ是不正确的,不会l双方带?一点益处,良好的沟通关pL有徏立导致了误解和忽略重要的信息。只有当双方参与者都明白要成功自己需要什么,同时也知道要成功Ҏ需要什么时Q才能徏立v 一U合作关pR?

  Z建立合作关系通常采取一U组队的方式来获取需求,建立一个由用户代表和开发h员组成的联合组作ؓ需求获取的核心队伍。联合小l将负责识别 需求、分析解x案和协商分歧Q小l成员可以采用会议、电子邮件、综合办公系l等方式q行交流Q但交流时应注意以下原则Q小l会议应该由中立Ҏl织和主 持,用户和开发h员都要参加;交流预先要确定准备和参与的规则;议题要明ƈ覆盖所有关键点Q但信息来源应该自由Q交目标要明确Qƈ告知所有的成员?

  5、确定用实?

  从用户代表处攉他们用系l完成所需d的描qͼ讨论用户与系l间的交互方式和对话要求Q这是使用实例Q一个单一的用实例可能包括完?某项d的许多逻辑相关d和交互顺序。用实例方法给需求获取带来的好处来自于该Ҏ是用以Q务ؓ中心和以用户Z心的观点Q比起用以功能Z心和?开发者ؓ中心的方法,使用实例Ҏ可以使用h清楚地理解和认识到新pȝ允许他们做什么和怎么做。描写用实例的时候要注意使用z直白的表述Q尽量?d语态,"pȝ"或?用户"作ؓ主语Q比?用户提交用户密码Q系l验证用户密码是否正?Q还有一点在描述中不要设计界面细节,比如"用户从下拉框 中选择产品cd".使用实例Z后写用例场景描述中的基本路径和扩展\径提供了素材?

  6、召开联合会议

  最常见的需求获取方法是召开会议或者面谈,联合会议是范围广的、简便的讨论会,也是核心队伍成员之间一U很好的沟通方法,该会议通过紧密而集?的讨论得以将用户代表与开发h员间的合作伙伴关pM怺实践q能由此拟出需求文档的底稿。联合会议的W一个议题就是系l的必要性和合理性,必须所有成员都 同意pȝ是必要的而且合理的。接下来可以讨Z用实例清单,清单可以打印成大U挂在墙上、写在黑板上或做成演C材料。对每个清单合ƈL重复,加上?充内容就可以得到一份ȝ清单Q注意避免采用负面的"太差""不可?d定用LxQ这些想法都应该保留下来作ؓ被评议的清单,q样保护了小l成?开攄思维。最后对清单q行讨论Q会议成员必L查每一个用实例,在把它们U_需求之前决定其是否在项目所定义的范围内QŞ成最l的需求报告?

  在进行讨论时Q也应该避免受不成熟的细节的影响Q在对系l需求取得共识之前,用户能很Ҏ地在一个报表或对话框中列出某些_设计Q如果这些细 节都作ؓ需求记录下来,他们会给随后的设计过E带来不必要的限Ӟ应确保用户参与者将注意力集中在与所讨论的话题适合的抽象层上,重点是讨论做什么而不 是怎么做。这里有一点很重要是要让用户理解对于某些功能的讨论ƈ不意味着卛_在系l中实现它,更不要做暗示或者承Z么时候完成需求。在讨论之后Q记?所讨论的条目,q请参与讨论的用戯论ƈ更正Q因为只有提供需求的人才能确定是否真正获取需求。当最后拿C一份详l准的需求报告书的时候,会议q?功完成了。但是要清楚需求过E本w就是一个P代的q程Q在以后的过E活动中不可避免的将要修改和完善q䆾报告?

  7、分析用户工作流E?

  分析用户工作程观察用户执行业务d的过E,通过分析使用实例得到pȝ的用例图。编制用例图文档有助于明确pȝ的用实例和功能需求,l一 建模语言的用有助于与用戯一步交。每个用例的描述应包括:~号Qؓ每个用例分配一个唯一的编P为需求的q溯提供了方便;参与者,与这个用例交互的 actorQ前|条Ӟ开始用例前所必须具备的系l状态;后置条gQ用例完成后pȝ辑ֈ的状态;基本路径Q用例完成的关键路径Q也是用h望的路径Q扩?点,基本路径的分枝,表示意外情况Q字D说明,路径中名U的q一步分解说明,对以后类属性的定义和数据库字段设计起作用;设计U束Q实现用例的非功能约 束。写基本路径时应该用主动语句;句子以actor或者系l作Z语;一句表CZ个actor动作Q一句表C系l动作,交叉表现交互Q不要涉及界面细 节,比如"用户在文本框输入名称Q下拉框选择cd".

  用例Q用h册,用户注册成ؓpȝ会员

  ~号

  UC1

  参与?用户

  前置条g

  用户讉KpȝQ系l运行正?

  后置条g

  pȝ记录用户注册信息

  基本路径

  1. 用户h注册?

  2. pȝ昄注册界面?

  3. 用户提交注册信息?

  4. pȝ验证注册信息是否正确?

  5. pȝ生成用户名和密码Q保存注册信息?

  6. pȝ昄"注册成功"信息Q进入会员页面?

  扩展?

  4a. 用户提供的信息不正确Q?

  4a1. pȝ提示输入正确信息

  4a2. q回3

  补充说明

  注册信息包括Q用户实名+电话Q传真+EmailQ联pd址联系地址Q省份+城市Q街道+邮编

  设计U束

  注册反应旉不能过3U?

  8、确定质量属?

  在功能需求之外再考虑一下非功能的质量特点,以及定׃Ҏ的商业应用环境对pȝ提出的功能或性能上的U束Q这会你的产品辑ֈq超q客L 期望。对pȝ如何能很好地执行某些行ؓ或让用户采取某一措施的陈q就是质量属性,q是一U非功能需求。听取那些描q合理特性的意见Q快捗简易、直觉性?用户友好、健壮性、可靠性、安全性和高效性。你要和用户一起商讨精定义他们模p的和主观言辞的真正含义Qƈ且要质量属性分配到每个用例的设计约束中 厅R?

  9、检查问题报?

  通过查当前已l运行系l的问题报告来进一步完善需求客L问题报告及补充需求ؓ新系l或新版本提供了大量丰富的改q及增加Ҏ的xQ负责提供用h持及帮助的h能ؓ攉需求过E提供极有h值的信息?

  10、需求重?

  如果客户要求的功能与已有的系l很怼Q则可查看需求是否有_的灵zL以允许重用一些已有的软glg。业务徏模和领域建模式需求重用的最好方法,像分析模式和设计模式一P需求也有自q模式?/FONT>



Sung 2005-10-23 21:03 发表评论
]]>
Software Engineer -2006 Graduate IntakeQHP2006校园招聘Q?/title><link>http://m.tkk7.com/qq13367612/archive/2005/10/23/16488.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Sun, 23 Oct 2005 10:42:00 GMT</pubDate><guid>http://m.tkk7.com/qq13367612/archive/2005/10/23/16488.html</guid><wfw:comment>http://m.tkk7.com/qq13367612/comments/16488.html</wfw:comment><comments>http://m.tkk7.com/qq13367612/archive/2005/10/23/16488.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/qq13367612/comments/commentRss/16488.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/qq13367612/services/trackbacks/16488.html</trackback:ping><description><![CDATA[<P><STRONG>JOB DISCRIPTIONQ?</STRONG></P> <P>hp invents. <BR>We never stand still. <BR>We look for new things to do, and new ways to do things we've done before. <BR>Excellence is the minimum standard acceptable. <BR>Job Description <BR>The software engineer designs, develops and tests. The software engineer works as a member of an engineering team developing, designing, and maintaining one or more of our products. This position reports to the appropriate project manager. The software engineer: <BR>-Responsible for the quality and completeness of assignments, including investigation tasks, initial design, development, bug fixing, quality engineering, documentation, and general product maintenance. <BR>-Recognizes and points out design problems during the project-planning process. <BR>-Resolves in-process problems independently, or with minor input from the project manager. <BR>-Responds to key product questions and customer needs, and ports products to new operating systems and compilers on a regular basis. <BR>-Reviews new product or new release proposals, and provides feedback to engineering on product features and project schedules. <BR>Your Profile <BR>-Bachelor/Master Candidate in Computer Science. <BR>-Good English both in oral and written, CET-6 is required. English presentation skill is a plus <BR>-Understand Intranet and Internet technologies: HTTP, firewall, Java, C++, HTML/DHTML, XML, middleware, etc. <BR>-Experience with C++ and Java programming & testing. <BR>-Experience with Data Warehouse, Business Intelligence, SAP implementation, SAP support, SAP Business Warehouse, Content Management, BOSS is highly preferred <BR>-Process a very strong understanding of the full Software Development Life Cycle (SDLC) and methodologies. <BR>-Excellent team player with strong verbal and written communication skills. <BR>-Integrity, attention to detail, timeline sensitive, goal oriented, motivator <BR></P> <P>密切x & Qualify myself for this Co.</P><img src ="http://m.tkk7.com/qq13367612/aggbug/16488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/qq13367612/" target="_blank">Sung</a> 2005-10-23 18:42 <a href="http://m.tkk7.com/qq13367612/archive/2005/10/23/16488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java企业pȝ架构选择考量http://m.tkk7.com/qq13367612/archive/2005/10/21/16252.htmlSungSungFri, 21 Oct 2005 03:45:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/21/16252.htmlhttp://m.tkk7.com/qq13367612/comments/16252.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/21/16252.html#Feedback1http://m.tkk7.com/qq13367612/comments/commentRss/16252.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16252.html  下面我们从一个发展角度来对J2EE/Java EE的这些框架诞生进行一番考量Q可能对我们的选择有很大帮助?/P>

  首先我们需要明白一?A target=_blank>高质量的J2EEpȝ是什么样?/A>Q高质量的J2EE/Java EEpȝ标准实际是OO设计的标准,松耦合是OO设计的主要追求目标之一Q那么无疑解耦性成量J2EE/JEE质量的首要标准。实际选择中,q需要兼֏伸羃?性能/开发效率等斚wl合考虑?/P>

  J2EE/Java EEL多层l构Qؓ什么多层比两层好?因ؓ多层l构解耦性好Q带来维护拓展方便灵zR?/P>

  典型的J2EE/Java EE臛_划分三个层次Q表现层/业务逻辑lg?持久层?/P>

  如图Q表现层英文是Presentation LayerQ是实现昄功能的,q部分一般用B/Sl构来完成,当然你也可以使用专门q程客户端来实现;

  业务逻辑层因为是由大量组?Components)l成的,也可UCؓlg层,lg从不同角度又可分为各U类型,然后又有不同的流z,目前占主要位|的是Model+ServiceQ模型加服务Q所以这一层又UCؓ业务服务层Business ServiceQ也有称为Model业务层;

  持久层是负责对象持久化也是数据库操作的层次,英文Persistence Layer?

  SUN伙伴们推出J2EE标准Ӟ分别对这三个层次规定了标准实玎ͼ表现层用Jsp/Servlet技术;业务lg层用EJB的会话BeanQ持久层使用实体Bean。同Ӟ标准业务层和持久层在物理上l成一个新的容器EJB容器Q与表现层技术完全一L容器Q这PJ2EE技术被l化为Web和EJBQ物理上有Web容器和Web应用E序Q以及EJB容器和EJB应用E序?/P>

  当然QJ2EE/JEE的发展不止这些,q三个层ơ技术分别独立发展,高歌猛进Q下面分别单独陈qͼ当你了解某种框架技术ؓ什么诞生时Q你可能q道你该在什么情况下选择它们了,工具L因目的而生Q?/P>

表现层框?/STRONG>

  J2EE/Java EE虽是多层l构Q但它不是一U强制性多层结构,也就是说Q你也可能做成传l两层结构,有的初学者直接用Jsp嵌入Java代码调用数据库这L构实际不是多层结构,q是以前的两层结构?/P>

  在Jsp中嵌入大量代码,一旦报I指针错误就很难扑և问题Q很多初学者下载JiveJdon 2.5后就l常到q个问题Q因此大量有关空指针错误问题出现论坛里,Z么他们不能自p军_Q?那是因ؓ无法定位错误在Jsp中的位置QTomcat{服务器只告诉我们错误在index_jsp.java(Jsp的java文g)位置Q搞得一些hl常会跑到Tomcat服务器内部翻找Jsp的Java文gQ这一q程无比痛苦Qؓ了减初学者这U痛苦,本站暂停了JiveJdon2.5的下载)?/P>

  J2EE/Java EE的发展就是降低这U痛苦,首先惛_的方式是Q在Jsp调试上下苦功Q要求Tomcat{服务器提供详细的错误定位;可惜到Tomcat 5.5我们也没看到q种功能Q实际上Q根本解决之道就是将Jsp的调试变成javalg的调试?/P>

  首先通过MVC模式规定Jsp只能{同于HtmlQ不能包含Java代码Q将Jsp和Java代码分离Q可是这样分M后,它们l合h又麻烦了Q所以,虽然你用MVC模式Q但是还是直接基于Jsp技术,带来的是开发效率的降低?/P>

  Struts框架解决了这个问题,通过ActionForm可以Jsp和JavaBeans方便快速地l合hQ但是有人又抱怨Struts的ActionForm限制太死Q与Jsp虽能对应Q只能一个ActionForm一个表单对应,而不能Q意组件JavaBeans都可以和JspL字段对应Q这时就出来了组件型框架JSF/Tapestry?/P>

  表现层框架Struts/Tapestry/JSF架构比较

业务逻辑层框?/STRONG>

可׾~?/STRONG>

  因ؓEJB标准的推出,业务lg层以前基本是EJB的天下,但是EJB功能实在太强大,它考虑了世界顶U大型系l需求,因此免不了显得很复杂Q当初,基本上所有的大型企业高端都是选用J2EEQ选用J2EE实际是选用EJB。EJB的高可׾~性ؓ大型企业日益发展提供最大的发展I间Q不再因Z业快速发展导致整个企业系l结构都要发生根本变?q是使用EJB的现实优ѝ?/P>

  q种企业pȝ的可伸羃性不是因为EJB存在才显得重要,而是我们企业架构选择需要考量的基本因素。换句话_无论我们使用EJB与否Q这个问题都需要考虑:一台服务器不够用怎么办?如果q台服务器死Z对企业运营带来什么媄响?如果每个星期q台服务器停机维护升U会不会对企业带来打击?我的企业pȝ是不是需要可靠的、几乎不当机?x24q行Q当企业pȝ面对大量外部讉K用户Ӟ一台服务器是否够用Q多台服务器联动的需求是否涉及Y件技术更换?

  在这个现实因素考量后,如果觉得不是很重要,或者说来一D|间内q些因素无所谓,那么可以不选用EJB了?/P>

  Z么有不选用EJB的理由?因ؓ它复杂,学习h比较困难QEJB帮助我们考虑企业中可能碰到的大部分问题,实际上,有的我们不需要,q也是Z么说EJB是一个重量解决Ҏ所在?/P>

  与重量相比的是轻量Q业务组件层轻量U解x案有Spring/HiveMidn/Jdon Framework{,轻量一词曾l因为EJB的出现而变得时髦,lh造成的感觉是QEJB׃老E子力气完成的那些功能Q用我轻量U解x案可以轻而易举也能解冻IN若轻啊,其实q是一U误解?/P>

  当曾l以轻量自居的Spring事务机制纳入自己怀׃Ӟ它也开始低调轻量了Q实际是不轻不重了;当然如果它把分布式计和事务再次加入Ӟ天^砝码也会沉下ȝ?/P>

  初学者L愿意使用单的解决ҎQ学习用方便,因此比较喜欢轻量U框架技术,q是正常的,但是在用轻量别框架之前必L白:你的pȝ来真的只需要一台服务器卛_Q你的项目完成期真的非常紧急?

  如果只需要一台巨强服务器Q就不必选择EJBQEJB是因分布式多服务器而生Q对于单台服务器Q缺乏本地透明性,也就是说Q你无法透过EJB直接和本地JVM或文件系l等打交道,透明性也是衡量一个框架的重要指标?/P>

  当然Q重量和轻量q不完全对立QEJB3是Z化J2EE的用,使得EJB不只是擅长处理大型企业系l,中小型系l也使用很方便,q实际上也是EJB轻量化的一U努力?A target=_blank>什么是Java EE 5Q?/P>

  所以,对于架构选择来说Q根本前提是需要明白你的系l现在或来一D|_注意需要考虑来一D|_不能只看眼前Q是中小型系l还是大型系l?

灉|?定制?透明?/STRONG>

  当然q个{案有时我们自己也可能很隄出,那么我们q需要从其他角度来考量EJB和非EJB之选,例如W者曾l经历一个大型实时娱乐^台社区系l,从规模上说肯定是大型pȝQ设计目?0万h在线Q从q个角度非选用EJB不可Q?/P>

  但是QEJB因ؓq有事务机制Q虽然应用程序可以选择失效EJB事务Q但是EJB容器设计因ؓ考虑了事务,所以在其内怸L会显得臃肿,是一U篏赘,q也是一U重量表C,不需要的东西存在肯定会媄响效率,那么N我不能根据我的需求,对EJB整体包括EJB容器q行可配|式的切Ԍ也就是说Q我上面q个案例只需要EJB的分布式计算功能Q其他的功能我都拆除Q只剩余我需要的功能能运行就可以了,轻装上阵?/P>

  可惜Q这UQ意切Ԍ应需而定的目标在EJB3标准q没有被重视Q所q的是,Ioc/AOP技术ؓq种目标实现提供了实现可能,但是Q只有Ioc/AOPq是不够Q特别是看Ioc的范_如果你只把应用系l组件纳入Ioc理Ӟ自由解耦只属于应用pȝQ我上面案例的目标还是无法达刎ͼ当你把框架本w组件也U_Ioc理ӞL切割Q应需而定的目标才真正实现?/P>

  Spring和EJB3属于“只把应用系l组件纳入Ioc理”,q从JBoss 4.0版本可以看出Q那什么框架会把框架本w组件也U_Ioc理呢?Apache?A target=_blank>Hivemind和笔者开发的Jdon框架?/P>

  什么样的组件可以被U_Ioc理呢?POJOlgQPOJOq个概念其实当初是针对EJB~点而推出,EJB要求应用pȝ的组件必ȝ承或依赖EJB容器Q这样得调试变的不方便Q但是后来,POJO的概念已l不只最初这些概念,POJO代表那种与周围完全脱dpR自p在的Object了,如果应用pȝ的Model或者Service都是POJOQ意味着你的应用pȝ不依赖Q何其他系l,解耦性灵zL高?/P>

  POJO是因为EJB而提出的Q当EJB自己們֐POJOӞ大家都在宣称自己是POJOӞPOJO概念没有立点了,q也是Java领域哭笑不得的现象,但是我个人更們֐把非EJB的JavaBeanslg通称为POJO?/P>

  Hivemind的Ioc依赖注射部分功能?A target=_blank>Jdon框架非常cMQ当上百个POJOlg配置Ӟ完全不必指定它们之间的依赖关p;你可以将自己应用E序的组件注册到Registry中,q样Hivemind帮助你启动q些lgQ正如你在Jdon框架中将你的lg写入mycontainer.xml中,Jdon框架也将自动启动你这些组Ӟq解军_们之间的互相调用Q包括和框架本nlg互动?/P>

  HiveMind?A target=_blank>Jdon框架定义的POJO Service有如下特点:

  不象EJB那样~Z本地透明?location transparency)概念Q这些POJO ServiceL能定位到同样一个JVMQ也不象ZXML的Web服务web services那样没有语言透明(language transparency)概念Q这些POJO ServiceL可以被一lJava接口来概括替?通过调用Java interface来替代调用这些具体Service)Q当Ӟ更不会类似JMX或JiniQ不能进行service的热装蝲Q?hot-loadingQ?/P>

  注意Q当Ioc/AOP提供高度灉|的同Ӟ已经有初学者开始抱怨Spring的过分灵z,那么比Spring在组件上更灵zȝJdon框架只能是一U追求极端,它不一定构成你q行架构选择的主要依据!

  上面q些讨论只是表明在灵zL(解耦?透明性)q条需求道路上q下去的选择Q你自己的应用系l需求会产生各种不同的要求,有些要求甚至是极致的Q这U偏向程度就成ؓ你架构选择的目标,如果你的q种极致要求在目前Java世界里还没有可选框架时Q那么你p动手自己做了Q这也说明什么时候你开始自己做框架Q如Jdon框架Q,虽然在大多数情况下我们是不必要自己发明轮子的?/P>

快速构建?/STRONG>

  前面是从灉|性和定制性这个角度讨论架构选择目标Q但是在一般情况下Q我们还是从上手难易、开发效率这个角度来q行架构选择Q从q个角度来说Q就是需要我们将选用的框架尽可能的多帮助我们实现一些功能,但这又是和用难易是矛盾的,因此有个取舍问题Q取舍有个准则:q个框架量能提供越多功能;量需要我们少写代码,甚至不写代码Q用XML配置Q,动脑筋?/P>

  关于XML配置q里也涉及难易问题,XML配置语法不能太复杂,有太多小开关Switch也增加学习成本?/P>

  从这个角度看QEJB无论是EJB2或EJB3提供的功能是最齐全的,但是XML配置开兛_?QSpring属于中等Q组件XML配置不算单,但是因ؓ有不Struts+Spring+Hibernate之类现成开源代码可供参考,因此学习h隑ֺ也不大,Spring来象一个J2EE APIQ注意,JDK是J2SE APIQ?QSpring除不能提供分布式计算外,也因分灵z降低了一些开发效率,例如它的lg依赖关系一般需要逐步指定Qauotwiring功能q没有深入骨髓成为核心功能?A target=_blank>Ioc容器的革命性优炏V?/A>

  Spring除了提供lg层功能以外,q有表现层支持Spring MVCQ也有持久层实现的JDBC模板Q这P整个J2EE/Java EEpȝ各个层次Spring都提供了~省实现Q在q方面无疑提高了开发效率,但是Spring提供丰富API目的好像不是Z快速开发,而是Z建立一个完整的功能齐全的API功能库。正如它|页上开头文字所qͼAs the leading full-stack Java/J2EE application frameworkQ注意full-stackQ完整齐全)是它H出的名词?/P>

  那么Q还有另外一个空白,是以开发效率ؓ主要考虑Q这cL枉了必考虑_灉|性和丰富功能以外Q宗旨是Z在一般缺省情况下快速完成一个J2EE/Java EEpȝQ这非常cMMDA工具了,但是一个完全qzL和定制性的MDA工具也不是我们欢q的?/P>

  Jdon框架的发展目标是Z填补q个I白Q相信也会越来越多框架向q个目标q进Q当然不可否认,Spring也可能调转枪头走入这个领域,EJB2/EJB3正依靠JBuilder{这样商业化开发工具向q个领域靠拢Q这个发展方向实际是4GL RAD Tools?/P>

  很多人在快速构建方面也很早q行了探索,涌现出各U工P如何构徏一个快速业务构件^収ͼ 但是如何把快速构建和构gQ组Ӟ灉|性有机结合在一P它是考验一个业务构Ӟ业务lgQ^台好坏的准则。有些构件^台虽然开发迅速,但是对于Ҏ情况Q可供程序员定制透明操作部分不多Q很死,典型的是两层l构以前的DelphiQ开发很快速,但是无法象J2EEq样深入到系l各个层ơ进行定?l护/拓展Q?/P>

业务lg框架Ҏ

  EJB2/EJB3 Spring Framework Jdon Framework
灉|?BR>(松耦合) EJB3比EJB2更具灉|性,EJB3支持应用pȝPOJO 支持应用pȝPOJOQ框架基功能不能替换 支持应用pȝPOJOQ框架本w可分离配置Q定制性更?/TD>
功能完整?/TD> 全面Q支持异步JMS 分布式事?/TD> 较ؓ全面。有自己的表现层和持久层模板,可支持异?/TD> 基本完整Q表现层借助Struts实现。有自己单的持久层模?/TD>
单台性能 一般,扚w查询{大数据量业务处理须心Q存在本C透明~陷?/TD> 一般,框架本nlg无性能提升极致Q应用程序可配置cache/Pool 好,框架本nlg使用~存提升性能Q应用程序可配置cache/PoolQ批量查询专门优化,适合实时性ƈ发性要求较高应?/TD>
可׾~?/TD>

可支持多台服务器分布式计?

不支持,可依靠EJB实现 不支持,可依靠EJB实现
开发效?/TD> 学习曲线?D熟练掌握难。借助商业开发工具可加快熟练者的开发速度?/TD> 较ؓ复杂Q可挑选只适合自己的功能实现。当lg很多Ӟ需要照这些组件之间调用关pR?/TD> 单快速,表现层编码很。当lg个数很多Ӟ无需照顾它们之间的调用关p?/TD>
pȝ规模 EJB2适合大型pȝ;EJB3适合中大型系l?/TD> 适合中小型系l?/TD> 适合中型系l,建立一个简单的|站pȝ{,和EJB无缝l合Q可借助EJB支持中大型系l?/TD>
重量U别 重量Q正在减?/TD> 轻量偏重Q有可能l箋增肥 最轻量Q恪守简单快速原?/TD>

 

持久层框?/STRONG>

  持久层框架目前有EJB2/EJB3的实体Bean、Hibernate和各UJDO产品Q当然还有直接写SQL语句的JDBCQ如iBatis{?/P>

  持久层框架质量好与坏区分是是否是O/R MappingQ也是对象和关pL据库映射Q关pL据库需要实现定义好Schemal构Q对象因为字D而变的也有一个自ql构Q如何将对象数据自动持久化到数据库中Q首先我们得定义两者结构的对应Q这实际是数据的元数据定义?/P>

  因ؓHiberante/Toplink/JDOq样O/R Mapping工具帮助你实现对象和数据库{换,克服了对象和数据库阻抗现象,O/R Mappingȝ Q所以才使得我们更多的可以对象方式(从模型Model对象Q来考虑Java EE/J2EEpȝQ可以完全放弃以前那U以数据库ؓ中心的思维方式Q?A target=_blank>数据库时代的l结?/A>

  所以,是否选用好的持久层框Ӟ取决于你整个团队思维是否dOO了,是否需要真正OOQ当Ӟ对于一些小型项目,有时我们觉得直接使用JDBC模板反而更加轻村ֿ捷一点,q也是Spring的JDBC模板/iBatis/Jdon的Jdbc模板存在的理׃?/P>

例如新增一个数据表Q在Jdon框架只需要下面几行代码即可:

String sql = "INSERT INTO testuser (userId , name) VALUES (?, ?)";
List queryParams = new ArrayList();
queryParams.add(userTest.getUserId());
queryParams.add(userTest.getName());
jdbcTemp.operate(queryParams,sql);

  q种方式和O/R Mapping兴师动众的多个XML配置和关pL思考相比,对于习惯SQL语句的程序员反而更加迅速?/P>

  从以上可以看出,灉|?快速?单?可׾~性是我们q行架构选择的主要几个依据,架构选择实际是在这几个{略之间做一个^衡。当Ӟq有一个非帔R要的因素Q因为它不属于某个层ơ的技术,性能/~存是必d上面因素l合考虑的因素?/P>

  因ؓ性能最初是我们使用计算机的基本原因Q别忘记q个Ҏ?/P>

Sung 2005-10-21 11:45 发表评论
]]>
关于BO的问题[转自http://www.jdon.com],可以来谈谈自q看法http://m.tkk7.com/qq13367612/archive/2005/10/21/16250.htmlSungSungFri, 21 Oct 2005 03:40:00 GMThttp://m.tkk7.com/qq13367612/archive/2005/10/21/16250.htmlhttp://m.tkk7.com/qq13367612/comments/16250.htmlhttp://m.tkk7.com/qq13367612/archive/2005/10/21/16250.html#Feedback0http://m.tkk7.com/qq13367612/comments/commentRss/16250.htmlhttp://m.tkk7.com/qq13367612/services/trackbacks/16250.html我们在开发系l时,一般VOQ或者是POQ对应的是数据库中的表中的记录,view object是提供给客户端显C用的对象,在业务逻辑部分是BO。在很多情况下,我们把VO或者是PO作ؓ了BOQ但是在复杂的业务环境中Q这U方式的脆弱性就体现出来了,如果我的业务对象比较复杂Q具体来_比如包含了多个表Q多个视图中的数据)Q就没办法将VO、PO作ؓBO用了。这时候我们需要专门做一层业务层Q通过D软干个PO、vo来构造我们需要的BOQ以及按一定的业务逻辑处理q些BOQƈ生成相应的view object提供l客L。我的疑问是Q?BR>1、这斚w有没有成熟的架构或者案例?
2、关于BO的构成:
2.1、BO中是否应该既包含业务对象的属性又应该包含业务ҎQ?BR>2.2、或者是BO只包含业务对象的属性,对BO的所有操作都׃务逻辑对象处理Q?BR>2.3、或者BO中包含业务对象的属性以及RetrieveQUpdateQCreateQDelete{操作,而业务逻辑׃门的业务逻辑对象处理Q?BR> Re: 关于BO的问题?发表旉: Jul 17, 2005 7:55 AM   回复 
 
发表? banq    发表文章: 5226 / 来  ? 上v / 注册旉: 2002-08 
你的疑问正好和这文章讨论的一_

BO中是否应该既包含业务对象的属性又应该包含业务ҎQ?BR>在Ruby on Rails/Naked Objects_指引下的域驱动开发框?/P>

>1、这斚w有没有成熟的架构或者案例?
你这是SOA架构Q是业务层加DomainQ现在大量的J2EE都是q种架构

?、关于BO的构成:
?.1、BO中是否应该既包含业务对象的属性又应该包含业务ҎQ?BR>现在SOA架构是不包括业务ҎQ被UCؓ贫血模型;Naked Object是两者都包括Q但q是一个研I方向?BR>>2.2、或者是BO只包含业务对象的属性,对BO的所有操作都׃务逻辑对象处理Q?BR>是的
>2.3、或者BO中包含业务对象的属性以及RetrieveQUpdateQCreateQDelete{操作,而业务逻辑׃门的业务逻辑对象处理Q?
一般BO只包括属性,CRUD也属于业务操作了Q我认ؓ属性和业务Ҏ分离属于桥模式,分离是ؓ了更灉|的组装,SOA也不q反OOQ不q因为OO?教皇"Martin fowler一句来自感觉的话:感觉不美Q血模型Q我怿不出Q在一个分布环境中和一个互联共享环境中Q如果把BO拿出来共享,而不是ServiceQ会产生什么样后果。也许“教皇”不是凡人,比你我看得很q,可惜我是倡导“上帝死了”的人?/P>


 
 

 Re: 关于BO的问题?发表旉: Jul 18, 2005 12:46 PM   回复 
 
发表? redlly    发表文章: 42 / 注册旉: 2003-07 
SOA好象是基于服务的架构,能说说和q个具体有什么关pd?
 
 

 Re: 关于BO的问题?发表旉: Jul 23, 2005 11:01 AM   回复 
 
发表? flyinair2000    发表文章: 10 / 注册旉: 2004-08 
Martin fowler一句来自感觉的话:感觉不美Q血模型
Q-Q-Q-Q-Q-Q-Q-Q?BR>q根本不是感觉的话,q样的模型又回到了procedural programming的老\上了?BR>procedural progrmming 告诉我们“世界就是世界,你就是你”?BR>oo说“世界就是你Q你是世界”?BR>现在多了一个SOAq个BUZZWORDQ说的却q是“世界就是世界,你就是你”。除了在哲学理论上我可以看出它的“螺旋式上升”的q步以外Q其他看不出有什么意义。(以上的“世界”和“你” 差可比拟为“method"和“property")

另外Q什么是soa? 谁也搞不清楚。(看最qTSS.NET上的一,MS QPDC?) 2005 大会上谁都讲SOA,谁都说不清。但是已l有architect宣称SOA是类goo 的paradigm shift了,搞笑不搞W?Q?BR>q来如果可以作paradigm的话Q个为恐怕要数AOPZ表的斚w~程了?
 
 

 Re: 关于BO的问题?发表旉: Sep 9, 2005 8:30 AM   回复 
 
发表? Kyle_Yin    发表文章: 26 / 注册旉: 2005-09 
"q根本不是感觉的话,q样的模型又回到了procedural programming的老\上了?

除了OOPq是PROCEDURAL的编E风g? 其实q里有o一个重要因素大家没有提? 性能.

很多大系l? 臛_我听说过(看过DIAGRAM)的和亲眼见过(CODE)的系l?呵呵, 其实也没几个), 大多是尽可能采用无状态设? 无状态的lg界面看上d然象PROCEDURAL函数. q样做的原因, 主要是ؓ了性能. 在分布计环境里, "状?往往意味着"地点亲合", "地点亲合"往往意味着"性能瓉".

我发现直白英文翻译成中文马上发怺.

 
 

 Re: 关于BO的问题?发表旉: Jul 23, 2005 11:07 AM   回复 
 
发表? flyinair2000    发表文章: 10 / 注册旉: 2004-08 
或者是BO只包含业务对象的属性,对BO的所有操作都׃务逻辑对象处理Q?BR>------------
臛_我见q的所有经典j2ee书中都是讲要包含逻辑处理的?BR>service只是一层wrapper而已Q不包含太多的逻辑?
 
 

 Re: 关于BO的问题?发表旉: Jul 24, 2005 12:13 PM   回复 
 
发表? redlly    发表文章: 42 / 注册旉: 2003-07 
> 臛_我见q的所有经典j2ee书中都是讲要包含逻辑处理的?BR>> service只是一层wrapper而已Q不包含太多的逻辑?/P>

我们知道Q在特定的领域中Q如果不发生革命性的变化Q一般来说这个领域的核心数据基本是稳定的。也是说我们可以抽象出特定领域的稳定数据模型;而在领域中的业务逻辑的变动是比较大的Q是难以被固化的。最典型的案例莫q于Ud、连通的资费吧,今天一个优惠,明天一个酬宾,业务逻辑可谓是变化五IP但是它们的基本数据基本还是保持不变,如:资费、时长等{?BR>q样来说如果在BO中即包含业务对象的属性又包含业务逻辑Q在业务需要变动的时候将不可避免的对BOq行修改Q更可怕的是,在业务逻辑比较烦多复杂的时候出现包括数十数百个ҎQ数千上万行代码的巨无霸BO的出现。这跟对象间解耦、分ȝ理念是严重背ȝ?/P>


 
 

 Re: 关于BO的问题?发表旉: Jul 24, 2005 12:21 PM   回复 
 
发表? redlly    发表文章: 42 / 注册旉: 2003-07 
对于SOAQ基于服务的架构Q,我也查过不少资料Q包括M$、IBM、BEA{等。但是给我的感觉是SOA只是一U理念,好像q没有一个统一的标准,或者说没有一个可以拿来做实例的案例架构,不像OO、DAO{设计模式。大多数厂商的对SOA的解释也不同、解x案更是像在做q告Q让看越qL。谁能详l的阐述一下SOAQ或者用几句话概括一下SOA?
 
 

 Re: 关于BO的问题?发表旉: Jul 24, 2005 12:42 PM   回复 
 
发表? banq    发表文章: 5226 / 来  ? 上v / 注册旉: 2002-08 
SOA有两者含义:一U是你说的SUN{公司提出那U理念,q更多是一U商业概念;q有一U是J2EE的开发模式的概念Q见老外q篇文章可能W合我们q个话题的讨论:
http://dotavery.com/blog/archive/2004/01/04/215.aspx
在这个话题中QSOA是Model中的业务逻辑分离出来Q单独Ş成一个服务,我们~程时就是面向这些服务编E了Q当然原理的模型因ؓ被抽取主要行为,变成了血模型了;但是我认W合GOF的桥模式。所以SOAq不是一U反设计的架构?/P>

 
 

 Re: 关于BO的问题?发表旉: Jul 26, 2005 2:34 PM   回复 
 
发表? flyinair2000    发表文章: 10 / 注册旉: 2004-08 
有很多时候,q不是不能用OO解决问题Q而是我们没有能力应用OO而已?BR>臛_Q对于你讲的资费问题Qƈ不是没有OO的解军_法?BR>加上一个service layerQƈ没有自动解决pȝ解耦问题,Q相反增加了耦合E度。ؓ什么?我也不想说了。-Q知道的自然知道Q不知道的争论半天,也不会有什么结果。国内论坛,抬杠骂架的居多,不想多说Q?BR>只是l一个原始的procedural programming 加上一个漂亮的wrapper而已?/P>

MQ各Z者见仁,见智吧?
 
 

 Re: 关于BO的问题?发表旉: Jul 29, 2005 11:08 AM   回复 
 
发表? redlly    发表文章: 42 / 注册旉: 2003-07 
看了不少资料Q关于BOQbussiness objectQ有不少U概念,主要有如下三U:
1、只包含业务对象的属性;
2、只包含业务ҎQ?BR>3、两者都包含?BR>呵呵Q看h是仁者见仁了。bang的看法应该是W一U,如果是这hq是比较偏向于bang的看法。其实怎么定义q不重要Q这些东西原本就已经在各U项目、各U模式中存在Q只是叫法不同。重要的是要扑ֈ一U适合自己目的模式?
 
 

 Re: 关于BO的问题?发表旉: Aug 25, 2005 6:52 PM   回复 
 
发表? billywxy    发表文章: 14 / 注册旉: 2003-11 
看了不少资料Q关于BOQbussiness objectQ有不少U概念,主要有如下三U:
1、只包含业务对象的属性;
2、只包含业务ҎQ?BR>3、两者都包含?/P>


我一直用第三种
 
 

 Re: 关于BO的问题?发表旉: Sep 9, 2005 8:02 AM   回复 
 
发表? Kyle_Yin    发表文章: 26 / 注册旉: 2005-09 
"加上一个service layerQƈ没有自动解决pȝ解耦问?-----所以会有ESB一cȝ东西, 呵呵.

关于SOA, 推荐一个网?www.soacentral.com, q是BEA, 微Y发v的一个consortium. 上面有SOA蓝图和BEA, J2EE 和微软的参考实?

SOA和OO不是一个层面的东西. OO的适用范围是偏向系l底层的, 比如~程, 构g设计. SOA是偏向宏观的, 比如集成, 整合, 工作?

SOA的一个成型的例子是WSRP. q里的SERVICE是一个PORTLET, 而服务客hPORTAL. 与传lPORTAL不同的是q个PORTLET不是本地? 而是ZWEB SERVICES? q且可以通过ESB解偶. 当然, WSRP有它的特D? 因ؓ整合的地Ҏ在最l用户面? 呵呵.
 
 

 Re: 关于BO的问题?发表旉: Aug 15, 2005 11:14 AM   回复 
 
发表? kylix_xp    发表文章: 1 / 注册旉: 2005-08 

我觉得这不是个问?bo没有了操作方?q叫面向对象?比如说银行帐号Account对象,存款deposit(),取款withdraw()操作不属于Account对象Q难道还属于别的对象Q这不是很自然吗Q?BR>?RUPl一软gq程
http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/mar05/5383/?ca=dwcn-newsletter-rational#N10098

 

Ҏ个用?/P>


建立一个用例实?


补充用例描述Q如果需要的话)


从用例行ZQ找出分析类
如果我们严格按照RUPq程q行Q下一步应该是Q?/P>

把行为分配给分析c?
Z以下理由Q这一ơ,我又会对RUPq程做一点小的改动:回顾一下我们的q展。我们刚刚找C8个实体类Q我们认些都是我们系l中的类。在我们做下一步之前,我们需要给q?个实体类增加一些内容,来确认他们是cR?/P>

有三U基本的Ҏ来充实我们的分析c:

数据驱动的方?/P>


行ؓ驱动的方法,?


职责驱动的方法?/P>


数据驱动的方法对于从事数据库工作Q或者从事过E语a~程的h员来说很常见。他们就是用数据和数据之间的关系来认识、描qC界的Q因此会首先d扄中的数据Q一般没有什么标准的Ҏd扄的函数或功能。这看v来不错,[b]但是数据只是工作的一半。实际上Q?cȝ准确定义Q包括了数据和对数据q行的操作。[/b]

行ؓ驱动的方法有着双重的成立理由。首先找出类执行的操作,从中军_q些操作涉及的数据中Q哪些应该被q个cL拥有。这很棒Q但是我们如何确认我们ؓcL出的操作之间能够保持一致呢Q如何区分操作和c,以明这个操作是属于q个c,但是 其它的操作要属于同一个类Q还是其它的c?我们需要某U方法来区分各个操作。这是职责驱动的方法带l我们的?/P>

职责驱动的方法是自上而下的,从M的类及其职责的视囑ּ始。首先定义一个类在业务中的“命”,q个“命”描qCq个cd外提供的服务。从军事术语上来_是责Q和策略。操作和数据是战术层面上的(为战略服务的Q服从于某些目标、策略的Q?2

一旦我们确定了我们的类的职责,我们可以设计一个分析类图,来描q类间关pȝ整体l构。这个结构一般都是由业务领域军_的。一个UML分析cd可以帮助我们可视化的把这个关pȝl构表示出来?/P>

因此Q我Ҏ准的RUPq程做如下修改(ơ序的改变)Q粗体)Q?/P>

Ҏ个分析类


描述cȝ职责


在分析类图上Q徏立分析类间的联系


把行为指定给分析c(扑և操作Q?


描述每个cȝ属性和关系


定义cȝ属?/P>


描述分析c间事g的相x?
u][b][/b][b][/b]
 
 

 Re: 关于BO的问题?发表旉: Aug 16, 2005 6:40 PM   回复 
 
发表? 大愚弱智    发表文章: 7 / 注册旉: 2004-09 
BO中包含业务对象的属性以及等操作Q而业务逻辑׃门的业务逻辑对象处理Q-我除了觉得这样做很合理外Q甚臌把RetrieveQUpdateQCreateQDelete{操作也攑ֈ专门的业务逻辑的bean来处理?/P>

把BO当成一个参Cl专门的业务逻辑的beanQ把操作和属性分开也见得违反了OO?BR>专门的业务逻辑的bean一般由容器理它的状态,q些bean可能q需要容器管理的事务Q假如把属性糅合进Ml容器管理好像就不是很适合了?
 
 

 Re: 关于BO的问题?发表旉: Sep 9, 2005 10:24 AM   回复 
 
发表? Kyle_Yin    发表文章: 26 / 注册旉: 2005-09 
个h意见, 大家对待J2EE模式有的时候太教条?
切莫忘记很多J2EE模式是在历史背景和特定语境下产生? 比如: EJB1.1没有"local interface", 早期的容器又~少对remote EJB界面的优? 和早期EJB设计者对于客L多样性的一些设?

EJB的初hUa的构建在RMI上的"地点透明". q个好的初L前提假设是多样化的客Lcd, 比如 HTML, 独立Swing client, Applet client, Midlet client. EJB1 徏立在q个假设之上. 可是很快大家意识?
1. q样做的代h是无区别无止境的marshalling, 从而导致性能恶化.
2. l大部分J2EE应用是WEB应用, 而WEB 容器和EJB容器通常在一个JVM之内. 没有必要Marshalling.
3. Swing client, Applet, Midlet和其他客L可以通过其他途径呼叫EJB, 比如WEB SERVICES, 而没有必要用RMI. 事实上RMI-IIOP往往无法通过攄? 而SOAP-HTTP则没有这个问? 对于q域分布应用, web services比RMI更适合做传输手D? 而WEB SERVICES又是可以部v在WEB容器上的, 和EJB同在一个JVM?
4. 容器生者往往采用一些优化措施省略不必要的marshalling. 比如在weblogic? 即使用了remote EJB, 如果q个ejb部v在本?JVM), 那么呼叫操作是不通过Socketq行? 事实上等同于后来的local interface.

在这些发现的指导? W一?核心J2EE设计模式"的主要目的是抉|EJB1的缺? 比如 Session Facade, Transfer Object的主要目的在于粗p通信_度, 减少 Socket ?marshalling. 而EJB2标准q一步引入了"local interface". 容器生商也推荐开发者用这些模? 自此, EJB ??WEB 层的"共同部v"作ؓJ2EE模式的核? 成了天经C.

问题? 如果WEB LAYER和BUSINESS LAYER"共同部v"在一个JVM? 那EJB除了"事物处理"?容器理怹?之外, q有什么意?

于是产生了SPRING, 于是产生了HIBERNATE. 在TomCat + Struts + Spring + hibernate的领域里, "Business Tier" 成ؓ一个纯_的设计概念, 不再具备"物理部v"层面的含?

可是有些传统J2EE的模式保留了下来. 在一个单JVMpȝ? Session Facade ?Transfer Object 已经不具备性能上的必要? 而更多地是一个审取向和习惯做法. 当然, Session Facade作ؓ事物处理的v?spring)的意义仍然存?

说这么多废话的意? 是有时我们容易忘? 分离"状??Ҏ"?模式", 是ؓ了一个理p存在的. 在回{?BO"该不该具?Ҏ"或?状?的时? 我们g更应该关心下面的q些问题:

1. q个BO是代?交易事物"? q是h"实体w䆾"?
2. q个BO的界面具备什么语? 有状? 无状?
3. q个BO和下面的怹层什么界? 如何l定?
4. q个BO的部|有什么物理约?
5. q个BO现在和未来的客户端是什? 在哪?

个h看法, 对于多数中小? 单层JVM (横向可以集群, 但是U向"共同部v"在一个JVM?, WEB表达层和EJB业务?共同部v"的应用而言, 一个完全作?业务交易中间数据属性集?而不具备"业务逻辑Ҏ"的BO属于杀鸡的钝牛刀. 原因如下:

1. 没有必要剥离"状?和方? "业务逻辑对象"的客户在q个环境里肯定是同一个JVM? 作ؓWEB代理的的"SessionFacade", 作ؓService代理的ApplicationService, 或者其他复合BO. ?共同部v"前提? 它们与BO之间的通信是纯JAVAҎ调用. 从性能角度分析, 不必?无状?的设计原则来优化通信_度. 事实? Core J2EE Pattern里BO的第一个战?composite entity strategy"也推荐?local entity bean 实现BO.

2. 从降低偶合角度看, 复杂数据l构而不具备相应逻辑Ҏ的对象是难以使用? 可以惌, "业务逻辑对象"的客L序将需要复杂的代码来维护这个BO的数据完整? q样的设计极大地增加了客L序和业务逻辑对象之间的偶合度.
相反, 如果BO和业务逻辑对象合而ؓ一, 那么BO本n可以负责自n属性数据的? 比如, 可以用有限状态模式来设计BO, 既增加BO界面的一致? 也降低客L序的复杂?

EJB3, AJAX, XAML, XUL, q有其他q_和客L技术的出现, 应该让我们不断质疑和反思现?传统"?模式". 跟随"模式"是不可能有创新的.

 
 

 Re: 关于BO的问题?发表旉: Oct 14, 2005 4:14 PM   回复 
 
发表? windfromsky    发表文章: 2 / 注册旉: 2005-10 
用文件系l来比方一?
BusinessObject是程序比如WordE序, 包含业务逻辑
DbObject 是文? 只包含属?BR>DbObjectManager 是资源管理器, 理DbObject

delete,list的操作应该属于DbObjectManager
insert,load,update以及其他业务逻辑应该属于WordE序即BO

 
 



Sung 2005-10-21 11:40 发表评论
]]>
վ֩ģ壺 þԭAV鶹| ޶aվ߹ۿ| ձ| ŮƵ77777| ձĻ| 99ƵƷƵ76| AVһ| ޵һ㽶Ƶ| VA߹ۿ| ѹۿձwwվһ| ɫavһ| ޾Ʒ| þѹۿ99Ʒ| ѹۿվ| ޾Ƶ| avɫ㽶һ| av뾫Ʒ4| ޹Ʒ˾Ʒ| Ʒ޾߹ۿ| Ů˾ƷƵ| ƬAëƬ鴤| ëƬa߹ۿ67194| ۺƵ| Ѹ߲| Ʒ˳ɵӰ߹ۿ| ߹ۿѸ| ȫƵ߹ۿѸ| Ʒվ | 91Ƶѹۿ| ܻƺ۵վ| ۲Ƶwwwѹۿ| һƵ| H⶯߹ۿ鶹 | avר߲| 츾AV߲| ۺ뾫Ʒһ| պvĻ| ˺ݺۺϾþ| vaþþþ| þþƷAV鶹վ| 91޵ҹ|