信手拈来 妙手偶得
日历
网志分类
· 所有网志 (781)
· OOD (36)
· OOP (6)
· Java.API使用 (32)
· Java.开源包使用 (39)
· Java.Swing (33)
· Java.语言特性 (41)
· CSS (8)
· Java.J2EE/JavaEE (26)
· 数据结构算法 (22)
· 正则表达式 (4)
· 当前事务 (63)
· 线程 (8)
· Web开发.Jsp/Servlet/Struts (18)
· Hibernate (3)
· Web开发.Ajax (13)
· Web开发.JavaScript (37)
· Web开发.CSS/Html (20)
· C# (20)
· ERP (4)
· JDBC (1)
· 编程资源 (16)
· 编程感悟 (28)
· DB/Sql (9)
· VB (29)
· VC (2)
· 桌面脚本 (3)
· 新兴软件 (1)
· 英语学习 (19)
· 网文转载 (105)
· 职场风云 (18)
· 诗词歌赋 (26)
· 生活感言 (60)
· 未分类 (31)
最新的评论
· 04/07 [:^^3:]
· 03/27 好恐怖……远离...
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 偶要雷锋
· 豆瓣
· 当当网
· Donews
· W3CSchool
· Dojo中国
· Dojo
· Extjs.com
· Lifehack中文网志
· Banq's JDon
· Java 中文网址大全
· 梦想Java,关注Java相关技术。Java Jsp Struts Velocity Webwork Spring Hibernate Ajax Javascript 领域驱动设计 设计模式 系统分析
· 360Doc个人图书馆
· java开源大全
· 我在硅谷动力的软件下载站
· 站长中国
· 随意贴
· CSS教学素材站
· java 参考中文站
· 面向构件与SOA社区
· 彩字生成
· 派派小说论坛
· 我在blogJava的博客--如坐春风
· 和风细雨
· 我的C#博客,放在csdn

订阅 RSS

0158600

歪酷博客

     
此博客一为经验积累,二为资料收集,三为同道交流,四为资源共享.
http://www.w3school.com @ 2008-05-12 13:03

转载地址: http://www.w3school.com.cn/careers/career_tips.asp

1. 学习的步伐不停止

古人说,活到老,学到老。终身学习应该是您的座右铭。

世界在不断变化,每个人都在寻找各自的事业途径。

您只有保证了足够的技能储备,才能确保能够得到一份足够满意的工作。

为了保证您的职业发展,您应当定期地更新您的技能和知识。

2. 学会问、学会听,学会学习

一个好的倾听者可以习得更多。

多听取来自同事、老板以及上级的声音。您可以从他们的经历中学到更多。

问一些您感兴趣的话题,然后听听他们怎么说。让他们告诉您事业如何运作,以及如何可以做得更好。

大多数都是乐意帮助您的。

3. 为目前的工作全力以赴

您目前的工作可能是开始您职业生涯的最好起点。

从本职工作做起,从现在做起,做好当前的工作,没有保留地尽到自己的职责,证明自己是一名有价值的员工。

您所做的工作终究会得到回报。

4. 构建人际网络

您的下一个职业阶段很可能得益于您的人际网络。

您知道吗,超过50%的工作都是通过关系网络获得的。

如果您拥有一张良好的人际网络,那么它会助您发现未来的职业,开拓新的方向,获得新的机会。

请在新的关系上多花些时间吧,同时请不要忽略对已有关系的保持。

从您的人际网络获得有价值信息的最佳途径之一是,定期地问候您的交际人,他们正在做什么,以及有关其职业的新情况。

5. 识别你的工作

识别真正重要的工作,而不是去假设。

一定要确定你目前所做的工作不是因假设得来的。那样会浪费您很多时间和才华。

当您着手一份新的工作时,一定要和主管聊聊首要的那些工作。如果您无法确定哪方面是重要的,就去询问他吧。多谈几次也没关系。您会经常对事实上的重要任务与您所作的假设之间差距感到惊讶。

6. 慎重决定下一个工作

在您开始未来的职业生涯之前,一定要认真考虑您理想中的工作。

您理想的职业应该是什么样的呢? 最关键的是,您一定要乐在其中。

您是否乐于为其它的同事承担责任?您喜欢和人打交道还是摆弄技术?你希望自己创业吗?您希望成为一位艺术家、一位设计师、一名熟练的工程师,还是一名管理人员?

在您为构建未来的职业生涯之前,请明确您的目标。

7. 为未来做准备

为了明天的梦想,今天就要进行准备。

一刻也不要耽搁。现在就更新您的履历,并且定期持续对其更新。

明天您也许就会看到梦想实现的曙光。为此,您需要准备一份专业的履历,准备好为您的雇主展现潜力无穷的你吧!

如果您不清楚如何写一份履历,或者任何描述自己,请现在就开始学习吧。

8. 量力而行

选择适合个人能力的任务。

您可以通过不同的方式来构建未来的职业生涯。在 W3School 学习是件容易的事情。而获得硕士学位则会困难一些。

您可以通过学习各类型的书籍和教程(比如您在 W3School 所找到的)来为职业添砖加瓦。参加一些带有认证测试的短期培训应该可以为您的履历增加不少分量。同时不要忘了:培养新技术所需要的最具价值的资源是您目前从事的工作。

不要为自己设置不可能完成的任务!

9. 实现您的梦想

把梦想落实为行动!

不要让繁忙的工作扼杀您的梦想。假如您有着更高远的目标,请现在就付诸行动吧!

如果您计划接受更高的教育,获得更好的工作,或者开一间属于自己的公司等等,请不要以日常的工作作为等待的借口。您的日常工作会变得越来越忙,您会陷入激烈的竞争中,并耗尽自己的能量。

如果您此刻就存有能量,那么现在就使用它去实现您的梦想吧!



 
Junglesong @ 2008-05-08 14:41

    http://www.blogjava.net/tendao/archive/2007/03/12/103355.html

今天接受了一个美资公司的电话面试,记录下了大部分的题目:
1. Talk about overriding, overloading.
2. Talk about JAVA design patterns you known.
3. Talk about the difference between LinkedList, ArrayList and Vector.
4. Talk about the difference between an Abstract class and an Interface.
5. Class a = new Class(); Class b = new Class();
 if(a == b) returns true or false, why?
6. Why we use StringBuffer when concatenating strings?
7. Try to explain Singleton to us? Is it thread safe? If no, how to make it thread safe?
8. Try to explain Ioc?
9. How to set many-to-many relationship in Hibernate?
10. Talk about the difference between INNER JOIN and LFET JOIN.
11. Why we use index in database? How many indexes is the maximum in one table as your suggestion?
12. When ‘Final’ is used in class, method and property, what dose it mean?
13. Do you have any experience on XML? Talk about any XML tool you used ,e.g. JAXB, JAXG.
14. Do you have any experience on Linux?
15. In OOD, what is the usage of Sequence diagram?


 
Junglesong @ 2008-05-06 21:06

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=ByOK ... 99zWpBng!-145788764
另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK ... 99zWpBng!-145788764
这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单

在被传递给客户端之前将被改写成

这种技术现在已较少应用,笔者接触过的很古老的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没有显示的使用 关闭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,对于应用程序来讲它的作用相当于根)。

/NASApp

需要注意的是,操作共享的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机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。


 
养生无双 @ 2008-05-04 09:03

二千年传承的古武术的秘密

养生无双

在火器时代之前,中国是天下第一步战强国。动则数十万人的战争中,能活下来的人所
凭借的东西到底是什么?
我研究在世上活命之道二十年,不敢在擂台上说能打赢泰森,小光头,格雷西,但是自
有自己独到之处。如今就完全免费地和各位分享一下。

本文会分析中国几大传统拳种的源流。看看它们的来历和用途。将分为如下几个章节。

1.战场之拳
2.义士之拳
3.暗杀之拳
4.飞贼之拳
5.擂台之拳

第一卷:战场之拳
中国古代战争的特点就是人多,多到什么地步呢?我打个比喻,一个足球场大概可以容
纳5万人在那里密密麻麻地站着。一场较大规模的战争,大概就是好几个足球场的人密
密麻麻地挤在一起。这么多人挤在一起,面临的最大危险是什么?

答案是个废话,就是被踩死。五万人中只要有1000人突然发了神经乱走路。至少一瞬间
就能踩死2000人。踩残废的则不计其数。什么泰森小光头遇到这1000个发神经乱走路的
人,可能可以一阵摆拳打倒四五个,但最后也只有死路一条。死得最快的是什么人?是
格雷西家族的人,这个家族的人有个坏习惯,就是一打架就往地上趴。只见一阵大脚丫
过后,顿时退货。
如果这发了神经乱走路的1000人,不是一般人,是骑着马拿着长矛的,死的人就更多
了。什么?发了神经的不止1000人,是另外50000个骑马拿长矛的人?!?!

所以各位喜欢看穿越小说的兄弟们,千万不要以为自己练了点什么无限制啊,k1啊,跑
到古代就能吃香。真过去的话吃的估计都是烧的香。
在战场之中,对武功的第一要求是
1.重心低+平衡感(马步稳),否则一滑倒则万事休矣
2.保护要害。挨一刀一枪则省下娶老婆生孩子的费用了。

这里说的保护要害,可千万不要以为是像拳击手一样两手护着太阳穴和下巴。在战场上
你摆这个姿势就是找死。
首先分析你是个什么兵种,你是长枪兵(排在最前面送死的就是你这个兵种)就摆个形
意拳的三体式。前手防咽喉和胸,后手防腹+下阴,两手抓一支长枪,用趟泥步前进。
形意拳号称是岳飞传下来的武功。岳飞用的肯定不是什么泰拳黑市拳。动脑想想就明白
了。

你是刀盾兵(好不到哪里,也是个送死的兵种啊!)就一手在前持盾,一手在后持刀。
摆个太极拳的白鹤亮翅的姿势。谁要是摆泰拳姿势死了不要怪我没指点啊!

你是弓箭兵……安心射箭吧,别想这么多了。士兵在该死的时候不死是一种耻辱。

如果你祖先积德,分配了个骑兵,也别太得意。你照样要练马步。那些喜欢蝴蝶步的兄
弟还是在家和美女扑蝶嬉戏吧。

看到这里,也许有些聪明的朋友已经明白了一个道理,那就是“功夫实用不实用,关键
看你在哪里用”

当年巴西有个小男生,学了日本的柔术。据他自己说“删除了一些不实用的技法,创编
了无敌的格雷西柔术”
格雷西柔术现在已经到处挨打了。说明这世界上那有什么无敌的东西?那都是广告!我
们分析一下日本柔术和格雷西柔术的异同,就不难发现格雷西删除的是什么技术。

日本柔术的针对对象,是双手持武士刀的铠甲武士(一般开始从小练刀,反应不会比你
差)。面对这样的对手,你用什么鞭腿,什么下潜抱腿摔都是假的,你若用鞭腿,只见
对方潇洒地大刀一挥,只见一条腿如鞭一样飞上半空去了。
吾观察街斗多年,未见有人敢对手持西瓜刀的对手使用高鞭腿,便是这个道理。
但如果对手是个空手的人,那便不可怕了,拼着挨几拳,也要把对方推倒凌辱一番。但
这依然有危险,你永远不知道他身上是不是藏着把小刀,或者摸出把钥匙朝你脸上猛
刺。
我观察了一下泰森的身板,在要害未被刺中的前提下,他大约能在挨5刀的情况下支持
10分钟不死亡。超出10分钟则情形不乐观。
如果要害被刺中,没啥说的,当场毙命。
在街斗中,吾未见面对匕首者双手护头跳跃作泰森状的。反对的人请上视频证明。


日本柔术和中国同类拳法(太极拳)的最大异同在哪里?两者都有快速进身反关节夺刀
的技术,都有快速进身用“内劲”打透铠甲的技术,都有借力跌人的技术。这几项都是战
场上最实用的东西。
但日本柔术多出一个“寝技”,其原因无他,因为日本战争人少,几百人对打就是大会战
了。打着打着就稀疏起来,可以放心用擒抱技术来抓俘虏,除此以外,还因为日本从来
没发明过盾牌兵之类的兵种,只要躲开了对方双手持的刀、枪,近了身抱住对方的手臂
就安全了。要是到了中国,一盾牌(铁山靠)把你撞开,顺手补一刀,看你还来寝技?
但到了格雷西的时代,就离战场越来越远,在单对单徒手对抗中,只剩下插眼踢裆等技
术还能让对方忌惮一下,格雷西柔术大刀一挥,把插眼踢裆去掉了,在不用武器的前提
下,寝技顿时失去了天敌,迅速繁殖起来。我常常见一些热心的传统武术家在思考怎么
对付格雷西柔术,我每次都对他们说,别想怎么对付了,干脆就别对付。干吗去找郁闷
呢?
 
 
 
 作者: yuchongfeng  2008-2-22 16:14   回复此发言   
 
--------------------------------------------------------------------------------
 
2 回复:二千年传承的古武术的秘密(转自新华山) 
 二千年传承的古武术的秘密(二)1
前言2
闲言闲语,在这个时代,保守其实是没啥意义的,我的师父们教我的时候不是怕教会徒
弟打师父,而是怕东西失传,恨不得先都塞到我脑子里。但东西还是在我这一代失传了
不少,为什么?因为这东西不值钱。
不值钱的东西就没人去学去练,这是千古不易的真理。好比说我在第一贴里毫不保留地
说了破甲打的发力方法。在古代我估计就会因此被同门追杀,但是这样便宜地说出来,
留意的人又有几个?
其他人也就罢了,但却要点名批评一下24,这家伙最近一直挂着太极拳的名义到处招摇
撞骗,却连实战太极拳最基础的东西发劲都不会(简直就像拳击手不会直拳一样),看
见了真传一句话的东西,却不去详细琢磨一下。中国功夫的名声,就是败在这些终日大
言炎炎,沉迷于自我心理满足的人手里。

许多看帖人都在留意“古代打仗怎样才能赢”(其实养生一句都没提过战争的胜负问
题)。而自动忽略其他内容,这就是功利心。这样的人适合当军师,但不适合当士兵,
适合当票友,却不适合当拳手。

下面我会专门用太极拳的一些秘奥义来讲解一下这一流派的战争之拳精髓。觉得不能理
解或者声称自己没听说过的人也不用怀疑,当小说看即可。

在说太极拳之前,先说一下巴西的华丽格斗术:卡波依拉
卡波依拉的动作主要为腿技,其次是一些匪夷所思的翻滚跳跃技巧。这东西在现代人看
来只是怪招,看起来好看。改成街舞能泡MM。但这种拳法的来历是什么呢?
是几百年前,殖民者入侵巴西,将巴西男子列为奴隶,持有武器者杀杀杀。大部分奴隶
还要带着较长的手铐工作。连晚上睡觉都不能解下来。在这种情况下,巴西人发明了一
种华丽的“传统舞蹈”,这种舞蹈实际上是专门利用手铐铁链为武器而研发的杀人拳。
卡波依拉的基础格斗式是身体不断左右变换(尽量躲闪火枪)两手保持距离交错在面前
划过(用铁链锁拿刺刀)一旦抓住机会,就用铁链锁住对方手臂或脖子,然后通过身体
的跳跃和旋转勒断目标,这种包含体重和跳跃力的锁链技,加上攻击角度诡异,实在是
奴隶们对抗火枪的最有效的方法。
看到这里,我知道肯定有人把自己代入到殖民者的身份说:“这样能打得过火枪吗?我
如果拿火枪去打,对方如何如何,等等。”
但我也要反问,当你就是那些奴隶的时候,你去哪里拿火枪?难道没火枪就安心当亡国
奴了吗?手上有啥你就用啥,战争的胜负轮不到你关心,但是关键在你努力了。

巴西有这样的技术,中国也有。而且种类更多。
形意拳是以枪化拳,太极拳则是刀盾兵留下来的拳法,一刀一盾,就是那阴阳鱼(当
然,还有别的比喻)
所谓的借力打力,在徒手打斗中没那么管用,或者说,使用难度太高,但是配上了盾牌
+刀,就是最恐怖的技术。
当一个盾牌兵顶着四米长的长矛,冲到敌人跟前,他的任务就是把敌人的长矛阵破开,
让自己的兄弟们能冲上来。
在敌人的枪阵还没冲破的时候,太极拳奥义“切地龙”“海底针”“跌叉”等技术的方法都是
持盾矮身潜进,避开上身的矛头,用刀猛捅对方下身。而当近身以后,则使用揽雀尾等
技巧抱住对方的多枝长矛,用刀猛砍。
揽雀尾的雀尾,指的是孔雀的尾巴,用来比喻许多长矛。当一个刀盾兵奋不顾身地抱住
了对手好几根长矛的时候,他的战友们就可以乘虚猛冲进去乱砍。
这也是揽雀尾被称为太极拳母拳的原因之一。当然,揽雀尾也可以用来接腿摔,用来反
关节。但效果便打有折扣。
而当兄弟们都冲到身后,把你挤得和敌人已经脸贴脸,心连心的时候,你已经没有距离
举刀,这种情况下,你有几个选择

1.用发力距离极短,可以借背后力的发劲透甲打来打对方,把对手打晕或者打退,有了
挥刀距离后补上一刀。
2.用盾牌猛击对手。(太极拳凡是用小臂发劲的技术大致都出于此)
3.用刀柄自上而下猛砸对方的脸。
4.丢了武器抱住对方脖子拧(看着练太极拳的兄弟在那里玩太极石球,不要奇怪,等你
的脑袋像石球一样在对方手里的时候就明白了)
5.用盾牌挤对手,趁对手用力对抗的时候盾牌上玩点虚实,让对方失势跌倒(牵动四两
拨千斤),成功的话,是让对手一大堆人一起跌倒(踩死)
6.用BT的柔韧性,突然矮身用盾牌和肩膀撞击对方小腿(七寸靠),让出上盘的空间给
自己兄弟在背后砍/捅对方。
7.用长劲将对方撞退,然后突进砍杀。
 

二千年传承的古武术的秘密(三)1
前言:
小温侯所谓的言论自由,我国自古就有,不过定义稍有不同,大多数人对言论自由的定
义是“我有批评你的言论自由,但是你没有反驳我的言论自由。”

上个帖子里,有人不就具体问题反驳或骂(这点24倒是做得比他们好),却喋喋不休
于“武人学文就是忽悠人”“我最反感有人一个人会很多门派功夫的”

金庸大侠说的好,某些人一辈子就练一种拳法,美其名曰“贵精不贵多”,他们是否能做
到“精”,那是很可疑的,至于“多”是肯定做不到的。所以只要有人说“贵精不贵多”,他
们就油然而生知己之感。
而养生刚好相反,所学的拳法能不能做到精这个很难说,但至少种类多是无可疑的。而
且读书不少,所以绝不是他们的知己。

养生认为太极拳为刀盾兵所创,证据嘛……比太极拳是张三丰夜梦神人所授,或者陈王
庭在乡下种田时拍脑袋想出来的还是要充足一点的。
陈王庭创太极拳说,来源于陈氏族谱。而养生的说法,来源于春秋时期齐桓公的……错
了,那个应该是神虎术。那么就来源于李景林将军的秘传日记本好了,李景林将军深明
打仗之道。他日记里的记载应该比在座各位都有说服力吧?看谁还敢质疑?

调侃就到这里好了,前几天有兄弟其实已经答对了。义士之拳是利用杂物,以少对多,
克制古代警察的一种拳法。

顺便回空格兄的话,依靠鲸鱼和鲨鱼样子长得像,是不能判断他们属于同族的,但是却
能够判断出这两种东西都是在海里生活的。因为他们的样子都符合海洋生物原则,而不
符合陆地生物原则。

我们先看看义士之拳必须符合什么原则

1.身体平衡,不容易在移动中摔倒。一旦倒地,就会被一堆捕快扑上去施展巴柔紧紧擒
住。而被擒住的话,则比死还惨,自己受尽酷刑不说,还要连累亲戚好友一起死。
2.反擒拿,不能被人轻易用关节技抓住,理由同上。
3.在一群围着自己的对手中找到可逃生的空位,并且冲出去。
4.为活命不择手段。(没错,就是24如获至宝地发现的无限制格斗术)
5.简单速成。
6.所用武器便携

 

义士拳五宝之一,四平大马
大部分义士之拳里都有四平大马,就算不是四平,也是马步桩。李连杰演的精武门里批
评马步桩,说那样不适合起腿踢人,所以是死马。那部片的动作指导估计是个李小龙迷
+散打控,哪里知道马步桩的妙处?

马步桩之妙,第一在速成。
义士们平时要工作养家,还要打扮成良民大大的样子,自然不能像职业拳手那样买了各
种器材,公然夏练三伏冬练三九给官府看,这样一来,大多数时候也只有晚上睡觉前能
关了灯练一阵子。在这种前提下,四平大马就是最快的增加平衡力和腿力,协调性的方
法。

站四平大马也没啥标准和诀窍,就是按标准站到四平状态,站到四平就啥都懂了。诸
如“两膝对称撑拔,气沉丹田,腰马合一。”等,一句话概括起来都是四平状态,说多了
反而让人糊涂。
练拳有两种方法,一种是明理后练拳,一种是练拳后明理。前者精细,后者强壮。各有
各的好处。各有各的好处,嘿嘿。

有人也许会说“四平大马这东西对膝盖有害啊,是不科学的练法。”,义士们对此则回答
说,眼前还活着最重要,让科学见鬼去吧。
四平大马之妙,还在于这是一种在移动时能时刻保持身体平衡的步法。拳击的步法在打
中目标时固然威力强大,但是在开始移动到攻击到目标之前,身体都处于被他人一撞就
会失重的状态。这种步法是不适合群战的。
当然,义士之拳中也有高位步法,所谓的高位步法也没什么特别,就和田径运动员的短
跑/跳远前的助跑差不多。但只要有人近身,就会马上切换为马步。 
 
 
 作者: yuchongfeng  2008-2-22 16:15   回复此发言   
 
--------------------------------------------------------------------------------
 
4 回复:二千年传承的古武术的秘密(转自新华山) 
 二千年传承的古武术的秘密(四)0

前言:AMAN和风云生是两个不同的例子,风云生认为传统拳法有其适应性,所以坚持
在研究传统拳法在现代擂台上的应用,以及和西方技术的结合。AMAN则直接否定,认
为传统的发力方式在西方人厚实肌肉面前不起作用。
对于适应性,我的看法是这样的。
一匹马和一匹毛驴结合,生下的是骡子。虽然骡子可能比马和驴都更适应特定环境,但
是他们非马非驴。
形意拳和拳击结合,它们的产物可以叫形意拳击或者风云道,但是不能叫形意,也不能
叫拳击。形意拳和拳击各有其对应环境,集合了一些精华的同时,必然导致其他一些精
华的失传。以传承为目标的,则是形意,以发扬形意拳其中某些技术或训练方法为目标
的,则是风云道。

AMAN所练的,则是散打,散打就是散打,不是别的东西,他说他练过形意拳,但只要
他用的教的研究的练的不是形意拳,那就等于没学过。把两者扯到一起,也只是骗骗外
国人吧。
题外说一句,85年左右我还是儿童的时候,曾看过AMAN对张建国的散打比赛。因为某
些缘故,有深刻印象。一转眼二十多年,物是人非,真是让人感伤。

题外话说完了,继续说义士之拳
义士之拳的第二宝,是王八拳。
对于一般没受过职业训练的街战者来说,为什么本能的用王八拳?因为王八拳是一种杀
伤范围大的拳法,只要在手臂范围内,都在扇形攻击覆盖下,只有整体下潜躲闪才能躲
得过。而会使用下潜躲闪的人一般都是受过职业训练的人(会使用腰腿力),常人无非
就是硬抗或者后仰躲闪。
王八拳能保证在自身训练时间较短,而又面对大批平庸对手时,有相对较高的命中率。
而杀伤力问题则用武器来弥补。
杀破狼》里吴京手持一把短刀来使用长拳。动作设计者是个明白人。但最适合长拳的
武器不是短刀,而是峨嵋刺,T字短拐等。一个王八拳摆过去,对方低头闪过了后,还
能回手再摆一下或者顺势举起往下扎砸。一个回合能攻击好几次。如果配合马步移动还
能造成一次出拳横扫几个目标。回步又横扫或者突捶其他目标等。
也许你这种横扫几个目标的拳法杀伤力不够大,但却能起到“荡开阵脚”的地步。在横扫
的过程中,对手谁是最弱的,马上就能分辨出来。

用三国演义中三英战吕布的局面来比喻一下,三英战吕布描述的不是军阵,而是小群
殴,吕布单对单未必能绝对搞定关羽张飞,但是依靠赤兔马的移动和力量,却能和他们
两个打得不落下风。等到刘备上阵,形成合围,吕布移动就有了困难,但刘备三人组中
最弱的刘备还是成了吕布逃跑的突围点。
这个突围法,是义士之拳的第三宝
冲撞
义士之拳中有很多冲捶类的拳法,冲捶之后还有靠撞的小动作。
冲捶的原理和训练方法很简单,就是上半身硬梆梆的,把手和身体化为刚体,利用下身
的快速移动把这个刚体向对手捅去。这东西没什么技术含量,就是简单速成,无需悟
性。
琉球人的空手道也是义士之拳的传承,他们最喜欢召集一大堆学生把这样硬梆梆的一个
正拳练上N久,只有入室弟子花钱买了黑带才教身追手的破甲打。
这个故事告诉我们,功夫有时不需要精深,只需要够用就好。一名义士如果能用这样没
有技术含量的技巧在人群中冲撞出一个缺口跑掉。就是捡回了自己的命,捡回了组织的
命。捡回了红花会千千万万弟兄的命。

这类不精深但是好用的拳还有很多精髓,例如“唯快不破”。
人的反应神经最快的时间一般在0.2秒左右。很多拳击手出拳都比0.2秒快,那么对手怎
么办呢?还是可以破,因为可以观察对手的身体变化,尤其是肩部或者脚步,可以判断
出提前量。
而大部分普通人出一拳至少要1秒,那些没时间进行职业训练的义士估计不会比普通人
好到哪里。但是他们却能做到超越对手的神经反应能力,避开对手对自己的身体预估来
对对手进行打击。
待续,看看有没有兄弟猜到义士之拳中的“唯快不破”是如何解释和应用的。 
 
唯快不破
在说这个技巧之前,我先埋下伏笔。说一下别的东西。

 

1。李小龙的截拳道创立时期,李小龙主要的交手对象为中国南方的武师而非外国拳法,而李小龙的拳法架势非常特别。在这里估计没人不了解截拳道的架势,就不重复了。

 

2.清末,埋藏数百年的战场之拳太极形意等纷纷重出江湖。和八卦掌一起横扫北方武林。

 

3.王芗斋认为形意拳有不适合环境的地方,于是对形意拳进行了一定的改革,其独特架势为前手远远撑抱的矛盾桩。

 

上述拳法在当时虽不能说中国无敌,但是却都是一方豪强。至少都是公开接受挑战的。而且挑战者众。证明其是有实战作用的。

 

但这几种拳法到今天则再也不能横扫一方,为什么呢?

义士之拳故老相传中常说“某招可破某招,某招可克制某招”。这些话,练现代搏击的人自然都不屑一顾,但是在一两百年前,这些话是谁都不怀疑的真理。
原因就在唯快不破,唯硬不破这八个字上。

 

上文说到人体反应一般最快就是0.2秒,义士们在社会稳定的情况下,纷纷退出江湖,成为“技击家”,作为技击家,一般对手就是单体攻击为主,虽然还有群战套路传下来,但是较技时一般不用群战套路,而是用门内秘传的“独门绝招”
需的说,这个世界上没有什么绝招,只有对方破不了的攻击。要对方破不了,只有更快。

 

在肌肉能力有其极限的情况下,最快频率攻击对方的守则如下
1.动作尽可能小,避免对手预读后躲避,小动作也有两条出路,一条出路是纯靠手法袭击对方面部脆弱器官,身体不参与出力。另一条是手先动,身体到最后一刻才参与作功。

 

2.发力距离尽可能短,距离2米出手,就算再快也要0.7秒才打的到对手,距离10厘米出手就算不快也只要0.1秒。

 

3.减少自己出拳时花费的思考和计划时间。

南方之拳术家相角,则一二手,多亦不过五六手,势均力敌者,不互中要害,即相揪相扭,同时力竭罢角,或重整旗鼓,相与复角,曾未有角至若干手,尚不分胜负者,此其分别之点,在北拳尚气劲,南拳则不然,纯以技巧胜,功夫不到者无论已,有工夫者,其气劲不必惊人,然出手必能创敌,角时多不施展门户,临时落马,意到手随,每有胜负之分,非特旁观者,不知所以致胜之道,即被创之人,亦多不明敌手来去之路。
                                                                ——平江不肖生
闲言闲语,在这个时代,保守其实是没啥意义的,我的师父们教我的时候不是怕教会徒弟打师父,而是怕东西失传,恨不得先都塞到我脑子里。但东西还是在我这一代失传了不少,为什么?因为这东西不值钱。

 

不值钱的东西就没人去学去练,这是千古不易的真理。好比说我在第一贴里毫不保留地说了破甲打的发力方法。在古代我估计就会因此被同门追杀,但是这样便宜地说出来,留意的人又有几个?

 

其他人也就罢了,但却要点名批评一下24,这家伙最近一直挂着太极拳的名义到处招摇撞骗,却连实战太极拳最基础的东西发劲都不会(简直就像拳击手不会直拳一样),看见了真传一句话的东西,却不去详细琢磨一下。中国功夫的名声,就是败在这些终日大言炎炎,沉迷于自我心理满足的人手里。

 

许多看帖人都在留意“古代打仗怎样才能赢”(其实养生一句都没提过战争的胜负问题)。而自动忽略其他内容,这就是功利心。这样的人适合当军师,但不适合当士兵,适合当票友,却不适合当拳手。

 

下面我会专门用太极拳的一些秘奥义来讲解一下这一流派的战争之拳精髓。觉得不能理解或者声称自己没听说过的人也不用怀疑,当小说看即可。

在说太极拳之前,先说一下巴西的华丽格斗术:卡波依拉

 

卡波依拉的动作主要为腿技,其次是一些匪夷所思的翻滚跳跃技巧。这东西在现代人看来只是怪招,看起来好看。改成街舞能泡MM。但这种拳法的来历是什么呢?

 

是几百年前,殖民者入侵巴西,将巴西男子列为奴隶,持有武器者杀杀杀。大部分奴隶还要带着较长的手铐工作。连晚上睡觉都不能解下来。在这种情况下,巴西人发明了一种华丽的“传统舞蹈”,这种舞蹈实际上是专门利用手铐铁链为武器而研发的杀人拳。

 

卡波依拉的基础格斗式是身体不断左右变换(尽量躲闪火枪)两手保持距离交错在面前划过(用铁链锁拿刺刀)一旦抓住机会,就用铁链锁住对方手臂或脖子,然后通过身体的跳跃和旋转勒断目标,这种包含体重和跳跃力的锁链技,加上攻击角度诡异,实在是奴隶们对抗火枪的最有效的方法。

 

看到这里,我知道肯定有人把自己代入到殖民者的身份说:“这样能打得过火枪吗?我如果拿火枪去打,对方如何如何,等等。”

 

但我也要反问,当你就是那些奴隶的时候,你去哪里拿火枪?难道没火枪就安心当亡国奴了吗?手上有啥你就用啥,战争的胜负轮不到你关心,但是关键在你努力了。

巴西有这样的技术,中国也有。而且种类更多。

 

形意拳是以枪化拳,太极拳则是刀盾兵留下来的拳法,一刀一盾,就是那阴阳鱼(当然,还有别的比喻)

 

所谓的借力打力,在徒手打斗中没那么管用,或者说,使用难度太高,但是配上了盾牌+刀,就是最恐怖的技术。

 

当一个盾牌兵顶着四米长的长矛,冲到敌人跟前,他的任务就是把敌人的长矛阵破开,让自己的兄弟们能冲上来。

 

在敌人的枪阵还没冲破的时候,太极拳奥义“切地龙”“海底针”“跌叉”等技术的方法都是持盾矮身潜进,避开上身的矛头,用刀猛捅对方下身。而当近身以后,则使用揽雀尾等技巧抱住对方的多枝长矛,用刀猛砍。

 

揽雀尾的雀尾,指的是孔雀的尾巴,用来比喻许多长矛。当一个刀盾兵奋不顾身地抱住了对手好几根长矛的时候,他的战友们就可以乘虚猛冲进去乱砍。

 

这也是揽雀尾被称为太极拳母拳的原因之一。当然,揽雀尾也可以用来接腿摔,用来反关节。但效果便打有折扣。

 

而当兄弟们都冲到身后,把你挤得和敌人已经脸贴脸,心连心的时候,你已经没有距离举刀,这种情况下,你有几个选择

 

1.用发力距离极短,可以借背后力的发劲透甲打来打对方,把对手打晕或者打退,有了挥刀距离后补上一刀。
2.用盾牌猛击对手。(太极拳凡是用小臂发劲的技术大致都出于此)
3.用刀柄自上而下猛砸对方的脸。
4.丢了武器抱住对方脖子拧(看着练太极拳的兄弟在那里玩太极石球,不要奇怪,等你的脑袋像石球一样在对方手里的时候就明白了)
5.用盾牌挤对手,趁对手用力对抗的时候盾牌上玩点虚实,让对方失势跌倒(牵动四两拨千斤),成功的话,是让对手一大堆人一起跌倒(踩死)
6.用BT的柔韧性,突然矮身用盾牌和肩膀撞击对方小腿(七寸靠),让出上盘的空间给自己兄弟在背后砍/捅对方。
7.用长劲将对方撞退,然后突进砍杀。

除了刀拳合一的拳击术外,太极拳有种种匪夷所思的小臂劲法,例如堋、履、挤、按,这些都是用盾牌打击或者挤压对手的训练法。还有采、挒这两种针对长矛或者对方手臂的控制技,肘、靠两种近身打击技。

 

上述都是实用至极的标准军人技术。但军人和军人之间总有区别,其中一些军人将自己的军体拳和道家的“返先天”奥义结合,潜心体己,发现了一些进阶的锻炼技巧。
注意,是锻炼技巧。不是实战技,我知道肯定有些回帖不看帖的人会在那里大喊:“这些东西战场上有用吗?”我现在就提前回答:“这些就像长跑跳绳一样,不是实战用的,都是锻炼用的,锻炼锻炼锻炼锻炼……”

 

和真正练太极拳的人搭手,会有奇怪的发现,就是无法从对方的手上感觉到对方的重心,但对方却能抵抗住你的力量不后退。这个情况在某些练日本剑道的人身上也能找到。

 

答案其实在李仲轩前辈的门下另一条走狗徐浩峰的书中已经披露,那就是无名指锻炼法。(全身及其他手指放松,只有无名指紧张),无名指在日常生活中是废指,很难动用到相关的力量,但是它紧张的时候却能让力量传到手上。而且你感觉不到自己无名指的相关力量,对方也感觉不到从你无名指上传出来的暗劲。

 

正确用刀挥砍的时候,主要就是无名指带动刀的运行,其他手指只是在砍中目标的时候紧张以保持刀的平稳,所以很多练剑道的人无意中能练出这个效果,专练柔道的兄弟反而练不出来。

而太极拳最重要的攻击力量虽然来源于无名指,但是其核心却在大拇指上,在持刀挥刀的时候,身体因刀而失重,全靠大拇指来维系刀的重量和平衡。内家拳的“人刀合一”秘法,也在大拇指上。

 

我们平时坐公共汽车,汽车一颠簸,我们就要找个地方扶一下来维持平衡,实际上扶一下那个力相对是很轻的,为何就能让我们一百多两百斤的体重保持平衡了呢?因为我们只是要找一下平衡感。找到了来源于两个大拇指的平衡感,就进入了“不动之动”的境界。,真正的“四两”拨千斤,用的是四两重的大拇指,拨自己的体重千斤。

 

养生自己发明了一个方法,平时把大拇指握在其他四个手指里。行走时假装失重,有时拇指从其他四个手指里寻找借力来平衡,有时其他四个手指也从拇指上找借力来寻找平衡。

 

中国的武家,为了避免被禁武的当局发现自己在练武,纷纷借用道家学说来掩盖武功的练法,所以你看一本古代的武功秘籍,里面一大堆阴阳啊,五行啊,千万不要奇怪,那些都是为了保证这本书被警察看到的时候不至于让书的持有人满门抄斩才这么写的。用时髦的话来说,道家的隐语成了军用密码。例如“吕洞宾”“吕纯阳”,“吕祖”这些词指的都是男人的小鸡鸡。(洞里的客人)

 

这些军用密码,在上一代的武术家都还有很多能翻译,但是到了我们这一代,能翻译的人就越来越少了。还有些乱翻译的人(好吧,我是在说我自己),搞得秘笈出版界一片混乱。

 

读者们只需要明白,当两个蒙元/清廷初期的武术家在谈论“阴随以无厚入海”这种莫名其妙的话,其实是在谈悄悄地背后用刀插入对方小鸡鸡附近的暗杀技术。就好了。

当统治渐渐稳定,战场之拳再难有用武之地,其中一部分战场之拳的传人沦为街头卖艺者,向高难度的华丽动作发展,一部分沦为拳手,专业角斗供吃饱了撑的观众取乐(或换个好听的说法说是参加奥运会为国争光)。而其中一部分转变为义士之拳。

 

义士这个词,在古代就是黑社会的意思。在元代,是明教,白莲教为主,在清代是以天地会,红花会等为主。这些秘密会社以反清复明为己任,大多数时候潜伏在民间,一般很少有大规模作战。打斗的对手一般也不是军人,而是衙役,捕头,密探,在这种情况下,战场之拳就不那么实用了。其中有一些实战高手发明了更实用与当前这种情况的技术。

 

重心前倾走路,感觉快失重的时候拇指一顶,就像顶在别的物体上一样顺势把重心调整过来。
语言表达有其极限,你可以试着坐公共汽车,扶着扶手,感受用手指轻轻借力来维持身体平衡的状态。平时练习,就把拇指当作其他手指扶着的扶手。以此保持身体平衡。或者把其他四个手指当作拇指顶着来维持平衡的物体。

我年轻的时候,遇到个练八卦掌的朋友,这位朋友练了好几年的八卦掌,但是还是打不过拳击手,他十分苦恼。认为是他内力未到的原因,实际上按他那种练法,就算练十年,也打不过练了十年的拳击手,因为八卦掌这东西最早出现在商业社会的时候,虽然是在一次职业擂台赛上,但是八卦掌最早的诞生用途却绝非打擂台,而是反清复明。

 

八卦掌的手法和身法让人眼花缭乱,打击力却不尽如人意。有很多八卦掌的朋友因此苦恼,都兼练铁砂掌之类的重手法,但是铁砂掌配合到这样灵活的身手上却又没了威力。所以当世很多八卦掌名家都遇到两难的境地。

 

实际上八卦掌的可怕之处还是在兵器上,空手的掌法也是掩人耳目罢了,甚至连八卦掌这个名字也是掩人耳目。八卦掌的精华在其独门武器子午鸳鸯钺,这东西可以锁勾,可以划,可以抠,可以割。但这东西也只是和平年代用来表演的。子午鸳鸯钺的真正平民身份是——镰刀。

 

在夕阳下的小树林里,一个双手持镰刀的农民,突然用极其诡异的身法,向着你的颈动脉,股动脉,脚筋,腕动脉等地方连续不断地袭击,你出一刀的时间他已经对你攻了五六刀。而当你反击的时候,他又躲到了树后,用匪夷所思的角度不断袭击你。八卦掌的“九宫步”,说穿了就是在人群中,树林里逃走或者躲闪反击的技术。在树林/无辜群众里的话,什么形意拳,什么太极拳,都不是八卦掌的对手。

八卦掌其实是介乎暗杀拳和义士拳之间,

 

真正招牌的义士之拳就是“洪拳”(前身为太祖长拳,后来者为国标武术长拳套路)
太祖长拳,即托名宋太祖的黑社会拳法,在蒙元就有出现。

 

其特征如下
1.注重王八拳(最符合人体本能的拳法,但此王八拳非彼王八拳,下面会详述)
2.注重桥手(小臂运用技巧)
3.注重移动,上一招向东打,下一招可能就向南跑了


东西方的思维模式是完全不同的,好比说某男失恋后迁怒,杀了他的教授,东方思维是:“如果他没失恋,就不会杀人了。”西方思维是“幸亏那女的没嫁给某男,不然也和教授一起被杀了。”
这两种思维都是对的,也都不对。

 

思维模式的差异,最终使东西方拳法开始走向不同的领域。如果按西方的思维看唯快不破,那么就是猛练速度,比对手更快到达目的地。按东方的思维就是减少距离,比对方更快到达目的地。
我培训一批新下属时,常用一个手段,就是问对方认为自己的上限是每秒能打击多少次。有人回答1次,有人回答3次,有些经过锻炼对自己速度比较自信的人回答5次。我便拿着秒表给他计时10秒,让他尽全力高速鼓掌,自己数次数。结果是很出人意表的,一般普通人每秒鼓掌平均在7次以上,部分人达到12次以上,受训的人往往也被自己所数的次数所震撼。不相信是自己做出来的。

 

这个鼓掌的原理,包含了许多纯技巧上的武学至理,例如什么同动近取,截拳中途,本能出击,贴身发力等。当然,这些只是博大精深的武学中的一个局部。但人都有走极端的时候,大约在清代中后期,中国拳法在整体上就走向了这样的一个极端。
因为义士之拳普遍使用小兵器作战,所以在这个情况下,你只要手上拿一支小铁笔,用鼓掌的速度对对方眼睛,咽喉连续猛插,一般没练过的对手就铁定得死。
而如果手上没有小铁笔怎么办呢?也有办法,就是将自己的手练得坚硬如铁。这也是现代内家拳的人往往不齿的“局部力、局部硬度。”以一对坚硬如铁的手,用练成了本能的鹤啄,虎爪,手刀,拍掌等手法,每秒7~12下地对对手脸部发动多角度攻击,如果配合马步突进,实际攻击速度还能翻倍。而人体反应速度的上限是每秒反应5次(做到这点的也是神人了)。外加眼睛受到威胁时的本能躲闪反应时间,理论上几乎是1秒内必分胜负。
当双方都完全依靠“拳招”来形成鼓掌式攻击本能时,谁的招数(攻击角度次序)最能克制对方的攻击角度次序,谁就能先击中对手,一旦击中,则绵绵不绝。(如果手持武器,则一击必杀),在这种情况下,传说中的“拳招时代”就到来了。

 

当然,每秒7~12下只是理论速度。实际上影响攻击有效性的因素很多。为了对抗这种“闪电手”,我国拳法家也发明了很多训练方法,例如“听劲”“粘手”“擒拿”“拔根”“控距”“地堂”等。

 

清末,隐藏多年的战场之拳突然重出江湖,大杀三方。并不是战场之拳在街头打起来一定真的比这种义士之拳实用,而是因为“杀人时代”过去了,“比武时代”开始到来。在徒手比武中,因为前提是被对方轻攻击击中非要害部位不会死,那么战场之拳就能大行其道。
战场之拳最擅长的就是用整劲使对方的锋锐(长枪或鹤啄手,砍刀或虎爪)的攻击偏移,使对方不能连击。例如形意拳的整劲硬打硬进,八卦掌的闪击,太极拳的缠绞。这些隐藏拳法的重出江湖,为一味追求“唯快不破”的武林带来了一片新的气息。但也是真正的战场之拳,义士之拳失传的开始。当战场之拳,义士之拳用于和平年代的比武,他们就像被阉割后的动物,只能发出瞬间的光辉了。一旦有其他更适合和平年代比武的拳法出现,这些旧时代的拳法就必然被淘汰或挂羊头卖狗肉。

 

而除此以外,还有擅长距离控制的流派。例如大成拳和截拳道。
大成拳王芗斋公然声称“一切局部硬度的手法打法,全不足取”,他在当时也未尝一败,主要原因还是他的对手主要是古拳法,他所发明的矛盾桩也是一种专门破解唯快不破拳法的架势,重心后倾,前手远撑不让对方近身,后手和脚等待机会给与打击。这样的架势适合对抗古拳法,却不适合对抗现代拳法。

 

李小龙的截拳架势则是侧身对敌,用低端截踢控制距离。等待机会给与重击。这样的架势适合对抗古拳法,但也不适合对抗现代拳法。

 

所谓的“拳本无法,有法也空”“以无法为有法”其中透露出来的信息,就是“用最适合环境的打法去在这个环境里打”,在散打擂台上,最实用的拳法就是散打,在泰拳擂台上,最实用的拳法就是泰拳。
在这个和平年代,最实用的拳法就是养生。如果以泡妞为目的,最实用的拳法就是跆拳道(不带I),如果想要保命,则最实用的是消除自己的一切心理盲点,让自己迅速进入环境,进入角色。

 

空拳老陶的拳法可以说威力一般,看老陶体型也很疏于锻炼,但是我相信很多专心练习XX拳的人打不过他。原因无它,因为他没有“心理盲点”。这个心理盲点则是专注于“XX拳”“XX擂台”的人最致命的地方。
替老陶打了一下广告,这家伙应该付我钱。

 

 

 


 
佚名 @ 2008-05-03 13:32

70个JavaScript的方法和技巧

有些时候你精通一门语言,但是会发现你其实整天在和其它语言打交道,也许你以为这些微不足道,不至于影响你的开发进度,但恰恰是这些你不重视的东西会浪费你很多时间,我一直以为我早在几年前就已经精通JavaScript了,直到目前,我才越来越觉得JavaScript远比我想象的复杂和强大,我开始崇拜它,
趁着节日的空隙,把有关JavaScript的方法和技巧整理下,让每个在为JavaScript而烦恼的人明白,JavaScript就这么回事!并希望JavaScript还可以成为你的朋友,让你豁然开朗,在项目中更好的应用~

适合阅读范围:对JavaScript一无所知~离精通只差一步之遥的人
基础知识:HTML


JavaScript就这么回事1:基础知识

1 创建脚本块

1: <script language=”JavaScript”>
2: JavaScript code goes here
3: </script>

2 隐藏脚本代码

1: <script language=”JavaScript”>
2: <!--
3: document.write(“Hello”);
4: // -->
5: </script>

在不支持JavaScript的浏览器中将不执行相关代码

3 浏览器不支持的时候显示

1: <noscript>
2: Hello to the non-JavaScript browser.
3: </noscript>

4 链接外部脚本文件

1: <script language=”JavaScript” src="/”filename.js"”></script>

5 注释脚本

1: // This is a comment
2: document.write(“Hello”); // This is a comment
3: /*
4: All of this
5: is a comment
6: */

6 输出到浏览器

1: document.write(“<strong>Hello</strong>”);

7 定义变量

1: var myVariable = “some value”;

8 字符串相加

1: var myString = “String1” + “String2”;

9 字符串搜索

1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: var therePlace = myVariable.search(“there”);
5: document.write(therePlace);
6: // -->
7: </script>

10 字符串替换

1: thisVar.replace(“Monday”,”Friday”);

11 格式化字串

1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: document.write(myVariable.big() + “<br/>”);
5: document.write(myVariable.blink() + “<br/>”);
6: document.write(myVariable.bold() + “<br/>”);
7: document.write(myVariable.fixed() + “<br/>”);
8: document.write(myVariable.fontcolor(“red”) + “<br/>”);
9: document.write(myVariable.fontsize(“18pt”) + “<br/>”);
10: document.write(myVariable.italics() + “<br/>”);
11: document.write(myVariable.small() + “<br/>”);
12: document.write(myVariable.strike() + “<br/>”);
13: document.write(myVariable.sub() + “<br/>”);
14: document.write(myVariable.sup() + “<br/>”);
15: document.write(myVariable.toLowerCase() + “<br/>”);
16: document.write(myVariable.toUpperCase() + “<br/>”);
17:
18: var firstString = “My String”;
19: var finalString = firstString.bold().toLowerCase().fontcolor(“red”);
20: // -->
21: </script>

12 创建数组

1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “First Entry”;
5: myArray[1] = “Second Entry”;
6: myArray[2] = “Third Entry”;
7: myArray[3] = “Fourth Entry”;
8: myArray[4] = “Fifth Entry”;
9: var anotherArray = new Array(“First Entry”,”Second Entry”,”Third Entry”,”Fourth Entry”,”Fifth Entry”);
10: // -->
11: </script>

13 数组排序

1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “z”;
5: myArray[1] = “c”;
6: myArray[2] = “d”;
7: myArray[3] = “a”;
8: myArray[4] = “q”;
9: document.write(myArray.sort());
10: // -->
11: </script>

14 分割字符串

1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “a,b,c,d”;
4: var stringArray = myVariable.split(“,”);
5: document.write(stringArray[0]);
6: document.write(stringArray[1]);
7: document.write(stringArray[2]);
8: document.write(stringArray[3]);
9: // -->
10: </script>

15 弹出警告信息

1: <script language=”JavaScript”>
2: <!--
3: window.alert(“Hello”);
4: // -->
5: </script>

16 弹出确认框

1: <script language=”JavaScript”>
2: <!--
3: var result = window.confirm(“Click OK to continue”);
4: // -->
5: </script>

17 定义函数

1: <script language=”JavaScript”>
2: <!--
3: function multiple(number1,number2) {
4: var result = number1 * number2;
5: return result;
6: }
7: // -->
8: </script>

18 调用JS函数

1: <a href=”#” onClick=”functionName()”>Link text</a>
2: <a href="/”javascript:functionName"()”>Link text</a>

19 在页面加载完成后执行函数

1: <body onLoad=”functionName();”>
2: Body of the page
3: </body>

20 条件判断

1: <script>
2: <!--
3: var userChoice = window.confirm(“Choose OK or Cancel”);
4: var result = (userChoice == true) ? “OK” : “Cancel”;
5: document.write(result);
6: // -->
7: </script>

21 指定次数循环

1: <script>
2: <!--
3: var myArray = new Array(3);
4: myArray[0] = “Item 0”;
5: myArray[1] = “Item 1”;
6: myArray[2] = “Item 2”;
7: for (i = 0; i < myArray.length; i++) {
8: document.write(myArray[i] + “<br/>”);
9: }
10: // -->
11: </script>

22 设定将来执行

1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: window.setTimeout(“hello()”,5000);
7: // -->
8: </script>

23 定时执行函数

1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: window.setTimeout(“hello()”,5000);
6: }
7: window.setTimeout(“hello()”,5000);
8: // -->
9: </script>

24 取消定时执行

1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: var myTimeout = window.setTimeout(“hello()”,5000);
7: window.clearTimeout(myTimeout);
8: // -->
9: </script>

25 在页面卸载时候执行函数

1: <body onUnload=”functionName();”>
2: Body of the page
3: </body>

JavaScript就这么回事2:浏览器输出

26 访问document对象

1: <script language=”JavaScript”>
2: var myURL = document.URL;
3: window.alert(myURL);
4: </script>

27 动态输出HTML

1: <script language=”JavaScript”>
2: document.write(“<p>Here’s some information about this document:</p>”);
3: document.write(“<ul>”);
4: document.write(“<li>Referring Document: “ + document.referrer + “</li>”);
5: document.write(“<li>Domain: “ + document.domain + “</li>”);
6: document.write(“<li>URL: “ + document.URL + “</li>”);
7: document.write(“</ul>”);
8: </script>

28 输出换行

1: document.writeln(“<strong>a</strong>”);
2: document.writeln(“b”);

29 输出日期

1: <script language=”JavaScript”>
2: var thisDate = new Date();
3: document.write(thisDate.toString());
4: </script>

30 指定日期的时区

1: <script language=”JavaScript”>
2: var myOffset = -2;
3: var currentDate = new Date();
4: var userOffset = currentDate.getTimezoneOffset()/60;
5: var timeZoneDifference = userOffset - myOffset;
6: currentDate.setHours(currentDate.getHours() + timeZoneDifference);
7: document.write(“The time and date in Central Europe is: “ + currentDate.toLocaleString());
8: </script>

31 设置日期输出格式

1: <script language=”JavaScript”>
2: var thisDate = new Date();
3: var thisTimeString = thisDate.getHours() + “:” + thisDate.getMinutes();
4: var thisDateString = thisDate.getFullYear() + “/” + thisDate.getMonth() + “/” + thisDate.getDate();
5: document.write(thisTimeString + “ on “ + thisDateString);
6: </script>

32 读取URL参数

1: <script language=”JavaScript”>
2: var urlParts = document.URL.split(“?”);
3: var parameterParts = urlParts[1].split(“&”);
4: for (i = 0; i < parameterParts.length; i++) {
5: var pairParts = parameterParts[i].split(“=”);
6: var pairName = pairParts[0];
7: var pairValue = pairParts[1];
8: document.write(pairName + “ :“ +pairValue );
9: }
10: </script>

你还以为HTML是无状态的么?

33 打开一个新的document对象

1: <script language=”JavaScript”>
2: function newDocument() {
3: document.open();
4: document.write(“<p>This is a New Document.</p>”);
5: document.close();
6: }
7: </script>

34 页面跳转

1: <script language=”JavaScript”>
2: window.location = “http://www.liu21st.com/”;
3: </script>

35 添加网页加载进度窗口

1: <html>
2: <head>
3: <script language=’javaScript’>
4: var placeHolder = window.open(’holder.html’,’placeholder’,’width=200,height=200’);
5: </script>
6: <title>The Main Page</title>
7: </head>
8: <body onLoad=’placeHolder.close()’>
9: <p>This is the main page</p>
10: </body>
11: </html>

JavaScript就这么回事3:图像

36 读取图像属性

1: <img src="/”image1.jpg"” name=”myImage”>
2: <a href=”# ” onClick=”window.alert(document.myImage.width)”>Width</a>
3:

37 动态加载图像

1: <script language=”JavaScript”>
2: myImage = new Image;
3: myImage.src = “Tellers1.jpg”;
4: </script>

38 简单的图像替换

1: <script language=”JavaScript”>
2: rollImage = new Image;
3: rollImage.src = “rollImage1.jpg”;
4: defaultImage = new Image;
5: defaultImage.src = “image1.jpg”;
6: </script>
7: <a href="/”myUrl"” onMouseOver=”document.myImage.src = rollImage.src;”
8: onMouseOut=”document.myImage.src = defaultImage.src;”>
9: <img src="/”image1.jpg"” name=”myImage” width=100 height=100 border=0>

39 随机显示图像

1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = “image1.jpg”;
4: imageList[1] = “image2.jpg”;
5: imageList[2] = “image3.jpg”;
6: imageList[3] = “image4.jpg”;
7: var imageChoice = Math.floor(Math.random() * imageList.length);
8: document.write(‘<img src=”’ + imageList[imageChoice] + ‘“>’);
9: </script>

40 函数实现的图像替换

1: <script language=”JavaScript”>
2: var source = 0;
3: var replacement = 1;
4: function createRollOver(originalImage,replacementImage) {
5: var imageArray = new Array;
6: imageArray[source] = new Image;
7: imageArray[source].src = originalImage;
8: imageArray[replacement] = new Image;
9: imageArray[replacement].src = replacementImage;
10: return imageArray;
11: }
12: var rollImage1 = createRollOver(“image1.jpg”,”rollImage1.jpg”);
13: </script>
14: <a href=”#” onMouseOver=”document.myImage1.src = rollImage1[replacement].src;”
15: onMouseOut=”document.myImage1.src = rollImage1[source].src;”>
16: <img src="/”image1.jpg"” width=100 name=”myImage1” border=0>
17: </a>

41 创建幻灯片

1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = new Image;
4: imageList[0].src = “image1.jpg”;
5: imageList[1] = new Image;
6: imageList[1].src = “image2.jpg”;
7: imageList[2] = new Image;
8: imageList[2].src = “image3.jpg”;
9: imageList[3] = new Image;
10: imageList[3].src = “image4.jpg”;
11: function slideShow(imageNumber) {
12: document.slideShow.src = imageList[imageNumber].src;
13: imageNumber += 1;
14: if (imageNumber < imageList.length) {
15: window.setTimeout(“slideShow(“ + imageNumber + “)”,3000);
16: }
17: }
18: </script>
19: </head>
20: <body onLoad=”slideShow(0)”>
21: <img src="/”image1.jpg"” width=100 name=”slideShow”>

42 随机广告图片

1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = “image1.jpg”;
4: imageList[1] = “image2.jpg”;
5: imageList[2] = “image3.jpg”;
6: imageList[3] = “image4.jpg”;
7: var urlList = new Array;
8: urlList[0] = “http://some.host/”;
9: urlList[1] = “http://another.host/”;
10: urlList[2] = “http://somewhere.else/”;
11: urlList[3] = “http://right.here/”;
12: var imageChoice = Math.floor(Math.random() * imageList.length);
13: document.write(‘<a href=”’ + urlList[imageChoice] + ‘“><img src=”’ + imageList[imageChoice] + ‘“></a>’);
14: </script>

JavaScript就这么回事4:表单

43 表单构成

1: <form method=”post” action=”target.html” name=”thisForm”>
2: <input type=”text” name=”myText”>
3: <select name=”mySelect”>
4: <option value=”1”>First Choice</option>
5: <option value=”2”>Second Choice</option>
6: </select>
7: <br/>
8: <input type=”submit” value=”Submit Me”>
9: </form>

44 访问表单中的文本框内容

1: <form name=”myForm”>
2: <input type=”text” name=”myText”>
3: </form>
4: <a href=’#’ onClick=’window.alert(document.myForm.myText.value);’>Check Text Field</a>

45 动态复制文本框内容

1: <form name=”myForm”>
2: Enter some Text: <input type=”text” name=”myText”><br/>
3: Copy Text: <input type=”text” name=”copyText”>
4: </form>
5: <a href=”#” onClick=”document.myForm.copyText.value =
6: document.myForm.myText.value;”>Copy Text Field</a>

46 侦测文本框的变化

1: <form name=”myForm”>
2: Enter some Text: <input type=”text” name=”myText” onChange=”alert(this.value);”>
3: </form>

47 访问选中的Select

1: <form name=”myForm”>
2: <select name=”mySelect”>
3: <option value=”First Choice”>1</option>
4: <option value=”Second Choice”>2</option>
5: <option value=”Third Choice”>3</option>
6: </select>
7: </form>
8: <a href=’#’ onClick=’alert(document.myForm.mySelect.value);’>Check Selection List</a>

48 动态增加Select项

1: <form name=”myForm”>
2: <select name=”mySelect”>
3: <option value=”First Choice”>1</option>
4: <option value=”Second Choice”>2</option>
5: </select>
6: </form>
7: <script language=”JavaScript”>
8: document.myForm.mySelect.length++;
9: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].text = “3”;
10: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].value = “Third Choice”;
11: </script>

49 验证表单字段

1: <script language=”JavaScript”>
2: function checkField(field) {
3: if (field.value == “”) {
4: window.alert(“You must enter a value in the field”);
5: field.focus();
6: }
7: }
8: </script>
9: <form name=”myForm” action=”target.html”>
10: Text Field: <input type=”text” name=”myField”onBlur=”checkField(this)”>
11: <br/><input type=”submit”>
12: </form>

50 验证Select项

1: function checkList(selection) {
2: if (selection.length == 0) {
3: window.alert(“You must make a selection from the list.”);
4: return false;
5: }
6: return true;
7: }

51 动态改变表单的action

1: <form name=”myForm” action=”login.html”>
2: Username: <input type=”text” name=”username”><br/>
3: Password: <input type=”password” name=”password”><br/>
4: <input type=”button” value=”Login” onClick=”this.form.submit();”>
5: <input type=”button” value=”Register” onClick=”this.form.action = ‘register.html’; this.form.submit();”>
6: <input type=”button” value=”Retrieve Password” onClick=”this.form.action = ‘password.html’; this.form.submit();”>
7: </form>

52 使用图像按钮

1: <form name=”myForm” action=”login.html”>
2: Username: <input type=”text” name=”username”><br/>
3: Password: <input type=”password”name=”password”><br/>
4: <input type=”image” src="/”login.gif"” value=”Login”>
5: </form>
6:

53 表单数据的加密

1: <SCRIPT LANGUAGE=’JavaScript’>
2: <!--
3: function encrypt(item) {
4: var newItem = ’’;
5: for (i=0; i < item.length; i++) {
6: newItem += item.charCodeAt(i) + ’.’;
7: }
8: return newItem;
9: }
10: function encryptForm(myForm) {
11: for (i=0; i < myForm.elements.length; i++) {
12: myForm.elements[i].value = encrypt(myForm.elements[i].value);
13: }
14: }
15:
16: //-->
17: </SCRIPT>
18: <form name=’myForm’ onSubmit=’encryptForm(this); window.alert(this.myField.value);’>
19: Enter Some Text: <input type=text name=myField><input type=submit>
20: </form>

JavaScript就这么回事5:窗口和框架

54 改变浏览器状态栏文字提示

1: <script language=”JavaScript”>
2: window.status = “A new status message”;
3: </script>

55 弹出确认提示框

1: <script language=”JavaScript”>
2: var userChoice = window.confirm(“Click OK or Cancel”);
3: if (userChoice) {
4: document.write(“You chose OK”);
5: } else {
6: document.write(“You chose Cancel”);
7: }
8: </script>

56 提示输入

1: <script language=”JavaScript”>
2: var userName = window.prompt(“Please Enter Your Name”,”Enter Your Name Here”);
3: document.write(“Your Name is “ + userName);
4: </script>

57 打开一个新窗口

1: //打开一个名称为myNewWindow的浏览器新窗口
2: <script language=”JavaScript”>
3: window.open(“http://www.liu21st.com/”,”myNewWindow”);
4: </script>

58 设置新窗口的大小

1: <script language=”JavaScript”>
2: window.open(“http://www.liu21st.com/”,”myNewWindow”,’height=300,width=300’);
3: </script>

59 设置新窗口的位置

1: <script language=”JavaScript”>
2: window.open(“http://www.liu21st.com/”,”myNewWindow”,’height=300,width=300,left=200,screenX=200,top=100,screenY=100’);
3: </script>

60 是否显示工具栏和滚动栏

1: <script language=”JavaScript”>
2: window.open(“http:

61 是否可以缩放新窗口的大小

1: <script language=”JavaScript”>
2: window.open(’http://www.liu21st.com/’ , ’myNewWindow’, ’resizable=yes’ );</script>

62 加载一个新的文档到当前窗口

1: <a href=’#’ onClick=’document.location = ’125a.html’;’ >Open New Document</a>

63 设置页面的滚动位置

1: <script language=”JavaScript”>
2: if (document.all) { //如果是IE浏览器则使用scrollTop属性
3: document.body.scrollTop = 200;
4: } else { //如果是NetScape浏览器则使用pageYOffset属性
5: window.pageYOffset = 200;
6: }</script>

64 在IE中打开全屏窗口

1: <a href=’#’ onClick=”window.open(’http://www.juxta.com/’,’newWindow’,’fullScreen=yes’);”>Open a full-screen window</a>

65 新窗口和父窗口的操作

1: <script language=”JavaScript”>
2: //定义新窗口
3: var newWindow = window.open(“128a.html”,”newWindow”);
4: newWindow.close(); //在父窗口中关闭打开的新窗口
5: </script>
6: 在新窗口中关闭父窗口
7: window.opener.close()

66 往新窗口中写内容

1: <script language=”JavaScript”>
2: var newWindow = window.open(“”,”newWindow”);
3: newWindow.document.open();
4: newWindow.document.write(“This is a new window”);
5: newWIndow.document.close();
6: </script>

67 加载页面到框架页面

1: <frameset cols=”50%,*”>
2: <frame name=”frame1” src="/”135a.html"”>
3: <frame name=”frame2” src="/”about:blank"”>
4: </frameset>
5: 在frame1中加载frame2中的页面
6: parent.frame2.document.location = “135b.html”;

68 在框架页面之间共享脚本
如果在frame1中html文件中有个脚本

1: function doAlert() {
2: window.alert(“Frame 1 is loaded”);
3: }

那么在frame2中可以如此调用该方法

1: <body onLoad=”parent.frame1.doAlert();”>
2: This is frame 2.
3: </body>

69 数据公用
可以在框架页面定义数据项,使得该数据可以被多个框架中的页面公用

1: <script language=”JavaScript”>
2: var persistentVariable = “This is a persistent value”;
3: </script>
4: <frameset cols=”50%,*”>
5: <frame name=”frame1” src="/”138a.html"”>
6: <frame name=”frame2” src="/”138b.html"”>
7: </frameset>

这样在frame1和frame2中都可以使用变量persistentVariable

70 框架代码库
根据以上的一些思路,我们可以使用一个隐藏的框架页面来作为整个框架集的代码库

1: <frameset cols=”0,50%,*”>
2: <frame name=”codeFrame” src="/”140code.html"”>
3: <frame name=”frame1” src="/”140a.html"”>
4: <frame name=”frame2” src="/”140b.html"”>
5: </frameset>