----------------------------------------------------------------------------------------------------------------------------------------------------------

 泡牛吧!

                                       希望越来越多的光棍能够泡到牛

-----------------------------------------------------------------------------------------------------------------------------------------------------------

共 62篇 前 10 页: 10    每页5篇 下一页  

兴趣新闻

http://www.javaeye.com/topic/81641
haohao   2007-05-24 16:26:34 阅读:78  评论:0  引用:0

简介

东西方政治制度可以交汇吗?

 

  •  

·    

  •  
    • 提摩西·贾顿·艾许   香港
    • 卫报       20081120   周四

 

今天早上,我在南华早报读到一则消息:袋鼠是起源于中国的。报纸的消息来源是澳大利亚袋鼠基因组研究中心,因此这应该是真的。那接下去将是什么?熊猫起源自法国?奇异鸟来自哥斯达黎加?

 

这是个混乱的时代。天空中充满了怪事。昨日的金融巨人如今化为乌有,通用汽车此时也成为了政府门前的乞丐。就在我们的眼前,世界正在被重塑,而在香港,很多世界顶级的贸易商,正默默地纪录着这些转变。

 

香港这个独一无二的东西方融合点来看,首要的,也最明显的转变,是从西方转向了东方。更具体地来说:是中国力量的加强和美国力量的衰落。就像在香港那些被人行天桥相互连接着的各种摩天大楼穿行,人们在看AIG大 厦时可能会充满忧虑,而看贝聿铭设计的那幢深色玻璃外墙,呈刀刃状的中银大厦时,却可以让人感到更加自信——虽然福斯特设计的汇丰大厦也还挺得下去。在电 视上,曾经是全美大学生优秀橄榄球员的财长保尔森,在国会面前,他罕见地失去了往日的沉着,原因大概是他提出的救助计划本身,现在也需要接受救助。而与此 同时,胡锦涛却能镇定自若地率领由600位商界领袖组成的代表团出席在秘鲁举行的亚太峰会。中国主席将在秘鲁签订一份双边贸易协定,这会让中国取代美国,成为秘鲁的首要贸易伙伴。

 

印度财长在接受一家地方电视台采访时,一脸满足地指出,华盛顿峰会是20国峰会,而不只是8国 峰会。他表示,峰会本该如此,也应该保持这种形式。中国领导层的一贯谦虚表态也曾一度中断(什么?超级大国?我们?),中国主权财富基金监事长金立群表 示,发达国家应该“谦虚地”寻求发展中国家,例如中国的帮助。这番话暗批要求中国注资国际货币基金组织的言论,他评论说:“如果你既想让中国为越来越严重 的金融危机花钱,同时却又不愿意给我们更多的投票权,那么没人会想跟你合作的。”

 

力量的转移会带来意识形态的转移吗?显然,美式自由市场经济从 某种意义上说正被乌云遮盖,即使在自由市场贸易温床的香港也是如此——而中国大陆积聚巨额外汇储备的中央调控市场混合经济,在现在这个危机中显得更有吸引 力,看上去前景更加光明。我听说,一些香港人,带有一些国民自豪色彩地如此解读中国的经济模式。但他们在大陆的亲戚和朋友的诸多经历,让他们对中国的体制 上的弱点太熟悉了——社会不平等、腐败、缺乏社会保障,还有运作低效——都让任何关于中国模式熠熠生辉的简单想法难以成立。

 

事实上,我听说了一个有趣得多,也更微妙的事情。现在正在进行一个务实的、跨越整个中国的大讨论,而香港知识分子和社会活动家也有参与。那就是中国社会如何才能让高效的市场经济,与能与美国比美的本土企业家精神结合在,并融合进公平度、社会凝聚力,或者说“和谐”?在这些大而空泛的口号背后,有着一个危险而且不稳的社会现实,中国的民众经常走上街头示威——公安部公布的记录显示,在2004年有大约74000起“群众聚集”事件——甚至就在本周,甘肃省还发生群众与防暴警察冲突并破坏政府建筑物的事件。如何建设社会和谐?我们欢迎所有的建议。嗯,几乎所有的建议。

 

无可否认,意识形态的框架还是很重要。胡主席不会推动他称之为“民主资本主义”的东西,同样,即将成为前总统的小布什,也不能接受“美国特色的社会主义”。但在那些大口号之下,现实总是出人意料的。例如,大部分人认为美国是小政府的国家,而中国是大政府的国家。但香港学者王绍光估计,中国目前中央和地方政府合计只占了GDP20%。而在美国,这个数字却比中国还要高,有多高要取决于你住在哪个州,但资本主义的美国政府占GDP的比例,毫无疑问比社会主义的中国还要高。

 

真正重要的是什么东西有效。香港有些人甚至把复杂的实用主义延用到政治体制。这不仅是民主或不民主的问题,或者他们称之为黑猫白猫的问题。民主之下也会有很多的阴影。比较有意思的建议是,采用香港用来“选举”特首的制度——由功能界别(不同经济部门、宗教团体,甚至还有中医行业也有20个名额)的提名代表组成选举委员会,他们有最终决定权——这是中国领导层正在观察的一个模式,中国正在考虑如何把它称之为民主制度的东西延用到国内的体制里。

 

如果这能成真,那就太美妙了,也将成为一次进步。但我对美国总统大选的印象实在是太深刻了,以致于不能接受香港这一模式是完全的民主。的确,完全专制与民主自由存在诸多差异,但总在某处有一条明确的界限,而且并不难找到。来个测试:如果你不知道谁将赢得大选,你可能就是在一个民主的环境中。我们当时也不敢肯定奥巴马一定能赢的——还记得吗?谁将继承胡主席不是中国人民能自己决定的。这条界限很清楚,也很基本。

 

当提到社会经济学 时,我则认为,在市场经济的天地里,不存在任何显而易见的界限,没有黑猫白猫——这里面只有在增长、社会凝聚力以及环境可持续之间,或者在公共部门和私人 部门之间的各种复杂因素达成平衡。正如中国大陆、香港还有甚至于台湾,都在对中国社会该如何处理这个问题进行复杂而间接的讨论,因此,对中国的政策制定者 来说,坐下来和印度或者巴西的领导人讨论一下,你们那边是如何处理这个问题的?我们在国内是这么处理这个问题的,这样做很有意义。

 

大英帝国的诗人吉卜林曾经到访香港, 写了一首著名的诗歌,叫做《东西方民谣》:“啊,东方就是东方,西方就是西方,它们永不交汇……”如果这句话曾经是对的,现在也不再是这样了。它们一直在 交汇并且融合。那首诗继续写到:“……没有东方和西方之分……当两大巨人面对面地站在一起……”而这些天我们看到的则是:这个涌动的星球上,当衰微的政府 试图满足人民躁动的需求时,真的不再有什么东方和西方之分了。

haohao   2008-11-21 13:59:05 阅读:4  评论:0  引用:0
 随着时间的流逝我们一直在获得新的知识,但是这些学问却往往在我们需要它的时候姗姗来迟。很多对我早期生活应该极其有用的事情我却现在才知道,它们本可以帮助我在那些年里避免很多错误跟伤害----大部分事情我也曾经强加于别人身上过。

     我不相信生活会 无故地变得富裕而有情趣,那只是浪漫的妄想。因为我一生都充满动荡和不安。也不同意错误是已经存在于某个地方好帮助我们学习的。那些错误都是我自己犯的 ----出于无知、害怕还有希望所有人都喜欢自己的愚蠢愿望----没有了它们我们的生活工作就会有更少的压力更多的快乐(当然还包括成功)。下面有几点 是我很久以前就希望自己能够了解的。期待它们能帮助大家,即使是小部份人,能够避免重蹈我的覆辙。

     拥有一颗平常心。

         太多我曾经为其兴奋,为其焦虑,亦或是浪费了我时间以及精力的事情到最后却被证明是无关紧要的。它们只是幸福生活里极其微小的一部分。我多么希望早点知道这些,以便能把精力都投入到这些关乎幸福的事,而不是其他。

     ●这个世界上痛苦与仇恨最大源泉是对过去的执迷。

        看看那些恐怖组织和激进分子,他们总是抓住过去的一些事情不放,或把一小片土地的历史归属问题作为他们进行杀戮的理由,更或是为了修正几百年前的所谓的历史错误。

     ●等待有把握时再去做一件事,往往意味着永远的等待

       一个人能做的最大的冒险事情,就是乐意在公共场合经常暴露自己的愚昧。没有什么能比这样学得更快。“哎呀”, 也是一种乐趣。

     ●盲目追赶潮流是对精神和智力的扼杀

       你可以成为一个廉价的时尚木偶,也可以成为独一无二的你,这些都在于自己的选择。信仰不是群众的鸦片,流行才是。

     ●如果有人抱怨你太特立独行,恭喜你,你正走在正确的路上

         谁愿意像动物一样活着?那些强有力的家伙们不希望你按照自己的意愿去做,他们希望你停止给他们制造麻烦并听从他们的命令。但你得知道,你无法做到在卑躬屈膝的同时又能活出自我。

     ●如果你将工作等同于生活,那么你将为工作而生活

         和很多人一样,当看到那些艺术家和音乐家的工作几乎是全部的生活,我感到很困惑。其实那不是工作,那是他们的自我。除非你有无法抵挡的激情,恰巧也能让你从中得以谋生,否则请永远记住,工作只是一种手段,而不是目的,我们的最终目的是享受生活。在实现目的的同时,尽可能地少花时间在手段上。只有傻瓜才是为工作而生活。

     ●破坏关系的最快最简单的方法就是听信谣言

       浪费你时间的最糟糕方式是传播这些谣言。传播流言蜚语的人好比瘟疫的携带者,相比之下,蟑螂都比他们干净、善良。

     ●试图取悦别人是徒劳无益的做法

       总有些人会对你发飙。很多你接触的人,在很多时候也会不喜欢、贬低、轻视或忽略你。另外,你永远也不知道别人真正的需要,因此你为此所做的所有努力都会付 诸东流。放松些吧,爱你的人终究会包容你的过失,他们才是值得我们在乎的人。其他那些人,他们甚至都不值得花5分钟去考虑。

     ●没有永久的胜利者

       踏上冠军宝座是件好事情。但不要梦想着可以永久占据这个位置,最糟糕的是,你正决定为达此目的而不择手段。

     ●不可能取悦、平息或改造一个混蛋

       你能做的最好方式,是和他们敬而远之。变成混蛋也能传染,你和他们呆的时间越长,你也越有可能染上混蛋的习气或者你就成为混蛋。

     ●努力加倍,期望减半

       任何事情都是花掉你计划的两倍时间,最后却只换来你一半的期望结果。没什么好为此沮丧的,(中国俗话说:事倍功半)让它去吧,你要继续前行。

     ●人是奇怪的偏执狂

       撒谎者总是撒谎,骗子总要行骗。一个人对你倾诉的时候,通常已在其它人的面前倾诉过,只是可能没有得到想要回应。一位忠诚的朋友,无论遭受多大的冤屈依旧忠诚。

     ●接纳自己

       不管你怎么努力,你都无法逃避成为自己。除了自己,你还能成为谁呢?你可以扮演和假装,但进行扮演和假装的人还是你自己。如果你都无法接纳自己,没有努力挖掘自己已有的东西,那么谁有义务接纳你呢?

     ●谈到公众谎言,没有比预算数字更令人震惊的

       把时间折腾在这上面,是浪费时间。既使(奇迹中的奇迹!) 你是实事求是并且准确的, 其他人也不会那么愚蠢。

     ●世界上最大的噪音是人们的抱怨

        不要再增加了。

haohao   2008-11-18 18:07:39 阅读:33  评论:0  引用:0

我这一辈关心中国发展的人,不可能不知道大跃进及 人民公社期间北京公布的经济数字不尽不实,往往离谱。开放改革以还,经济统计有了革命性的改进,可惜这些统计历来麻烦兼头痛。先进如美国,最近发生的金融 风暴,把大有来头的财政部长与联储局长弄得手忙脚乱,反映着他们的统计也有不少问题,误导了。是的,如果年多前次贷事发时他们有足够的资料,立刻处理,今 天的灾难不会那么严重。

记得一九八三年底,中国改革开始有眉目,一位在北 京主事统计的仁兄到香港解画,说他们大事整顿统计,陈辞恳切,又说他个人可以担保数字不错。我对他说:相信他的真诚,但希望他以后不要那么傻,担保数字的 准确性。我指出,政府的经济数据全世界都错,分别是错多错少而已。我也打趣地向他说了两个他很不以为然的小故事。那是七十年代时,香港的财政司郭伯伟与美 国的经济大师佛利民,曾经不约而同地对我说,如果政府完全不公布任何经济数字,对社会可能较好!

没有理由质疑中国今天从事统计的本领,但可以指出 与其它先进之邦相比,统计上中国在几方面有特别的困难。其一是流动人口不仅多,且常有变动,而这些是无从估计得准确的。其二是月入千六以下的不用付税,打 散工的懒得付,这些人的收入多少难知。其三是中国发明的发票制度,容易导致经济统计产生偏差。

提到这些,因为多年来我老是觉得中国的经济数据有 一处我不能理解:我可能错,但当局发表的数字,与个人现实观察的情况比对,通常是前者迟了一段日子。有时迟三几个月,有时迟逾一年。迟发的经济数据外国也 有,但中国的彷佛特别迟。这是个人的感受,可能错。这感受不起自今天──八十年代初期起我就觉得是这样。

要我认错容易,但朋友,我是真的错了吗?无数读者 会同意,数十年来我对中国经济的推断很准确──差不多没有错过。远比其它经济学者推得准,一部分靠真功夫:我的宏观分析是自己的发明。然而,衷心说实话, 我的准绳有好一部分是骗人的:在真实世界见到了情况的转变,认为合情合理,推远一点,就先写了出来,过后政府公布的数字说我对!这不是骗人是什么?不是政 府骗人民,而是我骗读者。是的,只要政府公布得迟,而你不断地到处观察,这里那里八卦一下,先说出来,水晶球就变得灵光了。

最近北京公布的经济增长率下降,上季下降至百分之 九。明年怎样看呢?某机构的预测是明年增长九点五,北京说要保九,林毅夫说保八以上不难。我呢?认为保零也不易!是的,我的水晶球说,未来一两年,神州大 地很可能出现负增长。说得肯定一点吧:如果北京依然故我,不洞烛先机地大手应对,负增长一定出现。最近北京公布的数据显示经济的增长率下降得快,但跟我在 几个地区见到的工业下跌相比,还是好看很多。工业是中国的经济命脉,此业遇难,整个国家的经济无可救药也。

地球金融风暴,对神州当然不利,但我说过,这次起 自美国灾难的地球传染性不高。这风暴起自一个月前,但中国的工业困境是八个月前开始明确,逐步恶化。这使我在悲观中看到乐观的一面:如果中国的工业发展没 有兵败如山倒,还是有着十多个月前的形势,那么这次地球灾难,除了某些部门或机构大输一笔,中国的发展还会是很不错的。这是说,地球带来的不幸,中国可以 处理的治方不多,但自己的工业不景,在地球不幸之前出现的那部分,起于拿起石头砸自己的脚,北京立刻着手更正是有前途的。

工业出事,主要是两点,说过多次了。其一是人民币 处理失误,其二是新劳动合同法。大陆的厂家也一般这样看。有些厂家是赞同这些政策的。某些有成就的大厂,见这些政策替他们淘汰了半生不死的「山寨」小厂, 不是拍手就是偷笑。这不对:维护大厂、牺牲小厂,跟中国文化的伦理不合,跟我知道的可能早就失传的经济学也合不来。

要搞什么经济转型,或要淘汰某些所谓夕阳工业的言 论,这些日子我听得多了。理论不对,我知得清楚。这些所谓「转型」或「淘汰」的理论基础,来自西方的所谓效率工资理论(有三位曾以之获诺奖)。说来有点搞 笑,这效率工资理论却来自我一九七六发表的《佳座票价为何偏低了?》。他们是误解了我。我认为该理论错得离奇(见拙作《制度的选择》,一五六至一五九 页),但胡里胡涂地给一些回归的后起之秀成功地在神州推销了。

经济转型是大话题,有机会才细述。这里要指出一个 重要的真实故事。不久前认识一位朋友,做厂的,做得很大,但生意算是「夕阳」工业,国家不重视,希望淘而汰之吧。这位朋友说,美国不断地向他招手,邀请他 到那里去设厂,提供很多方便、补贴等等。主要因为此友的工业,从科技看是「夕阳」,但雇用人手多,有养生之术也。世界难道这么快就轮流转乎?中国不要的工 业,美国却抢着要!

回头说「人民币」与「劳动法」这两个问题,读者以 为厂家们排哪个是为祸之首,哪个次之呢?我赌你猜不中,虽然厂家的看法很一致。你不可能猜中,因为有两个不同的答案。一、论到生意亏蚀,人民币兑美元升值 是祸首(其中复杂的内情要另文分析)。二、论到关门大吉,则要拜新劳动法所赐(其中内情也要另述)。

最近的三中全会及跟着推出的政策,显示北京是体会到事情来得严重了。他们推出的有对有不对——对多于不对——但我认为这些政策不能解决面对的困境。到处都是问题,世界本来复杂,今天看是大乱了。北京的朋友千万不要以复杂的政策来处理复杂之乱。

haohao   2008-10-24 10:36:28 阅读:19  评论:0  引用:0

       晚上,送完宝宝回家以后 顺便吃了点东西以后,就把家里的红酒拿出来喝了完了,晚上苏维和小沈陪我喝了点。

       直到11点点半,躺下睡觉一直到现在还是睡不着,和小楚打电话聊了会,想想睡着了吧!但是还是睡不着,宝宝的走

真的让我如此的悲伤吗?真不知道该说什么了!!!唉!!!!!!

haohao   2007-11-20 03:48:59 阅读:72  评论:0  引用:0
http://livedemo.exadel.com/richfaces-demo/
haohao   2007-11-16 11:02:19 阅读:1581  评论:1  引用:0
http://topic.csdn.net/u/20070315/10/78d03595-b5fa-4853-ab02-37ed16c2ddb3.html
haohao   2007-11-13 16:07:05 阅读:1021  评论:1  引用:0
http://www.blogjava.net/RongHao/archive/2007/11/06/158621.html
haohao   2007-11-08 08:29:38 阅读:174  评论:0  引用:0
http://news.nen.com.cn/72344605311500288/20071105/2341256.shtml
http://life.beelink.com.cn/20071104/2427764.shtml
http://www.ynhohe.cn/honghenews/2007-11/761p2.html
http://info.china.alibaba.com/news/detail/v5003000-d1001114171.html
http://www.ynhohe.cn/honghenews/2007-11/757.html
haohao   2007-11-05 11:41:36 阅读:44  评论:1  引用:0
译者前言:
      近来在整理有关Servlet资料时发现,在网上竟然找不到一份中文的Java Servlet API的说明文档,而在有一本有关JSP的书后面附的Java Servlet API说明竟然不全,而这份文档的2.1a版在1998年的11月份就已定稿。所以我决定翻译一份中文的文档(其中一些与技术关系不大的部分已被略去),有兴趣的读者可以从http://java.sun.com/products/servlet/2.1/servletspec-2.1.zip下载原文阅读。


      Java Servlet API说明文档(2.1a版)
      1998年11月


绪言
      这是一份关于2.1版Java Servlet API的说明文档,作为对这本文档的补充,你可以到http://java.sun.com/products/servlet/index.html下面下载Javadoc格式的文档。

      谁需要读这份文档
      这份文档描述了Java Servlet API的最新版本2.1版。所以,这本书对于Servlet的开发者及servlet引擎的开发者同样适用。

      Java Servlet API的组成
      Java Servlet API由两个软件包组成:一个是对应HTTP的软件包,另一个是不对应HTTP的通用的软件包。这两个软件包的同时存在使得Java Servlet API能够适应将来的其他请求-响应的协议。
      这份文档以及刚才提及的Javadoc格式的文档都描述了这两个软件包,Javadoc格式的文档还描述了你应该如何使用这两个软件包中的所有方法。

      有关规范
      你也许对下面的这些Internet规范感兴趣,这些规范将直接影响到Servlet API的发展和执行。你可以从http://info.internet.isi.edu/7c/in-notes/rfc/.cache 找到下面提到的所有这些RFC规范。
      RFC 1738 统一资源定位器(URL)
      RFC 1808 相关统一资源定位器
      RFC 1945 超文本传输协议--HTTP/1.0
      RFC 2045 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第一部分:Internet信息体格式
      RFC 2046 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第二部分:媒体类型
      RFC 2047 多用途网际邮件扩充协议(MIME)(多用途Internet邮件扩展)第三部分:信息标题扩展用于非ASCII文本
      RFC 2048 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第四部分: 注册步骤
      RFC 2049 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第五部分:一致性标准和例子
      RFC 2068 超文本传输协议 -- HTTP/1.1
      RFC 2069 一个扩展HTTP:摘要访问鉴定
      RFC 2109 HTTP状态管理机制
      RFC 2145 HTTP 版本号的使用和解释
      RFC 2324 超文本Coffee Pot控制协议 (HTCPCP/1.0)
      万维网协会(http://www.w3.org)管理着这些协议的规范和执行。


有关Java Servlets
      JavaTM servlets是一个不受平台约束的Java小程序,它可以被用来通过多种方法扩充一个Web服务器的功能。你可以把Servlet理解成Server上的applets,它被编译成字节码,这样它就可以被动态地载入并用效地扩展主机的处理能力。
      Servlet与applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。
      一个客户端程序,可以是一个Web浏览器,或者是非其他的可以连接上Internet的程序,它会访问Web服务器并发出请求。这个请求被运行在Web服务器上的Servlet引擎处理,并返回响应到Servlet。Servlet通过HTTP将这个响应转发到客户端。
在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。

      Java Servlet概论
      Servlet与其他普通的server扩展机制有以下进步:
      因为它采用了不同的进程处理模式,所以它比CGI更快。
      它使用了许多Web服务器都支持的标准的API。
      它继承了Java的所有优势,包括易升级以及平台无关性。
      它可以调用Java所提供的大量的API的功能模块。
      这份文档说明了Java Servlet API的类和接口的方法。有关更多的信息,请参看下面的API说明。

      Servlet的生命周期
      一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。
      所有的Java Servlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行。Servlet引擎是Web 服务器按照Java Servlet API定制的扩展。Servlet引擎提供网络服务,能够理解MIME请求,并提供一个运行Servlet的容器。
      javax.servlet.Servlet接口定义了在Servlet的生命周期中特定时间以及特定顺序被调用的方法。

      Servlet的解析和载入
      Servlet引擎解析并载入一个Servlet,这个过程可以发生在引擎启动时,需要一个Servlet去响应请求时,以及在此之间的任何时候。
      Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。

      Servlet的初始化
      Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化,在这一过程中,你可以读取一些固定存储的数据、初始化JDBC的连接以及建立与其他资源的连接。
      在初始化过程中,javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息。这样,Servlet可以对自己进行配置。
      init()方法获得了一个Servlet配置对象(ServletConfig)。这个对象在Servlet引擎中执行,并允许Servlet通过它获处相关参数。这个对象使得Servlet能够访问ServletContext对象。

      Servlet处理请求
      Servlet被初始化之后,它已经可以处理来自客户端的请求,每一个来自客户端的请求都被描述成一个ServletRequest对象,Servlet的响应被描述成一个ServletResponse对象。
      当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。
      Servlet也可以执行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有权使用客户端发出的请求。Servlet可以通过ServletInputStream对象读取请求信息。
      ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。

      多线程和映射
      在多线程的环境下,Servlet必须能处理许多同时发生的请求。例外的情况是这个Servlet执行了SingleThreadModel接口,如果是那样的话,Servlet只能同时处理一个请求。
      Servlet依照Servlet引擎的映射来响应客户端的请求。一个映射对包括一个Servlet实例以及一个Servlet返回数据的URL,例如:HelloServlet with /hello/index.html。
      然而,一个映射可能是由一个URL和许多Servlet实例组成,例如:一个分布式的Servlet引擎可能运行在不止一个的服务器中,这样的话,每一个服务器中都可能有一个Servlet实例,以平衡进程的载入。作为一个Servlet的开发者,你不能假定一个Servlet只有一个实例。

      Servlet的卸载
      Servlet引擎并不必需保证一个Servlet在任何时候或在服务开启的任何时候都被载入。Servlet引擎可以自由的在任何时候使用或清除一个Servlet。因此,我们不能依赖一个类或实例来存储重要的信息。
      当Servlet引擎决定卸载一个Servlet时(例如,如果这个引擎被关闭或者需要让资源),这个引擎必须允许Servlet释放正在使用的资源并存储有关资料。为了完成以上工作,引擎会调用Servlet的destroy()方法。
      在卸载一个Servlet之前,Servlet引擎必须等待所有的service()方法完成或超时结束(Servlet引擎会对超时作出定义)。当一个Servlet被卸载时,引擎将不能给Servlet发送任何请求。引擎必须释放Servlet并完成无用存储单元的收集

      Servlet映射技术
      作为一个Servlet引擎的开发者,你必须对于如何映射客户端的请求到Servlet有大量的适应性。这份说明文档不规定映射如何发生。但是,你必须能够自由地运用下面的所有技术:

      映射一个Servlet到一个URL
      例如,你可以指定一个特殊的Servlet它仅被来自/feedback/index.html的请求调用。

      映射一个Servlet到以一个指定的目录名开始的所有URL
      例如,你可以映射一个Servlet到/catalog,这样来自/catalog/、 /catalog/garden和/catalog/housewares/index.html的请求都会被映射到这个Servlet。但是来自/catalogtwo 或/catalog.html的请求没被映射。

      映射一个Servlet到所有以一个特定的字段结尾的所有URL
      例如,你可以映射一个来自于所有以in.thtml结尾的请求到一个特定的Servlet。

      映射一个Servlet到一个特殊的URL /servlet/servlet_name。
      例如,如果你建立了一个名叫listattributes的Servlet,你可以通过使用/servlet/listattributes来访问这个Servlet。

      通过类名调用Servlet
      例如,如果Servlet引擎接收了来自/servlet/com.foo.servlet.MailServlet的请求,Servlet引擎会载入这个com.foo.servlet.MailServlet类,建立实例,并通过这个Servlet来处理请求。

      Servlet环境
      ServletContext接口定义了一个Servlet环境对象,这个对象定义了一个在Servlet引擎上的Servlet的视图。通过使用这个对象,Servlet可以记录事件、得到资源并得到来自Servlet引擎的类(例如RequestDispatcher对象)。一个Servlet只能运行在一个Servlet环境中,但是不同的Servlet可以在Servlet引擎上有不同的视图。
      如果Servlet引擎支持虚拟主机,每个虚拟主机有一个Servlet环境。一个Servlet环境不能在虚拟主机之间共享。
      Servlet引擎能够允许一个Servlet环境有它自己的活动范围。
      例如,一个Servlet环境是属于bank应用的,它将被映射到/bank目录下。在这种情况下,一个对getContext方法的调用会返回/bank的Servlet环境。

      HTTP会话
      HTTP是一个没有状态的协议。要建立一个有效的Web服务应用,你必须能够识别一个连续的来自远端的客户机的唯一的请求。随着时间的过去,发展了许多会话跟踪的技术,但是使用起来都比较麻烦。
      Java Servlet API提供了一个简单的接口,通过这个接口,Servlet引擎可以有效地跟踪用户的会话。

      建立Session
      因为HTTP是一个请求-响应协议,一个会话在客户机加入之前会被认为是一个新的会话。加入的意思是返回会话跟踪信息到服务器中,指出会话已被建立。在客户端加入之前,我们不能判断下一个客户端请求是目前会话的一部分。
      在下面的情况下,Session会被认为是新的Session。
      客户端的Session在此之前还不知道
      客户端选择不加入Session,例如,如果客户端拒绝接收来自服务器的cookie
作为一个Servlet的开发者,你必须决定你的Web应用是否处理客户机不加入或不能加入Session。服务器会在Web服务器或Servlet规定的时间内维持一个Session对象。当Session终止时,服务器会释放Session对象以及所有绑定在Session上的对象。
绑定对象到Session中
      如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的Servlet调用。
      有些对象可能需要你知道什么时候会被放置到Session中或从Session中移开。你可以通过使用HttpSessionBindingListener接口获得这些信息。当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检杳什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。
     
      API对象的说明
      这一部分包含了对Java Servlet API的全部类和接口的详细说明。这个说明与Javadoc API差不多,但是这份文档提供了更多的信息。
API包含了两个软件包,十二个接口和九个类。
软件包:javax.servlet
所包含的接口:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。
所包含的类:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。

      一、RequestDispatcher接口:
      定义:
      public interface RequestDispatcher;
      定义一个对象,从客户端接收请求,然后将它发给服务器的可用资源(例如Servlet、CGI、HTML文件、JSP文件)。Servlet引擎创建request dispatcher对象,用于封装由一个特定的URL定义的服务器资源。
      这个接口是专用于封装Servlet的,但是一个Servlet引擎可以创建request dispatcher对象用于封装任何类型的资源。
      request dispatcher对象是由Servlet引擎建立的,而不是由Servlet开发者建立的。
      方法
      1、forward
      public void forward(ServletRequest request, ServletReponse response)
            throws ServletException, IOException;
      被用来从这个Servlet向其它服务器资源传递请求。当一个Servlet对响应作了初步的处理,并要求其它的对象对此作出响应时,可以使用这个方法。
      当request对象被传递到目标对象时,请求的URL路径和其他路径参数会被调整为反映目标对象的目标URL路径。
      如果已经通过响应返回了一个ServletOutputStream对象或PrintWriter对象,这个方法将不能使用,否则,这个方法会抛出一个IllegalStateException。
      2、include
      public void include(ServletRequest request, ServletResponse response)
            throws ServletException, IOException
      用来包括发送给其他服务器资源的响应的内容。本质上来说,这个方法反映了服务器端的内容。
      请求对象传到目标对象后会反映调用请求的请求URL路径和路径信息。这个响应对象只能调用这个Servlet的ServletOutputStream对象和PrintWriter对象。
      一个调用include的Servlet不能设置头域,如果这个Servlet调用了必须设置头域的方法(例如cookie),这个方法将不能保证正常使用。作为一个Servlet开发者,你必须妥善地解决那些可能直接存储头域的方法。例如,即使你使用会话跟踪,为了保证session的正常工作,你必须在一个调用include的Servlet之外开始你的session

      二、Servlet接口。
      定义
      public interface Servlet
      这个接口定义了一个Servlet:一个在Web服务器上继承了这个功能的Java类。
      方法
      1、init
      public void init(ServletConfig config) throws ServletException;
      Servlet引擎会在Servlet实例化之后,置入服务之前精确地调用init方法。在调用service方法之前,init方法必须成功退出。
      如果init方法抛出一个ServletException,你不能将这个Servlet置入服务中,如果init方法在超时范围内没完成,我们也可以假定这个Servlet是不具备功能的,也不能置入服务中。
      2、service
      public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException;
      Servlet引擎调用这个方法以允许Servlet响应请求。这个方法在Servlet未成功初始化之前无法调用。在Servlet被初始化之前,Servlet引擎能够封锁未决的请求。
      在一个Servlet对象被卸载后,直到一个新的Servelt被初始化,Servlet引擎不能调用这个方法
      3、destroy
      public void destroy();
      当一个Servlet被从服务中去除时,Servlet引擎调用这个方法。在这个对象的service方法所有线程未全部退出或者没被引擎认为发生超时操作时,destroy方法不能被调用。
      4、getServletConfig
      public ServletConfig getServletConfig();
      返回一个ServletConfig对象,作为一个Servlet的开发者,你应该通过init方法存储ServletConfig对象以便这个方法能返回这个对象。为了你的便利,GenericServlet在执行这个接口时,已经这样做了。
      5、getServletInfo
      public String getServletInfo();
      允许Servlet向主机的Servlet运行者提供有关它本身的信息。返回的字符串应该是纯文本格式而不应有任何标志(例如HTML,XML等)。

      三、ServletConfig接口
      定义
      public interface ServletConfig
      这个接口定义了一个对象,通过这个对象,Servlet引擎配置一个Servlet并且允许Servlet获得一个有关它的ServletContext接口的说明。每一个ServletConfig对象对应着一个唯一的Servlet。
      方法
      1、getInitParameter
      public String getInitParameter(String name);
      这个方法返回一个包含Servlet指定的初始化参数的String。如果这个参数不存在,返加空值。
      2、getInitParameterNames
      public Enumeration getInitParameterNames();
      这个方法返回一个列表String对象,该对象包括Servlet的所有初始化参数名。如果Servlet没有初始化参数,getInitParameterNames返回一个空的列表。
      3、getServletContext
      public ServletContext getServletContext();
      返回这个Servlet的ServletContext对象。

      四、ServletContext接口
      定义
      public interface ServletContext
      定义了一个Servlet的环境对象,通过这个对象,Servlet引擎向Servlet提供环境信息。
      一个Servlet的环境对象必须至少与它所驻留的主机是一一对应的。在一个处理多个虚拟主机的Servlet引擎中(例如,使用了HTTP1.1的主机头域),每一个虚拟主机必须被视为一个单独的环境。此外,Servlet引擎还可以创建对应于一组Servlet的环境对象。
      方法
      1、getAttribute
      public Object getAttribute(String name);
      返回Servlet环境对象中指定的属性对象。如果该属性对象不存在,返回空值。这个方法允许访问有关这个Servlet引擎的在该接口的其他方法中尚未提供的附加信息。
      2、getAttributeNames
      public Enumeration getAttributeNames();
      返回一个Servlet环境对象中可用的属性名的列表。
      3、getContext
      public ServletContext getContext(String uripath);
      返回一个Servlet环境对象,这个对象包括了特定URI路径的Servlets和资源,如果该路径不存在,则返回一个空值。URI路径格式是/dir/dir/filename.ext。
      为了安全,如果通过这个方法访问一个受限制的Servlet的环境对象,会返回一个空值。
      4、getMajorVersion
      public int getMajorVersion();
      返回Servlet引擎支持的Servlet API的主版本号。例如对于2.1版,这个方法会返回一个整数2。
      5、getMinorVersion
      public int getMinorVersion();
      返回Servlet引擎支持的Servlet API的次版本号。例如对于2.1版,这个方法会返回一个整数2。
      6、getMimeType
      public String getMimeType(String file);
      返回指定文件的MIME类型,如果这种MIME类型未知,则返回一个空值。MIME类型是由Servlet引擎的配置决定的。
      7、getRealPath
      public String getRealPath(String path);
      一个符合URL路径格式的指定的虚拟路径的格式是:/dir/dir/filename.ext。用这个方法,可以返回与一个符合该格式的虚拟路径相对应的真实路径的String。这个真实路径的格式应该适合于运行这个Servlet引擎的计算机(包括其相应的路径解析器)。
      不管是什么原因,如果这一从虚拟路径转换成实际路径的过程不能执行,该方法将会返回一个空值。
      8、getResource
      public URL getResource(String uripath);
      返回一个URL对象,该对象反映位于给定的URL地址(格式:/dir/dir/filename.ext)的Servlet环境对象已知的资源。无论URLStreamHandlers对于访问给定的环境是不是必须的,Servlet引擎都必须执行。如果给定的路径的Servlet环境没有已知的资源,该方法会返回一个空值。
      这个方法和java.lang.Class的getResource方法不完全相同。java.lang.Class的getResource方法通过装载类来寻找资源。而这个方法允许服务器产生环境变量给任何资源的任何Servlet,而不必依赖于装载类、特定区域等等。
      9、getResourceAsStream
      public InputStream getResourceAsStream(String uripath);
      返回一个InputStream对象,该对象引用指定的URL的Servlet环境对象的内容。如果没找到Servlet环境变量,就会返回空值,URL路径应该具有这种格式:/dir/dir/filename.ext。
      这个方法是一个通过getResource方法获得URL对象的方便的途径。请注意,当你使用这个方法时,meta-information(例如内容长度、内容类型)会丢失。
      10、getRequestDispatcher
      public RequestDispatcher getRequestDispatcher(String uripath);
      如果这个指定的路径下能够找到活动的资源(例如一个Servlet,JSP页面,CGI等等)就返回一个特定URL的RequestDispatcher对象,否则,就返回一个空值,Servlet引擎负责用一个request dispatcher对象封装目标路径。这个request dispatcher对象可以用来完全请求的传送。
      11、getServerInfo
      public String getServerInfo();
      返回一个String对象,该对象至少包括Servlet引擎的名字和版本号。
      12、log
      public void log(String msg);
      public void log(String msg, Throwable t);
      public void log(Exception exception, String msg); // 这种用法将被取消
      写指定的信息到一个Servlet环境对象的log文件中。被写入的log文件由Servlet引擎指定,但是通常这是一个事件log。当这个方法被一个异常调用时,log中将包括堆栈跟踪。
      13、setAttribute
      public void setAttribute(String name, Object o);
      给予Servlet环境对象中你所指定的对象一个名称。
      14、removeAttribute
      public void removeAttribute(String name);
      从指定的Servlet环境对象中删除一个属性。
      注:以下几个方法将被取消
      15、getServlet
      public Servlet getServlet(String name) throws ServletException;
      最初用来返回一个指定名称的Servlet,如果没找到就返回一个空值。如果这个Servlet能够返回,这就意味着它已经被初始化,而且已经可以接受service请求。这是一个危险的方法。当调用这个方法时,可能并不知道Servlet的状态,这就可能导致有关服务器状态的问题。而允许一个Servlet访问其他Servlet的这个方法也同样的危险。
      现在这个方法返回一个空值,为了保持和以前版本的兼容性,现在这个方法还没有被取消。在以后的API版本中,该方法将被取消。
      16、getServletNames
      public Enumeration getServletNames();
      最初用来返回一个String对象的列表,该列表表示了在这个Servlet环境下所有已知的Servlet对象名。这个列表总是包含这个Servlet自身。
基于与上一个方法同样的理由,这也是一个危险的方法。
      现在这个方法返回一个空的列表。为了保持和以前版本的兼容性,现在这个方法还没有被取消。在以后的API版本中,该方法将被取消。
      17、getServlets
      public Enumeration getServlets();
      最初用来返回在这个Servelet环境下所有已知的Servlet对象的列表。这个列表总是包含这个Servlet自身。
基于与getServlet方法同样的理由,这也是一个危险的方法。
      现在这个方法返回一个空的列表。为了保持和以前版本的兼容性,现在这个方法还没有被取消。在以后的API版本中,该方法将被取消。

      五、ServletRequest接口
      定义
      public interface ServletRequest
      定义一个Servlet引擎产生的对象,通过这个对象,Servlet可以获得客户端请求的数据。这个对象通过读取请求体的数据提供包括参数的名称、值和属性以及输入流的所有数据。
      方法
      1、getAttribute
      public Object getAttribute(String name);
      返回请求中指定属性的值,如果这个属性不存在,就返回一个空值。这个方法允许访问一些不提供给这个接口中其他方法的请求信息以及其他Servlet放置在这个请求对象内的数据。
      2、getAttributeNames
      public Enumeration getAttributeNames();
      返回包含在这个请求中的所有属性名的列表。
      3、getCharacterEncoding
      public String getCharacterEncoding();
      返回请求中输入内容的字符编码类型,如果没有定义字符编码类型就返回空值。
      4、getContentLength
      public int getContentLength();
      请求内容的长度,如果长度未知就返回-1。
      5、getContentType
      public String getContentType();
      返回请求数据体的MIME类型,如果类型未知返回空值。
      6、getInputStream
      public ServletInputStream getInputStream() throws IOException;
      返回一个输入流用来从请求体读取二进制数据。如果在此之前已经通过getReader方法获得了要读取的结果,这个方法会抛出一个IllegalStateException。
      7、getParameter
      public String getParameter(String name);
      以一个String返回指定的参数的值,如果这个参数不存在返回空值。例如,在一个HTTP Servlet中,这个方法会返回一个指定的查询语句产生的参数的值或一个被提交的表单中的参数值。如果一个参数名对应着几个参数值,这个方法只能返回通过getParameterValues方法返回的数组中的第一个值。因此,如果这个参数有(或者可能有)多个值,你只能使用getParameterValues方法。
      8、getParameterNames
      public Enumeration getParameterNames();
      返回所有参数名的String对象列表,如果没有输入参数,该方法返回一个空值。
      9、getParameterValues
      public String[] getParameterValues(String name);
      通过一个String对象的数组返回指定参数的值,如果这个参数不存在,该方法返回一个空值。
      10、getProtocol
      public String getProtocol();
      返回这个请求所用的协议,其形式是协议/主版本号.次版本号。例如对于一个HTTP1.0的请求,该方法返回HTTP/1.0。
      11、getReader
      public BufferedReader getReader() throws IOException;
      这个方法返回一个buffered reader用来读取请求体的实体,其编码方式依照请求数据的编码方式。如果这个请求的输入流已经被getInputStream调用获得,这个方法会抛出一个IllegalStateException。
      12、getRemoteAddr
      public String getRemoteAddr();
      返回发送请求者的IP地址。
      13、getRemoteHost
      public String getRemoteHost();
      返回发送请求者的主机名称。如果引擎不能或者选择不解析主机名(为了改善性能),这个方法会直接返回IP地址。
      14、getScheme
      public String getScheme();
      返回请求所使用的URL的模式。例如,对于一个HTTP请求,这个模式就是http。
      15、getServerName
      public String getServerName();
      返回接收请求的服务器的主机名。
      16、getServerPort
      public int getServerPort();
      返回接收请求的端口号。
      17、setAttribute
      public void setAttribute(String name, Object object);
      这个方法在请求中添加一个属性,这个属性可以被其他可以访问这个请求对象的对象(例如一个嵌套的Servlet)使用。
      注:以下方法将被取消
      getRealPath
      public String getRealPath(String path);
      返回与虚拟路径相对应的真实路径,如果因为某种原因,这一过程不能进行,该方法将返回一个空值。
      这个方法和ServletContext接口中的getRealPath方法重复。在2.1版中,ServletContext接口将阐明一个Servlet所能用的所有的路径的映射。该方法执行的结果将会与ServletContext中getRealPath方法的结果完全一样。

      六、ServletResponse接口
      定义
      public interface ServletResponse
      定义一个Servlet引擎产生的对象,通过这个对象,Servlet对客户端的请求作出响应。这个响应应该是一个MIME实体,可能是一个HTML页、图象数据或其他MIME的格式。
      方法
      1、getCharacterEncoding
      public String getCharacterEncoding();
      返回MIME实体的字符编码。这个字符编码可以是指定的类型,也可以是与请求头域所反映的客户端所能接受的字符编码最匹配的类型。在HTTP协议中,这个信息被通过Accept-Charset传送到Servlet引擎。
      有关字符编码和MIME的更多信息请参看RFC 2047。
      2、getOutputStream
      public ServletOutputStream getOutputStream() throws IOException;
      返回一个记录二进制的响应数据的输出流。
      如果这个响应对象已经调用getWriter,将会抛出IllegalStateException。
      3、getWriter
      public PrintWriter getWriter throws IOException;
      这个方法返回一个PringWriter对象用来记录格式化的响应实体。如果要反映使用的字符编码,必须修改响应的MIME类型。在调用这个方法之前,必须设定响应的content类型。
      如果没有提供这样的编码类型,会抛出一个UnsupportedEncodingException,如果这个响应对象已调用getOutputStream,会抛出一个getOutputStream。
      4、setContentLength
      public void setContentLength(int length);
      设置响应的内容的长度,这个方法会覆盖以前对内容长度的设定。
      为了保证成功地设定响应头的内容长度,在响应被提交到输出流之前必须调用这个方法。
      5、setContentType
      public void setContentType(String type);
      这个方法用来设定响应的content类型。这个类型以后可能会在另外的一些情况下被隐式地修改,这里所说的另外的情况可能当服务器发现有必要的情况下对MIME的字符设置。
      为了保证成功地设定响应头的content类型,在响应被提交到输出流之前必须调用这个方法。

      七、SingleThreadModel接口
      定义
      public interface SingleThreadModel;
      这是一个空接口,它指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法中将不会有两个线程被同时执行。
      Servlet可以通过维持一个各自独立的Servlet实例池,或者通过只让Servlet的service中只有一个线程的方法来实现这个保证。

      八、GenericServlet类
      public abstract class GenericServlet implements Servlet,
            ServletConfig, Serializable;
      这个类的存在使得编写Servlet更加方便。它提供了一个简单的方案,这个方案用来执行有关Servlet生命周期的方法以及在初始化时对ServletConfig对象和ServletContext对象进行说明。
      方法
      1、destroy
      public void destroy();
      在这里destroy方法不做任何其他的工作。
      2、getInitParameter
      public String getInitParameter(String name);
      这是一个简便的途径,它将会调用ServletConfig对象的同名的方法。
      3、getInitParameterNames
      public Enumeration getInitParameterNames();
      这是一个简便的途径,它将会调用ServletConfig对象的同名的方法。
      4、getServletConfig
      public ServletConfig getServletConfig();
      返回一个通过这个类的init方法产生的ServletConfig对象的说明。
      5、getServletContext
      public ServletContext getServletContext();
      这是一个简便的途径,它将会调用ServletConfig对象的同名的方法。
      6、getServletInfo
      public String getServletInfo();
      返回一个反映Servlet版本的String。
      7、init
      public void init() throws ServletException;
      public void init(ServletConfig config) throws ServletException;
      init(ServletConfig config)方法是一个对这个Servlet的生命周期进行初始化的简便的途径。
      init()方法是用来让你对GenericServlet类进行扩充的,使用这个方法时,你不需要存储config对象,也不需要调用super.init(config)。
      init(ServletConfig config)方法会存储config对象然后调用init()。如果你重载了这个方法,你必须调用super.init(config),这样GenericServlet类的其他方法才能正常工作。
      8、log
      public void log(String msg);
      public void log(String msg, Throwable cause);
      通过Servlet content对象将Servlet的类名和给定的信息写入log文件中。
      9、service
      public abstract void service(ServletRequest request, ServletResponse
            response) throws ServletException, IOException;
      这是一个抽象的方法,当你扩展这个类时,为了执行网络请求,你必须执行它。

      九、ServletInputStream类
      定义
      public abstract class ServletInputStream extends InputStream
      这个类定义了一个用来读取客户端的请求信息的输入流。这是一个Servlet引擎提供的抽象类。一个Servlet通过使用ServletRequest接口获得了对一个ServletInputStream对象的说明。
      这个类的子类必须提供一个从InputStream接口读取有关信息的方法。
      方法
      1、readLine
      public int readLine(byte[] b, int off, int len) throws IOException;
      从输入流的指定的偏移量开始将指定长度的字节读入到指定的数组中。如果该行所有请求的内容都已被读取,这个读取的过程将结束。如果是遇到了新的一行,新的一行的首个字符也将被读入到数组中。

      十、ServletOutputStream类
      定义
      public abstract class ServletOutputStream extends OutputStream
      这是一个由Servlet引擎使用的抽象类。Servlet通过使用ServletResponse接口的使用获得了对一个这种类型的对象的说明。利用这个输出流可以将数据返回到客户端。
      这个类的子类必须提供一个向OutputStream接口写入有关信息的方法。
      在这个接口中,当一个刷新或关闭的方法被调用时。所有数据缓冲区的信息将会被发送到客户端,也就是说响应被提交了。请注意,关闭这种类型的对象时不一定要关闭隐含的socket流。
      方法
      1、print
      public void print(String s) throws IOException;
      public void print(boolean b) throws IOException;
      public void print(char c) throws IOException;
      public void print(int i) throws IOException;
      public void print(long l) throws IOException;
      public void print(float f) throws IOException;
      public void print(double d) throws IOException;
      输出变量到输出流中
      2、println
      public void println() throws IOException;
      public void println(String s) throws IOException;
      public void println(boolean b) throws IOException;
      public void println(char c) throws IOException;
      public void println(int i) throws IOException;
      public void println(long l) throws IOException;
      public void println(float f) throws IOException;
      public void println(double d) throws IOException;
      输出变量到输出流中,并增加一个回车换行符

      十一、ServletException类
      定义
      public class ServletException extends Exception
      当Servlet遇到问题时抛出的一个异常。
      构造函数
      public ServletException();
      public ServletException(String message);
      public ServletException(String message, Throwable cause);
      public ServletException(Throwable cause);
      构造一个新的ServletException,如果这个构造函数包括一个Throwable参数,这个Throwable对象将被作为可能抛出这个异常的原因。
      方法
      1、getRootCause
      public Throwable getRootCause();
      如果配置了抛出这个异常的原因,这个方法将返回这个原因,否则返回一个空值。

      十二、UnavailableException类
      定义
      public class UnavailableException extends ServletException
      不论一个Servlet是永久地还是临时地无效,都会抛出这个异常。Servlet会记录这个异常以及Servlet引擎所要采取的相应措施。
      临时的无效是指Servlet在某一时间由于一个临时的问题而不能处理请求。例如,在另一个不同的应用层的服务(可能是数据库)无法使用。这个问题可能会自行纠正或者需要采取其他的纠正措施。
      永久的无效是指除非管理员采取措施,这个Servlet将不能处理客户端的请求。例如,这个Servlet配置信息丢失或Servlet的状态被破坏。
      Servlet引擎可以安全地处理包括永久无效在内的这两种异常,但是对临时无效的正常处理可以使得Servlet引擎更健壮。特别的,这时对Servlet的请求只是被阻止(或者是被延期)一段时间,这显然要比在service自己重新启动前完全拒绝请求更为科学。
      构造函数
      public UnavailableException(Servlet servlet, String message);
      public UnavailableException(int seconds, Servlet servlet,
            String message);
      构造一个包含指定的描述信息的新的异常。如果这个构造函数有一个关于秒数的参数,这将给出Servlet发生临时无效后,能够重新处理请求的估计时间。如果不包含这个参数,这意味着这个Servlet永久无效。
      方法
      1、getServlet
      public Servlet getServlet();
      返回报告无效的Servlet。这被Servlet引擎用来识别受到影响的Servlet。
      2、getUnavailableSeconds
      public int getUnavailableSeconds();
      返回Servlet预期的无效时间,如果这个Servlet是永久无效,返回-1。
      3、isPermanent
      public boolean isPermanent();
      如果这个Servlet永久无效,返回布尔值true,指示必须采取一些管理行动以使得这个Servlet可用
     
      软件包:javax.servlet.http
      所包含的接口:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。
      所包含的类:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。

      一、HttpServletRequest接口
      定义\
      public interface HttpServletRequest extends ServletRequest;
      用来处理一个对Servlet的HTTP格式的请求信息。
      方法
      1、getAuthType
      public String getAuthType();
      返回这个请求的身份验证模式。
      2、getCookies
      public Cookie[] getCookies();
      返回一个数组,该数组包含这个请求中当前的所有cookie。如果这个请求中没有cookie,返回一个空数组。
      3、getDateHeader
      public long getDateHeader(String name);
      返回指定的请求头域的值,这个值被转换成一个反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。
      如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。
      4、getHeader
      public String getHeader(String name);
      返回一个请求头域的值。(译者注:与上一个方法不同的是,该方法返回一个字符串)
      如果这个请求头域不存在,这个方法返回-1。
      5、getHeaderNames
      public Enumeration getHeaderNames();
      该方法返回一个String对象的列表,该列表反映请求的所有头域名。
      有的引擎可能不允许通过这种方法访问头域,在这种情况下,这个方法返回一个空的列表。
      6、getIntHeader
      public int getIntHeader(String name);
      返回指定的请求头域的值,这个值被转换成一个整数。
      如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。
      7、getMethod
      public String getMethod();
      返回这个请求使用的HTTP方法(例如:GET、POST、PUT)
      8、getPathInfo
      public String getPathInfo();
      这个方法返回在这个请求的URL的Servlet路径之后的请求URL的额外的路径信息。如果这个请求URL包括一个查询字符串,在返回值内将不包括这个查询字符串。这个路径在返回之前必须经过URL解码。如果在这个请求的URL的Servlet路径之后没有路径信息。这个方法返回空值。
      9、getPathTranslated
      public String getPathTranslated();
      这个方法获得这个请求的URL的Servlet路径之后的额外的路径信息,并将它转换成一个真实的路径。在进行转换前,这个请求的URL必须经过URL解码。如果在这个URL的Servlet路径之后没有附加路径信息。这个方法返回空值。
      10、getQueryString
      public String getQueryString();
      返回这个请求URL所包含的查询字符串。一个查询字串符在一个URL中由一个“?”引出。如果没有查询字符串,这个方法返回空值。
      11、getRemoteUser
      public String getRemoteUser
      返回作了请求的用户名,这个信息用来作HTTP用户论证。
      如果在请求中没有用户名信息,这个方法返回空值。
      12、getRequestedSessionId
      public String getRequestedSessionId();
      返回这个请求相应的session id。如果由于某种原因客户端提供的session id是无效的,这个session id将与在当前session中的session id不同,与此同时,将建立一个新的session。
      如果这个请求没与一个session关联,这个方法返回空值。
      13、getRequestURI
      public String getRequestURI();
      从HTTP请求的第一行返回请求的URL中定义被请求的资源的部分。如果有一个查询字符串存在,这个查询字符串将不包括在返回值当中。例如,一个请求通过/catalog/books?id=1这样的URL路径访问,这个方法将返回/catalog/books。这个方法的返回值包括了Servlet路径和路径信息。
      如果这个URL路径中的的一部分经过了URL编码,这个方法的返回值在返回之前必须经过解码。
      14、getServletPath
      public String getServletPath();
      这个方法返回请求URL反映调用Servlet的部分。例如,一个Servlet被映射到/catalog/summer这个URL路径,而一个请求使用了/catalog/summer/casual这样的路径。所谓的反映调用Servlet的部分就是指/catalog/summer。
      如果这个Servlet不是通过路径匹配来调用。这个方法将返回一个空值。
      15、getSession
      public HttpSession getSession();
      public HttpSession getSession(boolean create);
      返回与这个请求关联的当前的有效的session。如果调用这个方法时没带参数,那么在没有session与这个请求关联的情况下,将会新建一个session。如果调用这个方法时带入了一个布尔型的参数,只有当这个参数为真时,session才会被建立。
      为了确保session能够被完全维持。Servlet开发者必须在响应被提交之前调用该方法。
      如果带入的参数为假,而且没有session与这个请求关联。这个方法会返回空值。
      16、isRequestedSessionIdValid
      public boolean isRequestedSessionIdValid();
      这个方法检查与此请求关联的session当前是不是有效。如果当前请求中使用的session无效,它将不能通过getSession方法返回。
      17、isRequestedSessionIdFromCookie
      public boolean isRequestedSessionIdFromCookie();
      如果这个请求的session id是通过客户端的一个cookie提供的,该方法返回真,否则返回假。
      18、isRequestedSessionIdFromURL
      public boolean isRequestedSessionIdFromURL();
      如果这个请求的session id是通过客户端的URL的一部分提供的,该方法返回真,否则返回假。请注意此方法与isRequestedSessionIdFromUrl在URL的拼写上不同。
      以下方法将被取消\

      19、isRequestedSessionIdFromUrl
      public boolean isRequestedSessionIdFromUrl();
      该方法被isRequestedSessionIdFromURL代替。

      二、HttpServletResponse接口
      定义\

      public interface HttpServletResponse extends ServletResponse
      描述一个返回到客户端的HTTP回应。这个接口允许Servlet程序员利用HTTP协议规定的头信息。
      成员变量
      public static final int SC_CONTINUE = 100;
      public static final int SC_SWITCHING_PROTOCOLS = 101;
      public static final int SC_OK = 200;
      public static final int SC_CREATED = 201;
      public static final int SC_ACCEPTED = 202;
      public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
      public static final int SC_NO_CONTENT = 204;
      public static final int SC_RESET_CONTENT = 205;
      public static final int SC_PARTIAL_CONTENT = 206;
      public static final int SC_MULTIPLE_CHOICES = 300;
      public static final int SC_MOVED_PERMANENTLY = 301;
      public static final int SC_MOVED_TEMPORARILY = 302;
      public static final int SC_SEE_OTHER = 303;
      public static final int SC_NOT_MODIFIED = 304;
      public static final int SC_USE_PROXY = 305;
      public static final int SC_BAD_REQUEST = 400;
      public static final int SC_UNAUTHORIZED = 401;
      public static final int SC_PAYMENT_REQUIRED = 402;
      public static final int SC_FORBIDDEN = 403;
      public static final int SC_NOT_FOUND = 404;
      public static final int SC_METHOD_NOT_ALLOWED = 405;
      public static final int SC_NOT_ACCEPTABLE = 406;
      public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
      public static final int SC_REQUEST_TIMEOUT = 408;
      public static final int SC_CONFLICT = 409;
      public static final int SC_GONE = 410;
      public static final int SC_LENGTH_REQUIRED = 411;
      public static final int SC_PRECONDITION_FAILED = 412;
      public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
      public static final int SC_REQUEST_URI_TOO_LONG = 414;
      public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
      public static final int SC_INTERNAL_SERVER_ERROR = 500;
      public static final int SC_NOT_IMPLEMENTED = 501;
      public static final int SC_BAD_GATEWAY = 502;
      public static final int SC_SERVICE_UNAVAILABLE = 503;
      public static final int SC_GATEWAY_TIMEOUT = 504;
      public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
      以上HTTP产状态码是由HTTP/1.1定义的。
      方法
      1、addCookie
      public void addCookie(Cookie cookie);
      在响应中增加一个指定的cookie。可多次调用该方法以定义多个cookie。为了设置适当的头域,该方法应该在响应被提交之前调用。
      2、containsHeader
      public boolean containsHeader(String name);
      检查是否设置了指定的响应头。
      3、encodeRedirectURL
      public String encodeRedirectURL(String url);
      对sendRedirect方法使用的指定URL进行编码。如果不需要编码,就直接返回这个URL。之所以提供这个附加的编码方法,是因为在redirect的情况下,决定是否对URL进行编码的规则和一般情况有所不同。所给的URL必须是一个绝对URL。相对URL不能被接收,会抛出一个IllegalArgumentException。
      所有提供给sendRedirect方法的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。
      4、encodeURL
      public String encodeURL(String url);
      对包含session ID的URL进行编码。如果不需要编码,就直接返回这个URL。Servlet引擎必须提供URL编码方法,因为在有些情况下,我们将不得不重写URL,例如,在响应对应的请求中包含一个有效的session,但是这个session不能被非URL的(例如cookie)的手段来维持。
      所有提供给Servlet的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。
      5、sendError
      public void sendError(int statusCode) throws IOException;
      public void sendError(int statusCode, String message) throws
         IOException;
      用给定的状态码发给客户端一个错误响应。如果提供了一个message参数,这将作为响应体的一部分被发出,否则,服务器会返回错误代码所对应的标准信息。
      调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。
      6、sendRedirect
      public void sendRedirect(String location) throws IOException;
      使用给定的路径,给客户端发出一个临时转向的响应(SC_MOVED_TEMPORARILY)。给定的路径必须是绝对URL。相对URL将不能被接收,会抛出一个IllegalArgumentException。
      这个方法必须在响应被提交之前调用。调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。
      7、setDateHeader
      public void setDateHeader(String name, long date);
      用一个给定的名称和日期值设置响应头,这里的日期值应该是反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。如果响应头已经被设置,新的值将覆盖当前的值。
      8、setHeader
      public void setHeader(String name, String value);
      用一个给定的名称和域设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。
      9、setIntHeader
      public void setIntHeader(String name, int value);
      用一个给定的名称和整形值设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。
      10、setStatus
      public void setStatus(int statusCode);
      这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。
      以下的几个方法将被取消\
      11、encodeRedirectUrl
      public String encodeRedirectUrl(String url);
      该方法被encodeRedirectURL取代。
      12、encodeUrl
      public String encodeUrl(String url);
      该方法被encodeURL取代。
      13、setStatus
      public void setStatus(int statusCode, String message);
      这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。如果提供了一个message,它也将会被作为响应体的一部分被发送。

      三、HttpSession接口
      定义\
      public interface HttpSession
      这个接口被Servlet引擎用来实现在HTTP客户端和HTTP会话两者的关联。这种关联可能在多外连接和请求中持续一段给定的时间。session用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。
      一个session可以通过cookie或重写URL来维持。
      方法
      1、getCreationTime
      public long getCreationTime();
      返回建立session的时间,这个时间表示为自1970-1-1日(GMT)以来的毫秒数。
      2、getId
      public String getId();
      返回分配给这个session的标识符。一个HTTP session的标识符是一个由服务器来建立和维持的唯一的字符串。
      3、getLastAccessedTime
      public long getLastAccessedTime();
      返回客户端最后一次发出与这个session有关的请求的时间,如果这个session是新建立的,返回-1。这个时间表示为自1970-1-1日(GMT)以来的毫秒数。
      4、getMaxInactiveInterval
      public int getMaxInactiveInterval();
      返加一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。在这个时间之后,Servlet引擎可能被Servlet引擎终止。如果这个session不会被终止,这个方法返回-1。
      当session无效后再调用这个方法会抛出一个IllegalStateException。
      5、getValue
      public Object getValue(String name);
      返回一个以给定的名字绑定到session上的对象。如果不存在这样的绑定,返回空值。
      当session无效后再调用这个方法会抛出一个IllegalStateException。
      6、getValueNames
      public String[] getValueNames();
      以一个数组返回绑定到session上的所有数据的名称。
      当session无效后再调用这个方法会抛出一个IllegalStateException。
      7、invalidate
      public void invalidate();
      这个方法会终止这个session。所有绑定在这个session上的数据都会被清除。并通过HttpSessionBindingListener接口的valueUnbound方法发出通告。
      8、isNew
      public boolean isNew();
      返回一个布尔值以判断这个session是不是新的。如果一个session已经被服务器建立但是还没有收到相应的客户端的请求,这个session将被认为是新的。这意味着,这个客户端还没有加入会话或没有被会话公认。在他发出下一个请求时还不能返回适当的session认证信息。
      当session无效后再调用这个方法会抛出一个IllegalStateException。
      9、putValue
      public void putValue(String name, Object value);
      以给定的名字,绑定给定的对象到session中。已存在的同名的绑定会被重置。这时会调用HttpSessionBindingListener接口的valueBound方法。
      当session无效后再调用这个方法会抛出一个IllegalStateException。
      10、removeValue
      public void removeValue(String name);
      取消给定名字的对象在session上的绑定。如果未找到给定名字的绑定的对象,这个方法什么出不做。 这时会调用HttpSessionBindingListener接口的valueUnbound方法。
      当session无效后再调用这个方法会抛出一个IllegalStateException。
      11、setMaxInactiveInterval
      public int setMaxInactiveInterval(int interval);
      设置一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。
      以下这个方法将被取消\
      12、getSessionContext
      public HttpSessionContext getSessionContext();
      返回session在其中得以保持的环境变量。这个方法和其他所有HttpSessionContext的方法一样被取消了。

      四、HttpSessionBindingListener接口
      定义\
      public interface HttpSessionBindingListener
      这个对象被加入到HTTP的session中,执行这个接口会通告有没有什么对象被绑定到这个HTTP session中或被从这个HTTP session中取消绑定。
      方法
      1、valueBound
      public void valueBound(HttpSessionBindingEvent event);
      当一个对象被绑定到session中,调用此方法。HttpSession.putValue方法被调用时,Servlet引擎应该调用此方法。
      2、valueUnbound
      public void valueUnbound(HttpSessionBindingEvent event);
      当一个对象被从session中取消绑定,调用此方法。HttpSession.removeValue方法被调用时,Servlet引擎应该调用此方法。

      五、HttpSessionContext接口
      定义\
      此接口将被取消\
      public interface HttpSessionContext
      这个对象是与一组HTTP session关联的单一的实体。
      这个接口由于安全的原因被取消,它出现在目前的版本中仅仅是为了兼容性的原因。这个接口的方法将模拟以前的版本的定义返回相应的值。
      方法
      1、getSession
      public HttpSession getSession(String sessionId);
      当初用来返回与这个session id相关的session。现在返回空值。
      2、getIds
      public Enumeration getIds();
      当初用来返回这个环境下所有session id的列表。现在返回空的列表。

      六、Cookie类\
      定义\
      public class Cookie implements Cloneable
      这个类描述了一个cookie,有关cookie的定义你可以参照Netscape Communications Corporation的说明,也可以参照RFC 2109。
      构造函数
      public Cookie(String name, String value);
      用一个name-value对定义一个cookie。这个name必须能被HTTP/1.1所接受。
      以字符$开头的name被RFC 2109保留。
      给定的name如果不能被HTTP/1.1所接受,该方法抛出一个IllegalArgumentException。
      方法
      1、getComment
      public String getComment();
      返回描述这个cookie目的的说明,如果未定义这个说明,返回空值。
      2、getDomain
      public String getDomain();
      返回这个cookie可以出现的区域,如果未定义区域,返回空值。
      3、getMaxAge
      public int getMaxAge();
      这个方法返回这个cookie指定的最长存活时期。如果未定义这个最长存活时期,该方法返回-1。
      4、getName
      public String getName();
      该方法返回cookie名。
      5、getPath
      public String getPath();
      返回这个cookie有效的所有URL路径的前缀,如果未定义,返回空值。
      6、getSecure
      public boolean getSecure();
      如果这个cookie只通过安全通道传输返回真,否则返回假。
      7、getValue
      public String getValue();
      该方法返回cookie的值。
      8、getVersion
      public int getVersion();
      返回cookie的版本。版本1由RFC 2109解释。版本0由Netscape Communications Corporation的说明解释。新构造的cookie默认使用版本0。
      9、setComment
      public void setComment(String purpose);
      如果一个用户将这个cookie提交给另一个用户,必须通过这个说明描述这个cookie的目的。版本0不支持这个属性。
      10、setDomain
      public void setDomain(String pattern);
      这个方法设置cookie的有效域的属性。这个属性指定了cookie可以出现的区域。一个有效域以一个点开头(.foo.com),这意味着在指定的域名解析系统的区域中(可能是www.foo.com但不是a.b.foo.com)的主机可以看到这个cookie。默认情况是,cookie只能返回保存它的主机。
      11、setMaxAge
      public void setMaxAge(int expiry);
      这个方法设定这个cookie的最长存活时期。在该存活时期之后,cookie会被终目。负数表示这个cookie不会生效,0将从客户端删除这个cookie。
         12、setPath
      public void setPath(String uri);
      这个方法设置cookie的路径属性。客户端只能向以这个给定的路径String开头的路径返回cookie。
      13、setSecure
      public void setSecure(boolean flag);
      指出这个cookie只能通过安全通道(例如HTTPS)发送。只有当产生这个cookie的服务器使用安全协议发送这个cookie值时才能这样设置。
      14、setValue
      public void setValue(String newValue);
      设置这个cookie的值,对于二进制数据采用BASE64编码。
      版本0不能使用空格、{}、()、=、,、“”、/、?、@、:以及;。
      15、setVersion
      public void setVersion(int v);
      设置cookie的版本号

      七、HttpServlet类\
      定义\
      public class HttpServlet extends GenericServlet implements
         Serializable
      这是一个抽象类,用来简化HTTP Servlet写作的过程。它是GenericServlet类的扩充,提供了一个处理HTTP协议的框架。
      在这个类中的service方法支持例如GET、POST这样的标准的HTTP方法。这一支持过程是通过分配他们到适当的方法(例如doGet、doPost)来实现的。
      方法
      1、doDelete
      protected void doDelete(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      被这个类的service方法调用,用来处理一个HTTP DELETE操作。这个操作允许客户端请求从服务器上删除URL。这一操作可能有负面影响,对此用户就负起责任。
      这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理DELETE请求时,你必须重载这一方法。
      2、doGet
      protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      被这个类的service方法调用,用来处理一个HTTP GET操作。这个操作允许客户端简单地从一个HTTP服务器“获得”资源。对这个方法的重载将自动地支持HEAD方法。
      GET操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。
      这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。
      3、doHead
      protected void doHead(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException;
      被这个类的service方法调用,用来处理一个HTTP HEAD操作。默认的情况是,这个操作会按照一个无条件的GET方法来执行,该操作不向客户端返回任何数据,而仅仅是返回包含内容长度的头信息。
      与GET操作一样,这个操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。
      这个方法的默认执行结果是自动处理HTTP HEAD操作,这个方法不需要被一个子类执行。
      4、doOptions
      protected void doOptions(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOE