Profilo di wei我的生活FotoBlogElenchiAltro Strumenti Guida

我的生活

Foto 1 di 4

wei deng

Professione
Località
03 febbraio

09年1月的那些事儿

新的一年来了,在新年的头一个月里面就发生了这么多事儿,对接下来的月份很是期待呀!
 
1.乔迁
  在北京搬了n次家,就这次是往自己家里搬了,甭管多累,总算是有个窝了。
 
2.生病
  也不知道是搬家累着了,还是没穿毛衣的缘故,莫名其妙的发烧了,着急忙慌的去医院(武警总医院),还必须先去发热门诊,都是最近禽流感闹的,还好,俺不是,俺是病毒性感冒,最高到了39度多,输了两天液,花了六百多,医院也是促进内需呀。原以为输了两天液就该完事了,谁曾想余温不散呀,又只好换了家医院(北医三院)继续看病,又开了三天的液,还好到第二天温度正常了,这些病毒总算折腾够了。
 
3.回家
  本来是输三天的液,但是第二天得知票是第三天的,得,又浪费了一天的药费,头天晚上和媳妇非常精简的收拾了一番,才俩包,合适。都说要跟新房里过年,可是谁让我有颗思家的心,去年就冰冻没回成,姥爷都91了,今年怎么也要回去看看了,甭管有钱没钱,都要回家过年。想着家里没暖气,咱又刚病好,体虚着呢,所以啥都double了,毛裤,穿俩,毛衣,穿俩。上了火车,本应该第二天上午就到呀,一觉醒来,发现还在湖北,为啥呢,原来线路有问题,跟这停着呢,我说我怎么睡的这么香,最后到家一算,晚点6个小时,真是不容易呀。在出站口还遇到了同坐一趟车的同学,这个世界真是很奇妙!
 
4.过年
  还是家里吃的好呀,但是气候有点不适应,冷呀,守着电烤炉,打打牌,搓搓麻将。还好初二天气转暖了,可以户外活动了,到处走走,访访亲戚,拜拜年。还是家乡空气好,闻者都香,心里打算着以后还是回来养老吧,北京空气真不行。
 
5.返程
  短短的春节就这么过去了,吃的好,睡的香,足矣!12:00开车从南岳出发去衡山,正点的话火车应该是13:39到衡山,想着早点出发打点富余,谁曾想,南岳到衡山还堵车了,还挺严重,从12点十几堵到12点四十几,我是到处见缝插针才突围出来,到衡山站已经13:20了,这下还以为放心了,肯定没有问题了,结果一下车,发现衡山站初几这几天都不开,所有车都不停,额的神呀!旁边人说赶紧开车去株洲吧,那只能这么拼了,开着车就往株洲赶,火车正点到株洲是14:37,一路上见车就超,一般都走应急车道,高速限速120,最高开到了160,没办法,路上车还很多,都是大货和大客,幸亏没有堵车,开着开着自己都好几次都没信心了,呵呵,最后只能坚持到底,不然俩张票就没了,好不容易出了株洲市高速口,也不知道火车站怎么走呀,找到了一辆出租车,就赶紧搬行李,然后让司机加速走,司机估计也被我们感染了,还闯了一个红灯,吼吼,最后到车站,14:30,正好上车,浑身汗湿,上天保佑呀。
 
最后要感谢很多人,回家的车票是老丈人搞的,严重感谢!返程的票是老爸搞的,严重感谢!帮我赶上火车的宝驹是小姨夫的,严重感谢!母亲一路送我们到株洲火车站,严重感谢!媳妇一路照顾着我,严重感谢!需要感谢的人还有很多很多,都衷心祝愿大家在2009年里面,身体健康,大吉大利!!!
12 novembre

转载:何以为报

:这篇文章是弟弟出差香港的路上捡的。因为这篇文章,一向最注重“卫生”的他一直没有舍得扔掉这张显然不可能干净的皱巴巴的残报。

    他推荐给外甥看,没有太大反映,也许是年龄和阅历的原因。我拿来看,看到最后泪水静悄悄的流。

    是啊,多少人奔波在路上,为自己的学业及事业拼搏,为自己的小家奋斗,为自己的儿女操劳,他们没有更多的时间陪伴父母,没有更多的精力思考报恩,在他们眼里,父母是他们与生俱来的财富,也是永远都不必用心维护或回报的忠实朋友。他们没有想到,人生的事业无穷无尽,而父母的生命却有着一定极限;父母虽然不会因为儿女的疏忽而疏忽儿女,但是父母却在一天天的操劳和期盼中老去,直到永远离开我们。等我们意识到这个问题的时候往往是空留“子欲孝而亲不在”的悲伤,痛悔终生。

    还是在父母健在的时候多尽点孝吧!其实很简单,有时候只需拿出点时间来多陪陪老人罢了。

 

何以为报?    你1岁的时候,她喂养你,给你洗澡。你何以为报?哦,你整夜哭闹。
  你2岁的时候,她教你走路。你何以为报?哦,你不理睬她的呼唤,踉踉跄跄地乱跑。
  你3岁的时候,她精心为你制作每一餐。你何以为报?哦,你把餐具往地上抛。
  你4岁的时候,她给你买了蜡笔。你何以为报?哦,你在家里雪白的墙上画了狗狗和猫猫。
  你5岁的时候,她给你穿上新衣服过节。你何以为报?哦,你滚在泥地上和小朋友们嬉戏玩闹。
  你6岁的时候,她送你去读书。你何以为报?哦,你哭喊着说不愿意上学校。
  你7岁的时候,她给你买了一只皮球。你何以为报?哦,你砸坏邻居的窗玻璃惹得人家上门来告。
  你8岁的时候,她给你买冰淇淋。你何以为报?哦,你把黏糊糊的手往她衣服上靠。
  你9岁的时候,她请老师教你弹钢琴。你何以为报?哦,你宁可坐着发呆也不愿把钢琴练好。
  你10岁的时候,她开车送你去体育馆。你何以为报?哦,你下车就走,头不转来手不招。
  你11岁的时候,她带你和你的同学们去看电影。你何以为报?哦,你让她不要和你们坐在一道。
  你12岁的时候,她让你不要看某些电视频道。你何以为报?哦,你偷着看不理她这一套。
  你13岁的时候,她建议你去理发。你何以为报?哦,你笑她落伍,是一个“土老冒”。
  你14岁的时候,她替你报名参加了夏令营。你何以为报?哦,你不懂得写信把平安报。
  你15岁的时候,她下班回到家想把你抱。你何以为报?哦,你关在卧室里不愿把面照。
  你16岁的时候,她陪着你学开车。你何以为报?哦,你一有机会就独自开着车跑。
  你17岁的时候,她要等一个与你有关的重要电话。你何以为报?哦,你整晚都占着电话和朋友把天聊。
  你18岁的时候,她在你中学毕业典礼上流下激动的热泪。你何以为报?哦,你彻夜不归与同学聚会一通宵。
  你19岁的时候,她送你上大学帮你拎着包。你何以为报?哦,你不言谢是因为生怕同学们讥笑。
  你20岁的时候,她关心你有没有过约会。你何以为报?哦,你说与她无关不要把心操。
  你21岁的时候,她为你将来的事业出谋划策。你何以为报?哦,你认为你不会像她一样白来人世一遭。
  你22岁的时候,她庆祝你大学毕业了。你何以为报?哦,你伸手向她要出国游玩的钞票。
  你23岁的时候,她送你家具,布置你独立生活后的第一间房。你何以为报?哦,你向朋友抱怨说家具一点儿也不时髦。
  你24岁的时候,她见到了你的对象,询问你们将来的计划。你何以为报?哦,你瞪着眼冲着她喊,妈妈,不要瞎操心,好不好!
  你25岁的时候,她帮你置办了许多嫁妆。你何以为报?哦,你在远离她的地方安上了你的爱巢。
  你30岁的时候,她打电话告诉你抚养宝宝的经验。你何以为报?哦,你说时代不同,她的经验过时了。
  你40岁的时候,她通知你家里某某人的生日快到了。你何以为报?哦,你说这些天你忙得不可开交。
  你50岁的时候,她病了,需要你的照料。你何以为报?哦,你觉得她成了负担让你受不了。
  接着,有一天,她静静地走了,你忽然想起你还有许多话没有对她说,还有许多事没有为她做到。为什么要到这一天,才想到何以为报?别等到她离我们而去时才懂得母亲是那么重要。

15 maggio

祝愿所有受灾孩子们健康成长

2008童谣 
 
今年的雪,特别的大,
爸爸还有妈妈,回不了家。
有群坏人,来把人吓,
烧了我的学校,砸我的花。
那个喇嘛,叽里呱啦,
长鼻子的洋人,假装眼瞎。
巴黎铁塔,伦敦警察,
抱火炬的姐姐,人见人夸。
汽笛嘟嘟,铁轨哗哗,
去天堂的列车,还没到达。
龙又翻身,大地垮塌,
教室的瓦砾下,埋了童话。
重重的墙,将老师压,
我们在他身下,都很听话。
没过很久,听到喇叭,
外面有个爷爷,叫我别怕。
叔叔的手,使劲地挖,
解放军的飞机,送我回家。
经过灾难,我已长大,
永远不会忘记,二零零八.
14 maggio

中国加油!!!


  1月:当风雪阻断归路 我们彼此取暖       
  3月:当主权面对挑战 我们亮出利剑       
  4月:当圣火遭遇屈辱 我们义无反顾       
  4月:当病毒吞噬生命 我们用爱弥补       
  4月28日:当列车冲出轨道 我们竭诚互助       
  5月12日:当震撼撕裂大地 我们开山辟路      

保存一些网上非常感人的片段,珍藏

刚刚接通了一位采访过我的四川记者朋友的电话,她刚刚从绵竹退下来,这个娇小的丫头在电话里和我讲了她眼见的情况,她只用了四个字形容,就是:“世界末日。”她说她几乎无法工作,眼泪就没有停过,太惨了,一片一片的废墟,到处是哭喊的声音,救援队发了疯一样的救人,然而往往救不了,跟着去的摄影只了拍一张照片,就扔下相机去帮忙,因为那情景让你不可能站着看着。
她和我说,她在一个学校现场看到了她永远不会忘记的一幕,学校的主教学楼坍塌了大半,当时正在上课,几乎有100多个孩子被压在了下面。全是小学生。一些似乎是消防队员的战士在废墟中已经抢出了十几个孩子和三十多具尸体,看着那些小小的,带着红领巾却再也无法睁开眼睛的孩子,她说她突然觉得自己说话的勇气都没有了。
然而就在抢救到最关键的时候,突然教学楼的废墟因为余震和机吊操作发生了移动,随时有可能发生再次坍塌,再进入废墟救援十分的危险,几乎等于送死,当时的消防指挥下了死命令,让钻入废墟的人马上撤出来,要等到坍塌稳定后再进入,然而此时,几个刚才废墟出来的战士大叫又发现了孩子。
几个战士听见了就不管了,转头又要往里钻,这时坍塌就发生了,一块巨大的混凝土块眼看就在往下陷,那几个往里转的战士马上给其他的战士死死拖住,两帮人在上面拉扯,最后废墟上的战士们被人拖到了安全地带,一个刚从废墟中带出了一个孩子的战士就跪了下来大哭,对拖着他的人说你们让我再去救一个,求求你们让我再去救一个!我还能再救一个!
看到这个情形所有人都哭了,然而所有人都无计可施,只眼睁睁的看着废墟第二次坍塌。后来,那几个小孩子还是给挖出来了,但是却只有一个还活着,看着那些个年轻的战士抱着那个幸存的小女孩在雨中大叫着跑向救援所在的帐篷的时候,她已经泣不成声。
我无法想象这在电话中已经如此惊心动魄的情形在当时是怎么样一个悲壮的场面,我只知道这是真实的,而且,在现在,在震中地区,这样的事情还在重复的发生着,就在今夜,我坐在舒适的房间内,第一次意识到我是否应该做些什么,虽然我不可能到现场去,但是我是否应该做一些力所能及的事情?
于是我眼含着眼泪,首先发了这一篇博文,我知道这篇博文无法带来什么实际的帮助,但是,这是我想到的最便捷的,我所能立即做到的第一件事情,一篇文虽然没有力量,但是至少我可以让更多的人关注这件事情。只有完成了第一件事情,才有第二件,第三件。
天佑中国,人间有爱。朋友人,无论你们身边有任何的条件,只要是能帮助灾区的,希望我们都马上付之行动,莫以善小而不为,一篇文章,一元捐款,都是一种支持,2008注定是荣耀与灾难交辉的一年,灾难的是中国人的土地,荣耀的是中国人的心。

无题(转)

国难当头,也许是心的颤抖
  电视上,我看到总理的脚步
  竟有些许蹒跚
  看到他的两鬓斑白,突然想起
  这是一个已逾花甲的老人
  再过四年,年事古稀
  再让我们想象一下
  一个66岁的老人,他本有的生活轨迹
  应该是端着茶杯,躺着藤椅听于魁智
  或者就一壶老酒
  喜谈风云际会,笑看儿孙绕膝
  但这个老人有点特别
  他似乎更喜欢天上,飞来飞去
  那一年的非典医院,那一年的矿难现场
  那一年的冰雪前线,这一天的地震中央
  他似乎爱上孤独
  多少个万籁俱寂的夜晚
  他孜孜的在赶路的途中指点规划
  多少个满目创痍的场合
  他奋力的鼓舞在人潮之颠
  不要以为他掌握着权利
  他最谨慎的言行也牵动着社稷
  不要以为他没有天伦之乐
  只是他的时间并不属于自己
  不要以为他很快乐,很享受,以为他
  不厌其烦的展现自己
  哪个66岁老人的生命不是充满
  疲惫和叹息
  你说的也是对的
  在其位,谋其职,这是他的本分
  也许仆仆的风尘将追随他一生
  也许前行路上会遇到更多的
  坎坷,荆棘
  也许老人要去印证一句先贤古话
  鞠躬尽瘁,死而后已
  这恰恰是民族的魂魄啊
  老人在神州大地树立起精诚楷模
  我们又怎能不去尊敬
  我知道,在这个灾难发生之时
  每一句感谢的话都背负着沉痛
  但我宁愿铭刻着沉痛对老人去说:
  去年冰天雪地里您拉着我们的手,告诉我们
  要坚定信心,战胜灾难
  此刻虽然相隔千里,我想送上一句:
  谢谢您,总理,
  前行路上,保重身体!
  明天的太阳会打在我们每个人脸上
  我们应该记住,其中有一缕
  是一个66岁老人用生命焕发的光辉
  
  祝灾区同胞平安!
02 febbraio

热爱生命

热爱生命

汪国真

                  

                   我不去想是否能够成功

                   既然选择了远方

                   便只顾风雨兼程

                  

                   我不去想能否赢得爱情

                   既然钟情于玫瑰

                   就勇敢地吐露真诚

                  

                   我不去想身后会不会袭来寒风冷雨

                   既然目标是地平线

                   留给世界的只能是背影

                  

                   我不去想未来是平坦还是泥泞

                   只要热爱生命 一切

                   都在意料之中

02 aprile

有一种产品叫做Service Director

      有一种产品叫做Service Director,绝大部分人应该都没有听过,本人有幸前一阵与其厂商接触了一段时间,在这里将这期间自己对这款产品的理解和感受记录下来,希望能给对Service Director感兴趣的朋友们一些帮助。  

      SD全称Service Director,中文名称为服务质量管理,是由世界著名电信公司Telcordia倾力打造的一款针对电信网络服务质量管理的软件产品。针对服务质量的管理,应该对我们来说还是一种比较新的理念,原来大家比较多的关注点还是在网络的硬件质量方面,也就是网络的稳定性,有没有网络中断,而对其网络本身提供用户的无形的服务质量方面,没有一种成型的全面的工具用来监控和管理。有形的网络硬件好监控,但是无形的服务质量如何去管理呢,Telcordia作为电信行业领先的先驱者,根据其本身积累的深厚的行业经验,使其较早的认识到了这方面的重要性,厚积薄发,投入了大量的人力物力针对此方面进行分析设计,自主研发了此款产品,为的是让这款产品能让世界各大电信运营商更好的提高其网络服务质量,提供更好的更稳定的服务给用户,从而提高用户的感知度,无形中提高其品牌的认知度,提高了运营商的市场占有率和利润空间,最终运营商和用户达到稳定的平衡。

 说到服务质量这种潜在的价值,如何从底层的电信网络去挖掘,可不像酒店,餐馆说要提高服务质量那么直观,那么容易把握。大家都明白无形的东西不好掌控,那SD这款产品是如何做到这一点的呢,相信这都是我们大家刚刚接触SD这款产品最让人感兴趣,也最让人迷惑的地方了。其实任何东西一说穿,大家顿时会感慨一句“原来是这样的”,SD说到底也同样很简单,如何去监控网络的质量,也就是采集各个网络节点,各个网络设备的数据,同时针对采集到的大量数据,经过一段时间的运营分析,针对不同的网络设备,不同的时间段设置一定的阀值,从而达到预先防范网络出现故障的情况。通过SD不断的分析数据,运营商对网络数据的分析也会越来越合理,越来越精确,对其反映出来的问题,也能预先得到解决,不会像现在一样等到设备出了问题之后,相关人员才会发现,这样预先报警便极大程度的提高了网络的服务质量。

原来SD是通过数据说话的,大家很容易理解了这点,原来如此的感觉充斥了大脑。那网络数据分析的同类产品多如牛毛,为什么要选择SD呢,他还有没有隐藏得更深更不容易发现的亮点呢?心怀这么多疑问,我们继续深入研究。庞大的电信网络,各种网络设备蜂拥繁杂,各家网络设备厂商针对自己的设备都会提供相应的软件支持,都可以提供相应的数据报表,但是如何融合各个厂商设备,如何将各种设备的监控数据统一分析,如何将这些单独的数据孤岛一个一个连接起来,将纵向的面向网络设备数据转换为横向的面向业务网络数据,这也是SD的最大的亮点,可以统一分析数据。通过统一分析分析数据,获取用户的需求动向,这是运营商的市场部门和应用部门关注的;通过统一分析分析数据,更好地维护网络运营,这是运维部门关注的;通过统一分析分析数据,更加合理分配网络设备,更加充分发挥设备资源,这是网管部门关注的。这样使网络维护面向用户,面向业务,能够快速的响应客户的需求,快速的支撑业务。

不同的角色针对如此大量的网络数据,都期望能挖掘出自己所期望得到的分析结果,都期望能通过分析结果进一步提高自己的主观能动性,创造最大的价值,我想这也就是Telcordia通过其丰富的电信行业经验所观察到的,为何要推出SD的主要原动力吧。SD能根据不同角色所关注的不同方面,非常灵活的针对不同的网络设备,不同的网元节点,及时采集到相应的网络数据,通过数据分析形成各个相应的KPI(重要性能指标),也可以通过非常灵活的算法再得到KQI(重要质量指标),最后将这些不同KPI或者KQI以非常直观方式(比如,仪表盘方式)展现给不同的角色,让各种角色所关注的方面都能到满足。这便是SD最大的亮点,统一分析数据。

数据是王道,但是数据需要采集,数据自己不会自动送过来,那SD如何采集不同网络设备的数据呢,是否还需要设备厂商提供相应的接口,做相应的改造呢?SD的回答是不需要。SD自己提供了相应的数据采集模块,叫Transformation Layer,简称TLTL的位置处于SD和第三方的网络设备之间,主要的用途就是用于交换采集数据,TL支持多种通讯协议,HTTPFTPSNMPTELNETSQL,通过这些通讯方式,TL可以及时的获取到SD所需要的数据,有了TL这样得力的数据采集支持,SD才能将采集到的数据分析到底。

上面主要说了说自己刚刚接触这款产品时的心路历程,再简单介绍SD这款软件产品的技术指标。咱们首先一块先看看SD的系统架构图

                        1.1 Service Director 系统结构图

大家从Service Director的系统结构图中一眼就能看出来,SD也是一款基于J2EE平台的软件产品,其中客户端包括两种,一种是Flash调用AJAX与服务器交互,另外一种就是传统的Java Applet与服务器交互。本人只接触了Java Applet这种方式,从其界面设计,以及操作的灵活性,用户使用的友好性,都体现了其深厚的技术实力,暗自佩服。其App Server采用的是Apache的开源产品Tomcat,版本没有注意。数据库目前支持OracleMysql,听说Sysbase也即将支持,因为一直用Oracle所以没有关注这个。目前SD只支持linuxunix操作系统,不支持windows系统,所以对于单机版本的客户演示无法支持,只能远程访问服务器端。

SDTL之间是通过CORBA基于XML来进行通讯的,不知道为什么要采用CORBA,有其他很多方式都可以解决,因为对方不是研发人员,所以也没有给出答案。

TL和第三方设备采集数据需要自己提供Shell脚本来与不同的网络设备通讯,将获取的数据根据规定的格式解析后倒入数据库中,这样SD才能很好的获取到

这样从SD的使用,开发和部署来看,我们需要三类人员来配合工作:

1.电信网络工程师

   熟悉电信的网络结构,了解各种网络设备,网元节点,能根据运营商的需求迅速定位到某个网络设备,熟悉各种专业术语,能解析各种设备日志文件。这样才能配合运营商来设置SD中对应的关注点,需要熟练了解SD的设置。

2.程序开发工程师

   主要针对TL端数据采集的程序开发,针对需要采集的不同设备的日志文件,编写相应的Shell脚本,并且根据需要获取的日志信息元素,编写程序解析日志文件,形成有效的数据格式文件,倒入数据库。需要熟悉了解TL的设置。

3.硬件工程师

   针对SD产品的安装部署调试,以及对第三方设备访问途经提供支持

最后,给大家奉献一张SD的数据仪表盘的效果图,从此图上就能针对不同的网络状况进行监控,是不是感觉不错,想象一下,在大大监控屏下,关注着各种数据的变化,也是很专业的。

 

 

 

 

 

 

16 marzo

为融合通信做好技术储备

   2G,2.5G,3G,未来的4G全IP,移动通信网络的不断创新、飞跃,加上原有公共交换电话网络(PSTN)和Internet全球网络,使人类的通信方式越来越多元化,越来越丰富多彩。面对如此蜂拥繁杂的用户需求,有一种呼声应运而生,那就是融合通信。咱们暂且不去考虑各大运营商,各大设备厂商,各大IT巨头如何将这一切变为现实,而他们将如何会获取更多的利益,咱们更重要的是考虑自己在这通信春秋之中,如何把握机会,创造机会,从而获取更有生命力的发展。

融合通信,技术先行

JAIN
面向综合网络的JAIN API将业务便捷性、网络汇聚以及安全的网络接入带给电话和数据网络。JAIN技术为公共交换电话网(PSTN)、IP网和无线网的业务创建提供了新水平的抽象能力及相关的Java接口,使IP与IN(智能网)的整合成为可能。这被成为综合网。由于JAIN API包含对网络内部资源的安全接入,这就创造了推出成千上万新业务的机遇,超越当前实现的数十种业务。
  
Parlay X
Parlay组织成立于1998年,它是由多家网络运营公司、应用业务供应商、独立软件销售商、设备制造商及标准化组织组成的一个非赢利性组织,它的主要目标就是制定符合工业标准的应用编程接口(API)规范,促使第三方业务供应商或电信运营商基于这一 接口平台,采用不同的技术在无线、Internet 或公众交换网上开发通信产品、提供通信业务,同时为特定的用户群快速定制个性化业务以作为普遍业务的补充。

Parlay规范过于庞大和复杂,比较难以掌握,而且目前80%的Parlay业务只用到了20%的Parlay API。基于这个原因Parlay组织又推出了Parlay X规范,对Parlay API进行了组合和封装。

Parlay API 用于向应用开发者开放底层电信网络的能力,它虽然对底层的网络细节进行了屏蔽,但是仍要求应用开发者具备电信背景知识并熟悉电信网络应用开发流程。这就限制了Parlay API的应用推广。为此,Parlay组织推出了Parlay X Web Services规范,其目的是为了促进不具备电信专业知识的IT开发人员开发下一代网络应用。

上面我提到了两种相关技术,基于我是一位java工作者,所以下面着重说说JAIN。

JAIN,全称是:JAVA APIs for Integrated Networks,是为融合网络提供的JAVA  API规范。其幕后的带头大哥就是SUN,另有多家设备厂商和运营商参与制定。大家都知道,SUN的java平台在IT领域的重要性,Sun自己也宣称"Java无所不在",所以它把触角从IT领域伸到了电信领域,如何使得电信领域的增值应用业务也像IT领域的增值应用业务一样快速开发、自由部署、移植便捷是它们面对的巨大挑战。但对Sun来说,这正是它们的拿手好戏,它们在IT领域就是做这个的。还记得"Write Once,Run AnyWhere"吗?现在他们就是通过JAIN技术标准把所有这些好处带到电信领域里来。

JAIN是Sun公司和其他设备商、运营商制定的规范,通过这个规范为电信领域应用业务的开发制定了统一的接口,通过这个统一的接口,屏蔽网络层以下设备的不同差异、实现业务和承载的分离,各层业务功能独立且职责清晰,电信网络由以前的封闭状态慢慢的变为了开放状态,在这样开放的基础者上,电信领域增值应用开发、部署、移植也会越来越快捷。
值得强调的是,JAIN是一个规范,Sun下的JAIN项目专家组(分为协议专家组(PEG)和应用专家组(AEG))只负责制定,不负责实现,如果设备商或运营商支持JAIN规范,就要自己去实现规范的内容,然后到JAIN的官方网站下载一个TCK(Technology Compatibility Kit:技术兼容工具),用它来验证产品是否达到规范要求的标准,如果达到标准了,就可以向JAIN申请认证了。认证好之后,大家就都可以按照JAIN的标准开发和部署了。
 
JAIN协议组成

JAIN协议由一系列的子协议的组成:主要的由如下几个
1. JAIN Service Logic Execution Environment (JSLEE):一个业务执行环境协议,定义了一个业务运行的容器,所有的业务逻辑在容器中执行。
2. JAIN Session Initiation Protocol (JSIP): SIP协议栈JAIN实现。
3. Java Call Control (JCC):JAVA呼叫控制功能实现,完成软交换功能的一部分。
4. Server APIs for Mobile Systems (SAMS):移动系统的服务器API接口规范。
5. Mobile Device Management and Monitoring (DM):移动设备管理和监视。
6. SIP API for J2ME (SIP for J2ME):J2ME中使用的SIP API规范。
7. Location API for J2ME (Location for J2ME):J2ME中的定位API规范。
8. Wireless Messaging API (WMA):短消息API规范。
9. Operations Support Systems through Java (OSS/J) APIs:JAVA运营支撑系统API规范。

JAIN总体框架

(图1-1 JAIN总体框架)

     各种基本的信号从网络底层触发,送给JCC和JCAT完成呼叫控制,协同交互功能,即JCC和JCAT扮演软交换(SoftSwitch)的角色,然后将消息向JAIN SLEE 通报,JAIN SLEE执行一定的业务逻辑,处理分发请求操作。

大家在这里看到了JAIN SLEE,全称是JAIN Service Logic Execution Environment。JSLEE是独立于底层的网络,用于事件驱动的应用程序的高性能容器平台,通过定义丰富的事件过滤机制和路由规则来满足各种交互需求。 JSLEE 将网络资源表示为RA(Resource Adapter:资源适配器),外部网络功能或其他能力都认为是资源,每一个RA代表一种网络资源类型,如代表JAIN SIP的资源适配器类型是 JAIN SIP RA。JAIN SLEE通过RA实现业务逻辑和外部资源的交互。 JSLEE提出了SBB(Service Building Block,)的概念,如果说而JSLEE等同于J2EE容器,那么SBB可看作是EJB, SBB就是单个或多个功能组件,SBB间通过逻辑组合,可以以功能更强的SBB面目出现;而我们的业务应用服务则由一个个SBB构建而成。 此外,同J2EE定义的服务器容器一样,JSLEE还定义了一系列的公共服务机制,如Timer 、Alarm、Trace、Usage等。JSLEE还提供了JMX的管理接口,方便对系统的管理控制。 有了JSLEE的支持,电信增值业务开发人员只需关心应用业务逻辑,其他一般公用型的功能由容器环境提供支持,方便电信增值业务的研发、部署、移植。

目前已经有开源的符合JAIN SLEE规范的具体实现,它就是Mobicents,已经通过了SUN的JSLEE 1.0的认证,有感兴趣的可以访问其开发主页下载详细信息。

通过上面大概的述说,让大家大体的了解了JAIN的整体情况,这也是本人最近的一些小小心得,希望能起到抛砖引玉的效果,让大家更多的发表自己对行业技术发展的看法和观点。这样互补不足,互相学习,进一步促进咱们整体技术实力的不断提高。

参考文献实在太多了,本人就不一一列举了。

 

30 settembre

吟诗一首

著名的江南现实主义诗人 devi 创作新诗一首:

《断点》

为你弹奏张敬轩的断点
纪念我渴望的爱情
跟红山一样的声音
郁闷的很好听

手在轻轻地敲击着IBM
我给的欲望太小心
你飞翔的地方就有你
http://www.dopoem.com
03 settembre

中国长城

看了女排中国vs古巴,真是酣畅淋漓呀,作为一个中国人,作为一个中国男人,为咱们国家能拥有这样一支巾帼之师而感到由衷的骄傲呀!!!这可比看什么Chinese super league过瘾多了,唉,什么都不说了,期望下辈子还是做中国男人,看看将来的现状是否能有所改变。
28 agosto

终于有兴趣来这里写点东西了

最近几位朋友的空间中看见大家都经常游泳,而且越来越牛了,心里顿时开始痒痒了。我住的附近学校里面就有一个25米长的小游泳池,周六兴致勃勃地去办了一张记次卡,但是非常遗憾发现我的泳帽找不到了,只能周日再说了。周日傍晚整装待发,孤军一人杀入游泳池,这个游泳池可真小呀,只有5条泳道,难怪他限时一个半小时,不然大家都在里面泡着,估计煮饺子的地方都木有了。下水了,已经有很久很久没有在泳池里面游泳了,开始尝试了一下,换气不顺畅,才游了一半就呛着了,真是让自己郁闷。没辙,接着练习,但是我天资禀赋,一会就进入了状态,非常轻松的游了一个来回,看了看时间,还有不少剩余时间,决定要完成1000米的处女秀。加油!泳池小就是烦人呀,一次才25米,一个来回才50米,100米要游2个来回,1000米20个来回,我数数都累死了,途中还要来回躲避戏水的孩童,经常要变道,换档,甚至还要熄火停下来让让,真是累呀,我决定下次打着双蹦游。但是谁让这地方离我近呢,包括上下楼才5分钟时间,简直就是我的澡堂子嘛,也就不嫌弃这么多了。最后,没有辜负大家的厚望,完成了此次处女秀,以后每次都要将目标提高一点,这样才能更高,更快,更远!最后统计了一下,百米耗能量,大概???卡路里,无法评测,嘿嘿!今天上班还好,仅仅感觉手臂有点酸,看来最近身体保持得还不错!
18 maggio

我的巴塞罗那

     20060518日凌晨2:30分,欧洲冠军杯巴塞罗那vs阿森纳,上半场什么情况我不知道,因为电视开着,我睡着,下半场前30分钟情况我也不知道,因为电视开着,我仍然睡着。终于,当我的开始朦胧间听见解说员声音的时候,正好是埃托奥进球了,勉强挣开双眼,看见了进球回放,不错,这小子,拼劲很足,应该进球!此时的比分却是1:1,巴塞罗那才刚刚扳回比分(至于阿森纳那颗进球,我是全然不知呀),莫非这么精彩的比赛又要继续进行加时赛,最后再点球决定胜负么?
     正在此时,我做出一个超出寻常的举动,这个举动对于本场比赛的结果,本人认为有着非常深远的影响。我决定去上趟厕所,因为实在是憋不住了。就在那短短几分钟里,奇迹正常出现了,我的巴塞罗那又攻入了一球,反超了比分2:1,我真是太激动了。想不到伟人短短一瞬间的某种行为,却能产生如此大的能量,我的巴赛罗那没有辜负我!大家从表面上看是巴塞罗那队员奋力拼搏,以及教练小里战术上的成功,殊不知远在遥远的中国北京,有一个特殊的球迷在电视机旁边默默地为你们做出的贡献。就到此为止了,不要让大家都知道我,一切荣誉都属于我的巴塞罗那!!!
     我的巴塞罗那,继续加油!!!
    
     BTW:至于那颗在我上厕所时攻入的进球,我一直坚持到比赛完,一段n长的广告后,BTV6球迷抽完奖,评论员口水一番后,终于看到了,的确是我的能量干的。
15 aprile

饿了也绝不能吃的11种食品

一、牛奶、豆浆

    这两种食物中含有大量的蛋白质,空腹饮用,蛋白质将“被迫”转化为热能消耗掉,起不到营养滋补作用。正确的饮用方法是与点心、面饼等含面粉的食品同食,或餐后两小时再喝,或睡前喝均可。

   二、酸奶

    空腹饮用酸奶,会使酸奶的保健作用减弱,而饭后两小时饮用,或睡前喝,既有滋补保健、促进消化作用,又有排气通便作用。

    三、白酒

    空腹饮酒会刺激胃黏膜,久之易引起胃炎、胃溃疡等疾病。另外,人空腹时,本身血糖就低,此时饮酒,人体很快出现低血糖,脑组织会因缺乏葡萄糖的供应而发生功能性障碍,出现头晕、心悸、出冷汗及饥饿感,严重者会发生低血糖昏迷。

    四、茶

    空腹饮茶能稀释胃液,降低消化功能,还会引起“茶醉”,表现为心慌、头晕、头痛、乏力、站立不稳等。

    五、糖

    糖是一种极易消化吸收的食品,空腹大量吃糖,人体短时间内不能分泌足够的胰岛素来维持血糖的正常值,使血液中的血糖骤然升高容易导致眼疾。而且糖属酸性食品,空腹吃糖还会破坏机体内的酸碱平衡和各种微生物的平衡,对健康不利。

   六、柿子、西红柿

    含有较多的果胶、单宁酸,上述物质与胃酸发生化学反应生成难以溶解的凝胶块,易形成胃结石。

    七、香蕉

    香蕉中有较多的镁元素,空腹吃香蕉会使人体中的镁骤然升高而破坏人体血液中的镁钙平衡,对心血管产生抑制作用,不利于身体健康。

    八、山楂、桔子

    含有大量的有机酸、果酸、山楂酸、枸橼酸等,空腹食用,会使胃酸猛增,对胃黏膜造成不良刺激,使胃胀满、嗳气、吐酸水。

    九、大蒜

    大蒜含有强烈辛辣味的大蒜素,空腹食蒜,会对胃黏膜、肠壁造成强烈的刺激,引起胃肠痉挛、绞痛。

    十、白薯

    白薯中含有单宁和胶质,会刺激胃壁分泌更多胃酸,引起烧心等不适感。

    十一、冷饮

    空腹状态下暴饮各种冷冻食品,会刺激胃肠发生挛缩,久之将导致各种酶促化学反应失调,诱发肠胃疾病。在女性月经期间还会使月经发生紊乱。
12 aprile

江南(春游特别版)

词:devi 曲:林俊杰 唱:爱谁是谁
 
我们周末去春游
坐的是德国大轿子
导游说这车不便宜
pat只记住了耗油多
周末我们去春游了
住的是五星级大宅门
古香古色有韵味
希望我们晚上睡得香
洗洗搓搓洗洗
游游潜潜游游的我 看着满池子的人
花花的泳衣,花花的泳裤的裤头
不懂特殊服务享受的我们
都以为游泳是唯一的运动
相信那一晚 泡了两小时
晚上睡觉肩酸又背痛
不懂怎么扎金花的我们
还以为输钱只是古老的传言
你下得有多多输有多多
当钱被518的人给赢走心碎了才懂
03 aprile

46条足以震撼你的生活常识(ZT)

      注意了,准确地说,男生只需要注意44条,第5条和第30条就不用操心了!
 
      1、常吃宵夜。会得胃癌。 因为胃得不到休息
  2、一个星期只能吃四颗蛋。吃太多。对身体不好
  3、鸡屁股含有致癌物,不要吃较好
  4、饭后吃水果是错误的观念。应是饭前吃水果
  5、女生月经来时。不要喝绿茶。反正茶类不要喝就对了。多吃可以补血的东西
  6、喝豆浆时不要加鸡蛋及糖。也不要喝太多
  7、空腹时不要吃蕃茄,最好饭后吃
  8、早上醒来。先喝一杯水。预防结石
  9、睡前三小时不要吃东西。会胖
  10、少喝奶茶。因为高热量。高油。没有营养价值可言。长期饮用。易罹患高血压。糖尿病。等疾病
  11、刚出炉的面包不宜马上食用
  12、远离充电座。人体应远离30公分以上。切忌放在床边
  13、天天喝水八大杯
  14、每天十杯水。膀胱癌不会来
  15、白天多喝水。晚上少喝水
  16、一天不要喝两杯以上的咖啡。喝太多易导致失眠,胃痛
  17、多油脂的食物少吃。因为得花5~7小时去消化,并使脑中血液集中到肠胃。易昏昏欲睡
  18、下午五点后。大餐少少吃,因为五点后身体不需那么多能量
  19、10种吃了会快乐的食物:深海鱼,香蕉,葡萄柚,全麦面包,菠菜,大蒜,南瓜,低脂牛奶,鸡肉,樱桃
  20、睡眠不足会变笨,一天须八小时睡眠,有午睡习惯较不会老
  21、最佳睡眠时间是在晚上10点~清晨6点
  22、每天喝酒不要超过一杯,因为酒精会抑制制造抗体的B细胞,增加细菌感染的机会
  23、服用胶囊应以冷水吞服(可以第一个吃), 睡前30分先服药。忌立即躺下
  24、酸梅具防止老化作用,青春永驻;肝火有毛病者宜多食用
  25、掉发因素:熬夜,压力,烟酒,香鸡排。麻辣锅。油腻食物。调味过重的料理
  26、帮助头发生长:多食用包心菜,蛋。豆类;少吃甜食(尤其是果糖)
  27、每天一杯柠檬汁,柳橙汁。不但可以美白还可以淡化黑斑
  28、苹果是机车族、瘾君子、家庭主妇的常备良药,一天一颗,才能让自己有个干干净净的肺
  29、抽烟又吃维他命(B胡萝卜素-A维他命的一种),会致癌,尽早戒烟。才是最健康的做法
  30、女性不宜喝茶的五个时期:月经来时,孕妇,临产前。生产完后,更年期
  31、抽烟,关系最大的是肺癌,唇癌,舌癌,喉癌,食道癌,也与膀胱癌有关
  32、饮酒导致肝硬化。引发肝癌
  33、吃槟榔会导致口腔纤维化,口腔癌
  34、食物过于精细,缺乏纤维;含大量脂肪,尤其是胆固醇会引发胃癌
  35、食物过于粗糙,营养不足时导致食道癌,胃癌
  36、食品中的黄曲毒素。亚硝酸类物皆具有致癌性
  37、不抽烟。拒吸二手烟
  38、适量饮酒,不拚久。不醉酒
  39、减少食用盐腌。烟熏,烧烤的食物
  40、每天摄取新鲜的蔬菜与水果
  41、每天摄取富含高纤维的五谷类及豆类
  42、每天摄取均衡的饮食,不过量
  43、维持理想体重。不过胖
  44、保持规律的生活与运动
  45、保持轻松愉快的心情
  46、正确饮食习惯:早上吃的像皇帝,中午吃的像平民,晚上吃的像乞丐
21 marzo

烦人的MSN

每天都要挨个点一遍msn中的名字,就是为了让每个名字前面的那朵花消失,累死我了,有的space没有更新,但是那朵烦人的花照样会出现,实在是让我头疼,再这么下去,我估计以后一看见花,俺就会想用鼠标去点!
15 marzo

3.15

中午吃饭吃到一个小虫子,居然在3.15,很有纪念意义,店家居然只给打了五折,忘了用12315恐吓一下,下次一定要用到。嘿嘿!
13 marzo

点背

一大早就坚持用崴了的脚继续走路,并且利用十字路口红灯战术,成功的抢在了公共汽车之前到达车站,正当我满怀欣喜的登上汽车,一声噩耗“车坏了,请各位乘客等后车乘坐!”。简直是让我冷到了极点,并且当我缓缓的离去的时候,我与里面的乘客对我那怨恨的目光发生了碰撞,再次让我冷到了极点。你说,这能怨我么?脚崴了,我就这么好使了么?
12 marzo

伤,伤,伤

风力5-6级,晴,零下4度到3度,降水概率0%。今天还是球队内部训练,热身,对抗前练习,一切正常。正式开始对抗后,踢了不到15分钟,俺就下来了,是主动下场,因为脚崴了,自己崴的,不是别人拌的,也不是别人铲的,是自己崴的!点背不能怨社会,1点出门,3点进门,还带着伤,严重郁闷着。在这里表述一下,好让自己在百岁生辰的时候,还能有史可查。
26 dicembre

重造Java ESB:JBI与ServiceMix

 
Java的进展都是围绕着JSR形式的规格说明书进行的。最近,这个家族中又新添了一个成员,那就是JBI(Java Business Integration)。它是一种企业服务总线(Enterprise Service Bus,ESB),用于形成一种关键基础设施片段,使我们能够用Java实现面向服务的架构。我们将在本文中探讨JBI有关概念以及一种名为SeviceMix的开源实现。

  JBI的主要目的是提供一个基于服务的平台作为对现有Java/J2EE平台功能的扩展。由于Web services已经实际应用于J2EE中,而且ESB和SOA等术语与其说是技术推动力倒不如说更是市场概念,所以让我们一起来深究一下到底什么是Java/J2EE中所谓的“基于服务的平台”。

  当前的J2EE部署都运行在一个基础上,那就是应用服务器。应用服务器本身由两个独立的部分组成——Servlet容器和EJB容器,它们分别用于部署JSP/Servlets和EJB构件。在它们中的任何一个,你都能使用Web services。但是,在任何环境中以分散的方式使用services是很困难的工作,而JBI的目的就是为完成这个任务提供一个专门的环境。

  JBI的最底层是一个容器,它与J2EE中的容器一样定义了自身的部署构件。在我们深入之前,让我们先详细了解一下JBI的主要构想。

  首先,它关注了Web services的核心部分:在终端之间传输的SOAP 消息/信封。这种数据段或标记能够包含被服务于很多应用的信息。不仅如此,根据发送端或接受端的不同,它还能协助把某个业务逻辑与数据适配。

  现在,回过头来看看今天的Web services。在Web services出现之前,对于很多企业应用来说,使用面向消息的中间件系统或者MOM实现异构系统之间的通信已经足够了。Web services的出现同样是处于这个目的。用MOM的基于消息的架构和Web services很类似,被服务的数据也能在应用之间进行无缝操作。

  这种场景可以被应用到典型的J2EE环境中,并通过JMS或JAX-RPC等技术进行服务。这种做法对简单部署是可行的,但正如前面提到的,当进行很复杂的设计时,现有的容器则显得很难用。于是JBI试图解决这个问题。

  JBI提供了一种正规消息路由器(Normalized Message Router,NMR),说白了,就是一个地点。在这个地点,所有基于消息的数据片段——SOAP片段、MOM消息、HTTP数据或其它信息——被聚合、集中、应用到业务逻辑、传输,如果有必要则被转换成其它格式并随后被分派到最终目的地。

  先前的描述说明了为什么JBI被称为ESB。它很适合企业级应用,因为它通过一种总线型架构的基于消息的手段到达了适应大范围的消费者和提供者的目的。现在,让我们看看除了NMR还有什么构成了JBI。

  和JBI环境直接交互的是两个部分,JBI machine和JBI binding。JBI machine定义了部署构件以及在环境中管理它们的方式。本质上,它是提供商设计的黑盒,用于在JBI中支持他们自己的模型。另一方面,JBI binding则被环境通过专门的业务协议与外部世界进行通信。

  现在,再让我们把这些概念放到真实的JBI实现ServiceMix中。ServiceMix是完全用JBI的思想开发的一个开源项目。它可以支持多种绑定,包括HTTP、JMS、平面文件以及RSS,还提供了一系列类似BPEL、Schema Validation、JCA 和缓存等服务。

  与ServiceMix协作的还有基于JMX的管理接口以及用来与JBI构件通信的对本地客户端API。尽管本文不对ServiceMix功能做进一步说明,但你可以很容易地下载该软件然后继续学习。下面,让我们来看看一个可部署在ServiceMix上的真实的JBI构件,这样你会对它有点感性认识。

  Listing for JBI Components - File Sender & File Receiver.<>  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:my="http://servicemix.org/demo/">
  <!-- the JBI container -->
  <container id="jbi">
  <property name="useMBeanServer" value="true"/>
  <property name="createMBeanServer" value="true"/>
  <property name="dumpStats" value="true"/>
  <property name="statsInterval" value="10"/>
 
   <components>
     <!-- Write files to the outbox directory -->
      <component id="fileSender"
                 service="foo:fileSender"                  
                 class="org.servicemix.components.file.FileWriter">
      <property name="directory" value="outbox"/>
      <property name="marshaler">
      <bean
         class="org.servicemix.components.util.DefaultFileMarshaler">
      <property name="fileName">
      <bean
        class="org.servicemix.expression.JaxenStringXPathExpression">
      <constructor-arg value="concat('sample_', /sample/@id, '.xml')"/>
      </bean>
      </property>
       </bean>
      </property>
   </component>

   <!-- Look for files in the inbox directory -->
    <component id="filePoller" service="foo:filePoller"
          class="org.servicemix.components.file.FilePoller" 
          destinationService="foo:fileSender">
      <property name="workManager" ref="workManager"/>
      <property name="file" value="inbox"/>
      <property name="period" value="1000"/>
    </component>  
   </components>   
 </container>

  <!-- the work manager (thread pool) for this container -->
  <bean id="workManager"
      class="org.jencks.factory.WorkManagerFactoryBean">
      <property name="threadPoolSize" value="30"/>
  </bean>

</beans>

  JBI规格说明书本身并没有定义构件应该如何编码。请注意,ServiceMix用XML风格的语法定义了两个核心构件,关联到特定的类和属性。在把这种结构部署到ServiceMix以后,环境就会创建一种查询构件,负责从系统和其它构件中读取存档信息,然后把读取的值返回到文件系统。

  该文件系统是JBI中非常基本的场景,因为信息就是从JBI环境(NMR)原样集中的,然后被返回到同样类型的绑定(文件系统)。但是很明显,一旦JBI环境有能力把任何业务逻辑适配成数据,例如BPEL或schema validation,然后重定向到其它类型的绑定,例如HTTP或RSS,那么就不只是返回到文件系统了。

  正如你意识到的一样,当一用到JBI,操纵及分发数据的可能性就很大,但即使JBI用Java的方法实现了SOA,JSR-208规格说明书还是受到了批评。IBM和BEA是Java/J2EE领域的两个主要推动者,他们就不支持这个新项目。尽管如此,还是有像ServiceMix这样的小项目开发者和一些闭源开发组织打赌,一个培育良好的JBI市场将和J2EE的情况差不多。

  假如你正在Java中使用Web services或者为了复杂的集成任务使用基于消息的设计,你应该对JBI的进展特别关心,因为它能为执行这样的任务提供更健壮的平台。就算你对JBI/ESB是否能加入J2EE协议栈还存有怀疑,继续关注还是有帮助的,因为它可能会成为应用服务器领域像Spring那样的事实上的“第三容器”或轻量级的容器扩展,为Java提供SOA能力。

Struts动态控制表格大小(作者:作者:James M. Turner。译者:陈姣姣 )

在Succeeding with Struts的前面安装部分,我间接提到了DynaForms在运行期内可以动态的控制表格大小。换句话说,就是能够根据需要得到5行、或者10行、或者15行长的表格。可能有点不明智,我把这种策略的实际实现作为一种练习留给了读者自己。在接下来的几个月内,我收到了几十个读者的请求,他们请求给出详细的实现细节,所以这个月我将用两种不同的方法来实现动态调整的表格。
第一个方法就是我在前面的栏目中提到的那个方法,将尺寸参数留给DynaForm 的form-property 属性来实现。为了演示详细过程,我们来看看一个非常简单的应用:添加关于不同Star Wars 演员的注释。在这个应用中我们感兴趣的关键事实是:演员的数量在表格配置中动态设定,而不是在struts-config.xml文件中动态设定。
首先,我们先来看看struts-config.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" 
                               "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
    <form-beans>
        <form-bean name="dynamicArrayForm" type="org.apache.struts.validator.DynaValidatorForm">
            <form-property name="people" type="demo.Person[]"/>
        </form-bean>
    </form-beans>


<action-mappings>
    <action path="/setupForm" type="demo.SetupFormAction" name="dynamicArrayForm" scope="session"
 
     validate="false">
        <forward name="success" path="/displayForm.jsp"/>
    </action>
    
<action path="/processActorComments"
type="demo.ProcessFormAction"
        name="dynamicArrayForm" scope="session" 
validate="false">
        <forward name="success" path="/displayForm.jsp"/>
    </action>
</action-mappings>
</struts-config>


如你所见,这是一个相当简单的配置文件,只定义了一个表格和两个动作。第一个动作,/setupForm,用来在初始显示之前配置表格;另一个动作,/processActorComments 用来处理用户输入的注释。
在这个文件中有两个重要的事情需要注意,它们对于事态的发展很关键:
1. people 表格属性定义为demo.Person[] 类型(即demo.Person的一个排列),但不给出任何size 参数。这就为要创建的排列产生了一个占位符,但是没有任何例示的实排列。
2. 这两个动作将表格定义在会话期范围内。这是很关键的,因为用户在填写数值之后提交表格时,数值在动作执行之前已经填充到表格内了。这就意味着没有机会手动创建具有恰当空位数的排列,正如你在表格显示之前在SetupFormAction 类中看到的情况一样。换句话说,当表格提交时,必须已经有恰当的空位来接受表格值,唯一能保证这个的方法就是在会话期范围内就已经有了这个表格。
基本上在Person bean 中是没有值的,他只是一个具有lastName、 firstName、 dateOfBirth、gender 和comment字段的普通bean。源文件包括在WAR 文件内。
现在我们来看看SetupFormAction 类,它在表格第一次显示之前调用。


package demo;

/**
 *  Copyright 2004, James M. Turner.
 * All Rights Reserved
 *
 * A Struts action that sets up a DynaForm which is globally scoped
 */

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;

public class SetupFormAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                 HttpServletResponse response)
            throws ServletException, IOException {

        DynaValidatorForm df = (DynaValidatorForm) form;
        Person[] p = new Person[3];
        p[0] = new Person();
        p[0].setDateOfBirth("07/13/1942");
        p[0].setLastName("Ford");
        p[0].setFirstName("Harrison");
        p[0].setGender("M");
        p[1] = new Person();
        p[1].setDateOfBirth("10/21/1956");
        p[1].setLastName("Fisher");
        p[1].setFirstName("Carrie");
        p[1].setGender("F");
        p[2] = new Person();
        p[2].setDateOfBirth("09/25/1951");
        p[2].setLastName("Hamill");
        p[2].setFirstName("Mark");
        p[2].setGender("M");

        df.set("people", p);

        return mapping.findForward("success");
    }
}


这一次也没有许多东西要看的。execute 方法要做的第一件事情,和任何基于DynaForm的动作所做的一样,就是将泛型ActionForm 类放到DynaValidatorForm内。这就使得我们可以在表格上使用get和set 方法。第二件事情就是,创建一个具有三个元素的类型Person 的排列。在这个方法中,尺寸是硬布线的,在实际应用中可以从数据库中选择一个尺寸。我们需要考虑的重要事情是排列应该在代码中创建,而不是由Struts引擎自己创建。这样行数可根据应用要求由代码随意指定。
一旦排列已经确定,方法将创建三个Person 类实例并赋与数值。同样,在实际的应用中可通过一个循环来实现,这个循环不断地从数据库中读取行和填充表格行。最后,动作返回成功,导致Struts转移控制到displayForm.jsp 页。

<!--
    Copyright 2004, James M Turner.
    All Rights Reserved
    
    -->

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<head>
<title>Star Wars Actor Fact Page</title>
</head>
<H1><center>Start Wars Actor Fact Page</title>
<html:form action="/processActorComments" >
    <table border="1" width="80%">
        <tr><th>Last Name</th><th>First Name</th><th>Date of Birth</th><th>Comment</th></tr>
        <c:forEach var="people" items="${dynamicArrayForm.map.people}">
            <tr><td><c:out value="${people.lastName}"/></td>
                <td><c:out value="${people.firstName}"/></td>
                <td><c:out value="${people.dateOfBirth}"/></td>
                <td><html:text name="people" indexed="true" property="comment"/></td>
            </tr>
        </c:forEach>
    </table>
    <P/>
    <html:submit value="Update Comments"/> 
</html:form>


同样,这里也没有很多东西要看的,他与我们上一篇文章查看固定长度的行时的代码完全一样。该页迭代行(记住在JSTL中我们必须使用map 属性来获得到DynaForm 属性的访问),显示演员的姓、名和出生日期,并提供文本域以便输入注释。
当我们聚焦我们的浏览器合请求时,http://localhost:8080/struts/setupForm.do (假设你把struts.war 文件放在你本地机器的Tomcat 内),将会出现下列页面:

Start Wars Actor Fact Page
Last Name First Name Date of Birth Comment
Ford Harrison 07/13/1942
Fisher Carrie 10/21/1956
Hamill Mark 09/25/1951


一旦表格提供,另一个简单的Struts动作来处理结果:











package demo;

/**
 *  Copyright 2004, James M. Turner.
 * All Rights Reserved
 *
 * A Struts action that sends the new comments to the console
 */

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;

public class ProcessFormAction extends Action {
    public ActionForward execute(ActionMapping mapping, 
ActionForm form, 
HttpServletRequest request,
                                 HttpServletResponse response)
            throws ServletException, IOException {

        DynaValidatorForm df = (DynaValidatorForm) form;
        Person[] p = (Person[]) df.get("people");

        for (int i = 0; i < p.length; i++) {
            System.out.println(p[i].getFirstName() + " " + p[i].
getLastName() + ":" + p[i].getComment());
        }

        return mapping.findForward("success");
    }
}


在实际的应用中,这就是数据写回到数据库的地方。在这种情况下,他只将数据倒在控制台上所以我们可以看到他是正确收到的。假设我们为每个演员都填充了恰当的值,我们在控制台上会看到下列内容:

Harrison Ford:Indiana Jones
Carrie Fisher:Postcards from the Edge
Mark Hamill:Wing Commander


正如我在文章开头提到的一样,还有另一个方法可以解决这个问题,而且它不需要使用会话期范围内的表格。这个方法就是使用HashMaps 来存储行。我们来看看使用HashMaps编写的同一段代码:
首先,我们添加一个新表格到struts-config.xml:

<form-bean name="dynamicHashmapForm" type="org.apache.struts.validator.DynaValidatorForm">
            <form-property name="people" type="java.util.HashMap"/>
            <form-property name="comments" type="java.util.HashMap"/>
        </form-bean>


现在,我们不使用beans的排列,改为使用HashMap 来存储每个人的数据。另外,我们需要一个新的HashMap 来存储注释,原因我稍后再解释。我们也需要一个新的动作来填充数据:

package demo;

/**
 *  Copyright 2004, James M. Turner.
 * All Rights Reserved
 *
 * A Struts action that sets up a DynaForm which is globally scoped
 */

import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;

public class SetupHashFormAction extends Action {
    public ActionForward execute(ActionMapping mapping, 
ActionForm form, HttpServletRequest request,
                                 HttpServletResponse response)
            throws ServletException, IOException {

        DynaValidatorForm df = (DynaValidatorForm) form;
        HashMap hm = (HashMap) df.get("people");
        Person p = new Person();
        p = new Person();
        p.setDateOfBirth("07/13/1942");
        p.setLastName("Ford");
        p.setFirstName("Harrison");
        p.setGender("M");
        hm.put("1", p);
        p = new Person();
        p.setDateOfBirth("10/21/1956");
        p.setLastName("Fisher");
        p.setFirstName("Carrie");
        p.setGender("F");
        hm.put("2", p);
        p = new Person();
        p.setDateOfBirth("09/25/1951");
        p.setLastName("Hamill");
        p.setFirstName("Mark");
        p.setGender("M");
        hm.put("3", p);
        return mapping.findForward("success");
    }
}


基本上,这段代码与前面的代码相同,除了我们将Person 对象存储到HashMap 中,而不是排列中之外。我们也不需要创建HashMap,因为它可以作为表格初始化的一部分来动态实现。
在JSP本身中相应的技巧部分为:

<!--
    Copyright 2004, James M Turner.
    All Rights Reserved
    
    -->

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-html-el.tld" prefix="html-el" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" %>

<head>
<title>Star Wars Actor Fact Page</title>
</head>
<H1><center>Start Wars Actor Fact Page</title>
<html:form action="/processHashActorComments" >
    <table border="1" width="80%">
        <tr><th>Last Name</th><th>First Name</th>
<th>Date of Birth</th><th>Comment</th></tr>
        <c:forEach var="people" items="${dynamicHashmapForm.map.people}">
            <tr><td><c:out value="${people.value.lastName}"/></td>
                <td><c:out value="${people.value.firstName}"/></td>
                <td><c:out value="${people.value.dateOfBirth}"/></td>
                <td><html-el:text property="comments(${people.value.lastName},
${people.value.firstName})" /></td>
            </tr>
        </c:forEach>
    </table>
    <P/>
    <html:submit value="Update Comments"/> 
</html:form>


记住:在初始化时填充的HashMap 值,只要表格显示就会消失,因为表格是请求范围的,而不是会话期范围的。特别是对于我们来说这就意味着所有的Person 对象都会消失。所以,如果我们粘贴文本域到Person bean 的注释属性上,在提交表格时我们将得到一个空的指针异常,因为Person 对象不再位于HashMap 内(实际上,我们得到的是一个全新的空的HashMap.)。所以,我们需要将注释存储在一个单独的并行HashMap 内,它将注释当作简单的字符串来存储。
在上述的代码中还须注意几件事情。首先,因为现在正迭代HashMap条,来自c:forEach 标记的值实际上是用于堆栈条的占位符,同时具有两个属性。key 属性的值用来访问堆栈(在我们的例子中如字符"1", "2", "3"等等),value 属性的值存储在关键字之下。所以,在这种情况下,我们必须使用value 属性来得到Person bean 的实属性。
而且,我们需要构造一个用于文本框的有效的Struts属性域。在html-el 标记库中使用JSTL 扩展就可以实现。在这种情况下,我们通过一个由演员的最后一个名字、逗号和第一个名字组成的字符串来存储注释。
最后,我们需要一个新的动作来处理结果:

package demo;

/**
 *  Copyright 2004, James M. Turner.
 * All Rights Reserved
 *
 * A Struts action that sends the new comments to the console
 */

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;

public class ProcessHashFormAction extends Action {
    public ActionForward execute(ActionMapping mapping, 
ActionForm form, HttpServletRequest request,
                                 HttpServletResponse response)
            throws ServletException, IOException {

        DynaValidatorForm df = (DynaValidatorForm) form;
        HashMap hm = (HashMap) df.get("comments");

        Iterator it = hm.keySet().iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            String comment = (String) hm.get(key);
            System.out.println(key + ":" + comment);
        }

        return mapping.findForward("success");
    }
}



同样,这里最大的差别是数据都是作为HashMaps 来存储的。代码获取关键字(lastname,firstname),然后显示关键字和在控制台注释:

Fisher,Carrie:Leia
Ford,Harrison:Han
Hamill,Mark:Luke

请注意,当控制返回到JSP页时,打印一个空白表格。这是因为我们在初始化操作中创建的HashMap 已经没有了,在处理结果时我们不能重新创建它。你可以将该数据保存在会话期变量中,但是接着你要返回到你使用第一个方案的地方。最好是选择一个关键字,在表格提交时它可以允许你在后台对象上获得,并且能够总是重新创建需要的任何其他的表格数据。
哪种方式更好?基于排列的方案允许你将所有的数据都保存在一个bean 内,而基于堆栈的方法避免了任何会话期范围的数据。你觉得哪种方案最好就采用哪种。
注意:包含运行这些例子所需的所有代码和库的WAR 文件在http://www.blackbear.com/struts.war.上可以找到。


关于作者:James Turner 是Benefit Systems有限公司软件开发总监。他对Apache Struts 项目颇有贡献。他已经出版了两本面向WEB的JAVA技术的书:MySQL and JSP Web Applications, 和Struts Kick Start。他的第三本书,Java Server Faces Kick Start,在2003年冬季由Sams出版发行

20 dicembre

节日将至,祝大家节日快乐

蛋炒饭 _蛋炒饭 = new 蛋炒饭();

if(_蛋炒饭.get蛋() != null && _蛋炒饭.get饭() == null)
    System.out.println("剩蛋快乐!");

else if(_蛋炒饭.get蛋() != null && _蛋炒饭.get蛋().canRebuild())
    System.out.println("圆蛋也快乐!");
 
BTW:绝对原创
05 dicembre

人就是这样成长的

    周日,可恶的下水道堵了,由于楼层比较低,全部从俺家溢了出来,哎,一边手忙脚乱的盛着黑漆漆的脏水,一边急呼房管段的师傅救命,还要挨家挨户的敲门拜托人家暂时不要用水,那份郁闷就不用提了。然后又帮着师傅疏通管道,真tmd脏,但是目有办法,不忍这一时,怎会有以后的幸福生活。不经历风雨怎么会看见彩虹jj,不经历苦难怎么会体验到幸福生活的来之不易,让风雨来得更猛烈一些吧,让下水道堵得更加厉害一些吧,我决定不在这住了!
 
 
天降大任于斯人也,必先苦其心志,饿其体夫,劳其筋骨,堵其家下水道!
30 novembre

想留不能留
才最寂寞
唱不完情歌
只剩离歌
心碎前一秒
用力的簇拥着沉默
让心酸陪你
让心疼陪你
辛酸离歌~~~~~~~~~~~~~~~~~~~~~~~~
 
Nessun elenco musica in questo Windows Live Spaces.
Nessun elemento ancora aggiunto.