2009 年9 月10 日 ,国内领先的在线服务(SaaS ,Software as a Service )提供商用友 伟库网 ,正式推出旨在进一步改善用户在线应用体验的新服务——伟库应用加速器。即日起,用户只需在伟库网 以及国内主流下载网站页面上点击相关图标,便可免费获取用友财务宝(网上记账 )、用友商贸宝(网上进销存)以及用友营销 宝(客盈门)服务,感受伟库网 的应用加速新体验。
据介绍,与此前全部基于互联网络的在线服务产品不同,伟库应用加速器采取了富客户端桌面应用形式 ,其所涵盖的用友财务宝、用友商贸宝以及用友营销 宝等新服务更加契合当前用户使用习惯,是可以让用户看到的实实在在的实体化服务。用户可以方便的在伟库网 以及国内主流下载网站的页面上下载软件包到本地,并安装相关服务。
除了进一步丰富了用友 伟库网 在线服务产品的应用模式之外,此次推出的伟库应用加速器,仍然延续了此前完全基于互联网络的在线服务内容,其中用友财务宝(网上记账 )、用友商贸宝(网上进销存)面向企业的业务管理,而用友营销 宝(客盈门)则是主要针对中小企业的营销 服务,包括伟库大黄页数据查询等服务。
在此之前,有不少国内SaaS 用户反映,网络速度慢、IE 补丁更新等因素长期困扰其应用体验。而伟库应用加速器的推出可以妥善地解决这些问题。
据 了解,与基于互联网络的在线应用相比,新服务首先在产品性能方面做了改善,这主要体现在两个方面:一是针对网络稳定性的改进,新服务可以解决此前部分用户 遇到的网络不稳定带来的问题,如数据无法及时保存等;二是功能实现的提速,用户不会感觉到网络延时。新服务提供离线功能,可以实现数据的本地化存储,而在 用户下一次登陆网络时,数据可以实现同步上传。
其次,借助Adobe_AIR 技术,伟库应用加速器不挑浏览器,用户不必再为浏览器的版本低或补丁更新而困扰,而且新服务便于用户在交替使用不同版本浏览器时进行应用移植。
第三,相对于此前完全基于互联网络的在线服务,伟库应用加速器不再局限于搜索引擎的推广方式,用户除了可以在伟库网 直接下载或在线安装新服务,还可以在国内主流下载网站包括天空、华军、小熊在线、太平洋在线、泡泡网、中关村在线、IT168 、中国共享软件注册中心、非凡软件、硅谷动力、多特软件、PChome 、新浪等相关页面进行下载。
值得一提的是,伟库应用加速器是完全的绿色软件,不写入用户终端系统的注册表,支持在线实时安装,可实现自动更新,并方便安装卸载。而这一新服务对用户终端设备没有特殊要求,除去Adobe_AIR 软件,伟库应用加速器仅占1~3Mb 空间。
欲了解伟库应用加速器的详细内容请点击:
http://www.wecoo.com/treasure/download.html
posted @
2009-09-11 13:26 杨之廷 阅读(335) |
评论 (0) |
编辑 收藏
1.尽可能少的页面请求
如页面引入的js,css等文件
开发可以多个,发布必须合并,减少浏览器的访问次数
2.获取数据用get,表单提交用post
get速度优于post
posted @
2008-07-11 14:27 杨之廷 阅读(139) |
评论 (0) |
编辑 收藏
一、在姿态上要低调
在低调中修炼自己:低调做人无论在官场、商场还是政治军事斗争中都是一种进可攻、退可守,看似平淡,实则高深的处世谋略。
谦卑处世人常在:谦卑是一种智慧,是为人处世的黄金法则,懂得谦卑的人,必将得到人们的尊重,受到世人的敬仰。
大智若愚,实乃养晦之术:“大智若愚”,重在一个“若”字,“若”设计了巨大的假象与骗局,掩饰了真实的野心、权欲、才华、声望、感情。这种甘为愚钝、甘当弱者的低调做人术,实际上是精于算计的隐蔽,它鼓励人们不求争先、不露真相,让自己明明白白过一生。
平和待人留余地:“道有道法,行有行规”,做人也不例外,用平和的心态去对待人事事,也是符合客观要求的,因为低调做人才是跨进成功之门的钥匙。
时机未成熟时,要挺住:人非圣贤,谁都无法甩掉七情六欲,离不开柴米油盐,即使遁入空门,“跳出三界外,不在五行中”,也要“出家人以宽大为怀,善哉!善
哉!”不离口。所以,要成就大业,就得分清轻重缓急,大小远近,该舍的就得忍痛割爱,该忍的就得 从长计议,从而实现理想,成就大事,创建大业。
毛羽不丰时,要懂得让步:低调做人,往往是赢取对手的资助、最后不断走向强盛、伸展势力再反过来使对手屈服的一条有用的妙计。
在“愚”中等待时机:大智若愚,不仅可以将有为示无为,聪明装糊涂,而且可以若无其事,装着不置可否的样子,不表明态度,然后静待时机,把自己的过人之处
一下子说出来,打对手一个措手不及。但是,大智若愚,关键是心中要有对付对方的策略。常用“糊涂”来迷惑对方耳目,宁可有为而示无为,万不可无为示有为,
本来糊涂反装聪明,这样就会弄巧成拙。
主动吃亏是风度:任何时候,情分不能践踏。主动吃亏,山不转水转,也许以后还有合作的机会,又走到一起。若一个人处处不肯吃亏,则处处必想占便宜,于是,
妄想日生,骄心日盛。而一个人一旦有了骄狂的态势,难免会侵害别人的利益,于是便起纷争,在四面楚歌之中,又焉有不败之理?
为对手叫好是一种智慧:美德、智慧、修养,是我们处世的资本。为对手叫好,是一种谋略,能做到放低姿态为对手叫好的人,那他在做人做事上必定会成功。
以宽容之心度他人之过:退一步海阔天空,忍一时风平浪静。对于别人的过失,必要的指责无可厚非,但能以博大的胸怀去宽容别人,就会让世界变得更精彩。
二、在心态上要低调
功成名就更要保持平常心:高调做事是一种责任,一种气魄,一种精益求精的风格,一种执著追求的精神。所做的哪怕是细小的事、单调的事,也要代表自己的最高水平,体现自己的最好风格,并在做事中提高素质与能力。
做人不要恃才傲物:当你取得成绩时,你要感谢他人、与人分享、为人谦卑,这正好让他人吃下了一颗定心丸。如果你习惯了恃才傲物,看不起别人,那么总有一天你会独吞苦果!请记住:恃才傲物是做人一大忌。
容人之过,方显大家本色:大度睿智的低调做人,有时比横眉冷对的高高在上更有助于问题的解决。对他人的小过以大度相待,实际上也是一种低调做人的态度,这种态度会使人没齿难忘,终生感激。
做人要圆融通达,不要锋芒毕露:功成名就需要一种谦逊的态度,自觉地在名利场中做看客,开拓广阔心境。
知足者常乐:生活中如能降低一些标准,退一步想一想,就能知足常乐。人应该体会到自己本来就是无所欠缺的,这就是最大的财富了。
不要太把自己当回事:不要把自己太当回事,才不会产生自满心理,才能不断地充实、完善自己,缔造完善人生。
谦逊是终生受益的美德:一个懂得谦逊的人是一个真正懂得积蓄力量的人,谦逊能够避免给别人造成太张扬的印象,这样的印象恰好能够使一个员工在生活、工作中不断积累经验与能力,最后达到成功。
淡泊名利无私奉献:性格豪放者心胸必然豁达,壮志无边者思想必然激越,思想激越者必然容易触怒世俗和所谓的权威。所以,社会要求成大事者能够隐忍不发,高调做事,低调做人。
对待下属要宽容:作为上司,应该具有容人之量,既然把任务交代给了下属,就要充分想念下属,让其有施展才能的机会,只有这样,才能人尽其才。
简朴是低调做人的根本:在生活上简朴些、低调些,不仅有助于自身的品德修炼,而且也能赢得上下的交口称誉。
三、在行为上要低调
深藏不露,是智谋:过分的张扬自己,就会经受更多的风吹雨打,暴露在外的椽子自然要先腐烂。一个人在社会上,如果不合时宜地过分张扬、卖弄,那么不管多么优秀,都难免会遭到明枪暗箭的打击和攻击。
出头的椽子易烂:时常有人稍有名气就到处洋洋得意地自夸,喜欢被别人奉承,这些人迟早会吃亏的。所以在处于被动境地时一定要学会藏锋敛迹、装憨卖乖,千万不要把自己变成对方射击的靶子。
才大不可气粗,居功不可自傲:不可一世的年羹尧,因为在做人上的无知而落得个可悲的下场,所以,才大而不气粗,居功而不自傲,才是做人的根本。
盛名之下,其实难副:在积极求取巅峰期的时候,不妨思及颜之推倡导的人生态度,试图明了知足常乐的情趣,捕捉中庸之道的精义,稍稍使生活步调快慢均衡,才不易陷入过度偏激的生活陷阱之中。
做人不能太精明:低调做人,不耍小聪明,让自己始终处于冷静的状态,在“低调”的心态支配下,兢兢业业,才能做成大事业。
乐不可极,乐极生悲:在生活悲欢离合、喜怒哀乐的起承转合过程中,人应随时随地、恰如其分地选择适合自己的位置,起点不要太高。正如孟子所说的:“可以仕则仕,可以止则止,可以久则久,可以速则速。”
做人要懂得谦逊:谦逊能够克服骄矜之态,能够营造良好的人际关系,因为人们所尊敬的是那些谦逊的人,而决不会是那些爱慕虚荣和自夸的人。
规避风头,才能走好人生路:老子认为“兵强则灭,木强则折”、“强梁者不得其死”。老子这种与世无争的谋略思想,深刻体现了事物的内在运动规律,已为无数事实所证明,成为广泛流传的哲理名言。
低调做人,便可峰回路转:在待人处世中要低调,当自己处于不利地位,或者危险之时,不妨先退让一步,这样做,不但能避其锋芒,脱离困境,而且还可以另辟蹊径,重新占据主动。
要想先做事,必须先做人:要想先做事,必须先做人。做好了人,才能做事。做人要低调谦虚,做事要高调有信心,事情做好了,低调做人水平就又上了一个台阶。
功成身退,天之道:懂得功成身退的人,是识时务的,他知道何时保全自己,何时成就别人,以儒雅之风度来笑对人生。
四、在言辞上要低调
不要揭人伤疤:不能拿朋友的缺点开玩笑。不要以为你很熟悉对方,就随意取笑对方的缺点,揭人伤疤。那样就会伤及对方的人格、尊严,违背开玩笑的初衷。
放低说话的姿态:面对别人的赞许恭贺,应谦和有礼、虚心,这样才能显示出自己的君子风度,淡化别人对你的嫉妒心理,维持和谐良好的人际关系。
说话时不可伤害他人自尊:讲话要有分寸,不要伤害他人。礼让不是人际关系上的怯懦,而是把无谓的攻击降到零。
得意而不要忘形:得意时要少说话,而且态度要更加谦卑,这样才会赢得朋友们的尊敬。
祸从口出,没必要自惹麻烦:要想在办公室中保持心情舒畅的工作,并与领导关系融洽,那就多注意你的言行。对于姿态上低调、工作上踏实的人,上司们更愿意起用他们。如果你幸运的话,还很可能被上司意外地委以重任。
莫逞一时口头之快:凡事三思而行,说话也不例外,在开口说话之前也要思考,确定不会伤害他人再说出口,才能起到一言九鼎的作用,你也才能受到别人的尊重和认可。
口出狂言者祸必至:是不是因为物欲文明的催生所致,如今社会上各类职业当中都有动辄口出狂言的人。
耻笑讥讽来不得:言为心声,语言受思想的支配,反应一个人的品德。不负责任,胡说八道,造谣中伤,搬弄是非等等,都是不道德的。
不要总是报怨原单位:跳槽属于人才流动,是当今社会很正常的一种现象,并不为奇,而且跳槽者屡屡能在新的团
队里找到适合自己的位置,创造更佳的业绩。如果这一步还没有达到,你就急急忙忙地大耍“嘴功”,以贬低老团队的手段来抬高自己在新团队的人缘和地位的话,
那你就大错特错了!
说话不可太露骨:别以为如实相告,别人就会感激涕零。要知道,我们永远不能率性而为、无所顾忌,话语出口前,考虑一下别人的感受,是一种成熟的人处世方法。
沉默是金:沉默,并不是让大家永不说话,该说的时候还是要说的。就像佛祖那样境界的人,也还是会与人说话,传授佛法,适度的语言本身也是一种沉默。
五、在思想上要高调
给自己一个希望:不论你遇到了多揪心的挫折,都应当以坚持不懈的信心和毅力,感动自己,感动他人,把自己锤炼成一个做大事的人。
保持向上的激情:我们需要激情,需要开拓,让我们从现在做起,兢兢业业,开拓创新,扎扎实实做好本职工作,在平凡的工作中燃烧激情。
自信是高调做事的秘诀:信心对于做事成功者具有重要意义,成功的欲望是创造和拥有财富的源泉。人一旦有了这
种欲望,并经由自我暗示和潜意识的激发后形成一种自信心,这种信心就会转化成一种“积极的感情”,它能帮助人们释放出无穷的热情、智慧和精力,进而帮助人
们获得财富与事业上的巨大成就。
别让借口“吃掉”你的希望:无论什么时候,我们都不要为自己寻找借口,只有尽职尽责,勇往直前,不找借口,才能实现理想,创造辉煌人生。
丑小鸭也能变成白天鹅:一个人有希望,再加上坚忍不拔的决心,就会产生创造的能力;一个人有希望,再加上持之以恒的努力,就会达到目的。
点燃希望之火:一颗充满希望的心灵,具有极大的创造力,这种创造力会激发人的潜能,实现人的理想。
成功需要付出代价:从古到今,凡成事者,成大事者,莫不受尽磨难,在磨难中完成自我教育,如此也水到渠成地成就了事业。
主动去做应该做的事:只有气服懒惰,积极进取的人,才能不断成功,不断取得好成绩。
不要轻言放弃,坚持就能成功:抱定任何都不放弃的信念,即使在一片懊悔或叹息、宽容或指责的氛围中也要坚持。是的,任何时候都不要放弃,无论条件多么的困难,只要能坚持到底,成功就一定属于你。
学会自己鼓励自己:能自己鼓励自己的人就算不是一个成功者,但绝对不会是一个失败者,你还是趁早练练这“功夫”吧!
永远保持好心情:突破困境的方法,首先在于要肃清胸中快乐和成功的仇敌,其次要集中思想,坚定意识。只有运用正确的思想,并抱定坚定的精神,才能从逆境中突围。
激发自己的潜能:倘若你和一般失败者面谈,你就会发现:他们之所以失败,是因为他们从来不曾走进足以激发人、鼓励人的环境中,是因为他们的潜能从来不曾被激发,是因为他们没有力量从不良的环境中振作。
不要畏惧贫穷和困苦:行走于人生丛林中的每个人都应该记住,如果你正在遭受困苦,这并不是完全是件坏事,“天将大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为”。因为老天要把重任交给你,必先磨炼和考验你!
发掘出自身的强项:当巨大的压力、非常的变故和重大责任压在一个人身上时,隐伏在他生命最深处的种种能力,才会突然涌现出来,使他成就大业。
坚定生活的信念:困境可以检验一个人的品质。如果一个人敢于直面困境,积极主动寻求解决问题的办法,能在任何不利的环境中始终充满热情,坚定对生活的信念,那么他迟早会成功。
把挫折当成垫脚石:在生活中,有的人被挫折打倒,有的人却把挫折当成垫脚石,不断前进。只要我们正视坎坷,永不放弃自己的追求,生活的艰辛将被我们踩在脚下,生命将会永放光芒!
对生活充满热情:有了热情,就能把额外的工作视作机遇,就能把陌生人变成朋友,就能真诚地宽容别人。有了热情,就能充分利用余暇时间来完成自己的兴趣爱好。有了热情,就会抛弃怨恨,变得心胸宽广。有了热情,就会战胜困难,取得成功。
六、在细节上要高调
注重细节,从小事做起:看不到细节,或者不把细节当回事的人,对工作缺乏认真的态度,对事情只能是敷衍了事。而注重细节的人,不仅认真地对待工作,将小事做细,并且能在做细的过程中找到机会,从而使自己走上成功之路。
工作中没有小事:点石成金,滴水成河,只有认真对待自己所做的一切事情,才能克服万难,取得成功。
认真对待每一次训练:那些在平时训练和准备过程中认真对待的人则相反,由于一直接受了高强度的模拟训练,他们更容易在关键的比赛中表现出镇定的心态,因为在他们心目中,这无异于平时的一场简单的比赛和训练。
悄悄地为他人做点好事;试着去真心真意地帮助别人,当这一切完全发自你的意愿时,你将会感觉到这是件多么快乐的事,你的心灵就会得到回报—一种和平、安静、温暖的感觉。
敬业精神+脚踏实地=成功:敬业,不仅仅是事业成功的保障,更是实现人生价值的手段,有的人在生活中,总是不满意目前的职业,希望改变自己的处境。但世界上绝对没有不劳而获的事情,人们的成功无一不是按部就班、脚踏实地努力的结果。
相信自己,正视开端:任何大的成功,都是从小事一点一滴累积而来的。没有做不到的事,只有不肯做的人。想想你曾经历过的失败,当时的你真的用尽全力试过各种办法了吗?困难不会是成功的障碍,只有你自己才可能是一个最大的绊脚石。
扎实的基础是成功的法宝:如果一味地追求过高远的目标,丧失了眼前可以成功的机会,就会成为高远目标的牺牲
品。许多年轻人不满意现在的工作,羡慕那些大款或高级白领人员,不安心本职工作,总是想跳槽。其实,没有十分的本领,就不应有些妄想。我们还是多向成功之
人学习,脚踏实地,做好基础工作,一步一个脚印地走上成功之途。
实干才能脱颖而出:那些充满乐观精神、积极向上的人,总有一股使不完的劲,神情专注,心情愉快,并且主动找事做,在实干中实现自己的理想。
不为薪水而工作:想要获得成功,实现人生目标,就不要为薪水而工作。当一个人积极进取,尽心尽力时,他就能实现更高的人生价值。
要征服世界,先战胜自己:要想成功,就要战胜自己的感情,培养自己控制命运的能力。
用心做事,尽职尽责:以积极主动的心态对待你的工作、你的公司,你就会充满活力与创造性的完成工作,你就会成为一个值得信赖的人,一个老板乐于雇用的人,一个拥有自己事业的人。
对待小事也要倾注全部热情:倾注全部热情对待每件小事,不去计较它是多么的“微不足道”,你就会发现,原来每天平凡的生活竟是如此的充实、美好。
posted @
2008-07-08 12:59 杨之廷 阅读(171) |
评论 (0) |
编辑 收藏
href="javascript:void(0)"代替href="#" 浏览器会全页面找'#'变量
posted @
2008-07-03 09:44 杨之廷 阅读(354) |
评论 (2) |
编辑 收藏
在oralce中主键最好根据业务设置成number类型,而不要是varchar2 ,varchar2寻址太慢,
posted @
2008-07-03 09:41 杨之廷 阅读(119) |
评论 (0) |
编辑 收藏
CREATE INDEX ISB_1_IDX ON ITEM_SUB_BALANCE (ACCOUNTBOOK_ID);
CREATE INDEX ISB_2_IDX ON ITEM_SUB_BALANCE (IS_BAK_BOOK,ITEM_ID,SUBJECT_ID,PERIOD);
CREATE INDEX ISB_3_IDX ON ITEM_SUB_BALANCE (ACCOUNTBOOK_ID,IS_BAK_BOOK,ITEM_ID,SUBJECT_ID,PERIOD);
索引1+索引2=索引3的功能
因此索引3是多余的
posted @
2008-07-03 09:39 杨之廷 阅读(141) |
评论 (0) |
编辑 收藏
两个jsp页面之间如何传递一个对象?比如一个List或者HashMap?
答:
用request.setAttribute("name",Object),request.getAttribute("name");
或者session.setAttribute("name",Object),session.getAttribute("name");
注意问题:
- 如果用request,要注意request的范围仅限于同一个request对象;如果使用了form的"action"或者response.sendRedirect("xxx.jsp")等调转,则不再是同一个request对象,即用request.getAttribute("name")将取不到值。
- 换成request.getRequestDispatcher("xxx.jsp").forward(request,response);
才能共享request中数据
基础问题:
1,所有再页面提交的数据,在ACTION里只能通过request.getParameter( or values).
2,要想通过attribute传输数据,必须保持在同一个request中,不论中转了几次(forward)。
posted @
2007-12-25 11:51 杨之廷 阅读(3333) |
评论 (2) |
编辑 收藏
湘味农家小炒肉:
主料:鲜肉、青椒(尖椒为上)。
配料:湖南剁辣椒、大蒜、姜、食盐、鸡精、酱油、料酒、醋,根据个人喜好,备浏阳豆豉。
制法:
1、辣椒切片(尖椒切成筒状)、鲜肉切片或丝、姜切丝、大蒜切片;
2、将油烧热,放入姜丝、蒜片,待爆出香味后,将肉丝倒入锅中加适量盐、煸炒至九成熟,盛起;
3、煸炒青椒少时(根据火的大小调整时间),加少许盐,加一勺剁辣椒,炒匀。将肉丝倒入锅中,翻炒。
4、加入醋、酱油、料酒、豆豉各适量,继续翻炒少时,加适量鸡精后炒匀,即可装盘。
湖南农家小炒肉一般选用肉质比较细嫩的猪肉,最好是“隔纱”五花肉,用青椒、豆豉爆炒,中间加入香喷喷的油渣。辣椒最好选用形状瘦的、比较辣的青椒;嗜辣者亦可依个人喜好加入干尖椒或者剁辣椒的。好吃的小炒肉细嫩、有着青椒、瘦肉和豆豉的油香但是绝不腻人。做好这个菜,食材第一,火候第二,突出到酸辣、香鲜、软嫩的品味,是最能见湘菜水平的家常菜。
posted @
2007-11-11 17:17 杨之廷 阅读(285) |
评论 (0) |
编辑 收藏
在java中基本数据类型及其包装类,Stirng三种是传值
其它的引用数据类型是传引用.传的是变量所指向的对象的地址
当赋值操作时,内存会存在多个"value"就是传值.
只有一个"value",有多个引用指向它.就是传引用.
posted @
2007-10-30 22:45 杨之廷 阅读(335) |
评论 (0) |
编辑 收藏
摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。
目录:
一、术语session
二、HTTP协议与状态保持
三、理解cookie机制
四、理解session机制
五、理解javax.servlet.http.HttpSession
六、HttpSession常见问题
七、跨应用程序的session共享
八、总结
参考文档
一、术语session
在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。
session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 ①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。
然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者 “一个POP3 session”③。
而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session 里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。
鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。
在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥
二、HTTP协议与状态保持
HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。
然而聪明(或者贪心?)的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。
让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
三、理解cookie机制
cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。
正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。
而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。
cookie的内容主要包括:名字,值,过期时间,路径和域。
其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔来做比。
路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。
路径与域合在一起就构成了cookie的作用范围。
如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。
下面就是一个goolge设置cookie的响应头的例子
HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html
这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分
浏览器在再次访问goolge的资源时自动向外发送cookie
使用Firefox可以很容易的观察现有的cookie的值
使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。
IE也可以设置在接受cookie前询问
这是一个询问接受cookie的对话框。
四、理解session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单
<form name="testform" action="/xxx">
<input type="text">
</form>
在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。
实际上这种技术可以简单的用对action应用URL重写来代替。
在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。
恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
五、理解javax.servlet.http.HttpSession
HttpSession是Java平台对session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。
首先,Weblogic Server提供了一系列的参数来控制它的HttpSession的实现,包括使用cookie的开关选项,使用URL重写的开关选项,session持久化的设置,session失效时间的设置,以及针对cookie的各种设置,比如设置cookie的名字、路径、域, cookie的生存时间等。
一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用, Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。
复制严格说来不算持久化保存,因为session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进程中,这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。
cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。
cookie的路径对于web应用程序来说是一个非常重要的选项,Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。
关于session的设置参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869
六、HttpSession常见问题
(在本小节中session的含义为⑤和⑥的混合)
1、session在何时被创建
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。
由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
2、session何时被删除
综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)
3、如何做到在浏览器关闭时删除session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
4、有个HttpSessionListener是怎么回事
你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。
5、存放在session中的对象必须是可序列化的吗
不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。
6、如何才能正确的应付客户端禁止cookie的可能性
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL,具体做法参见[6]
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770
7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。
8、如何防止用户打开两个浏览器窗口操作导致的session混乱
这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。
9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue
做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。
10、为什么session不见了
排除session正常失效的因素之外,服务器本身的可能性应该是微乎其微的,虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过;浏览器插件的可能性次之,笔者也遇到过3721插件造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。
出现这一问题的大部分原因都是程序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。
七、跨应用程序的session共享
常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。
然而按照Servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。
首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从 Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。
根据这个特性,我们可以推测Tomcat中session的内存结构大致如下。
笔者以前用过的iPlanet也采用的是同样的方式,估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器,解决的思路很简单,实际实行起来也不难。要么让所有的应用程序共享一个session id,要么让应用程序能够获得其他应用程序的session id。
iPlanet中有一种很简单的方法来实现共享一个session id,那就是把各个应用程序的cookie路径都设为/(实际上应该是/NASApp,对于应用程序来讲它的作用相当于根)。
<session-info>
<path>/NASApp</path>
</session-info>
需要注意的是,操作共享的session应该遵循一些编程约定,比如在session attribute名字的前面加上应用程序的前缀,使得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo"),以防止命名空间冲突,导致互相覆盖。
在Tomcat中则没有这么方便的选择。在Tomcat版本3上,我们还可以有一些手段来共享session。对于版本4以上的Tomcat,目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段。
我们再看一下Weblogic Server是如何处理session的。
从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/,这是不是意味着在Weblogic Server中默认的就可以共享session了呢?然而一个小实验即可证明即使不同的应用程序使用的是同一个session,各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下
对于这样一种结构,在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量,比如使用文件、数据库、JMS或者客户端 cookie,URL参数或者隐藏字段等手段,还有一种较为方便的做法,就是把一个应用程序的session放到ServletContext中,这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,
应用程序A
context.setAttribute("appA", session);
应用程序B
contextA = context.getContext("/appA");
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");
值得注意的是这种用法不可移植,因为根据ServletContext的JavaDoc,应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通过。
那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢?原来是为了SSO,凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点,修改首先登录的那个应用程序的描述符weblogic.xml,把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录,即使是反过来,先访问cookie路径为/的应用程序,再访问修改过路径的这个,虽然不再提示登录,但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM,因为浏览器和web服务器对basic认证方式有其他的处理方式,第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization,你可以修改所附的示例程序来做这些试验。
八、总结
session机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。
摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。
posted @
2007-09-26 16:25 杨之廷 阅读(600) |
评论 (0) |
编辑 收藏
一、window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+
二、基本语法:
window.open(pageURL,name,parameters)
其中:
pageURL 为子窗口路径
name 为子窗口句柄
parameters 为窗口参数(各参数用逗号分隔)
三、示例:
<SCRIPT>
<!--
window.open ('page.html','newwindow','height=100,width=400,top=0,left=0,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no')
//写成一行
-->
</SCRIPT>
脚本运行后,page.html将在新窗体newwindow中打开,宽为100,高为400,距屏顶0象素,屏左0象素,无工具条,无菜单条,无滚动条,不可调整大小,无地址栏,无状态栏。
请对照。
上例中涉及的为常用的几个参数,除此以外还有很多其他参数,请见四。
四、各项参数
其中yes/no也可使用1/0;pixel value为具体的数值,单位象素。
参数 | 取值范围 | 说明
| |
alwaysLowered | yes/no | 指定窗口隐藏在所有窗口之后
alwaysRaised | yes/no | 指定窗口悬浮在所有窗口之上
depended | yes/no | 是否和父窗口同时关闭
directories | yes/no | Nav2和3的目录栏是否可见
height | pixel value | 窗口高度
hotkeys | yes/no | 在没菜单栏的窗口中设安全退出热键
innerHeight | pixel value | 窗口中文档的像素高度
innerWidth | pixel value | 窗口中文档的像素宽度
location | yes/no | 位置栏是否可见
menubar | yes/no | 菜单栏是否可见
outerHeight | pixel value | 设定窗口(包括装饰边框)的像素高度
outerWidth | pixel value | 设定窗口(包括装饰边框)的像素宽度
resizable | yes/no | 窗口大小是否可调整
screenX | pixel value | 窗口距屏幕左边界的像素长度
screenY | pixel value | 窗口距屏幕上边界的像素长度
scrollbars | yes/no | 窗口是否可有滚动栏
titlebar | yes/no | 窗口题目栏是否可见
toolbar | yes/no | 窗口工具栏是否可见
Width | pixel value | 窗口的像素宽度
z-look | yes/no | 窗口被激活后是否浮在其它窗口之上
window.showModalDialog使用手册
基本介绍:
showModalDialog() (IE 4+ 支持)
showModelessDialog() (IE 5+ 支持)
window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框。
window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。
使用方法:
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])
参数说明:
sURL--
必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
vArguments--
可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
sFeatures--
可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
1.dialogHeight :对话框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。
2.dialogWidth: 对话框宽度。
3.dialogLeft: 离屏幕左的距离。
4.dialogTop: 离屏幕上的距离。
5.center: {yes | no | 1 | 0 }:窗口是否居中,默认yes,但仍可以指定高度和宽度。
6.help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。
7.resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认no。
8.status: {yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9.scroll:{ yes | no | 1 | 0 | on | off }:指明对话框是否显示滚动条。默认为yes。
下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10.dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
11.edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12.unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。
参数传递:
1.要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:
-------------------------------
parent.htm
<script>
var obj = new Object();
obj.name="51js";
window.showModalDialog("modal.htm",obj,"dialogWidth=200px;dialogHeight=100px");
</script>
modal.htm
<script>
var obj = window.dialogArguments
alert("您传递的参数为:" + obj.name)
</script>
-------------------------------
2.可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:
------------------------------
parent.htm
<script>
str =window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");
alert(str);
</script>
modal.htm
<script>
window.returnValue="http://www.51js.com";
</script>
币种定义部分
var psAddStr="ProcessID="+ProcessID+"&AddFlag="+isAddFlag+"&BZBH="+vsBZBH+"&BZMC="+vsBZMC+"&BZFH="+vsBZFH+"&JD="+vsJD;
var Result=window.showModalDialog("addSave.asp?"+psAddStr,'',"dialogHeight:250px;dialogWidth:250px;status:no;");
posted @
2007-09-21 11:30 杨之廷 阅读(110) |
评论 (0) |
编辑 收藏