一个老鸟的java学习心得
目录
第一篇:一个老司机的心得第二篇:一个老业务员的心得第三篇:java学习心得笔记第四篇:java学习心得第五篇:关于java学习的一点心得体会更多相关范文正文
第一篇:一个老司机的心得
一个老司机的心得
1)当你在野外开车时,突然从路旁窜出一行人,这时候如果你躲避行人,你就会 车毁人亡,否则你就会将行人碾过。你怎么办?
答:轧死他,你的命比他值钱
2)在正常行使过程中,如果大家的车速假定都是50公里/小时,你的车速应该是多少?
答:略大于50公里/小时,因为其它车辆超你的可能性小。
3)如何躲避十字路口的?
答:过十字路口时先跟在一个比你大的车后,绿灯一亮,开车就跑。
4)如何躲避电子眼(电子)的监控?
答:按照中国的交通法,十字路口红灯可以右转向,你闯红灯时要在靠右的慢行道或者逆道行使。
5)你违章被抓住了怎么办?
答:如果你还没下车,先观察地形,把几个车门都从里面锁好,看能否跑掉。如果跑不掉,你就把执照给小,千万别和他纠缠,然后找关系要出来。
6)在野外遇到查车的怎么办?
答:你要看见是提着冲锋枪查车的,你就老老实实下来接受检查。如果是设卡查车乱罚款的,你先看看他们是什么车辆,能不能追上你,减速打右转向灯,假装要停车接受检查,骗过后加油就跑,一般不会追你。
7)有人投诉你的车违章怎么办?
答:死不认帐。
8)遇见拦你车搭乘车怎么办?
答:别给他停。下次你违章被他抓住一样会被罚款,他不会和你交朋友的。
9)遇见同方向行使的警车开道的车队怎么办?
答:不要超,停车去解个手。
10)遇见前面同方向有个大车(满载)不给你让路怎么办?
答:紧跟其后,找准机会,超过它后你用车压住他的车,待上大坡时你减速,直到让他一挡起步。
11)如果在十字路口你走眼误闯红灯过线了怎么办?
答:紧急刹车,只要后轮不过线,电子眼不会拍摄。
12)五座小车哪个位置最安全?
答:驾驶员位。
13)你把车交给无证人员驾驶,出了点小车祸怎么办(你在车上)?
答:不管你有理无理,停车下来先和对方大吵大骂,迷惑对方,转移他的注意力,待交警来后你把执照交上去,多数情况对方不会注意,如果对方发现,你就死不认帐。
14)公路限速60公里/小时,你高速行使时遇见紧急情况,紧急刹车后造成事故,刹车印痕很长,交警来处理时问你行使车速,你怎么回答?
答:大约60公里/小时的速度行使,主要是刹车不太好,再加上驾驶技术欠佳。
15)你在野外农村撞死了农民怎么办?
答:如果农民确已死亡,你要快速搭乘其它车辆离开出事地点,向保险公司和交通部门报案,再派一个朋友去帮你处理后事。你千万不能去出事地点,农民家属会打死你的。你可以说你受到刺激,也去住院检查。
16)你在野外农村撞死了农民的牲畜怎么办?
答:只要汽车还能开,能跑多远就跑多远,因为一头猪的价格要2014多元,要是一头牛,没个万儿八千的下不来,因为农民会说他的牛是种牛,肚子里还有牛崽等等。
17)你在野外汽车抛锚了,过路车又不给你停怎么办?
答:去路边捡些石头块,横挡在路上,手里再拿出200元钱示意,会有人帮你的。
18)如果你的车行使在野外没油了怎么办?
答:拦一辆大车,从他的车里用管吸出几升油即可,70号油不要紧。不要拦小车,一般小车是不能抽油的。
19)野外路上遇到有人搭车怎么办?
答:最好不要带。你又不知他是干什么的,万一要是贩卖大烟的呢。
20)连续下山,刹车片过热引起制动不灵怎么办?
答:停下来,自然冷却。千万不要用水冷却。
21)夏日连续上山爬坡,车温过高但你又不想停车,怎么办?
答:把空调关掉,车窗打开,把暖气开到最大,风门也开到最大,几分钟车即可降温。
22)普通野外三级公路,公路两边都有自行车和行人,如何高速行使?
答:尽可能占用逆向道行使,因为同方向的自行车等看不见你。
23)崎岖山路如何高速行使?
答:拐弯要加油。(经验丰富者)
24)如何在普通公路上超越比你性能优越的车?
答:紧跟其后,在同方向车多的情况时退档加速超越,不过你要胆大车技好。
25)什么情况下最好不要超车?
答:对面来的车比你大,如果撞击你倒霉。
26)夏天行使汽车要注意哪些?
答:前轮胎气压不能大,防止高速爆胎。
27)行车与时间的关系?
答:晚上8--10点要注意地方牌照的公用小车,这时候他们可能刚喝完酒,横冲直撞。凌晨3--5点,要注意过境公路上的长途汽车,司机可能在打磕睡
第二篇:一个老业务员的心得
一个老业务员的心得体会
业务是从市场上学出来的,不是从书里学出来的我收藏过一篇 一个老业务员的自白 的文章拿出来和大家分享下,希望对大家有所帮助:
1、业务员和客户聊天的时候哪些话题不需要聊太多关于技术和理论的话题,需要的是今天的新闻呀、天气呀等话题。因此,业务员在日常的时候必须多读些有关经济、销售方面的书籍、杂志,尤其必须每天阅读报纸,了解国家、社会消息、新闻大事,这往往是最好的话题,这样我们在拜访客户时才不会被看成孤陋寡闻、见识浅薄。
2、关于业务员晚上的四个小时。一个业务员的成就很大程度上取决于他晚上那四个小时是怎样过的。最差的业务员晚上就抱着个电视看,或者在抱怨,出去玩等。这样的业务员没出息。一般的业务员去找客户应酬,喝酒聊天。这样的业务员会有单,但我个人认为难有很高的成就。好一点的业务员晚上整理资料,分析客户,做好计划等。这样的业务是一个好业务,应该有前途。最好的业务员我认为是在做完好业务员的工作后还坚持看一个小时的书。我觉得这样的业务很有出息,以后有机会可以做老板。
业务是从市场上学出来的,不是从书里学出来的我收藏过一篇 一个老业务员的自白 的文章拿出来和大家分享下,希望对大家有所帮助:
3、关于业务员本身。很多人觉得,业务员最好身材高大,英俊潇洒。业务员一定要口才好,能说会道,嘴里能吐出油来才叫口才好。业务员一定要会抽烟,身上随时带着烟,逢人就派。业务员一定要会喝酒,白酒,啤酒千杯不倒。其实我感觉这些都不是重要的。就我个人而言,我身高不到160mm,刚开始跑业务时心里很自卑,说话都不流畅,更别说口才好了。我是从来不抽烟的,喝酒我最多一瓶啤酒,多点就醉了。可是勤能补拙,我刚跑业务时,在惠州,刚开始三个月,我拿几件衣服就到东莞的弟弟厂里一跑就是几天。一个工业区,一个工业区的跑。就这样,我走了三个月,客户也跑下了几个,可是皮鞋也烂了一双,人黑的像黑碳头一样。我现在自己开工厂了,我经常对业务员,头三个月过的是不是人的日子的,熬过后就可以了。所以业务的办公室在厂外。 关于找客户
做业务刚进公司的头三个月是考验业务员能否成功的最关键的三个月,这三个月可以说是影响了业务员以后的业务工作的。这之中第一个面对的就是如何找到客户的问题,关于怎样寻找目标客户。一般来说新业务员进到一个新公司后,在熟悉到1个星期左右的产品知识就要自己找客户去拜访了。如果开始没有业务经理或者老板提供客户资源的话,可以通过以下方法去找客户。
1、黄页,一般公司都有很多黄页的,如《深圳黄页》等。我们可以按照上面的分类等找到我 们的原始目标客户。现在深圳也有好多专业类的行业黄页,如家电黄页,玩具黄页等,业务员最好找到这样的黄页来收集第一手资料。这些黄页在一般大的图书馆都有。可以拿个本子去那里抄就可以了。
2、浏览招聘广告,就象在深圳,《深圳特区报》每天都有大量的招聘广告,还有《南方都市报》每个星期一都有招聘广告,我们可以通过阅览的招聘广告来获得我们想要的客户。我们也可以去附近的招聘市场看看,一般的招聘市场会在门口贴出每天的招聘单位的名称和招聘工种我们也可以通过他招聘的工种来分析他是做什么的,这样就可以找到我们要的客户了。还有我们可以去一些大的工业区附近转转,现在几乎所有的厂都招工,也可以通过他们门口的招工广告找到的。我们也可以上网看招聘网站,如卓博招聘网等。
从招聘广告中找的客户的好处是第一可以找到很多新的客户,因为有很多新的厂,他或者刚开,或者刚搬过来,如果我们第一个先找到他,那就是捷足先登了。还有,一般有能力大量招工的厂家生意都比较好,对以后业务做成功后的货款回收也相对有点信心。
3、网络搜索。我们可以通过关键字去搜索,如在百度输入我们要找的客户的生产产品的名字,我们可以找到大把的客户。我们也可以通过专业的网站来找客户,如阿里巴巴,如慧聪等等。这样我们可以找到很多客户的名单了。而且还可以找到老板的手机号码和老板的姓名等。
4、我们也要经常上街找客户,我们去逛商场,我一般会到家电商场去看看,他们都有包装的,或者有品牌和公司的名称,我们可以记录下来,回去上网找就可以了。我们可以通过商场的产品的销售来判断一个客户的经营情况来的。这从侧面也反映了他的一个经济实力。 5、但我个人认为最好的找客户的方法是通过交际网络的相互介绍来发展客户。以后做业务讲究资源共享的时代。例如你是做电线的,我是做插头的,他是做电阻的。我们同时做一个音响的客户。如果我们都可以资源共享,把好的客户都互相介绍,这样做进去一个客户就非常容易和省心。而且我们的客户因为大家互相看着,客户一有什么风吹草动.大家可以提防,风险不就低很多了吗。
6、还有个最好的办法是客户介绍客户,这是成功率最高的。厉害的业务员在有了几个原始客户以后,就会认真服务好这几个客户,和他们做朋友。等到熟悉了,就开口让他们介绍同行或者朋友给你。这时候不要让他们给你名单就好了,名单那里都可以找到,最主要是要让他帮你打个电话。如果他帮你打了个推荐电话,好过你打100个电话。你以后就主要服务好他介绍的客户,然后也依次类推的让这个新客户介绍下去,那样你就可以很轻松的找到你的客户网络拉
所以我们是有很多方法来找到我们想要的客户的,只要我们要用心。业务员的身上无论什么时候都要有三个东西在身上,除了冲凉的时候,这三个东西是:笔,小笔记本,名片。别人都说业务员有8个眼睛的,也是很有道理的,生活中处处留心,就可以找到很多商机。 关于打电话
我们找到客户之后,第二个问题就是要想着怎样打电话约客户了。这里面也有一些细节的。注意一下就可以了。
1、很多人打电话都会遇到这样的情况。客户还没有听完我们的介绍,就说不要不要,接着就啪的一生挂电话了。还有你说要去拜访他,他说没空,让你传真资料给他,或者把资料放到门卫室去。我们千万不要传真资料和放到保安室给他,没用的。遇到这样的情况我开始就很郁闷,后来我就这样想,可能采购小姐今天一上班就给老板骂了,不高兴所以才拒绝我,或者想可能采购小姐今天和男朋友吵架了,所以不理我。没关系,我下次再找你好了。我很多客户都是打了好多次电话才得到约见的,有时就是这么奇怪,采购小姐昨天还说不要,今天再打就可以让你带样品去见她了。所以生意的成功往往就是看你坚持不坚持了。 2、无论你的业务技巧多么熟练,我觉得打电话是还是要想一想将要讲的内容比较好,不要一拿起电话就聊。因为我们会聊着聊着就忘记了一些本来要讲的内容,往往刚挂掉电话又要打多一次。搞的大家都不好。对于刚做业务的朋友最好用纸写下来。这样会讲的比较有条理。 3、我觉得站着打电话比较好点。因为人站着的时候我感觉注意力比较集中,会比较认真,还有站着的时候中气十足,讲的话声音比较好听。大家不信试试看。无论你刚刚受了多大的气,打电话时最好带着微笑。这样气氛比较轻松,客户会感觉的到的。做业务本来就是受气的活,可是我们的客户没必要和你分担。
4、我们不要等到有求于客户的时候才打电话给他们。我们在平时的时候要经常给他们打电话,聊聊天,问候问候也好。直到他一听到声音就知道是我为止。最好能让他惦记着你。做业务就像谈恋爱一样。我们不能约了一次会后就指望别人能嫁给你。采购是很健忘的,我们要不断的提醒他。 初拜访客户
1、推销前的准备、计划工作,决不可疏忽轻视,有备而来才能胜券在握。准备好样品,目录书、笔和笔记本等。见客户之前先想想开场白、要问的问题、该说的话、以及可能的回答。
平时对与公司产品有关的资料、说明书、广告等,均必须努力研讨、熟记,同时要收集竞争对手的广告、宣传资料、说明书等,加以研究、分析,以便做到“知己知彼”,如此才能真正知己知彼.2、准时赴约——迟到意味着:“我不尊重你的时间”。迟到是没有任何借口的,假使无法避免迟到的发生,你必须在约定时间之前打通电话过去道歉,我相信提前出门是避免迟到的唯一方法。
3、服装不能造就完人,但是初次见面给的人印象,90%产生于服装。礼节、仪表、谈吐、举止是人与人相处的好坏印象的来源,销售代表必须多在这方面下功夫。我不喜欢我的业务员穿着红色绿色的t衬衣等去见我的客户。我起码要求是衬衣。还有公文包一定是皮的。 4、我们不可能与拜访的每一位客户达成交易,他应当努力去拜访更多的客户来提高成交的百分比。在拜访客户时,我们应当信奉的一个原则是“即使跌倒也要抓一把沙”。意思是,销售代表不能空手而归,即使你拜访的哪个暂时没有需求,不能成交。也要想办法让他帮你介绍一位新客户。
5、对客户而言。要经常留意客户喜欢的话题和他的爱好,他喜欢的就多跟他聊些。留意他的一举一动。你就可以投其所好拉。谈话的结果不重要,过程的气氛很重要。我们在和采购聊天的时候,往往很注意谈话的内容,老是说没话题。其实我们要注意到我们谈话的过程和气氛。如果我们哪天聊的很愉快,和融洽,我们的感情就会很亲近。在许多天后,我们往往回忘记了当时谈的是什么,只记得哪天我们聊得很好。其实采购也一样。价格我们会有报价单给他,品质我们有品质承认书给他,交期我们会盖章签名回传给他。所以我们只要和业务之外的事情就可以了,聊他感兴趣的问题最好。 如何维护客户
1、业务员在做到应该钓鱼,不是洒网。跑业务时最有效和舒服的做法是用钓鱼法。就像我们刚开始追女孩子时,难道我们会同时追几个女孩子,然后在博他有一个成吗吗。我们往会看准一个,竭而不舍的追求她,直到成功吧。我自己是这样跑业务的。我会选准一个行业,比如我要做耳机行业,我会挑行业里的3个左右认认真真的去攻他,直到做进去为止,以后其他的就很好做了。这样等你在耳机行业里占到80%的份额。我们再转到别的行业,复制它。就像钓鱼一样,看准大的。一条一条的钓,很舒服。胆大,心细,脸皮厚。我们年轻的时候,追女孩子,大一点的告诉我们的经验就是:胆大,心细,脸皮厚。其实做业务就像追女孩子一样的。
2、据估计,有80%的业务之所以完成,是由于交情关系。现在竞争都很激烈,在同样质量,同样价格,同样服务等的情况下,你要竞争过对手,只有凭交情了,如果你比对手更用心的对待客户,和朋友结成朋友关系。这样谁还能抢走你的单?所以你把时间花在什么地方,你就得到什么。所以说交情是个宝。
3、一定要热情,热情可以感染客户的。可能我们有很多业务员刚开始会非常热情,可是等到你做到一定的成绩就会变成老油条了,失去了往日的热情,有时候感觉反而单没那么好做了,你会以过分热情而失去某一笔交易,但会因热情不够而失去一百次交易。热情远比花言巧语更有感染力。
4、一定要有个试用期。一个客户做下来,就像男女结婚一样。发现客户就像我们发现一个心仪的梦中情人。从打电话到下单就像开始送情书到订婚那么漫长。到真正结婚了,都还要度完蜜月才可以认认真真的过日子。所以我们和客户也要度度蜜月,我们不要一下子就做的很大。一见钟情而结婚的新鲜感过后很难维持的。我们都应该给点时间客户和我们。互相考察一下信用,服务等等。 关于成交
1、很多业务员开始做业务的时候,往往冲劲很大,找到客户,送了样品,报了价就不知道怎么办了,往往前功尽弃。其实你应该不断的问他,你哪个单什么时候下呀(先假设已经成交),不断的问他,知道有结果为止。其实,采购就是等我们问他呢。会哭的孩子有奶吃。就像孩子不哭,我们怎么知道他饿了呢?所以我们要要求客户购买。然而,80%的业务员都
没有向客户提出成交要求。
2、如果未能成交,销售代(本站:)表要立即与客户约好下一个见面日期,如果在你和客户面对面的时候,都不能约好下—次见面的时间,以后要想与这位客户见面可就难上加难了。 3、我的感觉是,做业务要坚持追踪,追踪、再追踪,如果要完成一件业务工作需要与客户接触5至10次的话,那你不惜一切也要熬到那第10次倾听购买信号—如果你很专心在听的话,当客户已决定要购买时,通常会给你暗示。倾听比说话更重要。
做业务就是:以成交为目的而开展的一系列活动。虽然成交不等于一切,但没有成交就没有一切。 关于收款
1、做业务不要爱面子。业务做下来了,到收款的时候,很多人会想,我跟采购那么熟,一天到晚去追他的款感觉不好意思。所以就很少追款或者追几次没追到就不追了。其实我们也是要拿到货款才有提成拿呀。欠债还钱,天经地义的,如果你给他欠的太多,你的生意还做不长久呢。我一般追款,不是求他安排,而是说。 **先生,你星期3安排货款给我,我哪天下午去拿。他有时会说哪天不行,那我就说,那就星期二罗,他往往就说星期三行了。 2、对自己而言,在做客户之前,应该细心的去了解客户的一切。比如他之前和谁做的业务,也就是你的竞争对手是谁,知道了这一点你就可以报价和做出对策。了解客户为什么会想和你做生意。如果是别人不肯供货给他,那我们就可以要求他做现金。他肯定会赖帐。如果是对手的原因,例如质量不好,价钱高,服务不好。你就可以作相应的对策去应付他。如果是你在某方面做的比对手好而令到他跟你做,那你以后就知道怎么做了。
3、预防客户的拖款最好的办法是和客户成交之前的调查。我们要认真的考察客户的一切信息,包括他的员工工资水准,发工资准时否,厂房是自己的还是租的,老板是那里的。生产的东西是在中国卖还是外销。最好是要认识客户的一些老供应商,这样可以向他们了解客户的的信用情况。书嘛,多看看是有必要的,平时抽空去书店看看,书店关于业务方面的书很多
第三篇:java学习心得笔记
j2ee学习笔记
注:框架可以用word菜单中的 “视图/文档结构图” 看到
j2ee模式
value object(值对象)用于把数据从某个对象/层传递到其他对象/层的任意java对象。
通常不包含任何业务方法。
也许设计有公共属性,或者提供可以获取属性值的get方法。
jsp
1.jsp的基础知识
__
_____ |directive(指令)
| |-- scripting (脚本)
jsp -------| |__ action(动作)
|
|_____template data :除jsp语法外,jsp引擎不能解读的东西
1)在jsp中使用的directive(指令)主要有三个:
a) page指令
b) include指令
c) taglib指令
在jsp的任何地方,以任何顺序,一个页面可以包含任意数量的page指令
2)scripting(脚本)包括三种类型
a) <%!declaraction%>;
b) <%scriptlet %>;
c) <%= expression%>;
3)action(动作)
标准的动作类型有:
a)<jsp:usebean>;
b)<jsp:setproperty>;
d) <jsp:getproperty>;
e) <jsp:param>;
f) <jsp:include>;
g) <jsp:forward>;
h) <jsp:plugin>;
1. 注释: <% -----jsp comment-------%>;
<! -----html comment-------%>;
2. <%@ page session = “true”import =”.*” %>;
session可以不赋值,默认为true,如果session=”false”,则在jsp页面中,隐含的变量session就不能使用。
3. 请求控制器结构(request controller)
也被称之为jsp model 2 architecture
这种途径涉及到使用一个servlet或一个jsp作为一个应用程序或一组页面的入口点。
为创建可维护的jsp系统,request controller是最有用的方式之一。
不是jsp,而是java类才是放置控制逻辑的正确的地方。
请求控制器的命名模式为:
请求控制器类的命名模式为: xxxrequestcontroller
2.jsp中的javabean
jsp三种bean的类型
1) 页面bean
2) 会话bean
3) 应用bean
大多数的系统会使用一个会话bean来保持状态,而对每一个页面使用一个页面bean 来对复杂的数据进行表示。
页面bean是一个模型,而jsp是一个视图。
3.custom tag
bean是信息的携带者,
而tag更适用于处理信息。
标记库包含一个标记库描述符(tld)和用于实现custom tag的java类
在翻译阶段,jsp容器将使用tld来验证页面中的所有的tag是否都被正确的使用。
标记处理程序只是一个简单的适配器,而真正的逻辑是在另一个类中实现的,标记处理程序只是提供了一个供其他的可复用的类的jsp接口
servlet
1.servletconfig
 一个servletconfig对象是servlet container在servlet initialization的时候传递给servlet的。
servletconfig包涵 servletcontext 和 一些 name/value pair (来自于deployment descriptor)
 servletcontext接口封装了web应用程序的上下文概念。
2.会话跟踪
1) session
 当一个client请求多个servlets时,一个session可以被多个servlet共享。
 通常情况下,如果server detect到browser支持cookie,那么url就不会重写。
2) cookie
 在java servlet中,如果你光cookie cookie = new cookie(name,value)
那么当用户退出browser时,cookie会被删除掉,而不会被存储在客户端的硬盘上。
如果要存储 cookie,需加一句axage(200)
 cookie是跟某一个server相关的,运行在同一个server上的servlet共享一个cookie.
3) url rewriting
在使用url rewriting来维护session id的时候,每一次http请求都需要encodeurl()
典型的用在两个地方
1) t(“form action=” ”);
t(deurl(“sessionexample”));
t(“form action=” ”);
t(“method = get>;”);
2) t(“<p>;<a href=” ”);
t(deurl(“sessionexample?database=foo&datavalue=bar”));
tln(“” >;url encoded </a>;”);
3.singlethreadmodel
默认的,每一个servlet definition in a container只有一个servlet class的实例。
只有实现了singlethreadmodel,container才会让servlet有多个实例。
servlet specification上建议,不要使用synchronized,而使用singlethreadmodel。
singlethreadmodel(没有方法)
保证servlet在同一时刻只处理一个客户的请求。
singlethreadmodel是耗费资源的,特别是当有大量的请求发送给servlet时,singlethreadmodel的作用是使包容器以同步时钟的方式调用service方法。
这等同于在servlet的service()方法种使用synchronized.
single thread model一般使用在需要响应一个heavy request的时候,比如是一个需要和数据库打交道的连接。
2. 在重载servlet地init( )方法后,一定要记得调用( );
3. the client通过发送一个blank line表示它已经结束request
而the server通过关闭the socket来表示response已结束了。
4. 一个http servlet可以送三种东西给client
1) a single status code
2) any number of http headers
3) a response body
5. servlet之间信息共享的一个最简单的方法就是
roperties()(“key”,”value”);
6. post和get
post:将form内各字段名称和内容放置在html header内传送给server
get:?之后的查询字符串要使用urlencode,经过urlencode后,这个字符串不再带有空格,以后将在server上恢复所带有的空格。
get是web上最经常使用的一种请求方法,每个超链接都使用这种方法。
7. 就是web applicatin 的deployment descriptor
作用有:组织各类元素
设置init param
设置安全性
8. request dispatcher用来把接收到的request forward processing到另一个servlet
要在一个response里包含另一个servlet的output时,也要用到request dispatcher.
9. servlet和jsp在同一个jvm中,可以通过serveltcontext的
setattribute( )
getattribute( )
removeattribute( )
来共享对象
10. 利用arameter( )得到的string存在字符集问题。
可以用strtitle = arameter(“title”);
strtitle = new string(ytes(“8859-1”),”gb2312”);
如果你希望得到更大得兼容性
string encoding = haracterencoding();
//确定application server用什么编码来读取输入的。
strtitle = new string(ytes(encoding),”gb2312”);
xml
1.xml基础知识
1. 一个xml文档可以分成两个基本部分:
首部( header )
内容( content )
2. xml名字空间规范中指定:
xml文档中的每一个元素都处在一个名字空间中;如果没有指定的名字空间,缺省的名字空间就是和该元素相关联的名字空间。
3. a document that is well-formed obeys all of the rules of xml documents (nested tags, etc.)
" if a well-formed document uses a document type definition (more on these in a minute), and it follows all the rules of the dtd, then it is also a valid document
4. a tag is the text between the <angle brackets>;
" an element is the start tag, the end tag,and everything (including other elements) in between
5. 标签( tags ) 实际上包含了“元素”( elements ) 和 “属性”( attributes )两部分。
用元素( elements )来描述有规律的数据。
用属性( attributes ) 来描述系统数据。
如果你有一些数据要提供给某个应用程序,该数据就可能要用到一个元素。
如果该数据用于分类,或者用于告知应用程序如何处理某部分数据,或者该数据从来没有直接对客户程序公开,那么它就可能成为一种属性。
6. cdata (读作:c data ) c是character的缩写。
er
/|
eader
/|
arser
2.webservice
2.1 webservice的基本概念
webservice是一种可以接收从internet或者intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
这种技术允许网络上的所有系统进行交互。随着技术的发展,一个web服务可以包含额外的指定功能并且可以在多个b2b应用中协作通讯。
web服务可以理解请求中上下文的关系,并且在每一个特定的情况下产生动态的结果。这些服务会根据用户的身份,地点以及产生请求的原因来改变不同的处理,用以产生一个唯一的,定制的方案。这种协作机制对那些只对最终结果有兴趣的用户来说,是完全透明的。
uddi
在用户能够调用web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件。所以,我们需要一种方法来发布我们的web服务。
uddi (universal description, discovery, and integration) 是一个主要针对web服务供应商和使用者的新项目。uddi 项目中的成员可以通过uddi business registry (ubr) 来操作web服务的调用,ubr是一个全球性的服务。
web服务供应商可以在ubr中描述并且注册他们的服务。
用户可以在ubr中查找并定位那些他们需要的服务。
uddi是一种根据描述文档来引导系统查找相应服务的机制。
uddi包含标准的“白皮书”类型的商业查询方式,
“黄皮书”类型的局部查找,以及
“绿皮书”类型的服务类型查找。
uddi利用soap消息机制(标准的xml/http)来发布,编辑,浏览以及查找注册信息。它采用xml格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
wsdl
对于商业用户来说,要找到一个自己需要使用的服务,他必须知道如何来调用。
wsdl (web services description language) 规范是一个描述接口,语义以及web服务为了响应请求需要经常处理的工作的xml文档。这将使简单地服务方便,快速地被描述和记录。
以下是一个wsdl的样例:
<?xml version="1.0"?>;
<definitions name="stockquote"
targetnamespace=""
xmlns:tns=""
xmlns:xsd1=""
xmlns:soap=""
xmlns="">;
<types>;
<schema targetnamespace=
xmlns="">;
<element name="tradepricerequest">;
<complextype>;
<all>;
<element name="tickersymbol" type="string"/>;
</all>;
</complextype>;
</element>;
<element name="tradeprice">;
<complextype>;
<all>;
<element name="price" type="float"/>;
</all>;
</complextype>;
</element>;
</schema>;
</types>;
<message name="getlasttradepriceinput">;
<part name="body" element="xsd1:tradepricerequest"/>;
</message>;
<message name="getlasttradepriceoutput">;
<part name="body" element="xsd1:tradeprice"/>;
</message>;
<porttype name="stockquoteporttype">;
<operation name="getlasttradeprice">;
<input message="tns:getlasttradepriceinput"/>;
<output message="tns:getlasttradepriceoutput"/>;
</operation>;
</porttype>;
<binding name="stockquotesoapbinding"
type="tns:stockquoteporttype">;
<soap:binding style="document"
transport=""/>;
<operation name="getlasttradeprice">;
<soap:operation
soapaction=""/>;
<input>;
<soap:body use="literal"/>;
</input>;
<output>;
<soap:body use="literal"/>;
</output>;
</operation>;
</binding>;
<service name="stockquoteservice">;
<documentation>;my first service</documentation>;
<port name="stockquoteport" binding="tns:stockquotebinding">;
<soap:address location=""/>;
</port>;
</service>;
</definitions>;
它包含了以下的关键信息:
消息的描述和格式定义可以通过xml文档中的<types>;和<message>; 标记来传送。
<porttype>; 标记中表示了消息传送机制。 (e.g. request-only, request-response, response-only) 。
<binding>; 标记指定了编码的规范 。
<service>; 标记中表示服务所处的位置 (url)。
wsdl在uddi中总是作为一个接口描述文档。因为uddi是一个通用的用来注册wsdl规范的地方,uddi的规范并不限制任何类型或者格式描述文档。这些文档可能是一个wsdl文档,或者是一个正规的包含导向文档的web页面,也可能只是一个包含联系信息的电子邮件地址。
现在java提供了一个 java api for wsdl (jwsdl)规范。它提供了一套能快速处理wsdl文档的方法,并且不用直接对xml文档进行操作,它会比jaxp更方便,更快速。
soap
当商业用户通过uddi找到你的wsdl描述文档后,他通过可以simple object access protocol (soap) 调用你建立的web服务中的一个或多个操作。
soap是xml文档形式的调用商业方法的规范,它可以支持不同的底层接口,象http(s)或者smtp。
之所以使用xml是因为它的独立于编程语言,良好的可扩展性以及强大的工业支持。之所以使用http是因为几乎所有的网络系统都可以用这种协议来通信,由于它是一种简单协议,所以可以与任何系统结合,还有一个原因就是它可以利用80端口来穿越过防火墙。
soap的强大是因为它简单。soap是一种轻量级的,非常容易理解的技术,并且很容易实现。它有工业支持,可以从各主要的电子商务平台供应商那里获得。
从技术角度来看,soap详细指明了如何响应不同的请求以及如何对参数编码。一个soap封装了可选的头信息和正文,并且通常使用http post方法来传送到一个http 服务器,当然其他方法也是可以的,例如smtp。soap同时支持消息传送和远程过程调用。以下是一个soap请求。
post /stockquote http/1.1
host:
content-type: text/xml; charset="utf-8"
content-length: nnnn
soapaction: "some-uri"
<soap-env:envelope
xmlns:soap-env=""
关。
以下是你应该回避使用的一些java特色,并且在你的ejb组件的实现代码中要严格限
制它们的使用:
1.使用static,非final 字段。建议你在ejb组件中把所有的static字段都声明为final型的。这样可以保证前后一致的运行期语义,使得ejb容器有可以在多个java虚拟机之间分发组件实例的灵活性。
2.使用线程同步原语来同步多个组件实例的运行。避免这个问题,你就可以使ejb容器灵活的在多个java虚拟机之间分发组件实例。
3.使用awt函数完成键盘的输入和显示输出。约束它的原因是服务器方的商业组件意味着提供商业功能而不包括用户界面和键盘的i/o功能。
4.使用文件访问/ 操作。ejb商业组件意味着使用资源管理器如jdbc来存储和检索数据而不是使用文件系统api。同时,部署工具提供了在部署描述器(descriptor)中存储环境实体,以至于ejb组件可以通过环境命名上下文用一种标准的方法进行环境实体查询。所以,使用文件系统的需求基本上是被排除了。
5.监听和接收socket连接,或者用socket进行多路发送。ejb组件并不意味着提供网络socket服务器功能,但是,这个体系结构使得ejb组件可以作为socket客户或是rmi客户并且可以和容器所管理的环境外面的代码进行通讯。
6.使用映象api查询ejb组件由于安全规则所不能访问的类。这个约束加强了java平台的安全性。
7.欲创建或获得一个类的加载器,设置或创建一个新的安全管理器,停止java虚拟机,改变输入、输出和出错流。这个约束加强了安全性同时保留了ejb容器管理运行环境的能力。
8.设置socket工厂被url's serversocket,socket和stream handler使用。避免这个特点,可以加强安全性同时保留了ejb容器管理运行环境的能力。
9.使用任何方法启动、停止和管理线程。这个约束消除了与ejb容器管理死锁、线程
和并发问题的责任相冲突的可能性。
通过限制使用10-16几个特点,你的目标是堵上一个潜在的安全漏洞:
10.直接读写文件描述符。
11.为一段特定的代码获得安全策略信息。
12.加载原始的类库。
13.访问java一般角色所不能访问的包和类。
14.在包中定义一个类。
15.访问或修改安全配置对象(策略、安全、提供者、签名者和实体)。
16.使用java序列化特点中的细分类和对象替代。
17.传递this引用指针作为一个参数或者作为返回值返回this引用指针。你必须使用
sessioncontext或entitycontext中的getejbobject()的结果。
java2平台的安全策略
以上所列的特点事实上正是java编程语言和java2标准版中的标准的、强有力的特色。ejb容器允许从j2se中使用一些或全部的受限制的特色,尽管对于ejb组件是不可用的,但需通过j2se的安全机制来使用而不是通过直接使用j2se的api。
java2平台为ejb1.1规范中的ejb容器所制定的安全策略定义了安全许可集,这些许可在ejb组件的编程限制中出现。通过这个策略,定义了一些许可诸如:permission,ermission,ectpermission,ritypermission,以便加强先前所列出的编程限制。
许多ejb容器没有加强这些限制,他们希望ejb组件开发者能遵守这些编程限制或者是带有冒险想法违背了这些限制。违背这些限制的ejb组件,比标准方法依赖过多或过少的安全许可,都将很少能在多个ejb容器间移植。另外,代码中都将隐藏着一些不确定的、难以预测的问题。所有这些都足以使ejb组件开发者应该知道这些编程限制,同时也应该认真地遵守它们。
任何违背了这些编程限制的ejb组件的实现代码在编译时都不能检查出来,因为这些特点都是java语言和j2se中不可缺少的部分。
对于ejb组件的这些限制同样适用于ejb组件所使用的帮助/访问(helper/access)类,j2ee应用程序使用java文档(jar)文件格式打包到一个带(代表enterprise archive)扩展名的文件中,这个ear文件对于发送给文件部署器来说是标准的格式。ear文件中包括在一个或多个ejb-jar文件中的ejb组件,还可能有ejb-jar所依赖的库文件。所有ear文件中的代码都是经过深思熟虑开发的应用程序并且都遵守编程限制和访问许可集。
未来版本的规范可能会指定通过部署工具来定制安全许可的能力,通过这种方法指定了一个合法的组件应授予的许可权限,也指定了一个标准方法的需求:如从文件系统中读文件应有哪些要求。一些ejb容器/服务器目前在它们的部署工具中都提供了比标准权限或多或少的许可权限,这些并不是ejb1.1规范中所需要的。
理解这些约束
ejb容器是ejb组件生存和执行的运行期环境,ejb容器为ejb组件实例提供了一些服务如:事务管理、安全持久化、资源访问、客户端连接。ejb容器也负责ejb组件实例整个生命期的管理、扩展问题以及并发处理。所以,ejb组件就这样寄居在一个被管理的执行环境中--即ejb容器。
因为ejb容器完全负责ejb组件的生命期、并发处理、资源访问、安全等等,所以与容器本身的锁定和并发管理相冲突的可能性就需要消除,许多限制都需要使用来填上潜在的安全漏洞。除了与ejb容器责任与安全冲突的问题,ejb组件还意味着仅仅聚焦于商务逻辑,它依赖于ejb容器所提供的服务而不是自己来直接解决底层的系统层的问题。
可能的问题
通常,ejb组件在容器之间的移植不可避免地与如下问题相关:
1.它需要依靠的受限制的特点在特定ejb容器中没有得到加强。
2.它需要依靠的非标准的服务从容器中可获得。
为了保证ejb组件的可移植性和一致的行为,你应该使用一个具有与java2平台安全
策略集相一致的策略集的容器来测试ejb组件,并且其加强了前述的编程限制。
总结
ejb组件开发者应该知道这些推荐的关于ejb组件的编程限制,明白它们的重要性,并且从组件的稳定性和可移植性利益方面考虑来遵循它们。因为这些编程限制能阻止你使用标准的java语言的特点,违背了这些编程限制在编译时不会知道,并且加强这些限制也不是ejb容器的责任。所有这些原因都使你应很小心地遵守这些编程限制,这些限制在组件的合同中已经成为了一个条款,并且它们对于建造可靠的、可移植的组件是非常重要的。
2. 优化ejb
entity bean为在应用程序和设计中描述持久化商业对象(persistent business objec ts)提供了一个清晰的模型。在java对象模型中,简单对象通常都是以一种简单的方式进行处理但是,很多商业对象所需要的事务化的持久性管理没有得到实现。entity bean将持久化机制封装在容器提供的服务里,并且隐藏了所有的复杂性。entity bean允许应用程序操纵他们就像处理一个一般的java对象应用。除了从调用代码中隐藏持久化的形式和机制外,entity bean还允许ejb容器对对象的持久化进行优化,保证数据存储具有开放性,灵活性,以及可部署性。在一些基于ejb技术的项目中,广泛的使用oo技术导致了对entity bean的大量使用,sun的工程师们已经积累了很多使用entity bean的经验,这篇文章就详细阐述的这些卡发经验:
*探索各种优化方法
*提供性能优化和提高适用性的法则和建议
*讨论如何避免一些教训。
法则1:只要可以,尽量使用cmp
cmp方式不仅减少了编码的工作量,而且在container中以及container产生的数据库访问代码中包括了许多优化的可能。container可以访问内存缓冲中的bean,这就允许它可以监视缓冲中的任何变化。这样的话就在事物没有提交之前,如果缓存的数据没有变化就不用写到数据库中。就可以避免许多不必要的数据库写操作。另外一个优化是在调用find方法的时候。通常情况下find方法需要进行以下数据库操作:
查找数据库中的纪录并且获得主键
将纪录数据装入缓存
cmp允许将这两步操作优化为一步就可以搞定。[具体怎么做我也没弄明白,原文没有具体阐述]
法则2:写代码时尽量保证对bmp和cmp都支持
许多情况下,ejb的开发者可能无法控制他们写的bean怎么样被部署,以及使用的container是不是支持cmp.
一个有效的解决方案是,将商业逻辑的编码完全和持久化机制分离。再cmp类中实现商业逻辑,然后再编写一个bmp类,用该类继承cmp类。这样的话,所有的商业逻辑都在cmp类中,而持久化机制在bmp中实现。[我觉得这种情况在实际工作中很少遇到,但是作者解决问题的思路值得学习]
法则3:把ejbstore中的数据库访问减小到最少。
如果使用bmp,设置一个缓存数据改变标志dirty非常有用。所有改变数据库中底层数据的操作,都要设置dirty,而在ejbstore()中,首先检测dirty的值,如果dirty的值没有改变,表明目前数据库中的数据与缓存的一致,就不必进行数据库操作了,反之,就要把缓存数据写入数据库。
法则4:总是将从lookup和find中获得的引用进行缓存。(cache)
引用缓存对session bean和entity bean 都是适用的。
通过jndi lookup获得ejb资源。比如datasource,bean的引用等等都要付出相当大的代价。因此应该避免多余的lookup.可以这样做:
将这些引用定义为实例变量。
从setentitycontext(session bean使用setsessioncontext)方法查找他们。setentitycontext方法对于一个bean实例只执行一次,所有的相关引用都在这一次中进行查找,这样查找的代价就不是那么昂贵了。应该避免在其他方法中查找引用。尤其是访问数据库的方法:ejbload()和ejbstore(),如果在这些频繁调用的方法中进行datasource的查找,势必造成时间的浪费。
调用其他entity bean的finder方法也是一种重量级的调用。多次调用finder()方法的代价非常高。如果这种引用不适合放在setentitycontext这样的初始化时执行的方法中执行,就应该在适当的时候缓存finder的执行结果。只是要注意的是,如果这个引用只对当前的entity有效,你就需要在bean从缓冲池中取出来代表另外一个实体时清除掉这些引用。,这些操作应该在ejbactivate()中进行。
法则5:总是使用prepare statements
这条优化法则适用于所有访问关系数据库的操作。
数据库在处理每一个sql statement的时候,执行前都要对statement进行编译。一些数据库具有缓存statement和statement的编译后形式的功能。数据库可以把新的statement和缓存中的进行匹配。然而,如果要使用这一优化特性,新的statement要必须和缓存中的statement完全匹配。
对于non-prepared statement,数据和statement本身作为一个字符串传递,这样由于前后调用的数据不同而不能匹配,就导致无法使用这种优化。而对于prepared statement,数据和statement是分开传递给数据库的,这样statement就可以和cache中已编译的statement进行匹配。statement就不必每次都进行编译操作。从而使用该优化属性。
这项技术在一些小型的数据库访问中能够减少statement将近90%的执行时间。
法则6:完全关闭所有的statement
在编写bmp的数据库访问代码时,记住一定要在数据库访问调用之后关闭statement,因为每个打开的statement对应于数据库中的一个打开的游标。
security
1.加密
对称加密
(1)分组密码
(2)流密码
常用的对称加密算法:
des和tripledes
blowfish
rc4
aes
非对称加密
常用的非对称加密算法
rsa
elgamal
会话密钥加密(对称加密和非对称加密一起使用)
常用的会话密钥加密协议
s/mime
pgp
ssl和tlsssl是在application level protocal和transport protocal之间的。
比如:http和tcp/ip之间
ssl 提供了服务器端认证和可选的客户端认证,保密性和数据完整性。
提供基于ssl方式的传输加密和认证,确保以下三种安全防护:
数据的机密性和准确性、
服务器端认证
客户端认证。
客户端认证比服务器端认证不很普遍的原因是每一个要被认证的客户都必须有一张verisign这样的ca签发的证书。
通常,在进行身份认证的时候,应当只接受一个ca,这个ca的名字包含在客户证书中。
由于不可能随意创建一个由指定ca签发的证书,所以这可以有效的防御通过伪造证书来进行的攻击尝试。
2.认证(authentication)
认证就是确定一条消息或一个用户的可靠性的过程。
1.消息摘要
md5
sha和sha-1
2.消息认证码(message authientication codes,mac)
3.数字签名
用户可以用自己的密钥对信息加以处理,由于密钥仅为本人所有,这样就产生了别人无法生成的文件,也就形成了数字签名
数字签名可以
1)保证数据的完整性
2)验证用户的身份
数字签名采用一个人的私钥计算出来,然后用公钥去检验。
hash算法 私钥加密
原报文 ――――――>;报文摘要( message digest ) ―――――>;数字签名
原报文和数字签名一起被发送到接受者那里,接受者用同样的hash算法得到报文摘要,然后用发送者的公钥解开数字签名。
比较是否相同,则可以确定报文确定来自发送者。
验证数字签名必须使用公钥,但是,除非你是通过安全的方式直接得到,否则不能保证公钥的正确性。(数字证书可以解决这个问题)
一个接受者在使用公钥(public key)检查数字签名(digital signature)的可信度时,通常先要检查收到的公钥(public key)是否可信的。
因此发送方不是单单地发送公钥(public key),而是发送一个包含公钥(public key)的数字证书(cetificate )。
4.数字证书
数字证书是一个经证书授权中心数字签名的包含公开密钥所有者信息以及公开密钥的文件。
数字证书cetificate中包括:
i. 用户的公钥(public key)
ii. 用户的一些信息,如姓名,email
iii. 发行机构的数字签名(digital signature), 用于保证证书的可信度
iv. 发行机构的一些信息
数字证书的格式遵循x.509国际标准。
注意:一个数字证书certificate并不适用于多种browser,甚至一种browser的多个版本。
数字标识由公用密钥、私人密钥和数字签名三部分组成。
当在邮件中添加数字签名时,您就把数字签名和公用密钥加入到邮件中。数字签名和公用密钥统称为证书。您可以使用 outlook express 来指定他人向您发送加密邮件时所需使用的证书。这个证书可以不同于您的签名证书。
收件人可以使用您的数字签名来验证您的身份,并可使用公用密钥给您发送加密邮件,这些邮件必须用您的私人密钥才能阅读。
要发送加密邮件,您的通讯簿必须包含收件人的数字标识。这样,您就可以使用他们的公用密钥来加密邮件了。当收件人收到加密邮件后,用他们的私人密钥来对邮件进行解密才能阅读。
在能够发送带有数字签名的邮件之前,您必须获得数字标识。如果您正在发送加密邮件,您的通讯簿中必须包含每位收件人的数字标识。
数字证书,可以是个人证书或 web 站点证书,用于将身份与"公开密钥"关联。只有证书的所有者才知道允许所有者"解密"或进行"数字签名"的相应"私人密钥"。当您将自己的证书发送给其他人时,实际上发给他们的是您的公开密钥,这样他们就可以向您发送只能由您使用私人密钥解密和读取的加密信息。
通过浏览器使用数字证书,必须先要设置浏览器软件 internet explorer 或 netscape使用此证书,才能开始发送加密或需要数字签名的信息。访问安全的 web 站点(以"https"打头的站点)时,该站点将自动向您发送他们的web站点证书。
3.ca(证书授证中心)
ca机构,又称为证书授证(certificate authority)中心,作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。ca中心为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。ca机构的数字签名使得攻击者不能伪造和篡改证书。在set交易中,ca不仅对持卡人、商户发放证书,还要对获款的银行、网关发放证书。它负责产生、分配并管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。
对证书的信任基于对根证书的信任. 例如在申请sheca的个人数字证书前,需要先下载根证书,然后再进行各类证书的申请。
下载根证书的目的:
网络服务器验证(s);安全电子邮件(e)
申请个人数字证书可以为internet用户提供发送电子邮件的安全和访问需要安全连接(需要客户证书)的站点。
1)个人数字证书
a.个人身份证书
个人身份证书是用来表明和验证个人在网络上的身份的证书,它确保了网上交易和作业的安全性和可靠性。可应用于:网上炒股、网上理财、网上保险、网上缴费、网上购物、网上办公等等。个人身份证书可以存储在软盘或ic卡中。
b.个人安全电子邮件证书
个人安全电子邮件证书可以确保邮件的真实性和保密性。申请后一般是安装在用户的浏览器里。用户可以利用它来发送签名或加密的电子邮件。
用户在申请安装完安全安全电子邮件数字证书后,就可以对要发送的邮件进行数字签名。收信人收到该邮件后,就可以看到数字签名的标记,这样就可以证明邮件肯定来自发信者本人,而不是别人盗用该帐号伪造信件,同时也保证该邮件在传送过程中没被他人篡改过任何数据。
安全电子邮件中使用的数字证书可以实现:
保密性通过使用收件人的数字证书对电子邮件加密。如此以来,只有收件人才能阅读加密的邮件,在internet上传递的电子邮件信息不会被人窃取,即使发错邮件,收件人也无法看到邮件内容。
认证身份在internet上传递电子邮件的双方互相不能见面,所以必须有方法确定对方的身份。利用发件人数字证书在传送前对电子邮件进行数字签名即可确定发件人身份,而不是他人冒充的。
完整性利用发件人数字证书在传送前对电子邮件进行数字签名不仅可确定发件人身份,而且传递的电子邮件信息也不能被人在传输过程中修改。
不可否认性由于发件人的数字证书只有发件人唯一拥有,故发件人利用其数字证书在传送前对电子邮件进行数字签名,发件人就无法否认发过这个电子邮件。
outlook express中的个人安全电子邮件证书
签名邮件带有签名邮件图标。
签名邮件可能出现的任何问题都将在本信息之后可能出现的“安全警告”中得到描述。如果存在问题,您应该认为邮件已被篡改,或并非来自所谓的发件人。
当收到一封加密邮件时,您应该可以自信地认为邮件未被任何第三者读过。outlook express 会自动对电子邮件解密, 如果在您的计算机上装有正确的数字标识。
2)企业数字证书
a.企业身份证书
企业身份证书是用来表明和验证企业用户在网络上身份的证书,它确保了企业网上交易和作业的安全性和可靠性。可应用于:网上证券、网上办公、网上交税、网上采购、网上资金转帐、网上银行等。企业身份证书可以存储在软盘和ic卡中。
b.企业安全电子邮件证书
企业安全电子邮件证书可以确保邮件的真实性和保密性。申请后一般是安装在用户的浏览器里。企业可以利用它来发送签名或加密的电子邮件。
可使用 windows xx 中的证书服务来创建证书颁发机构 (ca),它负责接收证书申请、验证申请中的信息和申请者的身份、颁发证书、吊销证书以及发布证书吊销列表 (crl)。
通常,当用户发出证书申请时,在其计算机上的加密服务提供程序 (csp) 为用户生成公钥和私钥对。用户的公钥随同必要的识别信息发送至 ca。如果用户的识别信息符合批准申请的 ca 标准,那么 ca 将生成证书,该证书由客户应用程序检索并就地存储。
4.set
安全接口层协议——ssl(se cure socketslayer),并且已经几乎成为了目前www 世界的事实标准。这一标准使用公共密钥编码方案来对传输数据进行加密,在双方之间建立一个internet 上的加密通道,从而使第三方无法获得其中的信息,其思路与目前流行的vpn方案大致相同,目的都是要保护数据不被未经授权的第三方所窃听,或即使窃听到也不知所云。但就象vpn 一样,ssl 在认证方面没有任何作为,它们都需要通过另外的手段来确认身份和建立双方彼此间的信任,然后再通过ssl 进行交易。
正是由于ssl 标准在认证方面的缺憾,所以set 才有存在的必要。set(secure electronic transactions) 规范由masterc ard 和visa 公司于1996 年发布,专家们认为set 是保证用户与商家在电子商务与在线交易中免受欺骗的重要手段。传统的信用卡交易者总在担心不诚实的店员会将自己的信用卡号码透露给他人,而在线交易也是如此,持卡者总在担心服务器端的管理员会将信用卡号码泄露出去,或者担心黑客会在管理员不知情的情况下盗取信用卡号码。事实上这些担心都是必要的,而set 标准则可以保证用户的信用卡号码只传送给信用卡公司进行认证,不会被系统管理员看到,也不会留在交易服务器的硬盘上给黑客以可乘之机。
5.pki
pki是一种易于管理的、集中化的网络安全方案。它可支持多种形式的数字认证: 数据加密、数字签字、不可否认、身份鉴别、密钥管理以及交叉认证等。pki可通过一个基于认证的框架处理所有的数据加密和数字签字工作。p ki标准与协议的开发迄今已有15年的历史,目前的pki已完全可以向企业网络提供有效的安全保障。
pki是一种遵循标准的密钥管理平台,它能够为所有网络应用透明地提供采用加密和数字签名等密码服务所必需的密钥和证书管理。pki必须具有
1)ca、
2)证书库、
3)密钥备份及恢复系统、
4)证书作废处理系统、
5)客户端证书处理系统
等基本成分,构建pki也将围绕着这五大系统来构建
一个pki由众多部件组成,这些部件共同完成两个主要功能:
1)为数据加密
2)创建数字认证。
服务器(即后端)产品是这一系统的核心,这些数据库管理着数字认证、公共密钥及专用密钥( 分别用于数据的加密和解密)。
ca数据库负责发布、废除和修改x.509数字认证信息,它装有用户的公共密钥、证书有效期以及认证功能(例如对数据的加密或对数字签字的验证) 。为了防止对数据签字的篡改,ca在把每一数字签字发送给发出请求的客户机之前,需对每一个数字签字进行认证。一旦数字认证得以创建, 它将会被自动存储于x.500目录中,x.500目录为树形结构。ldap(lightweight directory access protocol)协议将响应那些要求提交所存储的公共密钥认证的请求。ca为每一用户或服务器生成两对独立的公共和专用密钥。其中一对用于信息的加密和解密, 另一对由客户机应用程序使用,用于文档或信息传输中数字签字的创建。
大多数pki均支持证书分布,这是一个把已发布过的或续延生命期的证书加以存储的过程。这一过程使用了一个公共查询机制,x.500目录可自动完成这一存储过程。影响企业普遍接受p ki的一大障碍是不同ca之间的交叉认证。假设有两家公司,每一家企业分别使用来自不同供应商的ca,现在它们希望相互托管一段时间。如果其后援数据库支持交叉认证, 则这两家企业显然可以互相托管它们的ca,因而它们所托管的所有用户均可由两家企业的ca所托管。
* 认证机关
ca是证书的签发机构,它是pki的核心。众所周知,构建密码服务系统的核心内容是如何实现密钥管理,公钥体制涉及到一对密钥,即私钥和公钥, 私钥只由持有者秘密掌握,无须在网上传送,而公钥是公开的,需要在网上传送,故公钥体制的密钥管理主要是公钥的管理问题,目前较好的解决方案是引进证书(certificate)机制。
证书是公开密钥体制的一种密钥管理媒介。它是一种权威性的电子文档,形同网络计算环境中的一种身份证,用于证明某一主体(如人、服务器等)的身份以及其公开密钥的合法性。在使用公钥体制的网络环境中, 必须向公钥的使用者证明公钥的真实合法性。因此,在公钥体制环境中,必须有一个可信的机构来对任何一个主体的公钥进行公证,证明主体的身份以及他与公钥的匹配关系。c a正是这样的机构,它的职责归纳起来有:
1、验证并标识证书申请者的身份;
2、确保ca用于签名证书的非对称密钥的质量;
3、确保整个签证过程的安全性,确保签名私钥的安全性;
4、证书材料信息(包括公钥证书序列号、ca标识等)的管理;
5、确定并检查证书的有效期限;
6、确保证书主体标识的唯一性,防止重名;
7、发布并维护作废证书表;
8、对整个证书签发过程做日志记录;
9、向申请人发通知。
其中最为重要的是ca自己的一对密钥的管理,它必须确保其高度的机密性,防止他方伪造证书。ca的公钥在网上公开,整个网络系统必须保证完整性。
* 证书库
证书库是证书的集中存放地,它与网上"白页”类似,是网上的一种公共信息库,用户可以从此处获得其他用户的证书和公钥。
构造证书库的最佳方法是采用支持ldap协议的目录系统,用户或相关的应用通过ldap来访问证书库。系统必须确保证书库的完整性,防止伪造、篡改证书。
* 密钥备份及恢复系统
* 证书作废处理系统
* pki应用接口系统
pki的价值在于使用户能够方便地使用加密、数字签名等安全服务,因此一个完整的pki必须提供良好的应用接口系统,使得各种各样的应用能够以安全、一致、可信的方式与p ki交互,确保所建立起来的网络环境的可信性,同时降低管理维护成本。最后,pki应用接口系统应该是跨平台的。
许多权威的认证方案供应商(例如verisign、thawte以及gte)目前都在提供外包的pki。外包pki最大的问题是,用户必须把企业托管给某一服务提供商, 即让出对网络安全的控制权。如果不愿这样做,则可建造一个专用的pki。专用方案通常需把来自entrust、baltimore technologies以及xcert的多种服务器产品与来自主流应用程序供应商(如microsoft、netscape以及qualcomm)的产品组合在一起。专用pk i还要求企业在准备其基础设施的过程中投入大量的财力与物力。
7.jaas
扩展jaas实现类实例级授权
“java 认证和授权服务”(java authentication and authorization service,jaas)
在 jaas 下,可以给予用户或服务特定的许可权来执行 java 类中的代码。在本文中,软件工程师 carlos fonseca 向您展示如何为企业扩展 jaas 框架。向 jaas 框架添加类实例级授权和特定关系使您能够构建更动态、更灵活并且伸缩性更好的企业应用程序。
大多数 java 应用程序都需要某种类实例级的访问控制。例如,基于 web 的、自我服务的拍卖应用程序的规范可能有下列要求:
public static object
doas(subject subject, ilegedaction action)
throws ilegedactionexception
注意,用来保护敏感代码的方法与“java 2 代码源访问控制”(java 2 codesource access control)概述中描述的方法相同。请参阅参考资料部分以了解更多关于 jaas 中代码源访问控制和认证的信息。
jaas 中的授权
清单 4 显示一个授权请求的结果,该请求使用清单 3 中显示的 jaas 策略文件。假设已经安装了 securitymanager,并且 logincontext 已经认证了一个带有名为“admin”的 cipalexample 主体的 subject。
清单 4. 一个简单的授权请求
public class jaasexample {
public static void main(string[] args) {
...
// where authenticateduser is a subject with
// a principalexample named admin.
(authenticateduser, new jaasexampleaction());
...
}
}
public class jaasexampleaction implements privilegedaction {
public object run() {
filewriter fw = new filewriter("");
e("hello, world!");
e();
}
}
这里,敏感代码被封装在 jaasexampleaction 类中。还要注意,调用类不要求为 jaasexampleaction 类代码源授予许可权,因为它实现了一个 privilegedaction。
扩展 jaas
大多数应用程序都有定制逻辑,它授权用户不仅仅在类上执行操作,而且还在该类的实例上执行操作。这种授权通常建立在用户和实例之间的关系上。这是 jaas 的一个小缺点。然而,幸运的是,这样设计 jaas 使得 jaas 可以扩展。只要做一点工作,我们将可以扩展 jaas,使其包含一个通用的、类实例级的授权框架。
在文章开头处我已经说明了,抽象类 cy 被用于代表 jaas 安全性策略。它的缺省实现是由 cyfile 类提供。policyfile 类从 jaas 格式的文件(象清单 3 中显示的那个一样)中读取策略。
我们需要向这个文件添加一个东西为类实例级授权扩展策略定义:一个与许可权语句相关的可选关系参数。
缺省 jaas 许可权语句的格式如下:
permission <permission implementation class>; [name], [actions];
我们在这个许可权语句的末尾添加一个可选的关系参数来完成策略定义。下面是新许可权语句的格式:
permission <permission implementation class>;
[name], [actions], [relationship];
在为类实例级授权扩展 jaas 时要注意的最重要的一点是:许可权实现类必须有一个带三个参数的构造函数。第一个参数是名称参数,第二个是行为参数,最后一个是关系参数。
解析新文件格式
既然文件格式已经改变,就需要一个新的 cy 子类来解析文件。
为简单起见,我们的示例使用了一个新的 cy 子类 olicyfile,来从 xml 文件读取策略。在实际的企业应用程序中,关系数据库更适合执行这个任务。
使用 xmlpolicyfile 类代替缺省的 jaas 访问控制策略实现的最容易的方法是向 rity 属性文件添加 ider=olicyfile 条目。rity 属性文件位于 java 2 平台运行时的 lib/security 目录下。清单 5 是与 xmlpolicyfile 类一起使用的样本 xml 策略文件:
清单 5. 一个 xml 策略文件
<?xml version="1.0"?>;
<policy>;
<grant codebase="file:/d:/sample_">;
<principal classname=
"cipalexample" name="users">;
<permission classname=
"urcepermission"
name="ion"
actions="create" />;
<permission classname=
"urcepermission"
name="ion"
actions="read" />;
<permission classname=
"urcepermission"
name="ion"
actions="write"
relationship="owner" />;
<permission classname=
"urcepermission"
name=""
actions="create" />;
<permission classname=
"urcepermission"
name=""
actions="read" />;
<permission classname=
"urcepermission"
name=""
actions="write"
relationship="owner" />;
<permission classname=
"urcepermission"
name=""
actions="accept"
relationship="actionowner" />;
</principal>;
</grant>;
</policy>;
在这个示例策略文件中,任何与名为 principalexample 的用户有关的用户(subject)都可以创建并读取一个 s 实例。但是,只有创建该实例的用户才可以更新(写)它。这是第三个 permission 元素定义的,该元素包含值为 owner 的 relationship 属性。s 实例也是一样,除了相应 s 实例的所有者可以更改投标接受标志。
resource 接口
要求类实例级访问控制的类必须实现 resource 接口。该接口的 getowner() 方法返回类实例的所有者。fulfills(subject subject, string relationship) 方法被用于处理特定关系。另外,这些类使用 urcepermission 类保护敏感代码。例如,auction 类拥有下列构造函数:
public auction() {
permission permission =
new resourcepermission("ion", "create");
kpermission(permission);
}
所有者关系
resourcepermission 类的 implies(permission p) 方法是这个框架的关键。implies() 方法就等同性比较名称和行为属性。如果定义了一个关系,那么必须把受保护的类实例(resource)传递到 resourcepermission 构造函数中。resourcepermission 类理解所有者关系。它将类实例的所有者与执行代码的 subject(用户)进行比较。特定关系被委托给受保护类的 fulfills() 方法。
例如,在清单 5 中所示的 xml 策略文件中,只有 auction 类实例的所有者可以更新(写)文件。该类的 setter 方法使用清单 6 中显示的保护代码:
清单 6. 运行中的 implies(permission) 方法
public void setname(string newname) {
permission permission =
new resourcepermission("ion", "write", this);
kpermission(permission);
// sensitive code
= newname;
}
被传递到 resourcepermission 构造函数中的 this 引用代表 auction 类实现的 resource 接口。由于策略文件中列出的关系是 owner,所以 resourcepermission 类使用这个引用检查当前 subject(用户)是否拥有与实例所有者相匹配的主体。如果指定了另一个关系,那么 resourcepermission 类调用 auction 类的 fulfills(subject subject, string relationship) 方法。由 resource 实现类提供 fulfills() 方法中的逻辑。
xml 策略文件中列出的 bid 类拥有清单 7 中所示的方法(假设 bid 类实例有一个对相应 auction 类实例的引用 — auction)。
清单 7. 处理特定关系
public void setaccepted(boolean flag) {
permission permission =
new resourcepermission("ion", "accept", this);
kpermission(permission);
// sensitive code
pted = flag;
}
public boolean fulfills(subject user, string relationship) {
if( lsignorecase("auctionowner") ) {
string auctionowner = wner();
iterator principaliterator = rincipals()ator();
while(ext()) {
principal principal = (principal) ();
if( ame()ls(auctionowner) )
return true;
}
}
return false;
}
传递到 fulfills() 方法中的关系字符串是策略文件中列出的关系。在这个案例中,我们使用了“auctionowner”字符串。
缺省情况下,xmlpolicyfile 类在当前工作目录中查找名为 的文件。系统属性 cy 可以用于指定另一个不同的文件名和位置。
websphere application server 示例
除命令行示例之外,您可能还想运行这个简单的程序,该程序为了 ibm websphere application server,version 4.0.2 而被优化。
一个可运行的示例
综合这些信息,我们将运行一个简单的命令行示例。该示例程序包含三个 jar 文件:
文件包含允许实例级访问控制的 jaas 扩展框架。它还包含一个 loginmoduleexample 类,这个类从 xml 文件读取用户认证信息。用户标识和密码存储在 文件中。用户组存储在 文件中。关于 loginmoduleexample 的更多信息,请参阅参考资料部分。
该示例包含四个附加的文件:
policy
在试图运行这个示例程序之前,请确保更新了 、policy 和 文件中的路径。缺省情况下,所有的密码都是“passw0rd”。
示例如何工作
该示例程序提示输入用户标识和密码。它用 文件中的条目核对所提供的用户标识和密码。在认证了用户之后,程序设法创建一个 userprofile 类实例,修改它并从中读取。缺省情况下,userprofile 类的所有者是 jane(jane)。当 jane 登录时,三个操作全部成功。当 john(john)登录时,只有创建操作成功。当 jane 的经理 lou(lou)登录时,只有第一个和最后一个操作成功。当系统管理员(admin)登录时,操作全部成功。当然,只有当提供的 文件未被修改时,上述这些才都是真的。
示例安装
下面的安装指导假设您正在使用 jdk 1.3 并且已经把文件解压缩到 d:jaasexample 目录。通过将文件解压缩到这个目录,您可以省去一些工作;否则您就必须使用正确的路径名修改 policy 和 策略文件。
下面是运行该示例需要做的工作:
下载这个示例的源文件。
把 和 复制到 jdk jrelibext 目录(即 d:jdk1.3jrelibext)。
向位于 jdk 的 jrelibsecurity 目录(即 d:jdk1.3jrelibsecurity)中的 rity 文件的末尾添加下面的字符串:ider=olicyfile。
执行 文件。
结束语
类实例级授权把访问控制分离到一个通用框架(该框架使用基于所有权和特定关系的策略)中。然后管理员可以在应用程序的生命周期内更改这些策略。用这种方法扩展 jaas 减少了您或另一个程序员必须在应用程序生命周期内业务规则发生更改时重写代码的可能性。
通过将关系字符串抽象为类可以进一步扩展特定关系这个概念。不调用 resource 实现类的 fulfills(subject user, string relationship) 方法,而只要调用 relationship 实现类中定义的新 fulfills(subject user, resource resource) 方法。这样就会允许许多 resource 实现类使用相同的关系逻辑。
6.java的安全性
1. the security manager是一个application-wide object ( ritymanager)
每个java application都可以有自己地security manager,但是默认地java application没有一个security manager
可以通过下面地代码得到一个security manager
try
{
ecuritymanager(new securitymanager(“--”));
}
catch( )
{}
2.
jdbc
在 jdbc 2 开发的过程中,sql99 还处在一种变化不定的情况下。现在规范已经完成了,而且数据库厂商已经采用了部分标准。所以自然地,jdbc 规范就跟着将自己与 sql99 功能的一部分相统一。最新的 jdbc 规范已经采用了 sql99 标准中那些已经被广泛支持的功能,还有那些在五年内可能会获得支持的功能。
1. datasource
在jdbc2.0 optional package中,提供了透明的连接池(connection pooling)。
一旦配置了j2ee应用服务器后,只要用datasource获取连接(connection),连接池(connection pooling)就会自动的工作。
如果用户希望建立一个数据库连接,通过查询在jndi服务中的datasource,可以从datasource中获取相应的数据库连接。
datasource被认为是从jndi中获取的网络资源。
datasource在池中保存的对象都实现了pooledconnection接口。
当应用程序向datasource请求一个connection时,它会找到一个可用的pooledconnection对象。
如果连接池空了,它就向connectionpoolecdatasource请求一个新的pooledconnection对象
通过使用 datasource 接口 (jdbc 2.0) 或 drivermanager (jdbc 1.0) 接口,j2ee 组件可以获得物理数据库连接对象(connection)。要获得逻辑(合用的)连接,j2ee 组件必须使用以下这些 jdbc 2.0 合用管理器接口:
ectionpooldatasource 接口,该接口充当合用的 ection 对象的资源管理器连接 factory。每家数据库服务器供应商都提供该接口的实现
(例如,oracle 实现 leconnectionpooldatasource 类)。
edconnection 接口,该接口封装到数据库的物理连接。同样,数据库供应商提供其实现。
对于那些接口和 xa 连接的每一个,都存在一个 xa(x/open 规范)等价定义。
2. resultset
在jdbc2.0中,为了获得一个uptatable result,在query语句里必须包含primarykey,并且查询的内容里必须来自一个table
ltset接口中定义了三种类型的结果集
type_forward_only
type_scroll_insensitive这种类型的结果集支持双向滚动
type_scroll_sensitive
如果要建立一个双向滚动的resultset,一定要在建立statement的时候使用如下参数
statement stmt = testatement(_scroll_insensitive,
ur_read_only);
3. jdbc驱动程序
连通oracle8.1.6的jdbc
把oracle8.1.6/lib/jdbc/* copy 到 %java_home%/jre/lib/ext/*
如果光copy不ren为是没有用的。
4. 事务处理
本地事务
ection接口可以控制事务边界(即开始和结束)。
在事务开始的时候调用setautocommit( false ), 而在中止事务时调用rollback或commit()方法。这类事务叫本地事务。
分布式事务
但是,在特定的情况下,可能有多个客户(例如两个不同的servlet或ejb组件)参与了同一个事务。
或者,客户在同一个事务中可能会执行跨越多个数据库的数据库操作。
jdbc2.0 optional package 同jta一起来实现分布式样事务。
5. 一些技巧
检索自动产生的关键字
为了解决对获取自动产生的或自动增加的关键字的值的需求,jdbc 3.0 api 现在将获取这种值变得很轻松。要确定任何所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,表示您有兴趣获取产生的值。您感兴趣的程度可以是 rn_generated_keys,也可以是 _generated_keys。在执行这条语句后,所产生的关键字的值就会通过从 statement 的实例方法 getgeneratedkeys() 来检索 resultset 而获得。resultset 包含了每个所产生的关键字的列。清单 1 中的示例创建一个新的作者并返回对应的自动产生的关键字。
清单 1. 检索自动产生的关键字
statement stmt = testatement();
// obtain the generated key that results from the query.
uteupdate("insert into authors " +
'(first_name, last_name) " +
"values ('george', 'orwell')",
rn_generated_keys);
resultset rs = eneratedkeys();
if ( () ) {
// retrieve the auto generated key(s).
int key = nt();
}
jta/jts
1.jta/jts基本知识
服务器实现jts是否对应用程序开发人员来说不是很重要的。
对你来说,应该把jta看作是可用的api。
jta是用来开发distributed tansaction的 api.
而jts定义了支持jta中实现transaction manager 的规范。
javatransaction service (jts) specifies the implementation of a transaction manager which supports the java transaction api (jta) 1.0 specification at the high-level and implements the java mapping of the omg object transaction service (ots) 1.1 specification at the low-level. jts uses the standard corba orb/ts interfaces and internet inter-orb protocol (iiop) for transaction context propagation between jts transaction managers.
a jts transaction manager provides transaction services to the parties involved in distributed transactions: the application server, the resource manager, the standalone transactional application, and the communication resource manager (crm).
2.jta
1.1 事务处理的概念
jta实际上是由两部分组成的:一个高级的事务性客户接口和一个低级的 x/open xa接口。
我们关心的是高级客户接口,因为bean可以访问它,而且是推荐的客户应用程序的事务性接口。
低级的xa接口是由ejb服务器和容器使用来自动协调事务和资源(如数据库)的
1.1.1事务划分
a.程序划分
使用usertransaction启动jta事务
the usertransaction interface defines the methods that allow an application to explicitly manage transaction boundaries.(from j2ee api document)
第四篇:java学习心得
java学习心得之一——鼠标事件处理
java中,鼠标事件一般由用户界面个组件的内部实现,用户不用关心太多细节。然而,在处理一些鼠标自适应事件如鼠标绘图、鼠标移动特定组件时,就需要对鼠标事件做专门的处理了。
和其他用户界面组件的实现一样,java对鼠标事件的处理也是通过awt事件处理机制来实现的,即:事件源(在此,鼠标事件的事件源可以看做隐藏,或为需要对鼠标事件响应的相关组件,如panel对象等)注册监听器(mouselistener or mousemotionlistener)对象,并发送事件对象的对象(mouseevent)。当事件发生时(如鼠标点击、指针移动等),事件源将事件对象传递给所注册的监听器,监听器对象利用事件对象中的信息 决定如何对事件做出响应。
在此,将引用一段源码()来具体说明。这段源码实现了如下功能:
1. 绘制方块:在鼠标任意键被按下时,绘制一个正方形。
2. 改变指针状态:当鼠标指针移动至图形内部时,指针变为十字形状,移出方块时,指针恢复。
3. 拖动方块:当鼠标指针移至图形内部,按下任意键,拖动指针时,图形将随之移动,直到松开按钮为止。
4. 擦除方块,当指针移至图形内部,双击鼠标任意键,可擦除当前方块。
具体源码如下:
import .*;
import t.*;
import .*;
import g.*;
import .*;
public class mousetest
{
public static void main(string[] args)
{
mouseframe frame=new mouseframe();
efaultcloseoperation(_on_close);
isible(true);
}
}
class mouseframe extends jframe
{
public mouseframe()
{
settitle("mouse test");
setsize(default_width,default_height);
mousepanel panel=new mousepanel();
add(panel);
}
public static final int default_width=500;
public static final int default_height=400;
}
class mousepanel extends jpanel
{
//绘制图形
public mousepanel()
{
squares=new arraylist<rectangle2d>();
current=null;
addmouselistener(new mousehandler());
addmousemotionlistener(new mousemotionhandler());
}
public void paintcomponent(graphics g)
{
tcomponent(g);
graphics2d g2=(graphics2d)g;
for(rectangle2d r: squares)
{
olor();
(r);
}
}
/*
* 查询当前点是否已经存在
*/
public rectangle2d find(point2d p)
{
for(rectangle2d r: squares)
{
if(ains(p))
return r;
}
return null;
}
/*
* 用当前鼠标点击的点生成图形,并存入图形数组列表,同时重画
*/
public void add(point2d p)
{
double x=();
double y=();
current=new
le(x-side_length/2,y-side_length/2,side_length,side_length);
(current);
repaint();
}
/*
* 删除图形
*/
public void remove(rectangle2d s)
{
if(s==null) return;
if(s==current) current=null;
ve(s);
repaint();
}
private static final int side_length=20;//正方形的边长
private arraylist<rectangle2d> squares;//存放所有已绘制的方块(鼠标有效绘制路径)
private rectangle2d current;//当前需要绘制的方块
private class mousehandler extends mouseadapter
{
/*
* 当鼠标按钮被按下时,先查找当前点是否已经包含在前期图新内,* 否,则添加至数组列表
*/
public void mousepressed(mouseevent event)
{
current=find(oint());
if(current==null)
add(oint());
}
/*
* 处理鼠标点击事件,如果当前点包含于图形之中,且鼠标连续点击两次以上,则擦除该图形。
*/
public void mouseclicked(mouseevent event)
{
current=find(oint());
if(current!=null && lickcount()>=2)
remove(current);
}
}
private class mousemotionhandler implements mousemotionlistener
{
/*
* 改变鼠标形状
h);*/public void mousemoved(mouseevent event){if(find(oint())==null)setcursor(efaultcursor());elsesetcursor(redefinedcursor(shair_cursor));}/** 拖动图形*/public void mousedragged(mouseevent event){if(current!=null){int x=oint().x;int y=oint().y;rame(x-side_length/2,y-side_length/2,side_length,side_lengt
}}}} repaint();
第五篇:关于java学习的一点心得体会
管理科学与工程学院11信管2班孙鑫20144548
关于java学习的一点心得体会
我是学信管专业的,这学期除了学习了java软件开发综合实验这门选修课外,还有自己本专业要学的java面向对象的程序设计。学习了近一学期的java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java),兴趣最重要。一直觉得自己在学习了计算机编程语言(也就是c语言),学到了很多东西,再学习java的话,应该问题不大,但在学习了几个星期后,还是明确感到了,有点吃力,于是趁学校开设这门选修课,并且有自己院的老师讲解,还有了上机的机会,比自己自学省事多了,于是鼓足信心,开始了漫长的java征途。
还记得我编写的第一个程序是简单的输出程序。当时自己不是很理解为什么main方法要这样来定义public static void main(string[] args),问了好多同学,他们告诉我的答案是一样的“java本身要求就是这样子的”,但我自己不甘心,就自己进行了探索:把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个string[]数组的,把string[]改掉,改成int[],或者string试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。 结果一个简单程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这 1
样定义的了。接着在以后的学习中我也采用这样的方法解决问题,却发现自己的速度比别人慢了好多,我就把自己的课余时间也分一部分给了java。
因为基础是最重要的,只有基础牢固才有可能对后面的学习有更加深刻的认识!
学习一门新的语言,参考书是离不开的。听专业课老师说订的教材偏难,不适合我们初学者,于是我在图书馆借了本参考书(一本篇幅较短的入门书来学习那些最简单、最基本的东西,包括学习java语法等)。同时,对一个最简单的程序也应该多去调试,多想想如果改动一下会出现什么结果?为什么必须那样写?多去想想这些问题然后去操作,会让你有更多的收获。这样反复地思考是很有用的。
在学习java的语法时,java的语法是类似c语言的,所以学习的比较轻松。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,和同学一起讨论了好久才得以解决。
在学习java的面向对象的编程语言的特性。比如继承,抽象类,方法的多态,重载,覆盖。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习java之前没有c++的经验,只有c语言的经验,花了很长时间,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了很多遍,才彻底领悟了。
此外,我对于static,public,private等等一开始都不是很懂,
都是把书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。
在学习java的过程中我得出这样的结论:
1.学习中,要养成良好的习惯(写括号时要成对,字母大小写要区分,单词拼写要准确)。
2.在学习的过程中,最好不是仅仅停留在java表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。
3.在学习的过程中一定要动手做、试着写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己。
4. 在 java 的学习过程中,可能会遇到形形色色的问题不容易解决,应多去专业论坛了解相关的知识,书本上的知识有限。要会从网上搜索有用的信息 加以整理,促进学习的深入和知识水平的提高。
看了好多网上课程,说学到一定程度要尝试着自己做东西,但觉得自己仅仅经过一学期的学习,还远远不够,希望自己在以后学习中继续努力,能够真真正正拥有一门编程语言,对自己今后的发展起到作用。
本网推荐访问其他精彩内容:
java学习心得
学习java的心得体会
学习java的心得体会
java学习的心得体会
java培训学习心得