生活日记
本来很简单的事,弄的那么麻烦,都是之前没有说好!
由于数据库(oracle)不是我弄的,人家只给了我个用户名 密码 内网ip地址 结果db为了数据的安全将来端口给改了,整的我,连数据库都连整整一个小时,先数客服端连接不上,再是数据库服务器和web server不是一个网段,导致连接不上。
[2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!
[3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!
[4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!
5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!
[6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱。
[7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维...这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!
[8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!
[9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...
[10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功 !
这是Millward Brown第二次发布这一年度排名,排名的主要依据包括在新兴市场的客户服务。 排名最高的非美国品牌为中国移动,排在第五位。Google一年前近排名第七。
去年排名第一的微软尽管推出了VISTA还大做广告,但是仍然下滑到第三。而Google很少做广告。Millward Brown首席执行官伊莲-坎贝尔表示:“排名显示了出色的企业领导、可靠的财务管理和有力的营销都能拥有创造、增长企业财富。”
Google品牌价值664.34亿美元,比去年增长77%。通用电气价值168.8亿美元。微软价值549.51亿美元,比去年下降11%。中国移动价值412.14亿美元,增长5%,居第五位。
此外,IBM排名第九,惠普排名第15,苹果电脑排名第16(攀升13位),星巴克攀升13位达到第35位。雅虎排名第42,ebay排名第43。所有品牌的总价值增长了10.6%,达到1.6万亿美元。(编译:搜狐IT Unifytruth)]
一提这东西我就来气。就那么一个破塑料片子,害老子非要大老远的回一趟老家。
出来给人做事,一般不能请假,那有时间回老家,我们可爱的d非要不用旧塑料片子,又弄了一个新的塑料片子来说是什么第80代身份证,真他妈的恶心,这塑料片子除了比以前厚一点以外,没有任何区别,应为没有加新的信息到里边,真不知道是怎么来为人民服务的。
实在搞不懂那些家伙是如何的弱智,破身份证,非要到原籍公安局去办,就不能想办法让我拿着老身份证到全国任何一个地方的公安局,换了就可以了吗?不就是一张照片吗?一个号码吗?那儿的号码不是号码,那儿不能弄一张照片。真不知道,他们是如何学校总书记在政法工作会议上的讲话的“从老百姓最需要的事做起,从老百姓最关心的事改起”
一想,什么身份证,暂住证,我就来气,真想骂街了!
燕雀安能鸿鹄之志哉!
2007.04.17 来自:商业周刊 [收藏到我的网摘]
思科总裁钱伯斯提前布局,抢攻下一波网络成长大潮,他自信的说:Web 2.0是他10年只看到一次的大改变!现在,思科全球前十五大对手的营收相加,不到思科的一半。他的简报里,苹果计算机(Apple)的后面,加上思科,意即未来思科将像苹果计算机一样,推出挂有思科品牌的消费性电子产品,和苹果一拚。
- 提前布局,抢攻下一波网络成长大潮,他自信的说:Web 2.0是他10年只看到一次的大改变!
文/林宏达
我们的成功,就是因为我们能看见市场的重大转变!」四月六日,思科(Cisco)耗费巨资,选在美国拉斯韦加斯著名的威尼斯人酒店召开年度大会,总裁钱伯斯(John Chambers)点着竞争对手名单,骄傲的说。台下,来自全球上百家媒体与法人、三千名经销商,挤满足以停下一架空中巴士A300型客机的会场。
o份名单,包括阿尔卡特(Alcatel)、朗讯(Lucent)、3Com。十年前,思科的营收只有前十二大对手总合的七分之一;现在,思科全球前十五大对手的营收相加,不到思科的一半。钱伯斯走向台下,眼睛盯着观众,不客气的说:「这些人(指竞争对手),就是因为忽略改变才消失,如果不现在改变,你只有等麻烦临头,被迫改变。」
钱伯斯并非一直意气风发。两年前,思科美国硅谷总部,一场钱伯斯面对媒体和分析师的场合里,所有人都对思科投资光纤市场亏损的事穷追猛打。当时思科的股价低迷不振,钱伯斯的嘴角也往下垂,演讲结束,连自己的识别证都忘了带走。
如今,钱伯斯像换了个人。同样面对媒体和分析师,这一次,他不但主动拿自己开玩笑,还不时提醒在场的所有分析师:「欢迎随时挑战我的看法!」他的嘴角高高扬起,整场记者会,他大笑声不绝于耳。
这也不是思科第一次咸鱼翻生。二○○○年五月,在网络股泡沫化的前一刻,思科股价曾高达七十九美元,但随着网络产业崩盘,思科股价一路下滑,○二年十月,甚至一度跌到只剩九美元。
领先趋势、及时改变 押宝网络影音产品,营收连四年成长
钱伯斯没有因为挫折而放弃,他从二○○○年开始布局网络视讯服务,苦等六年,原本没人看好的技术,去年却因为YouTube大红,对手易利信(Ericsson)开始急起直追购并相关公司,思科却早已建好专利竞争门坎,推出超高画质的网络视讯产品「网真」(TelePresence),抢占这块新兴大饼。
二○○五年十一月,思科看好当时仍属冷门的网络影音产品,举债购并有线电视机上盒大厂科学亚特兰大(Scientific Atlanta),二○○六年六月底进一步投资网络电视公司Akimbo,却换来华尔街的不信任票,思科股价一个月内跌掉一成。
五个月后,市场再度证明钱伯斯看法正确。在YouTube带动网络影音应用的影响下,思科营收不但超过华尔街预期,股价也从去年十七.二美元低点,飙升到今年初二十八.九美元。 擅长领先趋势,拥抱改变,正是思科维持高毛利和营收成长的关键。
思科是全球营业额最大的网络设备公司,二○○○年之前,曾创下连续十一年每年成长五○%以上的纪录;二○○三年起,它走出网络泡沫阴影,连续四年营业额成长,去年营业额达二百八十四亿美元(?己闲绿ū揖徘陌僖谠矢叽锪澹ァ?
站在讲台上,钱伯斯用一贯自信的手势,指出网络产业的下一个机会点:「Web 2.0将彻底改变我们未来五年的商业模式!」他强调:「这是我十年只看到一次的大改变。」
Web 2.0带来新动能 跨足消费性产品,力拚苹果、微软
Web 2.0概念的核心,是指一个不再由中心控制所有沟通和协调的新合作模式,在这个概念里,集合个人贡献,就能产生比传统由上而下的组织更大的力量。例如YouTube集合全世界短片,打败美国三大电视网,成为全球最大影片平台,便是实例之一。
钱伯斯进一步解释,Web 1.0时代,企业从核心控制整个组织,每个人都得等待下一步指令才能行动;但在Web 2.0时代,每个人能透过网络直接和其它同事合作。因此,人和人的合作网,将会改写工作方式,甚至公司内部组织。
「消费者不会再关心,他用的是什么技术上网,他们关心的是,有什么新的服务模式,让他们能跟别人合作,提高效率。」现在,美国已有三成的工作人口属于网络世代,使用Web 2.0的模式合作,就像呼吸空气一样自然。
对思科而言,Web 2.0代表网络产业新动能、新商机,「思科现在要从网络设备公司,变成以消费者、以服务为中心的公司。」钱伯斯在这次大会中,首次揭露其新战略。
钱伯斯说,未来思科不再只做网络设备,还将跨足消费性电子产品。他的简报里,苹果计算机(Apple)的后面,加上思科,意即未来思科将像苹果计算机一样,推出挂有思科品牌的消费性电子产品,和苹果一拚。此外,微软(Microsoft)和Google可以做的服务,例如网络搜寻平台,未来思科也将跨足。
这意味,思科不再将产品主力锁定金字塔顶层的大型企业,它将走下金字塔,拥抱中小企业与一般消费者,并将产品由硬件跨足至软件。它把战场扩大,试图在其中找到差异化获利模式。
钱伯斯不只是说说而已,去年十一月,思科花一亿二千万美元(约合新台币四十亿元),买下奥克兰运动家队新主场的命名权,并将把球场变成思科差异化获利模式的展示场。
他拿出一台超级行动计算机(UMPC),描绘这样的愿景:未来观众可以透过手上的小型计算机,变换不同的看球角度,甚至倒回去看刚刚错过的片段。棒球转播方式也能发展新商业模式,他展示一套由三台六十吋高分辨率电视组成的网真系统,过去这种技术被用来做视讯会议,未来则可做为极逼真的球赛转播,等于把球赛的观众席用网络搬到全世界的餐厅里。这些服务,都能创造新的获利。
钱伯斯认为,网络的下一步趋势,是要把固定网络、电话、无线网络、视讯融合在一起,思科把这个概念称为「Quad Play」(整合电话、网络、影像和行动通讯)。
他摊开网络发展历史分析,网络的应用普及,网络技术已经走到整合的阶段,在消费者生活中,网络已经变成听音乐、买股票、甚至选红酒都会用到的工具,「谁还会管现在是用有线网络还是无线网络上网?」现在,思科的网络设备也早已走出个人计算机(PC)的范围,背后连接的,可能是电话、手机甚至电视。
他强调,过去是PC操作系统的时代,现在是以网络做为作业平台的时代,思科要把PC之外的各种沟通方式,通通吸进来,更贴近一般大众!
为了这个目标,香港思科总经理冼超舜分析,思科两年前开始准备,从产品、品牌、通路三方面同时做了大幅改变。品牌方面,去年十月,思科连自己的商标都改了,把图案中旧金山金门大桥的图象,改成几根简单的线条,软化原本太过科技感的品牌形象,同时把公司名字从Cisco System,改成Cisco,表明思科不再只是网络设备制造商的决心。
产品方面,过去十年,思科每年几乎都会推出几种有潜力的网络技术,从网络电话到网络安全设备都有。过去的目标是,每种新技术都要发展成年营业额十亿美元的大生意,如今思科却不再用新技术当做成长灵药,破例大谈技术融合与新商业模式。去年十二月,思科更在印度成立服务中心,跨出软件服务第一步。
「我们要从卖Box(指网络设备),变成卖Solution(解决方案)。」台湾思科总经理吴传辉分析。
转攻家庭与中小企业 以整合与服务取代技术挂帅
过去,思科的产品从五万元起跳,销售清单里甚至有一台要价新台币三千二百万元的巨型路由器(Router);现在,你可以用几百元买到思科的无线网络基地台。以前,它的产品深藏在大企业机房里;现在,它开始进攻小公司,踏进消费?叩氖樽馈⒖吞K伎蒲翘懿贸率遂烤倮蠢刺ㄍ辶闶垡悼赏腹缯希芽獯婀芾怼⑺⒖ā⒌缁吧踔猎惫で┑剑空显谝惶ɑ髂凇R皆和绲缁埃部杀渖沓晌芾碚饰裣低澈头窳鞒痰墓ぞ摺?
思科原本在路由器、切换器(Switch)等二十个领域,已经是全球市占率的龙头,转向拥抱中小企业和个人,挑战在哪里?
通路,是最大的难题。因为中小企业数量庞大、资源有限,通常没有专职负责维护网络的技术人员,专攻中小企业的服务代理商规模也通常不大,加上思科过去给人昂贵、高档的印象,如何布建深入中小企业的通路,确保服务水平,是一大难题。
因此,吸引合作伙伴(经销商)支持,是钱伯斯现在最重视的问题,他不断跟在场经销商握手、寒暄、争取他们支持。过去一年,思科发出十亿美元,给全球二千五百个合作伙伴做奖励金,思科计划今年中小企业的经销商数目,要再增加两倍。这是因为,要服务小客户必须要有大量人力和对不同产业的背景知识,跟经销商合作,才能扭转思科产品高价的不利限制。
这个策略的成效已经初步浮现。去年思科才能在分析师不看好的情况下,维持一五%的营收成长,毛利率也达六成五;其中,新兴市场营收成长四○%,网络影音等重点应用也成长近三成。今年,钱伯斯喊出营收再成长一八%的新目标。
思科转向中小型企业,将与深耕中小企业网络设备的友讯起直接冲突,友讯总经理廖志诚表示,思科单价高,未必能打得过友讯。虽然看起来不在乎,友讯却很巧合的改变了过去二十年的发展策略,去年底,友讯董事长高次轩宣布,未来友讯要发展D-Link 2.0,建立用Web 2.0概念发展的新服务,等于打破过去二十年坚守制造和技术的传统路线,进入与思科直接冲突的备战阶段。
钱伯斯这场演讲,左攻苹果,右打微软、Google,连国内厂商友讯也被卷入这场新的竞争赛局。「网络通讯走向整合时代已经到了!」钱伯斯说。这家技术挂帅的网络公司,都已经发现技术不再是摇钱树,整合与服务才是,那么,网络通讯产业从技术竞争走向通路与营销肉搏战,已指日可待。
首先,要跟大家道个歉,前一阵子为给客户个一个DEMO,忙得不可开交,所以很久没有更新Blog。提到这个DEMO我想顺便跟大家分享一下心得——如果大家希望快速开发,一个类似Struts 2这样的简单方便的WEB框架必不可少。我们在开发DEMO使用的还是Struts 1.2.8,而且没有不使用任何EL(表达式语言),导致页面出现无数类似“<%= ((Integer) request.getAttribute("xx")).intValue()%6 %>”的代码。Struts 1.x的Form Bean的麻烦使得有部分同事直接使用request.getParameter(String arg),继而引入另一种麻烦。诸如此类的问题,在DEMO这样时间紧迫的项目凸显了Struts 1.x对快速开发的无能为力。不过没办法,由于我们项目中的几个资深员工除了Struts 1.x外,对其它的WEB框架似乎不大感兴趣。
言归正传,Interceptor(以下译为拦截器)是Struts 2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、转换器,校验等。
什么是拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
实现原理
Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,如图1所示。
图1 拦截器调用序列图
已有的拦截器
Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。
| 在本文使用是Struts 2的最新发布版本2.0.1。需要下载的朋友请点击以下链接: http://apache.justdn.org/struts/binaries/struts-2.0.1-all.zip |
以下部分就是从struts-default.xml文件摘取的内容:
< interceptor name ="autowiring" class ="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor" />
< interceptor name ="chain" class ="com.opensymphony.xwork2.interceptor.ChainingInterceptor" />
< interceptor name ="conversionError" class ="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor" />
< interceptor name ="createSession" class ="org.apache.struts2.interceptor.CreateSessionInterceptor" />
< interceptor name ="debugging" class ="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
< interceptor name ="external-ref" class ="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor" />
< interceptor name ="execAndWait" class ="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
< interceptor name ="exception" class ="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
< interceptor name ="fileUpload" class ="org.apache.struts2.interceptor.FileUploadInterceptor" />
< interceptor name ="i18n" class ="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
< interceptor name ="logger" class ="com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
< interceptor name ="model-driven" class ="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
< interceptor name ="scoped-model-driven" class ="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
< interceptor name ="params" class ="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
< interceptor name ="prepare" class ="com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
< interceptor name ="static-params" class ="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
< interceptor name ="scope" class ="org.apache.struts2.interceptor.ScopeInterceptor" />
< interceptor name ="servlet-config" class ="org.apache.struts2.interceptor.ServletConfigInterceptor" />
< interceptor name ="sessionAutowiring" class ="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor" />
< interceptor name ="timer" class ="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
< interceptor name ="token" class ="org.apache.struts2.interceptor.TokenInterceptor" />
< interceptor name ="token-session" class ="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
< interceptor name ="validation" class ="com.opensymphony.xwork2.validator.ValidationInterceptor" />
< interceptor name ="workflow" class ="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor" />
< interceptor name ="store" class ="org.apache.struts2.interceptor.MessageStoreInterceptor" />
< interceptor name ="checkbox" class ="org.apache.struts2.interceptor.CheckboxInterceptor" />
< interceptor name ="profiling" class ="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
配置和使用拦截器
在struts-default.xml中已经配置了以上的拦截器。如果您想要使用上述拦截器,只需要在应用程序struts.xml文件中通过“<include file="struts-default.xml" />”将struts-default.xml文件包含进来,并继承其中的struts-default包(package),最后在定义Action时,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈(interceptor stack)。一旦您继承了struts-default包(package),所有Action都会调用拦截器栈 ——defaultStack。当然,在Action配置中加入“<interceptor-ref name="xx" />”可以覆盖defaultStack。
下面是关于拦截器timer使用的例子。首先,新建Action类tuotrial/TimerInterceptorAction.java,内容如下:
package tutorial;
import com.opensymphony.xwork2.ActionSupport;

public class TimerInterceptorAction extends ActionSupport
{
@Override
public String execute()
{
try
{
// 模拟耗时的操作
Thread.sleep( 500 );
} catch (Exception e)
{
e.printStackTrace();
}
return SUCCESS;
}
}
配置Action,名为Timer,配置文件如下:
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< include file ="struts-default.xml" />
< package name ="InterceptorDemo" extends ="struts-default" >
< action name ="Timer" class ="tutorial.TimerInterceptorAction" >
< interceptor-ref name ="timer" />
< result > /Timer.jsp </ result >
</ action >
</ package >
</ struts >
至于Timer.jsp可以随意写些什么到里面。发布运行应用程序,在浏览器的地址栏键入http://localhost:8080/Struts2_Interceptor/Timer.action,在出现Timer.jsp页面后,查看服务器的后台输出。
信息: Executed action [ //Timer!execute ] took 2859 ms.
在您的环境中执行Timer!execute的耗时,可能上述的时间有些不同,这取决于您PC的性能。但是无论如何,2859 ms与500 ms还是相差太远了。这是什么原因呢?其实原因是第一次加载Timer时,需要进行一定的初始工作。当你重新请求Timer.action时,以上输出会变为:
信息: Executed action [ //Timer!execute ] took 500 ms.
OK,这正是我们期待的结果。上述例子演示了拦截器timer的用途——用于显示执行某个action方法的耗时,在我们做一个粗略的性能调试时,这相当有用。
自定义拦截器
作为“框架(framework)”,可扩展性是不可或缺的,因为世上没有放之四海而皆准的东西。虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。
| 大家在开始着手创建自定义拦截器前,切记以下原则: 拦截器必须是无状态的,不要使用在API提供的ActionInvocation之外的任何东西。 |
要求拦截器是无状态的原因是Struts 2不能保证为每一个请求或者action创建一个实例,所以如果拦截器带有状态,会引发并发问题。
所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。除此之外,大家可能更喜欢继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor。
以下例子演示通过继承AbstractInterceptor,实现授权拦截器。
首先,创建授权拦截器类tutorial.AuthorizationInterceptor,代码如下:
package tutorial;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorizationInterceptor extends AbstractInterceptor
{
@Override
public String intercept(ActionInvocation ai) throws Exception
{
Map session = ai.getInvocationContext().getSession();
String role = (String) session.get( " ROLE " );
if ( null != role)
{
Object o = ai.getAction();
if (o instanceof RoleAware)
{
RoleAware action = (RoleAware) o;
action.setRole(role);
}
return ai.invoke();
} else
{
return Action.LOGIN;
}
}
}
以上代码相当简单,我们通过检查session是否存在键为“ROLE”的字符串,判断用户是否登陆。如果用户已经登陆,将角色放到Action中,调用Action;否则,拦截直接返回Action.LOGIN字段。为了方便将角色放入Action,我定义了接口tutorial.RoleAware,代码如下:
package tutorial;

public interface RoleAware
{
void setRole(String role);
}
接着,创建Action类tutorial.AuthorizatedAccess模拟访问受限资源,它作用就是通过实现RoleAware获取角色,并将其显示到ShowUser.jsp中,代码如下:
package tutorial;
import com.opensymphony.xwork2.ActionSupport;

public class AuthorizatedAccess extends ActionSupport implements RoleAware
{
private String role;

public void setRole(String role)
{
this .role = role;
}

public String getRole()
{
return role;
}
@Override
public String execute()
{
return SUCCESS;
}
}
以下是ShowUser.jsp的代码:
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > Authorizated User </ title >
</ head >
< body >
< h1 > Your role is: < s:property value ="role" /></ h1 >
</ body >
</ html >
然后,创建tutorial.Roles初始化角色列表,代码如下:
package tutorial;
import java.util.Hashtable;
import java.util.Map;


public class Roles
{
public Map < String, String > getRoles()
{
Map < String, String > roles = new Hashtable < String, String > ( 2 );
roles.put( " EMPLOYEE " , " Employee " );
roles.put( " MANAGER " , " Manager " );
return roles;
}
}
接下来,新建Login.jsp实例化tutorial.Roles,并将其roles属性赋予<s:radio>标志,代码如下:
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > Login </ title >
</ head >
< body >
< h1 > Login </ h1 >
Please select a role below:
< s:bean id ="roles" name ="tutorial.Roles" />
< s:form action ="Login" >
< s:radio list ="#roles.roles" value ="EMPLOYEE" name ="role" label ="Role" />
< s:submit />
</ s:form >
</ body >
</ html >
创建Action类tutorial.Login将role放到session中,并转到Action类tutorial.AuthorizatedAccess,代码如下:
package tutorial;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;

public class Login extends ActionSupport implements SessionAware
{
private String role;
private Map session;

public String getRole()
{
return role;
}
public void setRole(String role)
{
this .role = role;
}

public void setSession(Map session)
{
this .session = session;
}
@Override
public String execute()
{
session.put( " ROLE " , role);
return SUCCESS;
}
}
最后,配置struts.xml文件,内容如下:
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< include file ="struts-default.xml" />
< package name ="InterceptorDemo" extends ="struts-default" >
< interceptors >
< interceptor name ="auth" class ="tutorial.AuthorizationInterceptor" />
</ interceptors >
< action name ="Timer" class ="tutorial.TimerInterceptorAction" >
< interceptor-ref name ="timer" />
< result > /Timer.jsp </ result >
</ action >
< action name ="Login" class ="tutorial.Login" >
< result type ="chain" > AuthorizatedAccess </ result >
</ action >
< action name ="AuthorizatedAccess" class ="tutorial.AuthorizatedAccess" >
< interceptor-ref name ="auth" />
< result name ="login" > /Login.jsp </ result >
< result name ="success" > /ShowRole.jsp </ result >
</ action >
</ package >
</ struts >
发布运行应用程序,在浏览器地址栏中输入:http://localhost:8080/Struts2_Interceptor/AuthorizatedAccess.action。由于此时,session还没有键为“ROLE”的值,所以返回Login.jsp页面,如图2所示:
图2 Login.jsp
选中Employee,点击Submit,出现图3所示页面:
图3 ShowRole.jsp
总结
拦截器是Struts 2比较重要的一个功能。通过正确地使用拦截器,我们可以编写高可复用的代码。
离开的时候心里非常的不舒服,但是感觉我们彼此之间是越走越远,
其实我也说不出个一二三,她长的不漂亮,脾气也不好,好吃懒坐,但是直到现在我还喜欢她。
今天下午她要我带她取麦当劳,说了一会之后,突然间我给她发了各短信说:“请你不再打扰我平
静的生活了,希望我没有在你心中留下永远的痛,但愿在未来的日子里,你永远不得安宁,愿主保佑的
你!!!!!
